DevOps
Модуль 3: Kubernetes (K8s)




Модуль 3: Kubernetes (K8s)
Kubernetes — операционная система кластера. Вместо «запусти на server-1» мы описываем желаемое состояние: «мне нужно 2 Гб RAM и 1 CPU», а система сама решает, где это разместить.
Необходимый инструментарий
  • kubectl: CLI для управления кластером.
  • Minikube / Kind / k3d: Локальный кластер для тестов.
  • K9s: (Опционально) Удобный терминальный UI для K8s.
Часть 1. Основные примитивы (YAML Manifests)
В K8s всё описывается через YAML. Применение конфига: kubectl apply -f my-config.yaml.
3.1 Deployment
Описывает "Что должно работать".
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3               # Хочу 3 экземпляра
  selector:
    matchLabels:
      app: nginx
  template:                 # Шаблон пода
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:stable-alpine
        ports:
        - containerPort: 80
        resources:          # Лимиты (Request/Limit) - ОБЯЗАТЕЛЬНО
          requests:
            memory: "64Mi"
            cpu: "250m"     # 0.25 ядра
          limits:
            memory: "128Mi"
            cpu: "500m"
3.2 Service
Описывает "Как туда попасть" (Сеть).
apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: nginx             # Трафик пойдет на поды с лейблом app: nginx
  ports:
    - protocol: TCP
      port: 80             # Порт сервиса
      targetPort: 80       # Порт контейнера
  type: ClusterIP          # Доступен только внутри кластера
Часть 2. Повседневные команды (Cheat Sheet)
Просмотр состояния
  • kubectl get nodes - живы ли сервера?
  • kubectl get pods -o wide - список подов + IP + на какой они ноде.
  • kubectl get all - показать вообще всё в текущем неймспейсе.

Полезные дополнения:
  • kubectl get events --sort-by=.metadata.creationTimestamp - события по времени (часто быстрее, чем листать describe).
  • kubectl get deploy,rs,po -l app=nginx -o wide - смотреть всё по лейблу.
Debugging
  • kubectl describe pod <pod-name> - Детальная инфа. Почему под в статусе Pending? (например, "Insufficient cpu").
  • kubectl logs <pod-name> - Логи (stdout) процесса. Если под упал, добавь --previous, чтобы увидеть предсмертный крик.
  • kubectl exec -it <pod-name> -- sh - Залезть внутрь (аналог ssh).
  • Внутри: curl localhost:80 (проверка приложения).

Если у вас несколько контейнеров в поде:
  • kubectl logs <pod-name> -c <container-name>
  • kubectl exec -it <pod-name> -c <container-name> -- sh
Масштабирование
  • kubectl scale deployment web-app --replicas=5 - мгновенно увеличить количество реплик.
Rollout (обновления и откаты)
  • kubectl rollout status deployment/web-app — прогресс обновления.
  • kubectl rollout history deployment/web-app — история ревизий.
Troubleshooting Guide: "Pod не стартует"
Статусы подов (kubectl get pods):

1. Pending: Под висит и не назначается на ноду.
  • Причина: Нет свободных ресурсов (CPU/RAM) или нет ноды, подходящей под nodeSelector.
  • Check: kubectl describe pod ... -> раздел Events.
2. CrashLoopBackOff: Приложение запускается и падает.
  • Причина: Ошибка в коде, нет коннекта к базе, не хватает переменных окружения.
  • Check: kubectl logs <pod>.
3. ImagePullBackOff: Не может скачать образ.
  • Причина: Опечатка в имени image, приватный репозиторий без ключей (imagePullSecrets).
Итоговая задача: "Zero Downtime Deploy"
Понять, как K8s обновляет приложения.

Задача:

  1. Создать Deployment с image: nginx:1.21 (3 реплики).
  2. В отдельном окне запустить наблюдение:
watch kubectl get pods
3. Обновить образ на nginx:1.23 одной командой:
kubectl set image deployment/web-app nginx=nginx:1.23
4. Наблюдать: Вы увидите "Rolling Update".

  • K8s создает 1 новый под.
  • Ждет, пока он станет Running.
  • Убивает 1 старый под.
  • Повторяет, пока все не обновятся.
  • Результат: Сервис не падал ни на секунду.
Бонус: Установить некорректный образ nginx:typo-version. Увидеть ошибку ErrImagePull, отменить деплой:
kubectl rollout undo deployment/web-app