Перейти к основному содержимому

Справочник по Kubernetes


CLI, конфигурация и типовые сценарии Kubernetes (DevOps, CI/CD, инфраструктура). Учебный курс: раздел.

Шпаргалка по Kubernetes: таблицы синтаксиса, API, команд и параметров — для быстрого поиска фактов. Полная официальная структура разделов (концепции, настройка, API, kubectl, сеть, хранилище, безопасность, задачи) — в навигаторе документации Kubernetes и на kubernetes.io/ru.


Официальная документация (kubernetes.io)​

ТемаСсылкаПримечание
Что такое Kubernetesoverview/what-is-kubernetesRU
Компонентыoverview/componentscontrol plane + node
API Kubernetesoverview/kubernetes-apiверсии, группы, OpenAPI
Объектыworking-with-objectsmetadata, spec, labels
Справочник APIreference/kubernetes-apiвсе kind и поля
kubectlreference/kubectlEN, полный CLI
Настройка / инструментыsetup, tasks/toolsMinikube, kubeadm
Сертификаты вручнуюadminister-cluster/certificatesEN
Pod и контейнерыconcepts/workloads/podsprobes, resources
Сетьservices-networkingService, Ingress
Хранилищеconcepts/storagePV, PVC, StorageClass
ConfigMap / SecretconfigurationEN
RBAC / Securityconcepts/securityEN
Policiesconcepts/policyQuota, PSA
Планированиеscheduling-evictionRU
Расширения / Windowsextend-kubernetes, windowsCRD, Windows nodes
Tasksdocs/tasksпошаговые сценарии

Интерактивный каталог с фильтрами: навигатор. Учебная глава: Docker Swarm и Kubernetes.


Справочные таблицы​

Содержание справочника​


Общая архитектура Kubernetes​

Kubernetes — это распределённая система оркестрации контейнеров, обеспечивающая автоматизацию развёртывания, масштабирования и управления приложениями в контейнерах.


Компоненты Control Plane (управляющей плоскости)​

Control Plane управляет состоянием кластера и принимает решения о его работе.

  • kube-apiserver
    Центральный компонент, предоставляющий REST API для взаимодействия с кластером. Все операции чтения и записи проходят через него. Поддерживает аутентификацию, авторизацию и валидацию запросов.

  • etcd
    Распределённое хранилище ключ-значение, используемое для хранения всего состояния кластера. Является единственным источником правды для Kubernetes.

  • kube-scheduler
    Отвечает за назначение Pod’ов на подходящие Node’ы на основе доступных ресурсов, политик размещения, толерантности к taint’ам и других ограничений.

  • kube-controller-manager
    Запускает контроллеры, которые наблюдают за состоянием кластера и стремятся привести его к желаемому. Включает:

    • Node Controller
    • ReplicaSet
    • Endpoints Controller
    • Service Account & Token Controllers
  • cloud-controller-manager (опционально)
    Изолирует облачно-зависимую логику от основного control plane. Управляет взаимодействием с облачными провайдерами (например, AWS, GCP, Azure).


Компоненты Data Plane (рабочей плоскости)​

Data Plane состоит из узлов (Node), на которых выполняются рабочие нагрузки.

  • kubelet
    Агент, работающий на каждом Node. Отвечает за запуск Pod’ов, мониторинг их состояния и взаимодействие с container runtime.

  • kube-proxy
    Сетевой прокси, управляющий сетевыми правилами на Node для обеспечения сетевой связи с Service’ами внутри и вне кластера. Поддерживает режимы:

    • iptables
    • IPVS
    • userspace (устаревший)
  • Container Runtime
    Программное обеспечение, отвечающее за выполнение контейнеров. Поддерживаемые runtimes:

    • containerd
    • CRI-O
    • Docker Engine (через dockershim до версии 1.20, далее не поддерживается напрямую)

Основные понятия Kubernetes​

Кластер (Cluster)​

Набор машин (физических или виртуальных), объединённых в единую систему управления контейнерами. Состоит из Control Plane и одного или нескольких Node.


Node (Узел)​

Рабочая машина в кластере. Может быть физическим сервером или виртуальной машиной. Выполняет Pod’ы.


Pod​

Наименьшая и простейшая единица вычислений в Kubernetes. Представляет собой группу одного или нескольких контейнеров, разделяющих:

  • Сеть (один IP-адрес)
  • Хранилище (Volumes)
  • Спецификацию жизненного цикла

Pod’ы создаются и управляются контроллерами (например, Deployment, StatefulSet).

Жизненный цикл Pod (краткая схема)​

Развёрнутое объяснение с примерами диагностики — в главе Docker Swarm и Kubernetes. Здесь — справочная цепочка этапов.

ЭтапКомпонентДействие
1kube-apiserver + etcdПриём объекта Pod, хранение spec/status
2kube-schedulerВыбор Node по ресурсам и политикам
3kubelet + CRIPod Sandbox, pull образов, тома, CNI, старт контейнеров
4kubeletМониторинг, restartPolicy, probes
5kubelet + CNISIGTERM → grace period → SIGKILL → удаление контейнеров и сети

Фазы (status.phase): Pending, Running, Succeeded, Failed, Unknown.

При удалении: metadata.deletionTimestamp → Terminating → terminationGracePeriodSeconds → освобождение CPU/RAM, IP, локальных томов.

Полезные поля и команды:

Что смотретьГде
Фаза и READYkubectl get pod <name>
Scheduling, pull, probeskubectl describe pod <name> → Events
Логи до рестартаkubectl logs <name> --previous
Grace periodspec.terminationGracePeriodSeconds в манифесте

Namespace​

Механизм изоляции ресурсов внутри одного кластера. Позволяет разделить кластер на логические зоны (например, dev, staging, prod).

Системные Namespace:

  • default — используется по умолчанию
  • kube-system — системные компоненты
  • kube-public — общедоступные ресурсы
  • kube-node-lease — информация о состоянии Node

Label и Selector​

  • Label — пары ключ-значение, прикрепляемые к объектам (Pod, Service и др.) для организации и выбора подмножеств.
  • Selector — выражение, используемое для фильтрации объектов по Label’ам.

Пример Label:

labels:
app: nginx
environment: production
tier: frontend

Разбор:

  • labels в metadata — пары ключ-значение для селекторов и политик.
  • app: nginx — типичный селектор для Service и Deployment.
  • environment: production — разделение сред в одном кластере.
  • tier: frontend — слой архитектуры для NetworkPolicy и маршрутизации.

Типы Selector’ов:

  • Equality-based: environment = production
  • Set-based: environment in (production, staging)

Annotation​

Произвольные метаданные, не используемые Kubernetes напрямую, но полезные для инструментов, библиотек или пользователей. Например, информация о билде, контактные данные команды, политики.


Структура объекта Kubernetes​

Каждый объект Kubernetes описывается в YAML или JSON. В манифесте вы задаёте apiVersion, kind, metadata и (для большинства типов) spec. Поле status заполняет API-сервер — его не указывают в kubectl apply.

