Kubernetes Tools/ArgoCD

[Ep.40] [Argo CD 운영 μ΅œμ ν™” #10] Argo CD와 GitOpsλ₯Ό ν™œμš©ν•œ λ©€ν‹°ν…Œλ„Œμ‹œ ν™˜κ²½ ꡬ성 및 RBAC 적용

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

πŸ”Ή λ©€ν‹°ν…Œλ„Œμ‹œ ν™˜κ²½μ΄ ν•„μš”ν•œ 이유

κΈ°μ—…μ˜ Kubernetes ν΄λŸ¬μŠ€ν„°λŠ” λ‹€μ–‘ν•œ νŒ€(κ°œλ°œνŒ€, QAνŒ€, μš΄μ˜νŒ€ λ“±) 및 μ„œλΉ„μŠ€κ°€ κ³΅μœ ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
이λ₯Ό 효과적으둜 κ΄€λ¦¬ν•˜λ €λ©΄ λ©€ν‹°ν…Œλ„Œμ‹œ(Multi-Tenancy) ν™˜κ²½μ„ κ΅¬μ„±ν•˜κ³ , 각 νŒ€λ³„λ‘œ κΆŒν•œμ„ μ„ΈλΆ„ν™”ν•˜μ—¬ μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

βœ… λ©€ν‹°ν…Œλ„Œμ‹œ 운영이 ν•„μš”ν•œ 이유

 

βœ” νŒ€λ³„, ν”„λ‘œμ νŠΈλ³„ λ¦¬μ†ŒμŠ€ 격리 ν•„μš”
βœ” 각 νŒ€μ˜ Kubernetes λ¦¬μ†ŒμŠ€ 접근을 μ œν•œν•˜μ—¬ λ³΄μ•ˆ κ°•ν™”
βœ” GitOps λ°©μ‹μœΌλ‘œ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 및 κΆŒν•œμ„ μžλ™ 관리
βœ” RBAC을 ν™œμš©ν•˜μ—¬ 각 νŒ€μ΄ νŠΉμ • λ„€μž„μŠ€νŽ˜μ΄μŠ€λ§Œ κ΄€λ¦¬ν•˜λ„λ‘ μ œν•œ κ°€λŠ₯


πŸ”Ή 1. Argo CDλ₯Ό ν™œμš©ν•œ λ©€ν‹°ν…Œλ„Œμ‹œ ν™˜κ²½ ꡬ성

Kubernetesμ—μ„œ λ©€ν‹°ν…Œλ„Œμ‹œλŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€(Namespace) 기반 λ˜λŠ” ν΄λŸ¬μŠ€ν„° 기반으둜 μš΄μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… 1.1 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 기반 λ©€ν‹°ν…Œλ„Œμ‹œ ꡬ성

βœ… 각 νŒ€λ³„λ‘œ λ³„λ„μ˜ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , Argo CDλ₯Ό ν™œμš©ν•˜μ—¬ μžλ™ 관리

apiVersion: v1
kind: Namespace
metadata:
  name: dev-team  # κ°œλ°œνŒ€ μ „μš© λ„€μž„μŠ€νŽ˜μ΄μŠ€
---
apiVersion: v1
kind: Namespace
metadata:
  name: qa-team  # QAνŒ€ μ „μš© λ„€μž„μŠ€νŽ˜μ΄μŠ€
---
apiVersion: v1
kind: Namespace
metadata:
  name: ops-team  # μš΄μ˜νŒ€ μ „μš© λ„€μž„μŠ€νŽ˜μ΄μŠ€

 

βœ… Argo CDλ₯Ό ν™œμš©ν•˜μ—¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€ μžλ™ 동기화

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: multi-tenancy-namespaces
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: main
    path: namespaces  # λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ •μ˜κ°€ μ €μž₯된 Git 경둜
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

 

βœ… μ„€λͺ…:
βœ” dev-team, qa-team, ops-team → 각 νŒ€λ³„ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 생성
βœ” syncPolicy.automated → Git μƒνƒœλ₯Ό μœ μ§€ν•˜μ—¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€ μžλ™ 동기화

 

βœ… 배포된 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 확인

kubectl get ns

 

βœ… 좜λ ₯ μ˜ˆμ‹œ:

NAME           STATUS    AGE
dev-team       Active    5m
qa-team        Active    5m
ops-team       Active    5m

βœ… 1.2 ν΄λŸ¬μŠ€ν„° 기반 λ©€ν‹°ν…Œλ„Œμ‹œ ꡬ성 (λ©€ν‹° ν΄λŸ¬μŠ€ν„° 운영)

βœ… νŒ€λ³„λ‘œ λ³„λ„μ˜ Kubernetes ν΄λŸ¬μŠ€ν„°λ₯Ό μš΄μ˜ν•˜λŠ” 방식
βœ… Argo CDλ₯Ό ν™œμš©ν•˜μ—¬ λ©€ν‹° ν΄λŸ¬μŠ€ν„° 동기화 κ°€λŠ₯

argocd cluster add CONTEXT_NAME

 

βœ… λ©€ν‹° ν΄λŸ¬μŠ€ν„° 동기화 μ„€μ • (ApplicationSet ν™œμš©)

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: multi-cluster-apps
  namespace: argocd
spec:
  generators:
    - list:
        elements:
          - cluster: "https://10.0.0.1:6443"
            name: "dev-cluster"
          - cluster: "https://10.0.0.2:6443"
            name: "qa-cluster"
  template:
    metadata:
      name: "{{name}}-example-app"
    spec:
      project: default
      source:
        repoURL: https://github.com/example/repo.git
        targetRevision: main
        path: k8s/manifests
      destination:
        server: "{{cluster}}"
        namespace: example
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

 

βœ… μ„€λͺ…:
βœ” ApplicationSet을 ν™œμš©ν•˜μ—¬ λ©€ν‹° ν΄λŸ¬μŠ€ν„° 동기화 μžλ™ν™”
βœ” ν΄λŸ¬μŠ€ν„°λ³„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μžλ™μœΌλ‘œ 배포


πŸ”Ή 2. Argo CD RBAC(Role-Based Access Control) μ„€μ •

βœ… 2.1 Argo CD RBAC μ„€μ • (λ„€μž„μŠ€νŽ˜μ΄μŠ€λ³„ μ ‘κ·Ό μ œν•œ)

πŸ“Œ Argo CD 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, sync, dev-team/*, allow  # κ°œλ°œνŒ€μ€ dev-team λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄ 동기화 κ°€λŠ₯
    p, qa, applications, sync, qa-team/*, allow  # QAνŒ€μ€ qa-team λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄ 동기화 κ°€λŠ₯

 

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

 

βœ… RBAC μ •μ±… 적용

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

βœ… 2.2 SSO(Single Sign-On) 연동

Argo CDλŠ” GitHub, LDAP, Keycloak λ“±μ˜ SSO(μ‹±κΈ€ μ‚¬μΈμ˜¨) 인증을 μ§€μ›ν•©λ‹ˆλ‹€.
DEXλ₯Ό ν™œμš©ν•˜μ—¬ OIDC 인증을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“Œ OIDC 기반 SSO μ„€μ • 예제

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 μ ‘κ·Ό κ°€λŠ₯


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

🟒 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 기반 λ˜λŠ” ν΄λŸ¬μŠ€ν„° 기반으둜 λ©€ν‹°ν…Œλ„Œμ‹œ ν™˜κ²½μ„ ꡬ성 κ°€λŠ₯
🟒 Argo CD RBAC을 μ μš©ν•˜μ—¬ νŒ€λ³„ μ ‘κ·Ό κΆŒν•œμ„ μ„ΈλΆ„ν™”ν•  수 있음
🟒 ApplicationSet을 ν™œμš©ν•˜μ—¬ λ©€ν‹° ν΄λŸ¬μŠ€ν„° μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 동기화 κ°€λŠ₯
🟒 SSO(Single Sign-On) 인증을 μ—°λ™ν•˜μ—¬ λ³΄μ•ˆ κ°•ν™” κ°€λŠ₯

728x90