πΉ λ©ν°ν λμ νκ²½μ΄ νμν μ΄μ
κΈ°μ
μ 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/master → Keycloak 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) μΈμ¦μ μ°λνμ¬ λ³΄μ κ°ν κ°λ₯