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 оправдан, когда сервисов десятки, команд несколько и нужны автомасштабирование и самовосстановление.
Связанные термины
- контейнер — то, чем управляет оркестратор
- Docker — платформа для сборки и запуска контейнеров
- Docker Swarm — более простой оркестратор
- autoscaling — автомасштабирование реплик
- health check — по нему k8s решает, жив ли под
- Стратегии деплоя — rolling update, canary, blue-green
Готовы запустить GPU-задачу?
Запустить GPU-сервер