kubectl apply

Разбор:

  • Базовая команда применения манифеста (YAML/JSON) к API-серверу.
  • Создаёт объект при отсутствии или патчит при совпадении name+kind+namespace.
  • Полный путь: kubectl apply -f file.yaml или каталог -f ./manifests/.
  • См. пояснение в тексте раздела выше или ниже.
apiVersion: <строка>
kind: <строка>
metadata:
name: <строка>
namespace: <строка> # опционально; иначе default
labels: <карта>
annotations: <карта>
spec: <желаемое состояние>
# status: <фактическое состояние> — только в ответе API, не в apply

Разбор:

  • apiVersion — группа и версия API (v1, apps/v1, networking.k8s.io/v1).

  • kind — тип ресурса (Pod, Deployment, Service).

  • metadata — имя, namespace, labels, annotations.

  • spec — желаемое состояние (задаёт пользователь в манифесте).

  • Поле status заполняет control plane — в apply не указывают.

  • apiVersion — указывает версию API, необходимую для создания объекта. Примеры:

    • v1 — для Pod, Service, Namespace
    • apps/v1 — для Deployment, StatefulSet, DaemonSet
    • batch/v1 — для Job, CronJob
    • networking.k8s.io/v1 — для Ingress
  • kind — тип объекта. Примеры — Pod, Service, Deployment, ConfigMap.

  • metadata.name — уникальное имя объекта в пределах Namespace.

  • metadata.namespace — пространство имён, в котором создаётся объект.

В манифестах поле всегда называется metadata: (не meta), ключи ConfigMap/Secret — data: (не переводить на кириллицу). Системный namespace — kube-system.

  • spec — желаемое состояние объекта. Определяется пользователем.

  • status — текущее состояние объекта. Обновляется системой автоматически.


Core API Resources​

Pod​

Структура spec​

Код ITЗагрузка примера кода…

Разбор:

  • spec.containers — список контейнеров в Pod (минимум один).
  • image, command, args — образ и переопределение entrypoint/CMD.
  • ports.containerPort — порт контейнера (для Service и probes).
  • env / valueFrom — переменные из литерала, ConfigMap или Secret.
  • resources.requests/limits — планирование и лимиты CPU/RAM.
  • volumeMounts + volumes — монтирование ConfigMap, Secret, PVC, emptyDir.
  • livenessProbe / readinessProbe / startupProbe — проверки здоровья.
  • restartPolicy, nodeSelector, tolerations, affinity — планирование Pod.

Важные параметры контейнера​
  • image: URI образа (например, nginx:1.25, registry.example.com/app:v1)
  • command и args: переопределяют ENTRYPOINT и CMD из Dockerfile
  • ports: информационное поле; не публикует порты наружу
  • resources.requests/limits:
    • CPU: значения в миллиядрах (100m = 0.1 ядра) или ядрах (2)
    • Memory: в байтах с суффиксами (64Mi, 1Gi)
  • livenessProbe: проверяет, жив ли контейнер. При провале — перезапуск.
  • readinessProbe: проверяет, готов ли контейнер принимать трафик. При провале — исключение из Service.
  • startupProbe: отключает liveness/readiness до успешного завершения. Полезен для медленно стартующих приложений.

Типы Volume​
  • emptyDir: временный том, существует пока Pod жив
  • hostPath: монтирует файл/директорию с Node (опасно, только для одиночных нод)
  • configMap, secret: монтирует данные как файлы или переменные окружения
  • persistentVolumeClaim: запрос на постоянное хранилище

Service​

Абстракция, определяющая логический набор Pod’ов и политику доступа к ним.


Типы Service​
  • ClusterIP (по умолчанию): внутренний IP, доступен только внутри кластера
  • NodePort: открывает статический порт на всех Node, перенаправляет на ClusterIP
  • LoadBalancer: создаёт внешний балансировщик (в облаке)
  • ExternalName: возвращает CNAME записи вместо IP (редко используется)

Структура spec​
spec:
type: ClusterIP|NodePort|LoadBalancer|ExternalName
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30007 # только для NodePort/LoadBalancer
clusterIP: <авто или задано>
externalIPs: [<IP>, ...]
sessionAffinity: None|ClientIP

Разбор:

  • type — ClusterIP, NodePort, LoadBalancer, ExternalName.

  • selector — Label Pod'ов, на которые направляется трафик Service.

  • port — порт Service внутри кластера; targetPort — порт контейнера.

  • nodePort — статический порт на Node (30000–32767) для NodePort/LB.

  • sessionAffinity: ClientIP — привязка сессии к одному backend Pod.

  • selector — выбирает Pod’ы по Label’ам

  • port — порт Service’а

  • targetPort — порт контейнера (может быть числом или именем порта из Pod spec)

  • nodePort — диапазон по умолчанию: 30000–32767

Объекты Endpoints / EndpointSlice связывают Service с IP и портами подходящих Pod’ов (обновляются автоматически).


Namespace​

Простой объект:

apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
labels:
team: backend
annotations:
owner: "devops@example.com"

Разбор:

  • apiVersion: v1, kind: Namespace — объект изоляции ресурсов.
  • metadata.name — имя namespace (my-namespace).
  • labels / annotations — квоты, PSA, владелец команды.
  • См. пояснение в тексте раздела выше или ниже.

Используется для изоляции ресурсов, квот и политик.


Node​

Объект, представляющий физическую или виртуальную машину.

Код ITЗагрузка примера кода…

Разбор:

  • spec.podCIDR — подсеть Pod'ов на этом Node (зависит от CNI).

  • taints — "метки отталкивания"; Pod без toleration не планируется.

  • effect: NoSchedule — запрет новых Pod без matching toleration.

  • status.capacity / allocatable — ресурсы Node для scheduler.

  • conditions[type=Ready] — готовность Node принимать Pod'ы.

  • taints — помечает Node, чтобы на него не назначались Pod’ы без соответствующих tolerations

  • unschedulable — запрещает планировщику назначать новые Pod’ы на этот Node


Workload Controllers​

Контроллеры управляют жизненным циклом Pod’ов, обеспечивая соответствие текущего состояния желаемому.


Deployment​

Используется для управления бессостоятельными приложениями. Обеспечивает декларативные обновления, откаты и масштабирование.


Структура spec​

Код ITЗагрузка примера кода…

Разбор:

  • replicas — желаемое число Pod'ов ReplicaSet.
  • selector.matchLabels — должен совпадать с labels в template.
  • strategy.type: RollingUpdate — постепенная замена Pod'ов.
  • maxUnavailable / maxSurge — допуск недоступности и "лишних" Pod при rollout.
  • template.spec — шаблон Pod (образ, probes, resources).

Параметры стратегии обновления​
  • RollingUpdate (по умолчанию): постепенно заменяет старые Pod’ы новыми.

    • maxUnavailable: максимальное количество Pod’ов, которые могут быть недоступны во время обновления. Значение по умолчанию — 25%.
    • maxSurge: максимальное количество Pod’ов сверх желаемого числа. Значение по умолчанию — 25%.
  • Recreate: сначала удаляет все старые Pod’ы, затем создаёт новые. Приводит к downtime.


