Cloud/Kubernetes

[k8s] GKE์—์„œ ArgoCD ์„ค์น˜ ๋ฐ Github Repository ์—ฐ๊ฒฐ

The Engineer, Lucy 2025. 2. 24. 23:02

ArgoCD๋ž€?

ArgoCD๋Š” Kubernetes๋ฅผ ์œ„ํ•œ ์„ ์–ธ์ ์ธ GitOps ์ง€์†์  ๋ฐฐํฌ ๋„๊ตฌ์ด๋‹ค.  ArgoCD๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋กœ ๋™์ž‘ํ•œ๋‹ค.

ArgoCD๋Š” ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ˜„์žฌ live state๋ฅผ ์›ํ•˜๋Š” ๋Œ€์ƒ ์ƒํƒœ์™€ ๋น„๊ตํ•˜๋Š” Kubernetes ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๊ตฌํ˜„๋œ๋‹ค. live์ƒํƒœ๊ฐ€ ๋Œ€์ƒ state์—์„œ ๋ฒ—์–ด๋‚˜ ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ OutOfSync๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ArgoCD๋Š” ์ฐจ์ด์ ์„ ๋ณด๊ณ ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•˜๋Š” ๋™์‹œ์— live ์ƒํƒœ๋ฅผ ์›ํ•˜๋Š” ๋Œ€์ƒ ์ƒํƒœ๋กœ ์ž๋™ ๋˜๋Š” ์ˆ˜๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. Git repo์—์„œ ์›ํ•˜๋Š” ๋Œ€์ƒ ์ƒํƒœ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ์ž๋™์œผ๋กœ ์ ์šฉ๋˜์–ด ์ง€์ •๋œ ๋Œ€์ƒ ํ™˜๊ฒฝ์— ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ๋‹ค.

ArgoCD ํŠน์ง•

  • ์ง€์ •๋œ ๋Œ€์ƒ ํ™˜๊ฒฝ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌ
  • ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ๊ด€๋ฆฌ/ํ…œํ”Œ๋ฆฟ ๋„๊ตฌ ์ง€์›(Kustomize, Helm, Jsonnet, plain-YAML)
  • ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ
  • SSO ํ†ตํ•ฉ(OIDC, OAuth2, LDAP, SAML 2.0, GitHub, GitLab, Microsoft, LinkedIn)
  • ์Šน์ธ์„ ์œ„ํ•œ ๋ฉ€ํ‹ฐ ํ…Œ๋„ŒํŠธ ๋ฐ RBAC ์ •์ฑ…
  • Git ์ €์žฅ์†Œ์— ์ปค๋ฐ‹๋œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์œผ๋กœ ๋กค๋ฐฑ/๋กค๋ง ์–ด๋””์„œ๋‚˜ ๊ฐ€๋Šฅ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค์˜ health status ๋ถ„์„
  • ์ž๋™ํ™”๋œ ๊ตฌ์„ฑ ๋“œ๋ฆฌํ”„ํŠธ ๊ฐ์ง€ ๋ฐ ์‹œ๊ฐํ™”
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ์ž๋™ ๋˜๋Š” ์ˆ˜๋™์œผ๋กœ ๋™๊ธฐํ™”
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™œ๋™์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์›น UI
  • ์ž๋™ํ™” ๋ฐ CI ํ†ตํ•ฉ์„ ์œ„ํ•œ CLI
  • Webhook  ํ†ตํ•ฉ(GitHub, BitBucket, GitLab)
  • ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ ํ† ํฐ ์•ก์„ธ์Šค
  • ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กค์•„์›ƒ์„ ์ง€์›ํ•˜๋Š” PreSync, Sync, PostSync hook
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ ๋ฐ API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ์ถ”์ 
  • ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค ์ง€ํ‘œ
  • Git์—์„œ Helm ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋งค๋ณ€์ˆ˜ ์žฌ์ •์˜

ArgoCD ์„ค์น˜ ๋ฐ Github ์—ฐ๊ฒฐ

1. Helm์œผ๋กœ ArgoCD ์„ค์น˜

helm repo add argo https://argoproj.github.io/argo-helm
helm install  argocd argo/argo-cd -n devops-tools

๋‚˜๋Š” helm์„ ์ด์šฉํ•ด์„œ argocd๋ฅผ ์„ค์น˜ํ•˜์˜€๋‹ค.

# Linux/Mac OS
kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 -d

