๐น 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/master → Keycloak 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 ํ๊ฒฝ์ ๋ณด์์ฑ์ ๊ฐํ ๊ฐ๋ฅ