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

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

Ответ

В Kubernetes нет прямого механизма наследования объектов, но есть несколько практик для повторного использования и композиции конфигураций.

Основные подходы:

  1. Использование kustomize (встроен в kubectl):

    • Базовая конфигурация (base/): определяет общие ресурсы.
    • Оверлеи (overlays/): наследуют от base и добавляют/модифицируют поля.

    Структура проекта:

    my-app/
    ├── base/
    │   ├── deployment.yaml
    │   ├── kustomization.yaml
    │   └── service.yaml
    └── overlays/
       ├── production/
       │   ├── kustomization.yaml  # Указывает на base и добавляет patches
       │   └── replica-patch.yaml
       └── staging/
           └── ...

    Пример overlays/production/kustomization.yaml:

    bases:
     - ../../base
    patchesStrategicMerge:
     - replica-patch.yaml
  2. Helm Charts и зависимости (dependencies):

    • Можно определить общий chart как зависимость и переопределять его values.yaml.
  3. Янки (YAML Anchors & Aliases) внутри одного файла:

    # Определение якоря
    baseConfig: &base
     image: myapp:latest
     ports:
       - containerPort: 8080
    
    # Использование алиаса и добавление полей
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: app-production
    spec:
     template:
       spec:
         containers:
           - name: app
             <<: *base  # Наследование якоря
             env:
               - name: ENV
                 value: "production"

Рекомендация: kustomize является стандартным и наиболее гибким способом для управления наследованием и окружениями в нативных Kubernetes-манифестах.