# Powershell
$encoded = kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}"
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($encoded))

 ๊ทธ๋ฆฌ๊ณ  ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์–ป์œผ๋ฉด ๋œ๋‹ค.

2. GKE์—ฐ๊ฒฐ์„ ์œ„ํ•œ secret ์ถ”๊ฐ€

kubectl config view --raw -o jsonpath="{.clusters[?(@.name == \"$(kubectl config current-context)\")].cluster.certificate-authority-data}"

์œ„ ๋ช…๋ น์–ด๋กœ GKE ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
  labels:
    argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
  name: <cluster-name>
  server: <cluster-api-url or ip>
  config: |
    {
      "execProviderConfig: {
        "command": "argocd-k8s-auth",
        "args": ["gcp"],
        "apiVersion": "client.authentication.k8s.io/v1betat1"
      },
      "tlsClientConfig": {
        "insecure": false,
        "caData": <cluster-encoded certificate>
      }"
    }

๊ทธ๋ฆฌ๊ณ  ์œ„์™€ ๊ฐ™์ด secret์„ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. ํ•ด๋‹น secret์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/ ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

3. Repository ์ถ”๊ฐ€ํ•˜๊ธฐ

์ขŒ์ธก์— Settings > Repositories > Connect repo ์ˆœ์œผ๋กœ ๋ˆ„๋ฅด๋ฉด ์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ„์€ via ssh ๋˜๋Š” via https๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ via https๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  repository์˜ url์„ ์ž…๋ ฅํ•˜๊ณ   project๋ถ€๋ถ„์€ default๋กœ ํ•œ ํ›„ connect๋ฅผ ๋ˆŒ๋Ÿฌ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค.

4. Application ๋งŒ๋“ค๊ธฐ

Repository๋ฅผ ๋งŒ๋“  ํ›„ ์˜†์— ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด create application์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค.

Application Name์„ ์„ค์ •ํ•˜๊ณ  Project Name์€ default๋กœ ํ•˜๋ฉด ๋œ๋‹ค. sync policy๋Š” manual๊ณผ automatic์ด ์žˆ๋‹ค. automatic์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” git repository์˜ ๋ณ€๊ฒฝ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. manual๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Github action์„ ์‚ฌ์šฉํ•˜์—ฌ sync๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

path๋ถ€๋ถ„์—๋Š” ๋ฐฐํฌํ•˜๊ณ ์ž ํ•˜๋Š” ํŒŒ์ผ์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Cluster URL์€ https://kubernetes.default.svc๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. namespace๋Š” ๋ฐฐํฌํ•˜๊ณ ์ž ํ•˜๋Š” namespace๋ฅผ ์ž‘์„ฑํ•˜๊ณ  create๋ฅผ ๋ˆŒ๋Ÿฌ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

5. manual๋กœ ํ•œ ๊ฒฝ์šฐ yaml ์ž‘์„ฑ

name: Sync ArgoCD

on:
  push:
    branches:
      - main
jobs:      
  sync-argocd-github:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up ArgoCD CLI
        run: |
          curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/download/v2.6.0/argocd-linux-amd64
          chmod +x /usr/local/bin/argocd

      - name: ArgoCD Login
        run: argocd login ${{ secrets.ARGOCD_SERVER }} --username ${{ secrets.ARGOCD_USERNAME }} --password ${{ secrets.ARGOCD_PASSWORD }} --insecure

      - name: Sync ArgoCD app
        run: |
          argocd app sync test-app
          argocd app wait test-app --timeout 300

์œ„์™€ ๊ฐ™์ด workflow๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด build์— ์„ฑ๊ณตํ•˜์—ฌ pod๊ฐ€ ๋ฐฐํฌ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

6. ๋โ€ผ๏ธ

argocd๋ฅผ ์„ค์น˜ํ•˜์—ฌ github์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ repository๋Š” argocd๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์ด๋‹ค.

https://github.com/5a6io/Monitoring-Project

 

GitHub - 5a6io/Monitoring-Project: Private Project/Web ์„œ๋ฒ„ ๊ฐœ๋ฐœ/Locust๋ฅผ ์ด์šฉํ•œ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ/Grafana ์‹œ๊ฐํ™” ๋ชฉ

Private Project/Web ์„œ๋ฒ„ ๊ฐœ๋ฐœ/Locust๋ฅผ ์ด์šฉํ•œ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ/Grafana ์‹œ๊ฐํ™” ๋ชฉํ‘œ - 5a6io/Monitoring-Project

github.com


์ฐธ๊ณ