Полезные команды​
kubectl rollout status deployment/<name> # прогресс обновления
kubectl rollout history deployment/<name> # история ревизий
kubectl rollout undo deployment/<name> # откат к предыдущей версии

Разбор:

  • rollout status — ждёт завершения обновления Deployment.
  • rollout history — список ревизий ReplicaSet (для отката).
  • rollout undo — откат к предыдущей ревизии образа/манифеста.
  • См. пояснение в тексте раздела выше или ниже.

StatefulSet​

Используется для приложений с состоянием, таких как базы данных, кэши, распределённые системы.

Обеспечивает:

  • Уникальные, стабильные имена Pod’ов (web-0, web-1, ...)
  • Упорядоченный запуск и завершение
  • Постоянное хранилище, привязанное к каждому Pod’у

Структура spec​

Код ITЗагрузка примера кода…

Разбор:

  • serviceName — Headless Service для стабильного DNS (pod-0.service).
  • volumeClaimTemplates — отдельный PVC на каждый Pod (data-web-0).
  • podManagementPolicy: OrderedReady — строгий порядок создания/удаления.
  • updateStrategy — rolling или OnDelete для StatefulSet.

Особенности​
  • serviceName должен ссылаться на Headless Service (clusterIP: None)
  • volumeClaimTemplates автоматически создаёт PersistentVolumeClaim для каждого Pod’а
  • podManagementPolicy:
    • OrderedReady (по умолчанию): строгий порядок запуска/удаления
    • Parallel: все Pod’ы управляются одновременно

DaemonSet​

Запускает по одному Pod’у на каждом подходящем Node. Используется для системных агентов — log collectors, monitoring agents, network plugins.


Структура spec​

Код ITЗагрузка примера кода…

Разбор:

  • selector — на каких Node запускать Pod DaemonSet (по labels Node).
  • template — Pod на каждом подходящем Node (логи, CNI, мониторинг).
  • updateStrategy.maxUnavailable — сколько Pod можно обновлять одновременно.
  • Поле replicas отсутствует — число Pod = число подходящих Node.

DaemonSet игнорирует replicas. Число Pod’ов равно числу подходящих Node’ов.


Job​

Выполняет однократную задачу до успешного завершения. Подходит для миграций, обработки данных, пакетных заданий (ETL, bulk load, checkpoint).


Структура spec​
spec:
parallelism: <целое> # сколько Pod’ов запускать одновременно
completions: <целое> # сколько успешных завершений требуется
backoffLimit: <целое> # максимум попыток после неудачи
activeDeadlineSeconds: <целое> # максимальное время выполнения
ttlSecondsAfterFinished: <целое> # через сколько удалять завершённый Job
template: # шаблон Pod
spec:
restartPolicy: OnFailure|Never # Always запрещён
containers: [...]

Разбор:

  • parallelism — одновременно работающих Pod Job.

  • completions — сколько успешных завершений нужно для успеха Job.

  • backoffLimit — повторы после падения Pod.

  • activeDeadlineSeconds — жёсткий таймаут всего Job.

  • restartPolicy: OnFailure|Never — в Job нельзя Always.

  • Если completions не указано, Job завершается после первого успешного Pod’а.

  • restartPolicy не может быть Always.


CronJob​

Запускает Job по расписанию в формате cron.


Структура spec​
spec:
schedule: "0 */6 * * *" # каждые 6 часов
timeZone: "Europe/Moscow" # опционально, начиная с v1.29
startingDeadlineSeconds: <целое> # макс. задержка запуска
concurrencyPolicy: Allow|Forbid|Replace
suspend: true|false
successfulJobsHistoryLimit: <целое> # сколько успешных Job хранить
failedJobsHistoryLimit: <целое> # сколько неудачных Job хранить
jobTemplate:
spec:
template:
spec:
containers: [...]

Разбор:

  • schedule — cron-выражение запуска Job (0 */6 * * *).

  • timeZone — часовой пояс (Kubernetes 1.29+).

  • concurrencyPolicy — Allow / Forbid / Replace параллельных Job.

  • jobTemplate.spec — шаблон Pod для каждого запуска CronJob.

  • successfulJobsHistoryLimit — сколько успешных Job хранить в истории.

  • concurrencyPolicy:

    • Allow (по умолчанию): разрешает параллельные запуски
    • Forbid: пропускает новый запуск, если предыдущий ещё работает
    • Replace: завершает текущий Job и запускает новый

Конфигурация и секреты​

ConfigMap​

Хранит нечувствительные конфигурационные данные в виде пар ключ-значение.


Способы использования​
  1. Как переменные окружения:
envFrom:
- configMapRef:
name: app-config

Разбор:

  • envFrom.configMapRef — все ключи ConfigMap как переменные окружения.
  • Имена ключей ConfigMap становятся именами env (с учётом допустимых символов).
  • Удобно для набора настроек без перечисления каждого env.name.
  • См. пояснение в тексте раздела выше или ниже.
  1. Как отдельные переменные:
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: database.host

Разбор:

  • valueFrom.configMapKeyRef — одно значение по ключу из ConfigMap.
  • name — ConfigMap; key — поле в data (например database.host).
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.
  1. Как Volume (файлы в директории):
volumes:
- name: config-volume
configMap:
name: app-config

Разбор:

  • volumes.configMap — монтирование ключей как файлов в каталог.
  • Имя volume связывается с volumeMounts в контейнере.
  • Обновление ConfigMap обновляет файлы в Pod (с задержкой kubelet).
  • См. пояснение в тексте раздела выше или ниже.

Структура объекта​
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database.host: "postgres"
log.level: "info"
binaryData:
cert.pem: <base64>

Разбор:

  • kind: ConfigMap, data — текстовые пары ключ-значение (UTF-8).

  • binaryData — бинарные файлы в base64.

  • Не храните секреты в ConfigMap — для них объект Secret.

  • См. пояснение в тексте раздела выше или ниже.

  • data — текстовые значения (UTF-8)

  • binaryData — двоичные данные в base64


Secret​

Хранит чувствительные данные: пароли, токены API, TLS-ключи, учётные данные registry. Официальная страница: Secret. Практика "приложение + БД": лабораторный пример.

Base64 — не шифрование. Поле data кодирует значения в base64 для хранения в etcd; любой с правом get secret в namespace прочитает их в открытом виде (kubectl get secret -o yaml). Для шифрования в etcd — EncryptionConfiguration; для секретов в Git — вне Git и GitOps.


data и stringData​
ПолеКогда использовать
dataЗначения уже в base64 (как в API после создания)
stringDataПишете открытым текстом в манифесте — apiserver кодирует в data при сохранении

В одном Secret нельзя дублировать один ключ в data и stringData. Лимит объекта — 1 MiB (сумма ключей).


