Заметки k8s
Конспекты по Kubernetes с объяснениями основных концепций и компонентов.
Всегда актуальная информация доступна в официальной документации Kubernetes
Архитектура Kubernetes
Ниже собрал диаграммы(схемы) компонентов Kubernetes из различных источников:

Компоненты Control Plane (Master Node)
Control Plane управляет состоянием кластера и принимает глобальные решения о планировании подов.
API Server (kube-apiserver)
Центральный компонент кластера - основная точка входа для всех REST-запросов.
Функции:
- Аутентификация и авторизация пользователей
- Валидация и мутация запросов
- Сериализация объектов в etcd
- Обслуживание REST API для всех операций кластера
Scheduler (kube-scheduler)
Планировщик подов - определяет оптимальную ноду для размещения нового пода.
Алгоритм работы:
- Фильтрация доступных нод по требованиям пода
- Ранжирование подходящих нод по различным критериям
- Назначение пода на ноду с наивысшим рейтингом
Факторы планирования:
- Доступные ресурсы (CPU, память)
- Политики размещения и anti-affinity
- Taints и tolerations
- Node selectors
Controller Manager (kube-controller-manager)
Управляющий демон - запускает контроллеры, которые регулируют состояние кластера.
Основные контроллеры:
- Node Controller - отслеживает состояние нод
- Replication Controller - поддерживает нужное количество реплик
- Endpoints Controller - связывает Services и Pods
- Deployment Controller - управляет развертываниями
etcd
Распределенное хранилище ключ-значение - база данных кластера.
Особенности:
- Хранит все манифесты и состояние кластера
- Требует кворум для работы (нечетное количество экземпляров)
- Обеспечивает консистентность данных
- Поддерживает снэпшоты для восстановления
Компоненты Worker Node
Worker Node выполняют фактическую работу по запуску приложений.
Pod
Базовая единица развертывания в Kubernetes - группа из одного или нескольких контейнеров.
Особенности:
- Контейнеры в поде разделяют сетевое пространство и хранилище
- Имеют общий IP-адрес и могут общаться через localhost
- Всегда планируются и выполняются на одной ноде
- Эфемерны - могут быть созданы, уничтожены и пересозданы
Kubelet
Агент узла - основной компонент на каждой worker ноде.
Функции:
- Получает спецификации подов от API сервера
- Управляет жизненным циклом подов на ноде
- Отправляет отчеты о состоянии нод и подов в API сервер
- Выполняет проверки работоспособности (health checks)
- Управляет томами (volumes)
Kube-proxy
Сетевой прокси - обеспечивает сетевую связность для сервисов.
Функции:
- Управляет правилами сетевой маршрутизации на узле
- Реализует балансировку нагрузки для сервисов
- Поддерживает различные режимы: iptables, IPVS, userspace
- Обеспечивает доступность сервисов через ClusterIP, NodePort, LoadBalancer
Container Runtime
Среда выполнения контейнеров - программное обеспечение для запуска контейнеров.
Поддерживаемые среды:
- containerd - легковесная, высокопроизводительная
- Docker Engine - популярная, но более тяжеловесная
- CRI-O - оптимизированная для Kubernetes
Дополнительные компоненты (Add-ons)
Необязательные компоненты для расширения функциональности кластера:
- CNI плагины (Calico, Flannel, Weave) - сетевое взаимодействие
- RBAC - контроль доступа на основе ролей
- DNS (CoreDNS) - разрешение имен внутри кластера
- Dashboard - веб-интерфейс управления
- Ingress Controllers - управление внешним трафиком
Основные объекты Kubernetes
Иерархия: Deployment → ReplicaSet → Pod
Декларативный подход - описываем желаемое состояние, а не последовательность действий.
Deployment - высокоуровневый объект для управления приложениями:
- Создает и управляет ReplicaSet
- Обеспечивает декларативные обновления
- Поддерживает стратегии развертывания (Rolling Update, Recreate)
- Позволяет откатываться к предыдущим версиям
ReplicaSet - обеспечивает заданное количество реплик подов:
- Создается автоматически Deployment
- Контролирует количество запущенных подов
- Заменяет неисправные поды
Pod - минимальная единица развертывания:
- Содержит один или несколько контейнеров
- Имеет уникальный IP-адрес в кластере
- Разделяет хранилище между контейнерами
Пример Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app: nginx
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginxdemos/hello:0.2
ports:
- containerPort: 80
name: http
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
resources:
limits:
cpu: "500m"
memory: "128Mi"
requests:
cpu: "250m"
memory: "64Mi"
Service
Абстракция для доступа к подам - обеспечивает стабильную точку входа к набору подов.
Проблемы, которые решает Service:
- Поды имеют эфемерные IP-адреса
- Поды могут быть пересозданы в любой момент
- Необходимость балансировки нагрузки между репликами
Типы Service:
ClusterIP (по умолчанию)
- Внутренний IP кластера
- Доступен только внутри кластера
- Используется для межсервисного взаимодействия
NodePort
- Открывает порт на всех нодах кластера
- Диапазон портов: 30000-32767
- Доступен извне кластера
LoadBalancer
- Создает внешний балансировщик нагрузки (в облаке)
- Автоматически создает ClusterIP и NodePort
- Получает внешний IP от провайдера
ExternalName
- Создает CNAME запись для внешнего сервиса
- Не создает прокси или балансировщик
Примеры Service
ClusterIP Service:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-clusterip
namespace: default
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
NodePort Service:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-nodeport
namespace: default
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30080
protocol: TCP
LoadBalancer Service:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-loadbalancer
namespace: default
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
Проверки работоспособности (Health Checks)
Kubernetes использует пробы (probes) для определения состояния контейнеров. Проверки выполняет kubelet.
Типы проб
Startup Probe
Проверка запуска - определяет, когда контейнер готов к работе.
Когда использовать:
- Для приложений с долгим временем запуска
- Когда нужно отключить другие пробы до завершения инициализации
Поведение:
- Выполняется только при запуске контейнера
- Блокирует выполнение liveness и readiness проб
- При неудаче контейнер перезапускается
Liveness Probe
Проверка жизнеспособности - определяет, нужно ли перезапустить контейнер.
Когда использовать:
- Для обнаружения зависших приложений
- При необходимости перезапуска проблемных контейнеров
Поведение:
- Выполняется периодически во время работы контейнера
- При неудаче контейнер перезапускается
- Не влияет на готовность к обслуживанию трафика
Readiness Probe
Проверка готовности - определяет, готов ли контейнер принимать трафик.
Когда использовать:
- Для приложений, которым нужно время на прогрев
- При зависимости от внешних сервисов
Поведение:
- Выполняется периодически во время работы контейнера
- При неудаче под исключается из Service endpoints
- Контейнер не перезапускается
Методы проверки
HTTP GET
livenessProbe:
httpGet:
path: /health
port: 8080
httpHeaders:
- name: Custom-Header
value: health-check
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
TCP Socket
readinessProbe:
tcpSocket:
port: 5432
initialDelaySeconds: 15
periodSeconds: 5
Command Execution
livenessProbe:
exec:
command:
- /bin/sh
- -c
- "pgrep -f my-app"
initialDelaySeconds: 30
periodSeconds: 10
Параметры конфигурации
- initialDelaySeconds - задержка перед первой проверкой
- periodSeconds - интервал между проверками
- timeoutSeconds - таймаут для одной проверки
- successThreshold - количество успешных проверок для восстановления
- failureThreshold - количество неудачных проверок для сбоя
Жизненный цикл запроса в Kubernetes
Рассмотрим, что происходит при выполнении команды kubectl apply -f deployment.yaml:
1. Отправка запроса
kubectl apply -f deployment.yaml -n production
Процесс:
- kubectl читает конфигурацию и отправляет HTTPS запрос к API Server
- API Server получает запрос и начинает его обработку
2. Аутентификация и авторизация
API Server выполняет:
- Аутентификация - проверяет подлинность пользователя (токены, сертификаты)
- Авторизация - проверяет права доступа (RBAC)
- Admission Control - применяет политики и мутации
3. Валидация и сохранение
API Server:
- Валидирует YAML манифест
- Сохраняет объект в etcd
- Возвращает подтверждение клиенту
4. Обработка контроллерами
Deployment Controller:
- Обнаруживает новый Deployment в etcd
- Создает соответствующий ReplicaSet
- Записывает ReplicaSet в etcd
ReplicaSet Controller:
- Обнаруживает новый ReplicaSet
- Создает необходимое количество Pod объектов
- Записывает Pod спецификации в etcd
5. Планирование
Scheduler:
- Обнаруживает неназначенные поды в etcd
- Анализирует доступные ноды и требования подов
- Принимает решение о размещении
- Обновляет спецификацию пода с назначенной нодой в etcd
6. Запуск на ноде
Kubelet на выбранной ноде:
- Обнаруживает назначенный ему под
- Взаимодействует с Container Runtime (containerd, Docker)
- Скачивает образы контейнеров
- Запускает контейнеры
- Отправляет статус обратно в API Server
7. Сетевое взаимодействие
Kube-proxy:
- Обновляет правила iptables/IPVS для новых сервисов
- Обеспечивает доступность подов через Service
Схема взаимодействия
graph TD
A[kubectl] --> B[API Server]
B --> C[etcd]
C --> D[Controllers]
C --> E[Scheduler]
C --> F[Kubelet]
F --> G[Container Runtime]
F --> H[Kube-proxy]
Все компоненты Kubernetes работают асинхронно и следуют принципу watch-loop:
- Наблюдают за изменениями в etcd
- Сравнивают текущее состояние с желаемым
- Предпринимают действия для достижения желаемого состояния
Дополнительные концепции
Namespaces
Виртуальные кластеры внутри физического кластера для изоляции ресурсов.
Системные namespace:
default- namespace по умолчаниюkube-system- системные компоненты Kuberneteskube-public- общедоступные ресурсыkube-node-lease- объекты lease для нод
ConfigMaps и Secrets
ConfigMap - хранение конфигурационных данных:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database_url: "postgresql://localhost:5432/myapp"
debug_mode: "true"
Secret - хранение конфиденциальной информации:
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
password: cGFzc3dvcmQxMjM= # base64 encoded
api-key: YWJjZGVmZ2hpams= # base64 encoded
Persistent Volumes
PersistentVolume (PV) - ресурс хранения в кластере:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: fast-ssd
hostPath:
path: /data/pv-example
PersistentVolumeClaim (PVC) - запрос на хранение:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: fast-ssd
Ingress
Управление внешним доступом к сервисам в кластере:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt
spec:
tls:
- hosts:
- example.com
secretName: example-tls
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Лучшие практики
Ресурсы и лимиты
Всегда указывайте requests и limits:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
Проверки работоспособности
Настройте все типы проб:
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet:
path: /startup
port: 8080
failureThreshold: 30
periodSeconds: 10
Безопасность
Используйте Security Context:
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
Мониторинг
Добавляйте метки для мониторинга:
metadata:
labels:
app: myapp
version: v1.2.3
environment: production
team: backend
Полезные команды kubectl
Основные команды
# Создание ресурсов
kubectl apply -f manifest.yaml
kubectl create -f manifest.yaml
# Просмотр ресурсов
kubectl get pods -o wide
kubectl get services --all-namespaces
kubectl describe pod my-pod
# Удаление ресурсов
kubectl delete pod my-pod
kubectl delete -f manifest.yaml
# Логи и отладка
kubectl logs my-pod -f
kubectl exec -it my-pod -- /bin/bash
kubectl port-forward my-pod 8080:80
# Масштабирование
kubectl scale deployment my-app --replicas=5
kubectl autoscale deployment my-app --min=2 --max=10 --cpu-percent=80
Полезные флаги
# Просмотр в разных форматах
kubectl get pods -o json
kubectl get pods -o yaml
kubectl get pods -o wide
# Фильтрация по лейблам
kubectl get pods -l app=nginx
kubectl get pods --field-selector=status.phase=Running
# Сортировка
kubectl get pods --sort-by='.metadata.creationTimestamp'
kubectl top pods --sort-by=memory