ArgoCD i GitOps — deploy przez PR bez SSH do serwera

GitOps to podejście, w którym Git jest jedynym źródłem prawdy o stanie infrastruktury. ArgoCD obserwuje repozytorium i automatycznie synchronizuje klaster z każdą zmianą.

Czym jest GitOps?

Tradycyjny CD: push kodu → CI buduje obraz → skrypt SSH na serwer → kubectl apply.

GitOps: push kodu → CI buduje obraz i aktualizuje tag w manifeście K8s → ArgoCD widzi zmianę w repo → ArgoCD aplikuje manifest na klastrze.

Kluczowa różnica: w GitOps nikt nie ma dostępu SSH do klastra produkcyjnego. Jedyna droga do deploymentu to PR do repo.

Instalacja ArgoCD

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Application manifest

Dla każdego serwisu tworzę argocd-application.yaml:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: portfolio-frontend
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/szymonborowski/portfolio
    targetRevision: master
    path: frontend/k8s
  destination:
    server: https://kubernetes.default.svc
    namespace: portfolio
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

automated.selfHeal: true oznacza, że jeśli ktoś ręcznie zmieni coś w klastrze, ArgoCD to przywróci do stanu z repo.

CI/CD pipeline — jak to łączy się z GitHub Actions?

# .github/workflows/ci-cd.yml (fragment CD)
- name: Update image tag in K8s manifest
  run: |
    IMAGE_TAG=sha-${GITHUB_SHA::7}
    sed -i "s|image: ghcr.io/.*/portfolio-frontend:.*|image: ghcr.io/${{ github.repository_owner }}/portfolio-frontend:${IMAGE_TAG}|" frontend/k8s/deployment.yaml
    git config user.email "ci@portfolio.local"
    git config user.name "CI Bot"
    git add frontend/k8s/deployment.yaml
    git commit -m "ci: update frontend image to ${IMAGE_TAG}"
    git push

Po tym commicie ArgoCD w ciągu ~3 minut wykrywa zmianę i robi rolling update.

Health checks i rollback

ArgoCD nie marki Deployment jako "Synced" dopóki wszystkie pody nie są w stanie Running z przechodzącymi health checks. Jeśli nowa wersja się nie uruchomi, ArgoCD to pokaże — można ręcznie zrolbackować jednym kliknięciem w UI lub:

argocd app rollback portfolio-frontend

Bezpieczeństwo

ArgoCD ma dostęp tylko do klastra (via ServiceAccount z ograniczonymi uprawnieniami). Sekrety w repo trzymam jako placeholdery — rzeczywiste wartości ładowane przez Sealed Secrets lub External Secrets Operator.

Comments

No comments yet