Структура (Opaque)​
apiVersion: v1
kind: Secret
metadata:
name: db-secret
namespace: default
type: Opaque
stringData:
username: app
password: change-me-in-prod
immutable: false

Разбор:

  • type: Opaque — произвольные пары ключ–значение (тип по умолчанию).
  • stringData — удобно в учебных YAML; в проде предпочитают kubectl create или операторы, без паролей в Git.
  • immutable: true — запрет изменений после создания (защита от случайной перезаписи; для смены пароля создают новый Secret и обновляют Pod).

Создание через kubectl​
kubectl create secret generic db-secret \
--from-literal=username=app \
--from-literal=password='s3cr3t'

kubectl create secret generic app-certs \
--from-file=tls.crt=./certs/tls.crt \
--from-file=tls.key=./certs/tls.key

kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=user \
--docker-password='token' \
--docker-email=user@example.com

Разбор:

  • generic — тип Opaque; --from-literal, --from-file, --from-env-file.
  • docker-registry — тип kubernetes.io/dockerconfigjson для imagePullSecrets.
  • Просмотр ключей без вывода значений: kubectl get secret db-secret -o jsonpath='{.data}' (значения остаются base64).

Типы Secret​
typeНазначениеОжидаемые ключи
OpaqueПароли, токены, произвольные данныелюбые
kubernetes.io/tlsTLS для Ingress / приложенийtls.crt, tls.key; опционально ca.crt
kubernetes.io/dockerconfigjsonPull из приватного registry.dockerconfigjson
kubernetes.io/basic-authHTTP basicusername, password
kubernetes.io/ssh-authSSH-ключssh-privatekey, опционально ssh-publickey
bootstrap.kubernetes.io/tokenТокены присоединения узлов (kubeadm)по схеме bootstrap
kubernetes.io/service-account-tokenУстаревший авто-Secret SA (до 1.24)токен в Secret

Токены ServiceAccount с Kubernetes 1.24+ по умолчанию не создают отдельный Secret; Pod получает projected volume с JWT (см. ServiceAccount).


Способы использования в Pod​
  1. Одна переменная (secretKeyRef):
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
optional: false
  1. Все ключи как env (envFrom):
envFrom:
- secretRef:
name: db-secret

Имена ключей Secret должны быть допустимыми именами переменных окружения (буквы, цифры, _).

  1. Том (файлы) — предпочтительно для паролей и сертификатов: значения не попадают в spec.containers.env и не видны в kubectl describe pod так же явно, как env:
volumeMounts:
- name: db-creds
mountPath: /etc/db-creds
readOnly: true
volumes:
- name: db-creds
secret:
secretName: db-secret
defaultMode: 0400
items:
- key: password
path: password

Разбор:

  • Смонтированный Secret — tmpfs в памяти узла; при удалении Pod том исчезает.
  • defaultMode — права файлов (octal), по умолчанию 0644.
  • items — выборочные ключи и имена файлов в каталоге.
  1. Pull образов — в spec Pod или ServiceAccount:
spec:
imagePullSecrets:
- name: regcred
  1. Projected volume — несколько источников в одном mount (Secret + ConfigMap + downwardAPI):
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: db-secret
items:
- key: password
path: db-password
- configMap:
name: app-config

Пример TLS Secret​
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
type: kubernetes.io/tls
data:
tls.crt: <base64>
tls.key: <base64>

Разбор:

  • type: kubernetes.io/tls — стандартный TLS Secret.
  • tls.crt / tls.key — сертификат и ключ в base64 в data.
  • Используется в Ingress tls.secretName и монтировании в Pod.
  • Автовыпуск: cert-manager (CRD Certificate → Secret).

Шифрование Secret в etcd​

По умолчанию etcd хранит объекты Secret без прикладного шифрования. Администратор кластера настраивает EncryptionConfiguration (KMS или локальный ключ) для ресурса secrets:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-32-byte-key>
- identity: {}

Разбор:

  • Первый provider в списке — шифрование при записи; identity — чтение старых незашифрованных записей при миграции.
  • Управляемые облака (EKS, GKE, AKS) часто включают encryption at rest отдельной настройкой.
  • Это не заменяет запрет хранения паролей в Git и RBAC на secrets.

Секреты вне Git и GitOps​
ПодходСуть
kubectl create secret / CI pipelineСекрет создаётся при деплое, в репозитории только ссылка по имени
External Secrets OperatorСинхронизация из Vault, AWS SM, GCP SM в native Secret — см. ИБ, Vault и ESO
Sealed SecretsВ Git лежит зашифрованный SealedSecret; контроллер создаёт Secret только в своём кластере
SOPSЗашифрованные файлы в Git; расшифровка в CI или при kustomize/Helm
HashiCorp VaultПриложение или sidecar читает секрет напрямую, без объекта Secret

Ответ на типовой экзаменационный вопрос "без пароля в манифесте" — в Deployment только secretKeyRef / volume на имя Secret, сам Secret — из оператора, CI или kubectl, не из открытого YAML в Git.


RBAC и риски​
  • Доступ к Secret — ресурс secrets, глаголы get, list, watch, create, update, patch, delete.
  • Роль с get pods + get secrets позволяет читать все секреты namespace.
  • Переменные из secretKeyRef отображаются в API Pod (ограниченно в describe; полный YAML Pod с env — риск утечки в логи CI).
  • Не кладите секреты в ConfigMap, annotations, labels, образы (ENV в Dockerfile) — см. безопасность контейнеров.

Отладка​
СимптомПроверка
CreateContainerConfigErrorkubectl get secret, имя и ключ в secretKeyRef
secret "x" not foundnamespace, имя, RBAC
Ingress без TLSkubectl get secret tls-secret, ключи tls.crt / tls.key
ImagePullBackOff на приватном registryimagePullSecrets, тип dockerconfigjson
kubectl get secret db-secret -o yaml
kubectl describe pod <pod> | grep -A2 Secret

Сетевые ресурсы​

Ingress​

Управляет входящим HTTP/HTTPS-трафиком на уровне кластера. Требует установленного Ingress Controller (NGINX, Traefik, HAProxy).


Структура spec​

Код ITЗагрузка примера кода…

Разбор:

  • ingressClassName — выбор Ingress Controller (nginx, traefik).
  • tls.hosts + secretName — HTTPS для указанных host.
  • rules.host — виртуальный хост HTTP-маршрутизации.
  • path / pathType: Prefix — префикс URL; backend.service — целевой Service.

Типы путей (pathType)​
  • Exact — точное совпадение
  • Prefix — префиксное совпадение
  • ImplementationSpecific — зависит от контроллера

Аннотации (часто используются)​
  • nginx.ingress.kubernetes.io/rewrite-target
  • traefik.ingress.kubernetes.io/router.entrypoints: websecure

NetworkPolicy​

Определяет правила сетевого трафика между Pod’ами. Требует CNI с поддержкой политик (Calico, Cilium, kube-router).


Пример — разрешить вход только из frontend​

