Deployment и Service

Как читать манифест и что произойдёт при его применении.

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: registry.example.com/web:1.4.2
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              memory: 256Mi

Разбор по частям:

requests и limits — разные вещи

Их путают чаще всего:

Практическое правило: лимит по памяти ставить обязательно, лимит по CPU — осторожно. Троттлинг CPU даёт медленные ответы, которые сложно диагностировать, тогда как отсутствие лимита памяти позволяет одному поду выжить соседей с ноды.

Service

Поды смертны и получают новый IP при каждом пересоздании. Service даёт стабильный адрес:

apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 8080

Service находит поды по тем же меткам и балансирует трафик между теми, что готовы. Внутри кластера он доступен по имени: http://web из того же namespace.

port — на чём слушает Service, targetPort — куда он шлёт в под. Их путаница — частая причина «сервис есть, а ответа нет».

Проверить, что связка работает

kubectl get endpoints web

Если список пуст — Service никого не нашёл. Почти всегда это несовпадение меток между Service.spec.selector и метками подов, либо поды не готовы (не проходит readiness).

Что происходит при выкате

Меняете тег образа и применяете. Deployment создаёт новый ReplicaSet и постепенно переключает: поднимает новые поды, дожидается их готовности, гасит старые.

kubectl rollout status deployment/web
kubectl rollout history deployment/web
kubectl rollout undo deployment/web      # откат

Без корректного readiness-пробы это ломается: Kubernetes считает под готовым сразу после старта и переводит на него трафик до того, как приложение сможет отвечать.