๐น 1. Argo CD์์ ConfigMap์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
โ ํ๊ฒฝ๋ณ ConfigMap ์ ์ฉ (Kustomize ํ์ฉ)
๐ ๊ธฐ๋ณธ ConfigMap (base/configmap.yaml)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config # ConfigMap ์ด๋ฆ
data:
LOG_LEVEL: "info" # ๊ธฐ๋ณธ ๋ก๊ทธ ๋ ๋ฒจ
DATABASE_URL: "postgres://db:5432/dev" # ๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค URL
๐ ์ด์ ํ๊ฒฝ ์ค๋ฒ๋ ์ด (overlays/prod/kustomization.yaml)
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base # ๊ธฐ๋ณธ ConfigMap์ ์ฐธ์กฐ
patches: # ์ด์ ํ๊ฒฝ์ ๋ง๊ฒ ์ค์ ๋ณ๊ฒฝ
- target:
kind: ConfigMap
name: app-config
patch: |-
- op: replace
path: /data/LOG_LEVEL
value: "error" # ์ด์ ํ๊ฒฝ์์๋ ๋ก๊ทธ ๋ ๋ฒจ์ "error"๋ก ๋ณ๊ฒฝ
- op: replace
path: /data/DATABASE_URL
value: "postgres://db:5432/prod" # ์ด์ ํ๊ฒฝ DB URL ์ ์ฉ
๐ Argo CD์์ Kustomize ๊ธฐ๋ฐ์ผ๋ก ConfigMap์ ๊ด๋ฆฌํ๋ Application ์ ์
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-configmap-app # Argo CD์์ ๊ด๋ฆฌํ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
namespace: argocd # Argo CD๊ฐ ๋ฐฐํฌํ ๋ค์์คํ์ด์ค
spec:
project: default
source:
repoURL: https://github.com/example/repo.git # Git ์ ์ฅ์ URL
targetRevision: main # ์ฌ์ฉํ Git ๋ธ๋์น
path: kustomize/overlays/prod # ์ด์ ํ๊ฒฝ ConfigMap ์ ์ฉ
destination:
server: https://kubernetes.default.svc # ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ฃผ์
namespace: example # ๋ฐฐํฌํ ๋ค์์คํ์ด์ค
syncPolicy:
automated:
prune: true # Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๋ฅผ Kubernetes์์๋ ์ญ์
selfHeal: true # Kubernetes ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ Git ์ํ๋ก ์๋ ๋ณต๊ตฌ
๐น 2. Argo CD์์ Secret์ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
GitOps ํ๊ฒฝ์์๋ Secret์ ์ง์ Git ์ ์ฅ์์ ์ ์ฅํ๋ ๊ฒ์ด ๋ณด์์ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Sealed Secrets ๋๋ External Secrets์ ํ์ฉํ ์ ์์ต๋๋ค.
โ ๋ฐฉ๋ฒ 1: Sealed Secrets์ ํ์ฉํ Secret ๊ด๋ฆฌ
๐ Sealed Secrets ์ปจํธ๋กค๋ฌ ์ค์น (Helm Chart ์ฌ์ฉ)
helm install sealed-secrets bitnami-labs/sealed-secrets -n kube-system
๐ Sealed Secrets๋ฅผ ํ์ฉํ ์ํธํ๋ Secret ์์ฑ
kubectl create secret generic db-secret --from-literal=DB_PASSWORD='supersecret' -n example
kubectl label secret db-secret sealedsecrets.bitnami.com/sealed="true" # Sealed Secrets ์ ์ฉ
kubeseal --format yaml < db-secret.yaml > sealed-secret.yaml # Secret์ ์ํธํํ์ฌ Git์ ์ ์ฅ ๊ฐ๋ฅ
๐ Git์ ์ ์ฅํ ์ํธํ๋ Sealed Secret ์์
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: db-secret # Sealed Secret ์ด๋ฆ
namespace: example
spec:
encryptedData:
DB_PASSWORD: AgAGXt... # ์ํธํ๋ ๋ฐ์ดํฐ (๋ณตํธํ ๋ถ๊ฐ)
๐ Argo CD์์ Sealed Secrets๋ฅผ ํ์ฉํ Application ์ ์
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-sealed-secrets # Argo CD์์ ๊ด๋ฆฌํ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/repo.git # Git ์ ์ฅ์ URL
targetRevision: main # ์ฌ์ฉํ Git ๋ธ๋์น
path: sealed-secrets # Sealed Secrets์ด ์ ์ฅ๋ ๊ฒฝ๋ก
destination:
server: https://kubernetes.default.svc # ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ฃผ์
namespace: example # ๋ฐฐํฌํ ๋ค์์คํ์ด์ค
syncPolicy:
automated:
prune: true # Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๋ฅผ Kubernetes์์๋ ์ญ์
selfHeal: true # Kubernetes ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ Git ์ํ๋ก ์๋ ๋ณต๊ตฌ
โ ๋ฐฉ๋ฒ 2: External Secrets์ ํ์ฉํ Secret ๊ด๋ฆฌ
๐ External Secrets ์ปจํธ๋กค๋ฌ ์ค์น
helm install external-secrets external-secrets/external-secrets -n kube-system
๐ AWS Secrets Manager๋ฅผ ํ์ฉํ Secret ์ฐ๋ ์์
apiVersion: external-secrets.io/v1alpha1
kind: ExternalSecret
metadata:
name: db-secret # External Secret ์ด๋ฆ
namespace: example
spec:
secretStoreRef:
name: aws-secrets # AWS Secrets Manager์ ์ฐ๋
kind: ClusterSecretStore
target:
name: db-secret # ์ฟ ๋ฒ๋คํฐ์ค Secret์ผ๋ก ์์ฑํ ์ด๋ฆ
creationPolicy: Owner # Secret์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์์ฑ
data:
- secretKey: DB_PASSWORD # ์ฟ ๋ฒ๋คํฐ์ค Secret์์ ์ฌ์ฉํ ํค
remoteRef:
key: production/db-password # AWS Secrets Manager์ ์ ์ฅ๋ Secret ํค
๐ Argo CD์์ External Secrets๋ฅผ ํ์ฉํ Application ์ ์
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-external-secrets # Argo CD์์ ๊ด๋ฆฌํ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/repo.git # Git ์ ์ฅ์ URL
targetRevision: main # ์ฌ์ฉํ Git ๋ธ๋์น
path: external-secrets # External Secrets ์ค์ ์ด ์ ์ฅ๋ ๊ฒฝ๋ก
destination:
server: https://kubernetes.default.svc # ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์ฃผ์
namespace: example # ๋ฐฐํฌํ ๋ค์์คํ์ด์ค
syncPolicy:
automated:
prune: true # Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๋ฅผ Kubernetes์์๋ ์ญ์
selfHeal: true # Kubernetes ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ Git ์ํ๋ก ์๋ ๋ณต๊ตฌ
๐น 4. Secret ๋ฐ ConfigMap ์ด์ ์ ๊ณ ๋ คํ ์
โ
1๏ธโฃ GitOps ๋ณด์ ์์น ์ค์
โ Secret์ Git์ ์ง์ ์ ์ฅํ์ง ๋ง๊ณ , Sealed Secrets ๋๋ External Secrets์ ์ฌ์ฉ
โ
2๏ธโฃ ํ๊ฒฝ๋ณ ConfigMap ๊ด๋ฆฌ ์ ๋ต
โ Kustomize ์ค๋ฒ๋ ์ด๋ฅผ ํ์ฉํ์ฌ Dev, Staging, Prod ํ๊ฒฝ์ ๋ถ๋ฆฌ
โ
3๏ธโฃ CI/CD ํ์ดํ๋ผ์ธ ์ฐ๋
โ Sealed Secrets ์ํธํ๋ฅผ ์๋ํํ๊ณ , External Secrets์ ํตํ ์ธ๋ถ ์ธ์ฆ ๊ด๋ฆฌ
โ
4๏ธโฃ Argo CD์ ์ฐ๋ํ์ฌ ์๋ํ ์ ์ง
โ selfHeal: true ์ต์
์ ํ์ฑํํ์ฌ Secret์ด ์์๋ ๊ฒฝ์ฐ ์๋ ๋ณต๊ตฌ
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข Kubernetes์ ConfigMap๊ณผ Secret์ GitOps ๋ฐฉ์์ผ๋ก ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ต
๐ข Sealed Secrets, External Secrets์ ํ์ฉํ์ฌ GitOps ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ๊ฐ๋ฅ
๐ข ํ๊ฒฝ๋ณ ConfigMap์ Kustomize๋ฅผ ํตํด ๋ถ๋ฆฌํ์ฌ ์ ์ฐํ๊ฒ ์ด์ ๊ฐ๋ฅ
๐ข GitOps ์์น์ ์ ์งํ๋ฉด์๋ Secret์ ์์ ํ๊ฒ ์ ์ฅํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ฉ ๊ฐ๋ฅ