Kubernetes: основы и концепции

Kubernetes (K8s) — система оркестрации контейнеров с открытым исходным кодом: автоматически распределяет, масштабирует и перезапускает Docker-контейнеры на кластере серверов.

Зачем нужно

Docker запускает один контейнер на одной машине. Kubernetes запускает десятки контейнеров на кластере машин и управляет ими: перезапускает при сбое, масштабирует при нагрузке, обновляет без даунтайма, балансирует трафик. Для микросервисной архитектуры и продакшна с требованиями к HA (high availability) Kubernetes — стандарт.

Где используется

  • Production-деплой микросервисов (EKS на AWS, GKE на Google Cloud, AKS на Azure)
  • Auto-scaling: число pod-ов растёт при нагрузке, уменьшается в простое
  • Canary-деплои и rolling updates без даунтайма
  • Управление секретами, конфигами, persistent storage

Основной контент

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

Control Plane:
  - API Server   — точка входа для всех команд
  - etcd         — хранилище состояния кластера
  - Scheduler    — решает, на какой Node запустить Pod
  - Controller   — обеспечивает desired state

Worker Nodes:
  - kubelet      — агент на каждом Node, управляет Pod-ами
  - kube-proxy   — сетевые правила
  - Container runtime (containerd / Docker)

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

Объект Назначение
Pod Минимальная единица: один или несколько контейнеров
Deployment Управляет набором Pod-ов, обеспечивает desired state
Service Стабильный IP/DNS для доступа к Pod-ам
ConfigMap Конфигурация (не секреты)
Secret Зашифрованные данные (пароли, ключи)
Ingress HTTP-маршрутизация в кластер
Namespace Логическая изоляция ресурсов
PersistentVolume Постоянное хранилище для Pod-ов

kubectl — основные команды

# Контекст и кластер
kubectl config current-context
kubectl config get-contexts

# Информация о ресурсах
kubectl get pods -n production
kubectl get pods -A                      # все namespaces
kubectl describe pod my-pod-abc123
kubectl logs my-pod-abc123 -f            # follow логи
kubectl logs my-pod-abc123 --previous    # логи упавшего pod

# Управление
kubectl apply -f deployment.yaml
kubectl delete -f deployment.yaml
kubectl scale deployment my-app --replicas=5

# Отладка
kubectl exec -it my-pod-abc123 -- sh     # войти в контейнер
kubectl port-forward pod/my-pod 3000:3000  # проброс порта

Установка локального K8s для разработки

# minikube (самый простой)
brew install minikube
minikube start
kubectl get nodes

# kind (Kubernetes in Docker) — быстрее для CI
go install sigs.k8s.io/kind@latest
kind create cluster

Namespace для изоляции окружений

kubectl create namespace staging
kubectl create namespace production

kubectl get pods -n staging
kubectl apply -f manifests/ -n production

Частые ошибки

  • Запускать приложения в namespace default в продакшне — изолируй по namespace
  • Не задавать resources.requests и resources.limits для Pod-ов — Scheduler не может правильно планировать
  • Pod перезапускается в CrashLoopBackOff — смотри логи командой kubectl logs <pod> --previous
  • Прямо изменять deployment через kubectl edit — нарушение GitOps, лучше через YAML + apply

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

Ресурсы