Код ITЗагрузка примера кода…

Разбор:

  • podSelector — к каким Pod применяется политика (labels backend).

  • policyTypes — Ingress и/или Egress (без типа правило не активно).

  • ingress.from.podSelector — трафик только от Pod с app: frontend.

  • egress.to.namespaceSelector — исходящий трафик в namespace monitoring.

  • Без NetworkPolicy в namespace трафик разрешён по умолчанию (зависит от CNI).

  • Без NetworkPolicy весь трафик разрешён.

  • policyTypes явно указывает, применяются ли правила к входящему, исходящему или обоим типам трафика.


Хранилище​

PersistentVolume (PV)​

Ресурс кластера, представляющий физическую или облачную единицу хранения.


Типы провайдеров​
  • hostPath — локальная директория (только для одиночных нод)
  • nfs, iscsi, cephfs — сетевые файловые системы
  • awsElasticBlockStore, gcePersistentDisk, azureDisk — облачные диски
  • CSI-драйверы — универсальный интерфейс для любых хранилищ

Структура PV​
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
- ReadOnlyMany
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain|Recycle|Delete
storageClassName: fast-ssd
hostPath:
path: /mnt/data

Разбор:

  • capacity.storage — размер тома на уровне кластера.
  • accessModes — RWO, ROX, RWX (совместимость с PVC).
  • persistentVolumeReclaimPolicy: Retain|Delete — судьба данных после удаления PVC.
  • storageClassName — класс для динамического связывания с PVC.

Access Modes​
  • ReadWriteOnce (RWO) — один Node, чтение и запись
  • ReadOnlyMany (ROX) — много Node, только чтение
  • ReadWriteMany (RWX) — много Node, чтение и запись

Reclaim Policy​
  • Retain — сохраняет данные после удаления PVC
  • Delete — удаляет PV и физическое хранилище
  • Recycle — устаревший, не рекомендуется

PersistentVolumeClaim (PVC)​

Запрос на использование PV от имени Pod’а.

spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: fast-ssd
volumeName: <имя PV> # прямая привязка (опционально)
dataSource: # для клонирования или восстановления из снапшота
name: backup-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io

Разбор:

  • resources.requests.storage — запрашиваемый объём у provisioner.
  • accessModes — должны поддерживаться выбранным StorageClass/PV.
  • volumeName — явная привязка к существующему PV (static provisioning).
  • dataSource — клон или восстановление из VolumeSnapshot.

PVC автоматически связывается с подходящим PV при динамическом provision’инге.


StorageClass​

Определяет классы хранилища для динамического создания PV.

provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
fsType: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer|Immediate

Разбор:

  • provisioner — CSI или in-tree драйвер (создание PV).

  • parameters — параметры облака (type: gp3 для EBS).

  • allowVolumeExpansion: true — разрешение kubectl patch увеличения PVC.

  • volumeBindingMode: WaitForFirstConsumer — PV создаётся при назначении Pod на зону.

  • provisioner — драйвер, создающий тома

  • allowVolumeExpansion — разрешает увеличение размера PVC после создания

  • volumeBindingMode:

    • Immediate — PV создаётся сразу при создании PVC
    • WaitForFirstConsumer — PV создаётся только когда Pod, использующий PVC, будет назначен на Node (полезно для зональных томов)

Безопасность​

Role-Based Access Control (RBAC)​

Kubernetes использует RBAC для управления доступом к API на основе ролей.


Основные объекты​
  • Role — определяет права в пределах одного Namespace.
  • ClusterRole — определяет права на уровне всего кластера.
  • RoleBinding — связывает пользователя или группу с Role в Namespace.
  • ClusterRoleBinding — связывает пользователя или группу с ClusterRole глобально.

Структура Role​
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]

Разбор:

  • rules — список разрешений — apiGroups, resources, verbs.
  • resources: ["pods"] — объект Pod в core API (apiGroups: [""]).
  • verbs — ["get", "list", "watch"] — только чтение без create/delete.
  • Role действует в одном namespace (metadata.namespace).

Допустимые глаголы (verbs)​
  • get, list, watch — чтение
  • create, update, patch, delete, deletecollection — запись
  • impersonate — подмена пользователя
  • bind, escalate — специфичные для RBAC

Пример RoleBinding​
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: dev
subjects:
- kind: User
name: alice
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io

Разбор:

  • subjects — кому выданы права (User, Group, ServiceAccount).
  • roleRef — ссылка на Role pod-reader в том же namespace.
  • Имя User alice должно совпадать с аутентификацией (OIDC, cert).
  • См. пояснение в тексте раздела выше или ниже.

subjects может ссылаться на:

  • User
  • Group
  • ServiceAccount

ServiceAccount​

Специальный тип аккаунта для процессов внутри Pod’ов.

  • Каждый Pod по умолчанию использует default ServiceAccount в своём Namespace.
  • Для доступа к API в Pod монтируется projected volume с ограниченным по времени токеном (путь вида /var/run/secrets/kubernetes.io/serviceaccount/). В старых кластерах использовался долгоживущий Secret-токен — в новых версиях предпочтителен bound token.

Создание ServiceAccount​
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-sa
namespace: prod

Разбор:

  • kind: ServiceAccount — идентичность для процессов в Pod.
  • Токен для API монтируется projected volume (bound service account token).
  • По умолчанию Pod использует SA default в своём namespace.
  • См. пояснение в тексте раздела выше или ниже.

Привязка к Pod:

spec:
serviceAccountName: app-sa
containers: [...]

Разбор:

  • serviceAccountName: app-sa — Pod работает от имени этого SA.
  • Токен API монтируется в /var/run/secrets/kubernetes.io/serviceaccount/.
  • RBAC RoleBinding на SA даёт права приложению к API Kubernetes.
  • Без явного указания используется SA default в namespace Pod.

SecurityContext​

Определяет параметры безопасности на уровне Pod или контейнера.


Уровень Pod​
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
seccompProfile:
type: RuntimeDefault

Разбор:

  • runAsUser / runAsGroup — UID/GID процессов в Pod (все контейнеры по умолчанию).
  • fsGroup — GID для томов с volumePermission.
  • seccompProfile.type: RuntimeDefault — профиль seccomp узла.
  • См. пояснение в тексте раздела выше или ниже.

Уровень контейнера​
containers:
- name: app
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
add: ["NET_BIND_SERVICE"]

Разбор:

  • allowPrivilegeEscalation: false — запрет эскалации привилегий.
  • readOnlyRootFilesystem: true — корень ФС только для чтения.
  • capabilities.drop: ["ALL"] — сброс Linux capabilities.
  • capabilities.add: ["NET_BIND_SERVICE"] — разрешение слушать порт <1024 без root.

Ключевые поля​
  • runAsUser — UID, от которого запускается процесс
  • runAsNonRoot — требует, чтобы контейнер не запускался от root
  • readOnlyRootFilesystem — делает корневую ФС только для чтения
  • capabilities.add/drop — управление Linux capabilities
  • seccompProfile.type — RuntimeDefault, Localhost, Unconfined

