Как используется YAML для конфигурации в Kubernetes?

«Как используется YAML для конфигурации в Kubernetes?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

YAML (YAML Ain't Markup Language) — это основной формат декларативных конфигурационных файлов в Kubernetes (K8s). Он используется для описания всех объектов кластера: Pod'ов, Deployments, Services, ConfigMaps и т.д.

Пример Deployment для веб-приложения:

apiVersion: apps/v1          # Версия API Kubernetes
kind: Deployment             # Тип объекта
metadata:                    # Метаданные объекта
  name: my-webapp           # Уникальное имя Deployment
  labels:                   # Метки для селекторов
    app: my-webapp
    tier: frontend
spec:                        # Спецификация желаемого состояния
  replicas: 3               # Количество идентичных копий Pod'ов
  selector:                 # Как Deployment находит свои Pod'ы
    matchLabels:
      app: my-webapp
  template:                 # Шаблон для создания Pod'ов
    metadata:
      labels:
        app: my-webapp      # Метки Pod'а должны совпадать с selector.matchLabels
    spec:                   # Спецификация Pod'а
      containers:
      - name: web-container # Имя контейнера внутри Pod'а
        image: nginx:1.25   # Образ Docker
        ports:
        - containerPort: 80 # Порт, который слушает контейнер
        env:                # Переменные окружения
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: database.host
        resources:          # Ограничения и запросы ресурсов
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

Ключевые особенности и правила YAML в K8s:

  • Отступы: Используются пробелы (обычно 2), табы не допускаются.
  • Структура: Определяется отступами (как Python).
  • Многострочные строки: Можно использовать | (сохраняет переносы) или > (складывает в одну строку).

Основные объекты Kubernetes, описываемые в YAML:

  1. Pod: Наименьшая единица развертывания (один или несколько контейнеров).
  2. Deployment: Управляет жизненным циклом Pod'ов (обновления, откаты).
  3. Service: Постоянная конечная точка для доступа к группе Pod'ов (балансировщик).
  4. ConfigMap / Secret: Хранение конфигурации и чувствительных данных отдельно от образа.
  5. PersistentVolumeClaim: Запрос на постоянное хранилище.

Практики и инструменты:

  • Валидация: kubectl apply --dry-run=client -f deployment.yaml
  • Шаблонизация: Используйте Helm для управления сложными наборами чартов с параметризацией.
  • Генерация: kubectl create deployment nginx --image=nginx:1.25 --dry-run=client -o yaml > deployment.yaml
  • Пространства имен: Всегда указывайте namespace: в metadata для продакшена.
  • Безопасность: Для секретов используйте объект Secret, а не ConfigMap, и избегайте хранения секретов в Git (используйте инструменты типа Sealed Secrets, Vault).