Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Развертывание Pod в Kubernetes
Pod — это наименьшая развертываемая единица в Kubernetes. Это обертка вокруг одного или нескольких контейнеров, которые совместно используют сетевое пространство имен. Обычно pod содержит один контейнер, но могут быть и исключения (sidecar паттерны).
Способ 1: Непосредственное создание Pod (не рекомендуется)
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: default
spec:
containers:
- name: app-container
image: nginx:latest
ports:
- containerPort: 80
Применить:
kubectl apply -f pod.yaml
kubectl get pods
kubectl logs my-pod
kubectl delete pod my-pod
Под автоматически удаляется при перезагрузке ноды, поэтому это используется только для тестирования.
Способ 2: Deployment (рекомендуемый подход)
Deployment управляет ReplicaSet'ами и обеспечивает:
- Масштабирование
- Rolling updates
- Откат версий
- Самовосстановление
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: my-app
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app-container
image: my-app:1.0.0
ports:
- containerPort: 8080
env:
- name: APP_ENV
value: "production"
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: kubernetes.io/hostname
Управление:
# Создать deployment
kubectl apply -f deployment.yaml
# Посмотреть статус
kubectl get deployments
kubectl describe deployment my-app
# Масштабировать
kubectl scale deployment my-app --replicas=5
# Обновить образ
kubectl set image deployment/my-app app-container=my-app:2.0.0
# Откатить версию
kubectl rollout undo deployment/my-app
# История развертываний
kubectl rollout history deployment/my-app
Способ 3: StatefulSet (для stateful приложений)
Для приложений, требующих:
- Стабильных идентификаторов сетей
- Постоянного хранилища
- Упорядоченного масштабирования
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
Способ 4: DaemonSet (на каждой ноде)
Для инструментов, которые должны запускаться на каждой ноде:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:latest
ports:
- containerPort: 9100
Практический workflow развертывания
# 1. Подготовить image в registry
docker build -t myregistry.azurecr.io/my-app:1.0.0 .
docker push myregistry.azurecr.io/my-app:1.0.0
# 2. Создать или обновить Deployment
kubectl apply -f deployment.yaml
# 3. Проверить статус
kubectl get pods -l app=my-app
kubectl logs <pod-name>
# 4. Отладка при проблемах
kubectl describe pod <pod-name>
kubectl debug pod/<pod-name> -it
Best Practices
- Используйте Deployment — никогда не создавайте pod'ы напрямую в production
- Resource requests/limits — всегда определяйте для правильного scheduling
- Health checks — используйте livenessProbe и readinessProbe
- Image tagging — избегайте latest, используйте конкретные версии
- Pod disruption budgets — защищайте критические приложения
- Network policies — ограничивайте трафик между pod'ами
- Security context — запускайте как non-root
В production я всегда использую Deployment с rolling updates, четко определенными resource limits, и проб для здоровья приложения. Это обеспечивает надежное, масштабируемое развертывание.