DevOps & CI/CD

Kubernetes

Оркестратор контейнеров: запускает, масштабирует и перезапускает контейнеры на кластере серверов по описанному желаемому состоянию.

Что такое Kubernetes

Kubernetes (сокращённо k8s — «k», восемь букв, «s») — оркестратор контейнеров. Вы описываете желаемое состояние («три реплики этого образа, 8 ГБ памяти каждой, доступны по такому адресу»), а Kubernetes непрерывно приводит кластер к этому состоянию: запускает контейнеры, перезапускает упавшие, переносит их с умерших узлов, добавляет реплики под нагрузкой.

Оркестрация — это и есть автоматическое управление жизненным циклом контейнеров на группе машин: размещение, сеть, обновление, восстановление. Оркестратор — программа, которая этим занимается. Один Docker умеет запускать контейнер на одной машине; оркестратор нужен, когда машин десятки и падение любой из них не должно ронять сервис.

Ключевые объекты

Объект Что это
Pod Минимальная единица запуска: один или несколько контейнеров с общей сетью
Deployment Декларация «хочу N реплик такого пода», умеет rolling update и откат
Service Стабильный внутренний адрес и балансировка на поды
Ingress Точка входа снаружи: HTTP-маршрутизация по хостам и путям, TLS
ConfigMap / Secret Конфиги и пароли отдельно от образа
PersistentVolume Постоянный диск, переживающий перезапуск пода
Namespace Логическое разделение кластера на окружения и команды

Что такое Ingress

Ingress — объект, описывающий, как внешний HTTP-трафик попадает внутрь кластера. Сам по себе он лишь правило; работу выполняет Ingress Controller — балансировщик внутри кластера (обычно на Nginx или Traefik), который эти правила читает и применяет.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api
spec:
  ingressClassName: nginx
  rules:
    - host: api.example.com
      http:
        paths:
          - path: /v1
            pathType: Prefix
            backend:
              service:
                name: api-svc
                port:
                  number: 8000
  tls:
    - hosts: [api.example.com]
      secretName: api-tls

Без Ingress пришлось бы на каждый сервис поднимать отдельный внешний SSL-терминатор и адрес. С Ingress один вход обслуживает десятки сервисов по имени хоста.

Архитектура кластера

  • Control plane: kube-apiserver (единственная точка входа для всех команд), etcd (хранит состояние кластера), scheduler (решает, на какой узел поставить под), controller-manager (сводит фактическое состояние к желаемому).
  • Worker-узлы: kubelet (запускает поды), kube-proxy (сетевые правила), container runtime (containerd).

Практика: деплой и проверка

kubectl apply -f deployment.yaml      # применить манифест
kubectl get pods -o wide              # где что запущено
kubectl logs -f deploy/api            # логи
kubectl describe pod api-7d9f-xk2     # почему под не стартует
kubectl exec -it api-7d9f-xk2 -- bash # зайти внутрь
kubectl rollout restart deploy/api    # перезапустить
kubectl rollout undo deploy/api       # откатить обновление
kubectl scale deploy/api --replicas=5 # изменить число реплик

GPU в Kubernetes

Kubernetes умеет раздавать GPU как ресурс — через NVIDIA device plugin и NVIDIA Container Toolkit на узлах:

resources:
  limits:
    nvidia.com/gpu: 1

Целая карта выдаётся поду эксклюзивно — GPU не делится между подами так, как делится CPU. Разрезать карту можно через MIG. Так строят GPU-кластеры под инференс: один под — одна карта, autoscaling по очереди запросов.

Когда Kubernetes не нужен

Kubernetes стоит дорого в обслуживании: сеть, хранилище, обновления, мониторинг. Для одного-двух сервисов на одном сервере достаточно Docker Compose, для небольшого кластера — Docker Swarm. Kubernetes оправдан, когда сервисов десятки, команд несколько и нужны автомасштабирование и самовосстановление.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер