Print this page

Kubernetes Orchestration + Docker

08 October 2025

Когда проект подрастает, docker-compose уже не вывозит. Нужны масштабирование, самовосстановление, нормальная сеть, секреты и централизованное управление. Именно здесь на сцену выходит Kubernetes.


Оглавление

Зачем нужен Kubernetes

Когда проект вырастает, docker compose уже не хватает. Нужно:

  • Масштабировать сервисы по нагрузке
  • Автоматически перезапускать упавшие контейнеры
  • Централизованно управлять сетью, секретами и обновлениями

Kubernetes (k8s) — это система оркестрации контейнеров, которая автоматизирует деплой, масштабирование и управление приложениями.

Структура манифестов

Вместо одного docker-compose.yaml, в Kubernetes используется набор YAML-файлов, каждый описывает отдельный ресурс:

  • Deployment — количество реплик приложения (аналог docker run -d)
  • Service — маршрутизация трафика к Pod'ам (аналог портов в Compose)
  • ConfigMap / Secret — конфиги и чувствительные данные
  • PersistentVolumeClaim — постоянные данные (аналог volumes)
  • Ingress — внешний HTTP/HTTPS вход

Пример Deployment + Service для PHP-FPM

# php-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-fpm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-fpm
  template:
    metadata:
      labels:
        app: php-fpm
    spec:
      containers:
      - name: php-fpm
        image: php:7.1-fpm
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: www-data
          mountPath: /var/www/public_html
      volumes:
      - name: www-data
        persistentVolumeClaim:
          claimName: www-pvc
---
# php-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: php-fpm
spec:
  selector:
    app: php-fpm
  ports:
  - port: 9000
    targetPort: 9000

Пример Nginx с Ingress

# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: www-data
          mountPath: /var/www/public_html
        - name: nginx-conf
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: www-data
        persistentVolumeClaim:
          claimName: www-pvc
      - name: nginx-conf
        configMap:
          name: nginx-config
---
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80
---
# nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - host: devopz.tech
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

Secrets и ConfigMap

Вместо .env в Kubernetes используют Secret и ConfigMap.

# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  root-password: c3VwZXJzZWNyZXQ=   # base64(supersecret)

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  default.conf: |
    server {
      listen 80;
      root /var/www/public_html;
      index index.php index.html;
      server_name devopz.tech;
      location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      }
    }

Секреты можно монтировать как файлы или переменные окружения. Данные — в base64.

Persistent Volumes

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: www-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Деплой

После написания манифестов всё применяется одной командой:

kubectl apply -f ./k8s/
kubectl get pods
kubectl get svc
kubectl get ingress

Рекомендуемая структура каталога:

k8s/
├── php-deployment.yaml
├── php-service.yaml
├── nginx-deployment.yaml
├── nginx-service.yaml
├── nginx-ingress.yaml
├── secret.yaml
├── configmap.yaml
└── pvc.yaml

Масштабирование и обновления

Изменить количество реплик:

kubectl scale deployment nginx --replicas=3

Плавное обновление образа:

kubectl set image deployment/php-fpm php-fpm=myregistry/php:7.4

Преимущества Kubernetes перед Compose

Docker Compose Kubernetes
Для разработки, тестов и мелких проектов Для продакшена и масштабируемых систем
Один YAML Много манифестов
Нет self-healing Автовосстановление и автоскейлинг
Сеть и секреты ограничены Ingress, Secrets, NetworkPolicy, Service Mesh

Вывод

Docker Compose — огонь для локалки и быстрых стартов.

Kubernetes — когда нужны масштабирование, отказоустойчивость, управление и продакшн-класс инфраструктуры.

Дальше — CI/CD, автоматизация деплоя и Secret Management через Vault или External Secrets Operator.