Kubernetes Tools/ArgoCD

[Ep.29] [Argo CD ์„ฑ๋Šฅ ์ตœ์ ํ™” #6] Argo CD์—์„œ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐ RBAC ์„ค์ •

ygtoken 2025. 3. 17. 13:11
728x90

๐Ÿ”น Argo CD ๋ณด์•ˆ ๊ฐœ์š”

Argo CD๋Š” Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ GitOps ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ,
๋ณด์•ˆ์ด ์ œ๋Œ€๋กœ ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด ๋ฌด๋ถ„๋ณ„ํ•œ ์ ‘๊ทผ ๋ฐ ๊ถŒํ•œ ์˜ค๋‚จ์šฉ์œผ๋กœ ์ธํ•ด
์‹œ์Šคํ…œ์ด ์œ„ํ—˜์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Argo CD์˜ ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด RBAC(Role-Based Access Control)๊ณผ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ ์ ˆํžˆ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

โœ… Argo CD ๋ณด์•ˆ ์„ค์ •์˜ ํ•ต์‹ฌ ์š”์†Œ

 

๋ณด์•ˆ ์š”์†Œ ์„ค๋ช…
RBAC (Role-Based Access Control) ์‚ฌ์šฉ์ž ์—ญํ• (Role)์„ ์ •์˜ํ•˜์—ฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œํ•œ
SSO (Single Sign-On) ์™ธ๋ถ€ ์ธ์ฆ ์‹œ์Šคํ…œ(OAuth, OIDC, LDAP ๋“ฑ)๊ณผ ์—ฐ๋™
TLS & HTTPS API ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”
External Secrets Kubernetes Secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ

๐Ÿ”น 1. Argo CD RBAC(Role-Based Access Control) ์„ค์ •

Argo CD๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Admin, Read-Only ๋‘ ๊ฐ€์ง€ ์—ญํ• ์„ ์ œ๊ณตํ•˜์ง€๋งŒ,
๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์—ญํ• ์„ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

โœ… 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, role:admin, applications, *, */*, allow  # ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Admin ์—ญํ• 
    p, role:dev, applications, get, dev/*, allow  # ๊ฐœ๋ฐœํŒ€(Dev)์—๊ฒŒ dev ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์กฐํšŒ ๊ถŒํ•œ ๋ถ€์—ฌ
    p, role:ops, applications, sync, ops/*, allow  # ์šด์˜ํŒ€(Ops)์—๊ฒŒ ops ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™๊ธฐํ™” ๊ถŒํ•œ ๋ถ€์—ฌ

    g, user1, role:dev  # user1์€ Dev ์—ญํ•  ๋ถ€์—ฌ
    g, user2, role:ops  # user2๋Š” Ops ์—ญํ•  ๋ถ€์—ฌ
    g, admin, role:admin  # admin ๊ณ„์ •์€ Admin ์—ญํ•  ๋ถ€์—ฌ

 

โœ… ์„ค๋ช…:
โœ” policy.default: role:readonly → ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” Read-Only ๊ถŒํ•œ์„ ๊ฐ€์ง
โœ” p, role:admin, applications, *, */*, allow → Admin์€ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
โœ” p, role:dev, applications, get, dev/*, allow → Dev๋Š” dev ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ ์กฐํšŒ ๊ฐ€๋Šฅ
โœ” p, role:ops, applications, sync, ops/*, allow → Ops๋Š” ops ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋™๊ธฐํ™”(Sync)๋งŒ ๊ฐ€๋Šฅ
โœ” g, user1, role:dev → user1์€ Dev ์—ญํ• ์„ ๊ฐ€์ง

 

โœ… RBAC ์„ค์ • ์ ์šฉ ๋ฐฉ๋ฒ•

kubectl apply -f argocd-rbac-cm.yaml -n argocd

 

โœ… ํ˜„์žฌ ์ ์šฉ๋œ RBAC ์ •์ฑ… ํ™•์ธ

kubectl get configmap argocd-rbac-cm -n argocd -o yaml

๐Ÿ”น 2. Argo CD์—์„œ SSO(Single Sign-On) ์—ฐ๋™

Argo CD๋Š” ์™ธ๋ถ€ ์ธ์ฆ ์‹œ์Šคํ…œ(OIDC, OAuth2, LDAP ๋“ฑ)๊ณผ ์—ฐ๋™ํ•˜์—ฌ
์‚ฌ์šฉ์ž๊ฐ€ ์ค‘์•™ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

โœ… OIDC(OpenID Connect) ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ์„ค์ • ์˜ˆ์ œ

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  url: https://argocd.example.com  # Argo CD ์ ‘๊ทผ URL ์„ค์ •

  dex.config: |
    connectors:
      - type: oidc
        id: google
        name: Google
        config:
          issuer: https://accounts.google.com
          clientID: 
          clientSecret: 
          redirectURI: https://argocd.example.com/auth/callback

โœ… ์„ค๋ช…:
โœ” type: oidc → OIDC ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ Google ๊ณ„์ • ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ํ™œ์„ฑํ™”
โœ” issuer: https://accounts.google.com → Google OAuth ์ธ์ฆ์„ ์‚ฌ์šฉ
โœ” redirectURI: https://argocd.example.com/auth/callback → ๋กœ๊ทธ์ธ ํ›„ ๋ฆฌ๋””๋ ‰์…˜๋  URL

 

โœ… OIDC ์„ค์ • ์ ์šฉ ๋ฐฉ๋ฒ•

kubectl apply -f argocd-cm.yaml -n argocd

 

โœ… SSO ํ™œ์„ฑํ™” ํ›„ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ
Argo CD ์›น UI → Settings → Login via Google ์„ ํƒ


๐Ÿ”น 3. Argo CD API ํ†ต์‹ ์„ TLS๋กœ ๋ณดํ˜ธ

Argo CD API ์„œ๋ฒ„์™€ CLI ๊ฐ„์˜ ํŠธ๋ž˜ํ”ฝ์„ TLS(SSL)๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… TLS ์ธ์ฆ์„œ ์ž๋™ ์ ์šฉ (Let's Encrypt ์‚ฌ์šฉ)

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: argocd-tls
  namespace: argocd
spec:
  secretName: argocd-tls-secret
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
    - argocd.example.com

 

โœ… ์„ค๋ช…:
โœ” secretName: argocd-tls-secret → TLS ์ธ์ฆ์„œ๊ฐ€ ์ €์žฅ๋  Secret ์ด๋ฆ„
โœ” issuerRef.name: letsencrypt-prod → Let's Encrypt ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์š”์ฒญ
โœ” dnsNames: argocd.example.com → Argo CD์— ํ• ๋‹น๋œ ๋„๋ฉ”์ธ ์„ค์ •

 

โœ… TLS ์„ค์ • ์ ์šฉ ๋ฐฉ๋ฒ•

kubectl apply -f argocd-tls.yaml -n argocd

 

โœ… TLS ์ ์šฉ ํ™•์ธ

kubectl get secret argocd-tls-secret -n argocd

๐Ÿ”น 4. Argo CD์—์„œ External Secrets์„ ํ™œ์šฉํ•œ ๋ณด์•ˆ ๊ฐ•ํ™”

Kubernetes Secrets์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Base64 ์ธ์ฝ”๋”ฉ๋˜์–ด ์ €์žฅ๋˜๋ฏ€๋กœ,
Sealed Secrets ๋˜๋Š” External Secrets์„ ํ™œ์šฉํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

โœ… External Secrets์„ ํ™œ์šฉํ•˜์—ฌ AWS Secrets Manager์—์„œ ์‹œํฌ๋ฆฟ ๋™๊ธฐํ™”

apiVersion: external-secrets.io/v1alpha1
kind: ExternalSecret
metadata:
  name: argocd-secret
  namespace: argocd
spec:
  secretStoreRef:
    name: aws-secrets-manager
    kind: ClusterSecretStore
  target:
    name: argocd-credentials
  data:
    - secretKey: admin.password
      remoteRef:
        key: /argocd/admin-password

 

โœ… ์„ค๋ช…:
โœ” secretStoreRef: aws-secrets-manager → AWS Secrets Manager์™€ ์—ฐ๋™
โœ” data.secretKey: admin.password → /argocd/admin-password ๊ฐ’์„ Kubernetes Secret์œผ๋กœ ๋™๊ธฐํ™”

 

โœ… External Secrets ์ ์šฉ ๋ฐฉ๋ฒ•

kubectl apply -f argocd-secret.yaml -n argocd

 

โœ… ์‹œํฌ๋ฆฟ ๋™๊ธฐํ™” ํ™•์ธ

kubectl get secrets argocd-credentials -n argocd

๐Ÿ”น ๊ฒฐ๋ก : ์ด๋ฒˆ ๊ธ€์—์„œ ๋ฐฐ์šด ํ•ต์‹ฌ ๋‚ด์šฉ ์ •๋ฆฌ

๐ŸŸข Argo CD์˜ RBAC(Role-Based Access Control)์„ ์„ค์ •ํ•˜๋ฉด ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ๊ฐ€๋Šฅ
๐ŸŸข OIDC(OAuth2)๋ฅผ ํ™œ์šฉํ•œ SSO(Single Sign-On) ์—ฐ๋™์œผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ๊ฐ•ํ™” ๊ฐ€๋Šฅ
๐ŸŸข TLS(SSL) ์„ค์ •์„ ํ†ตํ•ด API ๋ฐ ์›น UI ๋ณด์•ˆ ๊ฐ•ํ™” ๊ฐ€๋Šฅ
๐ŸŸข External Secrets์„ ํ™œ์šฉํ•˜์—ฌ ์‹œํฌ๋ฆฟ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ , Git์— ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋จ

728x90