Ответ
В Kubernetes Pod'ами напрямую не управляют. Вместо этого используются контроллеры (Controller objects), которые следят за состоянием Pod'ов и поддерживают его в соответствии с декларативным описанием. Основные сущности:
- Deployment: Основной контроллер для stateless-приложений. Управляет жизненным циклом набора идентичных Pod'ов (ReplicaSet'ом), обеспечивая декларативные обновления (rolling update), откаты (rollback) и масштабирование.
- StatefulSet: Для stateful-приложений (базы данных, очереди), где важны:
- Устойчивые, предсказуемые имена Pod'ов (
<statefulset-name>-0,-1и т.д.). - Упорядоченный запуск и остановка.
- Устойчивые тома хранилища (PersistentVolume), привязанные к каждому Pod'у.
- Устойчивые, предсказуемые имена Pod'ов (
- DaemonSet: Гарантирует, что Pod будет работать на каждом (или на выбранных) Node в кластере. Используется для системных сервисов: сборщики логов (Fluentd, Filebeat), мониторинг (node-exporter), сетевые плагины (Calico).
- Job: Создает один или несколько Pod'ов для выполнения задачи, которая должна завершиться успешно. Управляет повторными попытками при сбое.
- CronJob: Запускает Jobs по расписанию, аналогично cron в Linux.
Пример Deployment для веб-приложения:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-deployment
spec:
replicas: 3
selector:
matchLabels:
app: frontend
tier: web
template: # Шаблон для создания Pod'ов
metadata:
labels:
app: frontend
tier: web
spec:
containers:
- name: nginx
image: nginx:1.21-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
Ключевое различие: Deployment управляет ReplicaSet'ом, который, в свою очередь, гарантирует количество Pod'ов. ReplicaSet — низкоуровневый примитив, вручную его используют редко.