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

Как разворачивать pod в Kubernetes

2.2 Middle🔥 241 комментариев
#Kubernetes

Комментарии (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, и проб для здоровья приложения. Это обеспечивает надежное, масштабируемое развертывание.

Как разворачивать pod в Kubernetes | PrepBro