Когда проект подрастает, docker-compose уже не вывозит. Нужны масштабирование, самовосстановление, нормальная сеть, секреты и централизованное управление. Именно здесь на сцену выходит Kubernetes.
Оглавление
- Зачем нужен Kubernetes
- Структура манифестов
- PHP-FPM: Deployment + Service
- Nginx: Deployment + Service + Ingress
- Secrets и ConfigMap
- Persistent Volumes
- Деплой манифестов
- Масштабирование и обновления
- Compose vs 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.
