Ответы на вопросы
1. Что такое Kubernetes и зачем он нужен?
Kubernetes (k8s) — это система оркестрации контейнеров, предназначенная для автоматизации развертывания, управления и масштабирования контейнеризированных приложений.
Раньше администраторы запускали контейнеры вручную с помощью Docker, но со временем стало сложно управлять большим количеством контейнеров, балансировать нагрузку и следить за отказоустойчивостью. Kubernetes решает эти проблемы, позволяя:
Автоматически распределять контейнеры между серверами (нодами).
Следить за состоянием приложений и автоматически перезапускать упавшие контейнеры.
Обеспечивать балансировку нагрузки между сервисами.
Масштабировать приложения в зависимости от нагрузки.
Разграничивать доступ и управлять конфигурацией сервисов.
Ключевые возможности
Самовосстановление: если контейнер выходит из строя, Kubernetes автоматически создаст новый.
Автоматическое масштабирование: при увеличении нагрузки Kubernetes может добавить новые экземпляры подов.
Декларативное управление: разработчики описывают, каким должен быть кластер (например, 3 реплики пода), а Kubernetes сам поддерживает это состояние.
2. Основные компоненты Kubernetes и их просмотр
Kubernetes — это распределённая система, которая состоит из Control Plane (управляющей плоскости) и Worker Nodes (рабочих узлов).
Control Plane (управляющая плоскость)
Это компоненты, которые управляют кластером:
API Server (kube-apiserver) – основной входной API для всех операций (работает через kubectl).
Scheduler (kube-scheduler) – определяет, на каких нодах запустить поды.
Controller Manager (kube-controller-manager) – следит за состоянием кластера, пересоздавая упавшие поды.
ETCD – распределённое хранилище состояния кластера.
Worker Nodes (рабочие узлы)
На рабочих узлах (нодах) выполняются приложения:
Kubelet – агент, отвечающий за запуск подов на узле.
Container Runtime – система, управляющая контейнерами (Docker, containerd).
Kube Proxy – сетевой компонент, обеспечивающий доступ сервисов внутри кластера.
Как посмотреть системные компоненты в кластере?
kubectl get pods -n kube-system
Пример вывода:
NAME READY STATUS RESTARTS AGE
kube-apiserver-master 1/1 Running 0 10d
kube-controller-manager-master 1/1 Running 0 10d
kube-scheduler-master 1/1 Running 0 10d
kube-proxy-abc12 1/1 Running 0 10d
3. Создание пода из YAML, основные поля
Pod (под) – это минимальная единица Kubernetes. Он может содержать один или несколько контейнеров, объединённых общей сетью и хранилищем.
Основные поля Pod YAML
apiVersion – версия API Kubernetes (v1).
kind – тип ресурса (Pod).
metadata – имя и метки пода.
spec – спецификация пода (описание контейнеров).
containers – список контейнеров внутри пода.
image – используемый образ контейнера (например, nginx).
ports – список портов, открытых в контейнере.
Создать под в кластере:
kubectl apply -f pod.yaml
4. Сервисы ClusterIP и Headless
Сервис (Service) – это абстракция, которая предоставляет постоянный IP-адрес и DNS-имя для набора подов. Это важно, потому что IP-адреса подов динамически изменяются, и напрямую к ним обращаться неудобно.
ClusterIP (по умолчанию)
Доступен только внутри кластера.
Позволяет подам общаться друг с другом.
Посмотреть сервисы:
kubectl get svc
Headless Service
Используется, когда нужен прямой доступ к подам без балансировки.
Полезен для баз данных (PostgreSQL, MySQL, Kafka).
5. Сервисы NodePort и LoadBalancer
NodePort
Открывает доступ извне кластера через IP-адрес узла.
Используется, если нет балансировщика нагрузки.
LoadBalancer
Автоматически создаёт внешний IP-адрес.
Используется в облачных платформах (AWS, GCP, Azure).
Доступ к сервису:
http://<NODE_IP>:30080
6. Что такое Ingress?
Ingress – это маршрутизатор HTTP-трафика внутри кластера. Вместо того чтобы обращаться к каждому сервису через разные порты, можно настроить Ingress и использовать человеческие URL.
Пример:
http://myapp.com/api → перенаправляет на service-api
http://myapp.com/web → перенаправляет на service-web
Преимущества Ingress
Позволяет использовать дружелюбные домены вместо IP-адресов Может выполнять SSL-терминацию (HTTPS) Позволяет балансировать нагрузку между сервисами
Просмотр Ingress-контроллеров:
kubectl get ingress
7. Deployment, StatefulSet и DaemonSet
Deployment
Используется для обычных приложений, которые не требуют сохранения состояния. Пример: веб-серверы, API, микросервисы.
StatefulSet
Используется для сервисов, требующих сохранения состояния (базы данных, Kafka). Основное отличие:
Каждый под имеет постоянный идентификатор (pod-0, pod-1).
Хранилище привязано к определённому поду.
DaemonSet
Используется для запуска одного пода на каждой ноде. Пример: логирование (Fluentd), мониторинг (Prometheus Node Exporter).
8. Job и CronJob
Job
Запускает одноразовую задачу, которая выполняется и завершается. Пример: миграция базы данных.
CronJob
Запускает задачу по расписанию (аналог cron в Linux). Пример: очистка временных файлов раз в день.
9. ConfigMap и Secret
ConfigMap
Используется для хранения конфигурации (например, адресов БД). Пример: переменная DATABASE_URL, которая передаётся в под.
Secret
Используется для хранения секретных данных (пароли, API-ключи). В отличие от ConfigMap, данные в Secret кодируются в base64 и хранятся безопасно.
10. Основные команды kubectl
kubectl get pods # Список подов
kubectl get svc # Список сервисов
kubectl get nodes # Список узлов
kubectl apply -f file.yaml # Применение манифеста
kubectl delete -f file.yaml # Удаление ресурса
kubectl logs pod-name # Логи пода
kubectl describe pod pod-name # Детальная информация о поде
