Ответ
Есть два основных подхода: классический CI/CD и GitOps. Я использовал оба, но для production-проектов сейчас предпочитаю GitOps с ArgoCD.
1. GitOps-подход с ArgoCD (Рекомендуемый) В этом подходе Git-репозиторий — единственный источник истины. ArgoCD, установленный в кластере, постоянно сравнивает состояние кластера с манифестами в репозитории и автоматически синхронизирует их.
Как я это настраивал:
- Устанавливаем ArgoCD в кластер:
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml. - В репозитории с кодом приложения храним Kubernetes-манифесты (например, в папке
k8s/). - Создаем 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 коммита.