Как настраивается конфигурация Kubernetes

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

Ответ

Конфигурация Kubernetes — это декларативное описание желаемого состояния кластера в виде YAML- или JSON-манифестов. Я настраиваю её, следуя принципам GitOps и инфраструктуры как кода (IaC).

Основные инструменты и подходы:

  1. Базовые манифесты (kubectl apply): Для простых сервисов или одноразовых задач.

    # deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: api-backend
      namespace: production
      labels:
        app: api
        tier: backend
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: api
          tier: backend
      template:
        metadata:
          labels:
            app: api
            tier: backend
        spec:
          containers:
          - name: api
            image: registry.example.com/api:v1.2.3
            ports:
            - containerPort: 8080
            envFrom:
            - configMapRef:
                name: api-config
            resources:
              requests:
                memory: "256Mi"
                cpu: "250m"
              limits:
                memory: "512Mi"
                cpu: "500m"
          # Добавляем sidecar для сбора логов
          - name: log-shipper
            image: fluentbit:latest

    Применение: kubectl apply -f deployment.yaml -n production

  2. Kustomize для управления окружениями: Позволяет создавать базовые конфигурации и оверлеи для dev/staging/prod.

    base/
    ├── deployment.yaml
    ├── service.yaml
    └── kustomization.yaml
    overlays/
    ├── staging/
    │   ├── replica-patch.yaml # Увеличиваем реплики
    │   ├── configmap-patch.yaml # Конфиг для staging
    │   └── kustomization.yaml
    └── production/
        ├── hpa.yaml # Добавляем HorizontalPodAutoscaler
        ├── ingress.yaml # Публичный ingress
        └── kustomization.yaml

    Применение: kubectl apply -k overlays/production

  3. Helm для пакетирования приложений: Использую для сложных приложений с множеством зависимостей (например, Elasticsearch с StatefulSet, Service, ConfigMap).

    # Установка чарта из репозитория
    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm install my-postgres bitnami/postgresql -f values/prod.yaml
    
    # Создание своего чарта
    helm create my-microservice
    # Затем редактирую templates/ и values.yaml
  4. GitOps с ArgoCD: Это основной подход в production. Манифесты хранятся в Git, а ArgoCD автоматически синхронизирует состояние кластера с репозиторием.

    # Application manifest для ArgoCD
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
      name: api-backend
      namespace: argocd
    spec:
      project: default
      source:
        repoURL: 'git@github.com:my-org/k8s-manifests.git'
        targetRevision: HEAD
        path: apps/api/overlays/production
      destination:
        server: 'https://kubernetes.default.svc'
        namespace: production
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

    Такой подход обеспечивает аудируемость, откат изменений через git revert и единый источник истины для всей инфраструктуры.