Ответ
В Kubernetes я постоянно работаю со следующими основными типами манифестов (ресурсов API):
1. Рабочие нагрузки (Workloads):
- Deployment: Основной ресурс для развертывания stateless-приложений. Управляет обновлениями (rolling updates), откатами и масштабированием через ReplicaSet.
- StatefulSet: Использую для stateful-приложений (БД, Kafka, Elasticsearch), где важны устойчивые идентификаторы подов (pod-0, pod-1), стабильные сетевые идентификаторы и постоянное хранилище (PersistentVolume).
- DaemonSet: Гарантирует, что под будет работать на каждом (или на выбранных) узле кластера. Идеален для агентов мониторинга (node-exporter) или лог-коллекторов (Fluentd).
- Job / CronJob: Job создает один или несколько подов, которые выполняют задачу и завершаются. CronJob — это Job, запускаемый по расписанию (например, для бэкапов или периодических отчетов).
2. Конфигурация и хранение данных:
- ConfigMap: Хранение неконфиденциальных конфигурационных данных в формате ключ-значение. Подключаю как переменные окружения или файлы в поды.
- Secret: Аналогичен ConfigMap, но для конфиденциальных данных (пароли, токены, TLS-сертификаты). Данные хранятся в base64 (не шифрование!). Для продакшена интегрирую с внешними хранилищами типа HashiCorp Vault.
- PersistentVolume (PV) / PersistentVolumeClaim (PVC): Абстракция для предоставления постоянного хранилища (дисков) в кластере. PVC — это "запрос" пода на PV с определенным размером и типом доступа.
3. Сеть и доступ:
- Service: Абстракция, предоставляющая стабильный IP-адрес и DNS-имя для набора подов. Типы: ClusterIP (внутренний), NodePort, LoadBalancer.
- Ingress: Правила для маршрутизации внешнего HTTP/HTTPS трафика к сервисам внутри кластера. Использую вместе с Ingress-контроллером (nginx-ingress, traefik).
Пример манифеста Deployment с ConfigMap и Service:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-api
spec:
replicas: 3
selector:
matchLabels:
app: web-api
template:
metadata:
labels:
app: web-api
spec:
containers:
- name: api
image: myregistry/web-api:v1.2.0
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: app-config
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: web-api-service
spec:
selector:
app: web-api
ports:
- port: 80
targetPort: 8080
type: ClusterIP