PodSecurity Admission (PSA)​

Механизм, заменивший PodSecurityPolicy (устаревший с v1.25).

Работает через метки Namespace:

  • pod-security.kubernetes.io/enforce: baseline
  • pod-security.kubernetes.io/warn: restricted
  • pod-security.kubernetes.io/audit: privileged

Уровни безопасности​
  • Privileged — без ограничений
  • Baseline — минимальные ограничения, совместимо с большинством приложений
  • Restricted — строгие требования (например, запрет root, обязательные capabilities drop)

Пример меток:

apiVersion: v1
kind: Namespace
metadata:
name: secure-app
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: latest

Разбор:

  • Метки PSA на Namespace задают уровень Pod Security Admission.
  • enforce: restricted — отклонение Pod, не проходящих строгий профиль.
  • enforce-version: latest — версия политики PSA.
  • См. пояснение в тексте раздела выше или ниже.

Мониторинг и логирование​

Metrics Server​

Лёгкий компонент, собирающий метрики CPU и памяти с Node и Pod’ов. Требуется для kubectl top и Horizontal Pod Autoscaler.

Устанавливается как Deployment в kube-system.


Prometheus​

Система мониторинга с pull-моделью. Использует ServiceMonitor и PodMonitor (через Prometheus Operator) для обнаружения целей. Учебный стенд — Практикум Prometheus и Grafana; мониторинг VM и bare metal — Практикум Zabbix; справочник — Справочник по Prometheus.


Пример ServiceMonitor​
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: app-monitor
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: metrics
interval: 30s

Разбор:

  • CRD Prometheus Operator: ServiceMonitor для scrape метрик.
  • selector.matchLabels — Service с меткой app: my-app.
  • endpoints.port: metrics — имя порта в Service, не номер.
  • interval: 30s — период опроса Prometheus.

Loki​

Система агрегации логов от Grafana Labs. Хранит логи без полнотекстового индекса, используя метки (labels) для фильтрации. Практикум — Loki и Tempo, шаг 7; справочник — Справочник по Loki.

Интегрируется с Promtail — агентом, отправляющим логи из Pod’ов.


Расширяемость​

CustomResourceDefinition (CRD)​

Позволяет создавать пользовательские ресурсы в Kubernetes API.


Пример CRD​

Код ITЗагрузка примера кода…

Разбор:

  • CustomResourceDefinition регистрирует новый тип Database в API.
  • group: example.com, versions[].schema — OpenAPI валидация полей CR.
  • scope: Namespaced — объекты CR в пределах namespace.
  • names.plural/kind — kubectl get databases, kind: Database.

После применения можно создавать объекты:

apiVersion: example.com/v1
kind: Database
metadata:
name: my-db
spec:
size: "10Gi"

Разбор:

  • Пример пользовательского ресурса после установки CRD.
  • apiVersion: example.com/v1 — версия из CRD.
  • spec.size: "10Gi" — доменное поле, валидируется схемой CRD.
  • См. пояснение в тексте раздела выше или ниже.

Operators​

Паттерн расширения Kubernetes, реализующий доменную логику через контроллер, управляющий CRD.

Оператор наблюдает за состоянием CR и выполняет действия:

  • Создание PVC, Service, Secret
  • Выполнение SQL-миграций
  • Резервное копирование

Популярные Operators:

  • Prometheus Operator
  • Cert-Manager
  • Strimzi (Kafka)
  • Elastic Cloud on Kubernetes (ECK)

Инструменты​

Helm​

Менеджер пакетов для Kubernetes. Пакет называется Chart.


Структура Chart​
my-chart/
├── Chart.yaml
├── values.yaml
├── charts/ # зависимости
└── templates/ # шаблоны YAML
├── deployment.yaml
├── service.yaml
└── _helpers.tpl

Разбор:

  • Chart.yaml — метаданные чарта — name, version, appVersion, зависимости (dependencies).
  • values.yaml — параметры по умолчанию; переопределяют -f values-prod.yaml при helm install/upgrade.
  • charts/ — вложенные subchart'ы (зависимости), подтягиваются helm dependency build.
  • templates/ — Go-шаблоны манифестов K8s; рендер: {{ .Values.replicaCount }}.
  • _helpers.tpl — именованные фрагменты шаблонов (labels, selectors) для переиспользования.
  • Дерево каталогов — соглашение Helm 3; helm package упаковывает его в .tgz.

Ключевые команды​
helm install my-release ./my-chart
helm upgrade my-release ./my-chart
helm rollback my-release 2
helm template ./my-chart # рендеринг без установки

Разбор:

  • helm install — развёртывание chart с релизом my-release.
  • helm upgrade — обновление релиза новыми values/шаблонами.
  • helm rollback — откат к ревизии 2.
  • helm template — рендер YAML без применения в кластер.

Kustomize​

Инструмент для декларативной настройки манифестов без шаблонов.

Использует файл kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
namePrefix: staging-
namespace: staging
commonLabels:
env: staging
patches:
- path: patch.yaml

Разбор:

  • resources — базовые манифесты для Kustomize.
  • namePrefix: staging- — префикс имён всех ресурсов.
  • namespace: staging — переопределение namespace.
  • commonLabels — labels на все объекты.
  • patches — стратегические или JSON6902 патчи.

Kustomize (рекомендуемый синтаксис patches вместо patchesStrategicMerge):

kubectl apply -k overlays/staging/

Разбор:

  • kubectl apply -k — сборка overlay Kustomize и применение в кластер.
  • Путь overlays/staging/ должен содержать kustomization.yaml.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

kubectl — шпаргалка команд​

Типовые команды kubectl, сгруппированные по задачам. Краткая версия — в учебной шпаргалке; полный справочник CLI — reference/kubectl.

