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.