Как развернуть Docker-образ в Kubernetes?

«Как развернуть Docker-образ в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Развертывание Docker-образа в Kubernetes — это стандартная операция, которая обычно выполняется через ресурс Deployment. Он обеспечивает declarative updates, масштабирование и self-healing для ваших подов. Вот пошаговый пример.

1. Подготовка образа Сначала образ должен быть собран и помещен в доступный для кластера реестр (Docker Hub, Google Container Registry, Amazon ECR, приватный Harbor).

docker build -t myregistry.com/myapp:v1.0 .
docker push myregistry.com/myapp:v1.0

2. Создание манифеста Deployment Этот манифест описывает желаемое состояние: 3 реплики пода, использующего наш образ.

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: myregistry.com/myapp:v1.0 # Указываем наш Docker-образ
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10

3. Применение манифеста и проверка

# Применяем конфигурацию
kubectl apply -f deployment.yaml

# Проверяем статус подов
kubectl get pods -l app=my-app
# NAME                                    READY   STATUS    RESTARTS   AGE
# my-app-deployment-7cbbd6f9c6-2jqwx   1/1     Running   0          10s
# my-app-deployment-7cbbd6f9c6-kk9lp   1/1     Running   0          10s
# my-app-deployment-7cbbd6f9c6-xcvbn   1/1     Running   0          10s

# Смотрим статус развертывания
kubectl rollout status deployment/my-app-deployment

4. Обеспечение доступа к приложению (Service) Поды сами по себе эфемерны. Чтобы обеспечить стабильную сетевую точку доступа к ним, создается Service.

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80          # Порт, на котором Service доступен внутри кластера
      targetPort: 8080  # Порт контейнера, куда перенаправлять трафик
  type: LoadBalancer    # Для внешнего доступа. Для внутреннего — ClusterIP

Применяем: kubectl apply -f service.yaml. Cloud-провайдер автоматически создаст внешний балансировщик нагрузки.

5. Обновление образа (Rolling Update) Deployment поддерживает плавное обновление без простоя. Чтобы обновить версию образа:

kubectl set image deployment/my-app-deployment my-app-container=myregistry.com/myapp:v2.0
# Или отредактировать манифест и применить заново: kubectl apply -f deployment.yaml

Kubernetes постепенно создаст новые поды с v2.0 и удалит старые с v1.0, контролируя готовность новых подов через readinessProbe.