Контекст и конфигурация​
КомандаНазначение
kubectl config viewПоказать настройки kubeconfig
kubectl config view -o jsonpath='{.users[*].name}'Список пользователей в конфиге
kubectl config get-contextsВсе контексты (кластер + пользователь + namespace)
kubectl config current-contextТекущий контекст
kubectl config use-context <имя>Переключить контекст по умолчанию
kubectl config set-credentials <user>@<cluster> --username=... --password=...Добавить учётные данные
kubectl config set-context --current --namespace=<ns>Запомнить namespace для всех последующих команд
kubectl config unset users.<имя>Удалить пользователя из kubeconfig
Просмотр и поиск ресурсов​
КомандаНазначение
kubectl get <ресурсы>Список объектов в namespace текущего контекста
kubectl get pods --all-namespacesВсе Pod во всех namespace (-A — то же)
kubectl get pods -o widePod с node, IP и прочими колонками
kubectl describe nodes <node>Подробности ноды: условия, ёмкость, события
kubectl events --types=WarningПредупреждающие события кластера
kubectl diff -f ./manifest.yamlОтличия манифеста от состояния кластера перед apply
Обновление ресурсов​
КомандаНазначение
kubectl rollout history deployment/<имя>История ревизий Deployment
kubectl rollout undo deployment/<имя>Откат к предыдущей ревизии
kubectl rollout restart deployment/<имя>Rolling restart без смены образа
kubectl label pods <pod> <key>=<value>Добавить или изменить label
kubectl annotate pods <pod> <key>-Удалить annotation (дефис после ключа)
kubectl autoscale deployment <имя> --min=2 --max=10Создать HPA для Deployment
Создание ресурсов​
КомандаНазначение
kubectl apply -f ./manifest.yamlДекларативно создать или обновить объекты
kubectl create deployment nginx --image=nginxИмперативно создать Deployment
kubectl explain podsСправка по полям API (.spec.containers и т. д.)
Масштабирование​
КомандаНазначение
kubectl scale --replicas=3 rs/<имя>Масштабировать ReplicaSet
kubectl scale --current-replicas=2 --replicas=3 deployment/<имя>Масштабировать только если текущее число реплик совпадает
kubectl scale --replicas=5 rc/foo rc/bar rc/bazНесколько ReplicationController за раз
Работа с запущенными Pod​
КомандаНазначение
kubectl logs <pod>Логи контейнера (stdout/stderr)
kubectl logs <pod> -c <container>Логи конкретного контейнера в multi-container Pod
kubectl logs -f <pod>Поток логов в реальном времени
kubectl run nginx --image=nginx -n <ns>Одноразовый Pod (для экспериментов; в проде — манифесты)
kubectl attach <pod> -iПодключиться к stdin работающего контейнера
kubectl port-forward <pod> 5000:6000Локальный порт 5000 → порт 6000 в Pod
kubectl exec --stdin --tty <pod> -- /bin/shИнтерактивный shell в Pod
kubectl debug <pod> -it --image=busyboxEphemeral debug-контейнер (K8s 1.23+)
kubectl top pod <имя> --containersCPU/RAM по Pod и контейнерам (нужен Metrics Server)
Deployment и Service​
КомандаНазначение
kubectl logs deploy/<имя>Логи Pod'а Deployment (один контейнер)
kubectl port-forward svc/<имя> 5000Локальный порт → порт Service
kubectl exec deploy/<имя> -- <команда>Команда в первом Pod и контейнере Deployment

Дополнительно — права, Kustomize и метрики нод:

kubectl auth can-i create pods --namespace dev
kubectl top nodes
kubectl apply -k overlays/staging/

Разбор:

  • config view / get-contexts / use-context — работа с ~/.kube/config; set-context --current --namespace избавляет от -n в каждой команде.
  • get -o wide, describe, events --types=Warning — быстрая диагностика без входа в Pod.
  • diff -f — dry-run отличий; удобно в CI перед apply.
  • rollout history / undo / restart — жизненный цикл Deployment; restart пересоздаёт Pod'ы с тем же образом.
  • label и annotate с суффиксом - у ключа — удаление метаданных.
  • autoscale создаёт HorizontalPodAutoscaler; для кастомных метрик нужны metrics-server или Prometheus adapter.
  • apply — основной декларативный путь; create и run — императивные, для отладки.
  • explain — встроенная документация API; альтернатива веб-справочнику.
  • scale --current-replicas — оптимистичная блокировка при параллельных изменениях.
  • logs -f, exec -it, port-forward, debug — отладка без SSH на ноду.
  • logs deploy/... и exec deploy/... — сокращения для workload-контроллеров; выбирается один из Pod'ов.
  • auth can-i — проверка RBAC перед действием; top — метрики узлов и Pod'ов.

CI/CD и GitOps​

Argo CD​

Инструмент GitOps, синхронизирующий состояние кластера с манифестами в Git.

  • Отслеживает ветку репозитория
  • Автоматически применяет изменения
  • Предоставляет UI и CLI для управления

Application CR​

Код ITЗагрузка примера кода…

Разбор:

  • Argo CD Application — GitOps-связь репозитория и кластера.
  • source.repoURL / path — откуда брать манифесты.
  • destination.server — API кластера (in-cluster: kubernetes.default.svc).
  • destination.namespace — целевой namespace развёртывания.

Tekton​

Фреймворк для CI/CD на основе Kubernetes. Использует CRD — Task, Pipeline, PipelineRun.


Пример Task​

В новых установках предпочтителен API tekton.dev/v1; ниже — распространённый вариант v1beta1.

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: build-image
spec:
steps:
- name: build
image: gcr.io/kaniko-project/executor:v1.9.1
args:
- --dockerfile=/workspace/Dockerfile
- --destination=my-registry/app:$(inputs.params.version)

Разбор:

  • Tekton Task — один шаг CI в Kubernetes.
  • steps[].image — образ с инструментом (Kaniko для сборки).
  • args — параметры executor (--destination — push в registry).
  • inputs.params.version — подстановка тега образа из PipelineRun.

Tekton хорошо интегрируется с Argo Events, GitHub Actions и другими триггерами.


Сетевые модели и CNI-плагины​

Kubernetes требует реализации Container Network Interface (CNI) для обеспечения сетевой связи между Pod’ами.


Общие требования к CNI​

  • Каждый Pod получает уникальный IP-адрес (IP-per-Pod)
  • Pod’ы могут общаться напрямую без NAT
  • Узлы могут общаться с Pod’ами без NAT
  • Поддержка политик безопасности (опционально)

Calico​

Высокопроизводительный CNI с поддержкой сетевых политик, BGP и eBPF.


Особенности​
  • Использует BGP для маршрутизации между Node
  • Поддерживает режимы:
    • IPIP — инкапсуляция трафика (подходит для облака)
    • VXLAN — альтернатива IPIP
    • eBPF — ускорение dataplane без iptables
  • Полная поддержка NetworkPolicy
  • Встроенный контроллер для управления политиками

Установка​

Через Helm или manifest (актуальный URL — на странице установки Calico):

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/calico.yaml

Разбор:

  • Применение манифеста Calico (CNI + NetworkPolicy).
  • Версию v3.28.0 сверяйте с документацией Tigera.
  • После apply Pod'ы kube-system должны перейти в Running.
  • См. пояснение в тексте раздела выше или ниже.

Cilium​

CNI на основе eBPF, обеспечивающий высокую производительность и расширенную безопасность.


Особенности​
  • Полная замена iptables на eBPF
  • Поддержка L3–L7 политик (включая HTTP, Kafka, gRPC)
  • Встроенная видимость трафика (Hubble)
  • Безопасность на уровне identity, а не IP
  • Поддержка Service Mesh без sidecar (Cilium Service Mesh)

Установка​
helm install cilium cilium/cilium \
--namespace kube-system \
--set hubble.enabled=true

Разбор:

  • helm install cilium — CNI на eBPF в namespace kube-system.
  • hubble.enabled=true — UI/CLI наблюдаемость трафика L3–L7.
  • Требуется совместимое ядро Linux и отключение конфликтующего CNI.
  • См. пояснение в тексте раздела выше или ниже.

