๐น 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์ ์ ์ฅํ์ง ์์๋ ๋จ