Как настроить автоматический деплой в Kubernetes при коммите в Git?

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

Ответ

Есть два основных подхода: классический CI/CD и GitOps. Я использовал оба, но для production-проектов сейчас предпочитаю GitOps с ArgoCD.

1. GitOps-подход с ArgoCD (Рекомендуемый) В этом подходе Git-репозиторий — единственный источник истины. ArgoCD, установленный в кластере, постоянно сравнивает состояние кластера с манифестами в репозитории и автоматически синхронизирует их.

Как я это настраивал:

  1. Устанавливаем ArgoCD в кластер: kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml.
  2. В репозитории с кодом приложения храним Kubernetes-манифесты (например, в папке k8s/).
  3. Создаем Application CRD, который указывает ArgoCD на этот репозиторий:
    # application.yaml
    apiVersion: argoproj.io/v1alpha1
    kind: Application
    metadata:
    name: myapp-production
    namespace: argocd
    spec:
    project: default
    source:
    repoURL: 'git@github.com:myorg/myapp.git'
    targetRevision: main # Следим за веткой main
    path: k8s/overlays/production # Используем Kustomize для оверлеев
    destination:
    server: 'https://kubernetes.default.svc'
    namespace: production
    syncPolicy:
    automated:
      prune: true # Удалять ресурсы, удаленные из Git
      selfHeal: true # Автоматически исправлять дрейф конфигурации
    syncOptions:
      - CreateNamespace=true

    Теперь при любом коммите в main ветку (или при мерже PR) манифесты обновляются, и ArgoCD автоматически применяет изменения в кластере.

2. Классический CI/CD-подход (например, с GitHub Actions) Пайплайн в CI сам обновляет кластер, используя kubectl.

# .github/workflows/deploy.yml
name: Deploy to K8s
on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Set up Kubeconfig
        run: |
          mkdir -p ~/.kube
          echo "${{ secrets.KUBE_CONFIG }}" > ~/.kube/config
      - name: Deploy to Kubernetes
        run: |
          kubectl apply -f k8s/manifests/ -n production
          # Или использовать Kustomize/Helm
          kubectl rollout status deployment/myapp -n production

Сравнение: GitOps (ArgoCD) обеспечивает лучшую наблюдаемость, безопасность (изменения только через Git) и возможность легкого отката через revert коммита.