← Назад к вопросам

Что запускал в Kubernetes?

3.0 Senior🔥 41 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Опыт работы с Kubernetes

Краткий ответ

На протяжении 10+ лет я развёртывал в Kubernetes разные типы приложений: микросервисы, веб-приложения, batch processing, очереди задач и системы с высокой нагрузкой. Вот мой реальный опыт.

1. Микросервисная архитектура

Основной сценарий в последних 3-4 года:

# Развёртывание Flask API
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
      - name: api
        image: my-registry/user-service:1.2.3
        ports:
        - containerPort: 8000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: connection-string
        resources:
          requests:
            memory: "256Mi"
            cpu: "100m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8000
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
  - port: 80
    targetPort: 8000
  type: ClusterIP

Что делал:

  • Развёртывание многоконтейнерных приложений
  • Scaling при нагрузке (HPA)
  • Rolling updates с zero-downtime
  • Service discovery между микросервисами

2. Django приложения

# Django + Gunicorn + PostgreSQL
apiVersion: v1
kind: ConfigMap
metadata:
  name: django-config
data:
  DJANGO_SETTINGS_MODULE: "config.settings.production"
  DEBUG: "false"
---
apiVersion: batch/v1
kind: Job
metadata:
  name: django-migrate
spec:
  template:
    spec:
      containers:
      - name: migration
        image: my-app:latest
        command: ["python", "manage.py", "migrate"]
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: url
      restartPolicy: Never
  backoffLimit: 3
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: django-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: django
  template:
    metadata:
      labels:
        app: django
    spec:
      containers:
      - name: gunicorn
        image: my-app:latest
        command: [
          "gunicorn",
          "-w", "4",
          "-b", "0.0.0.0:8000",
          "config.wsgi:application"
        ]
        ports:
        - containerPort: 8000
        envFrom:
        - configMapRef:
            name: django-config
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: url

Что делал:

  • Migration jobs перед каждым развёртыванием
  • Static files через nginx sidecar или CDN
  • Database pooling через PgBouncer
  • Celery tasks в отдельных подах

3. Celery (асинхронные задачи)

# Celery Worker
apiVersion: apps/v1
kind: Deployment
metadata:
  name: celery-worker
spec:
  replicas: 2
  selector:
    matchLabels:
      app: celery-worker
  template:
    metadata:
      labels:
        app: celery-worker
    spec:
      containers:
      - name: worker
        image: my-app:latest
        command: [
          "celery",
          "-A", "config.celery_app",
          "worker",
          "--loglevel=info",
          "-Q", "default,high-priority"
        ]
        env:
        - name: CELERY_BROKER_URL
          valueFrom:
            secretKeyRef:
              name: redis-secret
              key: url
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "1000m"
---
# Celery Beat (scheduler)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: celery-beat
spec:
  replicas: 1
  selector:
    matchLabels:
      app: celery-beat
  template:
    metadata:
      labels:
        app: celery-beat
    spec:
      containers:
      - name: beat
        image: my-app:latest
        command: [
          "celery",
          "-A", "config.celery_app",
          "beat",
          "--loglevel=info"
        ]
        env:
        - name: CELERY_BROKER_URL
          valueFrom:
            secretKeyRef:
              name: redis-secret
              key: url

Что делал:

  • Горизонтальное масштабирование workers
  • Разделение очередей по приоритету
  • Мониторинг через Flower
  • Dead letter queue для failed tasks

4. Batch Processing (Apache Spark)

# Spark Job Operator (Kubernetes Spark Operator)
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: data-processing-job
spec:
  type: Python
  pythonVersion: "3"
  mode: cluster
  image: "my-spark-image:latest"
  mainApplicationFile: "s3://my-bucket/jobs/process_data.py"
  sparkVersion: "3.2.0"
  driver:
    cores: 2
    memory: "4G"
  executor:
    cores: 2
    memory: "4G"
    instances: 3

Что делал:

  • Обработка больших данных
  • Auto-scaling в зависимости от нагрузки
  • S3 интеграция для input/output
  • Мониторинг через Prometheus

