Kubernetes Tools/ArgoCD

[Ep.39] [Argo CD 운영 μ΅œμ ν™” #9] Argo CD λ³΄μ•ˆ κ°•ν™” 및 GitOps 운영 베슀트 ν”„λž™ν‹°μŠ€

ygtoken 2025. 3. 18. 10:25
728x90

πŸ”Ή Argo CD λ³΄μ•ˆ κ°•ν™”κ°€ ν•„μš”ν•œ 이유

Argo CDλŠ” GitOps 기반으둜 Kubernetes μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μžλ™ λ°°ν¬ν•˜μ§€λ§Œ,
λ³΄μ•ˆ 섀정이 미흑할 경우 Git μ €μž₯μ†Œ 유좜, ν΄λŸ¬μŠ€ν„° μ ‘κ·Ό κΆŒν•œ λ‚¨μš©, μ‹œν¬λ¦Ώ λ…ΈμΆœ λ“±μ˜ λ³΄μ•ˆ μœ„ν—˜μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

βœ… Argo CD λ³΄μ•ˆ κ°•ν™”λ₯Ό κ³ λ €ν•΄μ•Ό ν•˜λŠ” 이유

 

βœ” GitOps ν™˜κ²½μ—μ„œ μ‹œν¬λ¦Ώκ³Ό 인증 정보λ₯Ό μ•ˆμ „ν•˜κ²Œ λ³΄ν˜Έν•΄μ•Ό 함
βœ” RBAC(Role-Based Access Control)을 톡해 μ‚¬μš©μžμ˜ 접근을 μ œμ–΄ν•΄μ•Ό 함
βœ” TLS μ•”ν˜Έν™”λ₯Ό μ μš©ν•˜μ—¬ μ•ˆμ „ν•œ API 톡신을 보μž₯ν•΄μ•Ό 함
βœ” λ³΄μ•ˆ λͺ¨λ‹ˆν„°λ§μ„ 톡해 GitOps ν™˜κ²½μ—μ„œ λ°œμƒν•˜λŠ” μœ„ν˜‘μ„ 감지해야 함


πŸ”Ή 1. Argo CD RBAC(Role-Based Access Control) 적용

βœ… 1.1 Argo CD κΈ°λ³Έ RBAC μ •μ±… μ„€μ •

Argo CDλŠ” 기본적으둜 RBAC 정책을 톡해 μ‚¬μš©μž 및 μ„œλΉ„μŠ€μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“Œ κΈ°λ³Έ RBAC μ„€μ • 예제 (argocd-rbac-cm.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
  namespace: argocd
data:
  policy.default: role:readonly  # 기본적으둜 λͺ¨λ“  μ‚¬μš©μžλŠ” Read-Only κΆŒν•œλ§Œ 가짐
  policy.csv: |
    p, admin, applications, *, */*, allow  # κ΄€λ¦¬μž(Admin) λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ œμ–΄ κ°€λŠ₯
    p, dev, applications, get, */*, allow  # 개발자(Dev)λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 쑰회만 κ°€λŠ₯
    p, dev, applications, sync, dev/*, allow  # κ°œλ°œμžλŠ” dev λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄ 동기화 κ°€λŠ₯
    p, qa, applications, sync, qa/*, allow  # QA μ‚¬μš©μžλŠ” qa λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄ 동기화 κ°€λŠ₯

 

βœ… μ„€λͺ…:
βœ” policy.default: role:readonly → 기본적으둜 λͺ¨λ“  μ‚¬μš©μžλŠ” 읽기 μ „μš©(Read-Only) κΆŒν•œ
βœ” p, admin, applications, *, */*, allow → Admin μ—­ν•  μ‚¬μš©μžλŠ” λͺ¨λ“  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ œμ–΄ κ°€λŠ₯
βœ” p, dev, applications, sync, dev/*, allow → Dev μ—­ν•  μ‚¬μš©μžλŠ” dev λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œλ§Œ 동기화 κ°€λŠ₯

 

βœ… RBAC μ •μ±… 적용

kubectl apply -f argocd-rbac-cm.yaml -n argocd
kubectl rollout restart deployment argocd-server -n argocd

βœ… 1.2 Argo CD SSO(Single Sign-On) 적용

Argo CDλŠ” SSO(Single Sign-On) λ₯Ό μ§€μ›ν•˜μ—¬ λ³΄μ•ˆμ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
DEX(Identity Provider)λ₯Ό ν™œμš©ν•˜μ—¬ OIDC(OpenID Connect), GitHub, LDAP 인증을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“Œ Argo CD SSO μ„€μ • 예제 (OIDC 기반)

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  url: https://argocd.example.com
  oidc.config: |
    name: Keycloak
    issuer: https://keycloak.example.com/auth/realms/master
    clientID: argocd
    clientSecret: $oidc.keycloak.clientSecret
    requestedScopes:
      - openid
      - profile
      - email

 

βœ… μ„€λͺ…:
βœ” issuer: https://keycloak.example.com/auth/realms/masterKeycloak OIDC 제곡자 μ‚¬μš©
βœ” clientID: argocd → Argo CD의 OIDC ν΄λΌμ΄μ–ΈνŠΈ ID μ„€μ •
βœ” clientSecret: $oidc.keycloak.clientSecret → ν΄λΌμ΄μ–ΈνŠΈ μ‹œν¬λ¦Ώμ„ ν™˜κ²½ λ³€μˆ˜λ‘œ 관리

 

βœ… SSO 적용 ν›„ 둜그인 ν…ŒμŠ€νŠΈ

argocd login argocd.example.com --sso

 

βœ… SSO λ‘œκ·ΈμΈμ„ 톡해 인증 성곡 ν›„ Argo CD μ ‘κ·Ό κ°€λŠ₯


πŸ”Ή 2. Argo CD μ‹œν¬λ¦Ώ 관리 및 μ•”ν˜Έν™”

GitOps ν™˜κ²½μ—μ„œλŠ” μ‹œν¬λ¦Ώ(Secret)을 μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•˜κ³  λ°°ν¬ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
Argo CDλŠ” Sealed Secrets, External Secrets을 ν™œμš©ν•˜μ—¬ μ‹œν¬λ¦Ώμ„ μ•”ν˜Έν™”ν•˜κ³  관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… 2.1 Sealed Secrets을 ν™œμš©ν•œ μ‹œν¬λ¦Ώ μ•”ν˜Έν™”

πŸ“Œ Sealed Secrets을 ν™œμš©ν•œ μ‹œν¬λ¦Ώ 생성 및 μ•”ν˜Έν™”

kubectl create secret generic db-secret --from-literal=DB_PASSWORD='supersecret' -n example
kubectl label secret db-secret sealedsecrets.bitnami.com/sealed="true"
kubeseal --format yaml < db-secret.yaml > sealed-secret.yaml

 

πŸ“Œ Git에 μ €μž₯ν•  μ•”ν˜Έν™”λœ Sealed Secret 예제

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: db-secret
  namespace: example
spec:
  encryptedData:
    DB_PASSWORD: AgAGXt...  # μ•”ν˜Έν™”λœ 데이터

 

βœ… μ„€λͺ…:
βœ” kubeseal을 μ‚¬μš©ν•˜μ—¬ Git μ €μž₯μ†Œμ— μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•  수 μžˆλ„λ‘ μ‹œν¬λ¦Ώμ„ μ•”ν˜Έν™”
βœ” μ•”ν˜Έν™”λœ λ°μ΄ν„°λŠ” λ³΅ν˜Έν™” ν‚€ μ—†μ΄λŠ” μ ‘κ·Ό λΆˆκ°€


βœ… 2.2 External Secrets을 ν™œμš©ν•œ μ‹œν¬λ¦Ώ μ™ΈλΆ€ μ €μž₯

AWS Secrets Manager, HashiCorp Vault와 같은 μ™ΈλΆ€ μ‹œν¬λ¦Ώ 관리 μ‹œμŠ€ν…œμ„ ν™œμš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“Œ External Secrets μ„€μ • 예제 (AWS Secrets Manager 연동)

apiVersion: external-secrets.io/v1alpha1
kind: ExternalSecret
metadata:
  name: db-secret
  namespace: example
spec:
  secretStoreRef:
    name: aws-secrets
    kind: ClusterSecretStore
  target:
    name: db-secret
    creationPolicy: Owner
  data:
    - secretKey: DB_PASSWORD
      remoteRef:
        key: production/db-password  # AWS Secrets Managerμ—μ„œ 뢈러올 μ‹œν¬λ¦Ώ ν‚€

 

βœ… μ„€λͺ…:
βœ” secretStoreRef.name: aws-secrets → AWS Secrets Managerλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œν¬λ¦Ώ 관리
βœ” remoteRef.key: production/db-password → AWS Secretsμ—μ„œ νŠΉμ • ν‚€λ₯Ό λΆˆλŸ¬μ™€ Kubernetes에 적용


πŸ”Ή 3. Argo CD λ³΄μ•ˆ λͺ¨λ‹ˆν„°λ§ 및 감사 둜그 ν™œμ„±ν™”

λ³΄μ•ˆ 이벀트λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•˜κ³  감사(Audit) 둜그λ₯Ό ν™œμ„±ν™”ν•˜μ—¬
λˆ„κ°€, μ–Έμ œ, μ–΄λ–€ 변경을 μˆ˜ν–‰ν–ˆλŠ”μ§€ 좔적 κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

βœ… 3.1 Argo CD 감사(Audit) 둜그 ν™œμ„±ν™”

πŸ“Œ Argo CD 둜그 μ„€μ • (argocd-cm.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  application.instanceLabelKey: argocd.argoproj.io/instance
  server.enable.audit: "true"  # 감사 둜그 ν™œμ„±ν™”

 

βœ… μ„€λͺ…:
βœ” server.enable.audit: "true" → Argo CD 감사 둜그 ν™œμ„±ν™”

 

βœ… 둜그 확인 방법

kubectl logs -l app.kubernetes.io/name=argocd-server -n argocd

πŸ”Ή κ²°λ‘ : 이번 κΈ€μ—μ„œ 배운 핡심 λ‚΄μš© 정리

🟒 RBAC 및 SSO(Single Sign-On) μ μš©μ„ 톡해 λ³΄μ•ˆ κ°•ν™”λ₯Ό μˆ˜ν–‰ κ°€λŠ₯
🟒 Sealed Secrets, External Secrets을 ν™œμš©ν•˜μ—¬ μ‹œν¬λ¦Ώμ„ μ•ˆμ „ν•˜κ²Œ 관리 κ°€λŠ₯
🟒 감사(Audit) 둜그 및 λ³΄μ•ˆ λͺ¨λ‹ˆν„°λ§μ„ ν™œμ„±ν™”ν•˜μ—¬ GitOps ν™˜κ²½μ˜ λ³΄μ•ˆμ„±μ„ κ°•ν™” κ°€λŠ₯

728x90