Заметки 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