Какие основные манифесты (ресурсы) в Kubernetes ты знаешь?

«Какие основные манифесты (ресурсы) в Kubernetes ты знаешь?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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