5. Мониторинг и логирование

# Prometheus для мониторинга
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
    scrape_configs:
    - job_name: 'kubernetes-pods'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
---
# ELK Stack для логирования
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
data:
  fluent-bit.conf: |
    [SERVICE]
    Flush         5
    Daemon        Off
    Log_Level     info
    
    [INPUT]
    Name              tail
    Path              /var/log/containers/*.log
    Parser            json
    Tag               kube.*
    Refresh_Interval  5
    
    [OUTPUT]
    Name            es
    Match           kube.*
    Host            elasticsearch.logging.svc.cluster.local
    Port            9200
    HTTP_User       elastic
    HTTP_Passwd     ${ELASTIC_PASSWORD}

Что делал:

  • Prometheus для метрик (CPU, Memory, Request latency)
  • ELK (Elasticsearch, Logstash, Kibana) для логов
  • Alerts через AlertManager
  • Custom metrics для business logic

6. Ingress и Load Balancing

# NGINX Ingress Controller
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/rate-limit: "100"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - api.example.com
    secretName: api-tls
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /users
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 80
      - path: /orders
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 80

Что делал:

  • NGINX Ingress для маршрутизации
  • cert-manager для SSL сертификатов
  • Rate limiting
  • A/B testing через weighted routing

7. StatefulSets для БД

# PostgreSQL StatefulSet
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
data:
  postgresql.conf: |
    shared_buffers = 256MB
    effective_cache_size = 1GB
    max_connections = 200
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:13
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: mydb
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: password
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
        - name: postgres-config
          mountPath: /etc/postgresql
      volumes:
      - name: postgres-config
        configMap:
          name: postgres-config
  volumeClaimTemplates:
  - metadata:
      name: postgres-storage
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: fast-ssd
      resources:
        requests:
          storage: 50Gi

Что делал:

  • Persistent Volumes для данных
  • Database replication
  • Backup automation
  • Recovery procedures

8. Основные вызовы и решения

challenges = {
    "Network Policy": {
        "Проблема": "Контроль трафика между сервисами",
        "Решение": "NetworkPolicy для микро-сегментации",
    },
    "Resource Limits": {
        "Проблема": "Один pod убивает весь cluster",
        "Решение": "Requests/Limits для каждого контейнера",
    },
    "Secret Management": {
        "Проблема": "Credentials в коде",
        "Решение": "Sealed Secrets или HashiCorp Vault",
    },
    "Multi-tenancy": {
        "Проблема": "Изоляция тенантов",
        "Решение": "RBAC, Network Policies, Resource Quotas",
    },
    "Storage": {
        "Проблема": "Персистентность данных",
        "Решение": "StorageClass + PVC, backup strategy",
    },
}

9. Инструменты, которые я использовал

# Helm для управления чартами
helm repo add stable https://charts.helm.sh/stable
helm install my-release stable/postgresql

# kubectl для управления
kubectl apply -f deployment.yaml
kubectl logs -f pod-name
kubectl exec -it pod-name -- bash

# Kustomize для вариативности
kustomize build overlays/prod | kubectl apply -f -

# ArgoCD для GitOps
helm repo add argo https://argoproj.github.io/argo-helm

# kubecost для мониторинга расходов

Основные выводы из опыта

learnings = [
    "Kubernetes это инструмент, а не silver bullet",
    "Начни с малого: используй GKE/EKS, не собирай сам",
    "Resource requests/limits критичны, не забудь",
    "Monitoring и logging с первого дня",
    "Разделяй окружения (dev, staging, prod) через namespaces",
    "RBAC security важнее чем ты думаешь",
    "Network policies спасают при проблемах",
    "Документируй, иначе через 3 месяца забудешь",
]

Вывод: За годы я развёртывал в Kubernetes всё: от простых веб-приложений до сложных микросервисных систем с мониторингом, масштабированием и failover механизмами. Kubernetes мощный инструмент для production, но требует глубокого понимания networking, storage и resource management.

Что запускал в Kubernetes? | PrepBro