Flannel​

Простой и лёгкий CNI, использующий VXLAN по умолчанию.


Особенности​
  • Минимальная конфигурация
  • Не поддерживает NetworkPolicy (требуется дополнительный компонент)
  • Подходит для тестовых и небольших кластеров
  • Хранит конфигурацию в etcd или kube-api

Установка​
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

Разбор:

  • Официальный manifest Flannel — простой overlay CNI (VXLAN).
  • Не включает NetworkPolicy — для политик нужен Calico/Cilium поверх или вместо.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.

Мультикластерное управление​

Karmada​

Проект CNCF для управления несколькими кластерами через единый control plane.


Возможности​
  • Распределение рабочих нагрузок по кластерам
  • Failover между регионами
  • Единая политика размещения (PropagationPolicy)
  • Поддержка федеративных ресурсов

Архитектура​
  • Control plane в отдельном кластере
  • Агенты (karmada-agent) в управляемых кластерах
  • Ресурсы дублируются через ResourceBinding

Cluster API (CAPI)​

Декларативный подход к управлению жизненным циклом Kubernetes-кластеров.


Компоненты​
  • Cluster: описание кластера
  • Machine: описание Node
  • Provider — облачный или bare-metal провайдер (AWS, Azure, Metal3)

Пример​
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
name: my-cluster
spec:
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AWSManagedCluster
name: my-cluster
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
name: my-cluster-control-plane

Разбор:

  • Cluster API: декларативное описание кластера.
  • infrastructureRef — провайдер инфраструктуры (AWS, Azure).
  • controlPlaneRef — KubeadmControlPlane для мастеров.
  • См. пояснение в тексте раздела выше или ниже.

Позволяет автоматизировать создание, масштабирование и удаление кластеров.


Rancher​

Платформа с UI для управления множеством кластеров (включая EKS, GKE, AKS, RKE).


Функции​
  • Централизованная аутентификация (LDAP, SAML)
  • RBAC на уровне проектов
  • Мониторинг и логирование из коробки
  • CI/CD через Fleet и GitRepo CRD
  • Поддержка Windows Node

Отладка и диагностика​

Чек-лист диагностики Pod’а​

  1. Проверка статуса
kubectl get pod <name>

Разбор:

  1. Описание Pod’а
kubectl describe pod <name>

Разбор:

  • describe pod — Events — FailedScheduling, ImagePullBackOff, OOMKilled.

  • Показывает requests/limits, node, volumes, conditions.

  • См. пояснение в тексте раздела выше или ниже.

  • См. пояснение в тексте раздела выше или ниже.

    Показывает события — FailedScheduling, ImagePullBackOff, CrashLoopBackOff.

  1. Логи контейнера
kubectl logs <pod> -c <container>
kubectl logs <pod> --previous # предыдущий запуск

Разбор:

  • logs -c <container> — логи конкретного контейнера.
  • --previous — логи упавшего контейнера до рестарта.
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.
  1. Интерактивный доступ
kubectl exec -it <pod> -- sh

Разбор:

  • exec -it — интерактивная отладка в running Pod.
  • Требует shell в образе; для distroless — debug ephemeral containers (K8s 1.23+).
  • См. пояснение в тексте раздела выше или ниже.
  • См. пояснение в тексте раздела выше или ниже.
  1. Проверка сети
kubectl run debug --image=busybox --rm -it --restart=Never -- sh
nslookup service-name
wget http://service-name:80

Разбор:

  • Временный Pod debug на busybox для сетевой диагностики.
  • nslookup service-name — DNS Service внутри кластера.
  • wget http://service-name:80 — проверка доступности Service.
  • См. пояснение в тексте раздела выше или ниже.

Типичные проблемы и решения​

ПроблемаПричинаРешение
ImagePullBackOffНеверный образ или нет доступа к registryПроверить имя образа, добавить imagePullSecrets
CrashLoopBackOffКонтейнер завершается с ошибкойПроверить логи, readinessProbe, зависимости
PendingНедостаточно ресурсов или taintsУвеличить capacity, добавить tolerations
Service unreachableНеправильный selector или портСверить selector и targetPort
Ingress not workingНет Ingress ControllerУстановить NGINX/Traefik

Резервное копирование — Velero​

Инструмент для резервного копирования и восстановления кластера.


Возможности​

  • Резервное копирование Namespace, PVC, PV
  • Восстановление в другой кластер
  • Планирование через CronJob
  • Интеграция с AWS S3, Azure Blob, GCS

Установка​

velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.8.0 \
--bucket k8s-backups \
--secret-file ./credentials-velero

Разбор:

  • velero install — деплой Velero в кластер с плагином AWS.
  • --bucket — S3 bucket для backup объектов и PV снапшотов.
  • --secret-file — credentials для облачного API.
  • См. пояснение в тексте раздела выше или ниже.

Создание бэкапа​

velero backup create full-backup --include-namespaces=prod
velero backup get
velero restore create --from-backup full-backup

Разбор:

  • backup create — снимок ресурсов namespace prod.
  • backup get — список бэкапов.
  • restore create --from-backup — восстановление в тот же или другой кластер.
  • См. пояснение в тексте раздела выше или ниже.

Производительность и масштабируемость​

Официальные лимиты Kubernetes (v1.29+)​

  • До 5000 Node’ов
  • До 150 000 Pod’ов
  • До 110 Pod’ов на Node
  • До 10000 сервисов
  • До 200000 total objects

Best Practices​

  • Использовать HPA вместо ручного масштабирования
  • Ограничивать ресурсы через requests/limits
  • Избегать hostPath в production
  • Использовать PodDisruptionBudget для отказоустойчивости
  • Включать livenessProbe и readinessProbe
  • Разделять критические и некритические нагрузки по Namespace
  • Использовать nodeSelector или affinity для размещения GPU-нагрузок

PodDisruptionBudget (PDB)​

Гарантирует минимальное количество доступных Pod’ов при добровольных прерываниях (например, обновление Node).

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: web

Разбор:

  • PodDisruptionBudget ограничивает добровольные eviction (drain node).
  • minAvailable: 2 — минимум 2 Pod с label app: web всегда доступны.
  • Альтернатива: maxUnavailable: 1 — не более одного недоступного Pod.
  • selector должен совпадать с labels Pod'ов Deployment/StatefulSet.

Альтернатива: maxUnavailable: 1


Ошибки​

СитуацияЧто проверить
Команда не найденаPATH, установка пакета, alias
Permission deniedпользователь, группа, sudo, ACL
Неверная версиясм. "Совместимость", --version

Совместимость​

ОбластьПримечание
Версииактуальные LTS/стабильные релизы Kubernetes
Платформыофициальная матрица поддержки вендора
СтандартыRFC, ISO, спецификация API — см. таблицы выше

Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.


В подборках​

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Справочники — Справочник по Docker, Справочник по Roblox, Справочник по Apache Kafka, Справочник по Unity, Справочник по RabbitMQ, Справочник по Adobe Photoshop.