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
Связанные темы
- _MOC DevOps
- Kubernetes -- Pods, Services, Deployments
- Helm -- пакетный менеджер для K8s
- GitOps -- принципы
- Что такое Docker