2026๋ Kubernetes ์ํฌ๋ฆฟ ๊ด๋ฆฌ ์๋ฒฝ ๊ฐ์ด๋: External Secrets, Vault, ๋ฉด์ ๋๋น
Kubernetes ์ํฌ๋ฆฟ ๊ด๋ฆฌ์ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃน๋๋ค. External Secrets Operator, HashiCorp Vault ์ฐ๋, ํ๋ก๋์ ํ๊ฒฝ ๋ชจ๋ฒ ์ฌ๋ก, ๊ธฐ์ ๋ฉด์ ๋น์ถ ์ง๋ฌธ๊น์ง ์์ธํ ์ค๋ช ํฉ๋๋ค.

Kubernetes ์ํฌ๋ฆฟ ๊ด๋ฆฌ๋ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์์ ๊ฐ์ฅ ์ค์ํ ๋ณด์ ๊ณผ์ ์ค ํ๋์ ๋๋ค. ๋ค์ดํฐ๋ธ Kubernetes Secret์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ base64 ์ธ์ฝ๋ฉ์ผ๋ก ์ ์ฅํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฅ ์ ์ํธํ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ด๋ฌํ ์ทจ์ฝ์ ์ DevOps ์ฑ์ฉ ๋ฉด์ ์์ ์์ฃผ ๋ค๋ค์ง๋ ๋ณด์ ์ํ์ ์ผ๊ธฐํฉ๋๋ค.
Kubernetes ์ํฌ๋ฆฟ ๋ณด์์ ๋ํด ์ง๋ฌธ๋ฐ์ ๋: ๋ค์ดํฐ๋ธ Secret์ base64 ์ธ์ฝ๋ฉ์ด๋ฉฐ ์ํธํ๊ฐ ์๋๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ HashiCorp Vault ๋๋ AWS Secrets Manager์ ๊ฐ์ ์ธ๋ถ ์ํฌ๋ฆฟ ๊ด๋ฆฌ์๊ฐ ํ์ํ๋ฉฐ, External Secrets Operator(ESO)๋ฅผ ํตํด ๋๊ธฐํํฉ๋๋ค. ์ด๋ฌํ ๋ถ๋ฆฌ๋ฅผ ํตํด ์ํฌ๋ฆฟ์ด Git ์ ์ฅ์์ ์กด์ฌํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ค์ดํฐ๋ธ Kubernetes Secret์ ํ๊ณ
๋ด์ฅ Secret ๋ฆฌ์์ค๋ etcd์ base64 ์ธ์ฝ๋ฉ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด ์ธ์ฝ๋ฉ์ ๋จ์ผ ๋ช ๋ น์ผ๋ก ๋ณต์ํ ์ ์์ต๋๋ค:
# decoding-secret.sh
# Kubernetes ์ํฌ๋ฆฟ ๊ฐ์ ์ฆ์ ๋์ฝ๋ฉ
kubectl get secret db-credentials -o jsonpath='{.data.password}' | base64 -dbase64๋ ์ํธํ๊ฐ ์๋๋๋ค. ํด๋ฌ์คํฐ ์ ๊ทผ ๊ถํ์ด ์๋ ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ์ํฌ๋ฆฟ ๊ฐ์ ์ฝ์ ์ ์์ต๋๋ค. Kubernetes ๋ฌธ์์์๋ Secret์ด "๊ธฐ๋ณธ์ ์ผ๋ก ์ํธํ๋์ง ์๋๋ค"๊ณ ๋ช ์ํ๋ฉฐ, ์ ์ฅ ์ ์ํธํ๋ฅผ ํ์ฑํํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
ํ๋ก๋์ ๋ฐฐํฌ์ ์ํฅ์ ๋ฏธ์น๋ ์ธ ๊ฐ์ง ์ฃผ์ ์ ํ ์ฌํญ์ด ์์ต๋๋ค:
- ๊ฐ์ฌ ์ถ์ ๋ถ์ฌ: ๋ค์ดํฐ๋ธ Secret์ ๋๊ฐ ์ธ์ ์ด๋ค ๊ฐ์ ์ ๊ทผํ๋์ง์ ๋ํ ๋ก๊ทธ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค
- ๋กํ ์ด์ ๋ฉ์ปค๋์ฆ ๋ถ์ฌ: ์ํฌ๋ฆฟ ๋ณ๊ฒฝ์๋ ์๋ ๊ฐ์ ๊ณผ Pod ์ฌ์์์ด ํ์ํฉ๋๋ค
- GitOps ๋นํธํ์ฑ: ์ํธํ๋ ์ํฌ๋ฆฟ์ Git์ ์ ์ฅํด๋ ์ํธํ ํค ๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ๋จ์ต๋๋ค
External Secrets Operator ์ํคํ ์ฒ
External Secrets Operator(ESO)๋ Kubernetes์ ์ธ๋ถ ์ํฌ๋ฆฟ ๊ด๋ฆฌ ์์คํ ์ ์ฐ๊ฒฐํฉ๋๋ค. 2023๋ CNCF Sandbox ํ๋ก์ ํธ๋ก ์ถ์๋์ด 2026๋ ์ v0.10์ ๋๋ฌํ์ต๋๋ค. ESO๋ AWS Secrets Manager, HashiCorp Vault, Google Secret Manager, Azure Key Vault ๋ฐ 15๊ฐ ์ด์์ ๋ฐฑ์๋๋ฅผ ์ง์ํฉ๋๋ค.
์ํคํ ์ฒ๋ ์ธ ๊ฐ์ง ์ปค์คํ ๋ฆฌ์์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
# secret-store.yaml
# ClusterSecretStore๋ Vault๋ก์ ์ฐ๊ฒฐ์ ์ ์
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: vault-backend
spec:
provider:
vault:
server: "https://vault.internal:8200"
path: "secret"
version: "v2"
auth:
kubernetes:
mountPath: "kubernetes"
role: "external-secrets"
serviceAccountRef:
name: "external-secrets"
namespace: "external-secrets"์ด ClusterSecretStore๋ Kubernetes ์๋น์ค ๊ณ์ ํ ํฐ์ ์ฌ์ฉํ์ฌ Vault์์ ์ธ์ฆํ๋๋ก ESO๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. kubernetes ์ธ์ฆ ๋ฐฉ์์ ํด๋ฌ์คํฐ์ TokenReview API์ ๋ํด ์๋น์ค ๊ณ์ JWT๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
# external-secret.yaml
# ExternalSecret์ ์ค์ ์ํฌ๋ฆฟ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋๊ธฐํ
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-credentials
namespace: production
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: db-secret
creationPolicy: Owner
data:
- secretKey: username
remoteRef:
key: secret/data/production/database
property: username
- secretKey: password
remoteRef:
key: secret/data/production/database
property: passwordESO๋ 1์๊ฐ๋ง๋ค Vault๋ฅผ ํด๋งํ๊ณ (refreshInterval: 1h), Kubernetes Secret์ ์๋์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค. creationPolicy: Owner๋ ExternalSecret์ด ์ญ์ ๋ ๋ Secret๋ ์ญ์ ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
HashiCorp Vault ์ฐ๋ ํจํด
Vault๋ ๋์ ์ํฌ๋ฆฟ, ์๋ ๋กํ ์ด์ , ํฌ๊ด์ ์ธ ๊ฐ์ฌ ๋ก๊น ์ ์ ๊ณตํฉ๋๋ค. Vault Kubernetes ์ธ์ฆ ๋ฌธ์์ ์ค๋ช ๋ Kubernetes ์ธ์ฆ ๋ฐฉ์์ ํตํด ์ฅ๊ธฐ ์๊ฒฉ ์ฆ๋ช ์ ๋ฐฐํฌํ์ง ์๊ณ ๋ Pod๊ฐ ์ธ์ฆํ ์ ์์ต๋๋ค.
Vault ์ธ์ฆ ์ค์ ์๋ ์ธ ๊ฐ์ง ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค:
# vault-k8s-auth.sh
# Vault์์ Kubernetes ์ธ์ฆ ๋ฐฉ์ ํ์ฑํ
vault auth enable kubernetes
# Kubernetes API์ ๋ํด ํ ํฐ์ ๊ฒ์ฆํ๋๋ก Vault ๊ตฌ์ฑ
vault write auth/kubernetes/config \
kubernetes_host="https://kubernetes.default.svc:443" \
kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
# ์๋น์ค ๊ณ์ ์ ์ ์ฑ
์ ๋ฐ์ธ๋ฉํ๋ ์ญํ ์์ฑ
vault write auth/kubernetes/role/external-secrets \
bound_service_account_names=external-secrets \
bound_service_account_namespaces=external-secrets \
policies=readonly-secrets \
ttl=1h์ด ๊ตฌ์ฑ์ external-secrets ์๋น์ค ๊ณ์ ์ Vault ์ ์ฑ
์ ๋ฐ์ธ๋ฉํฉ๋๋ค. TTL์ ํ ํฐ ์ ํจ ๊ธฐ๊ฐ์ ์ ํํ์ฌ ์ฌ์ธ์ฆ์ ๊ฐ์ ํ๊ณ , ์์๋ ํ ํฐ์ ์ํฅ ๋ฒ์๋ฅผ ์ค์
๋๋ค.
ํ๋ก๋์ ๋ฐฐํฌ์์๋ ์ต์ ๊ถํ ์์น์ ๋ฐ๋ฅด๋ ์ ์ฑ ์ด ํ์ํฉ๋๋ค:
# readonly-secrets.hcl
# ํน์ ๊ฒฝ๋ก์ ๋ํ ์ฝ๊ธฐ ์ ์ฉ ์ ๊ทผ์ ๋ถ์ฌํ๋ Vault ์ ์ฑ
path "secret/data/production/*" {
capabilities = ["read"]
}
path "secret/metadata/production/*" {
capabilities = ["list"]
}์ด ์ ์ฑ ์ ํ๋ก๋์ ์ํฌ๋ฆฟ ๊ฒฝ๋ก์ ๋ํ ์ฝ๊ธฐ ์ ๊ทผ๋ง ๋ถ์ฌํฉ๋๋ค. ๋ค๋ฅธ ํ๊ฒฝ์ ๊ด๋ฆฌํ๋ ํ์ ํด๋น ๊ฒฝ๋ก ์ ํ์ด ์๋ ๋ณ๋์ ์ ์ฑ ์ ๋ฐ์ต๋๋ค.
๋ค์ดํ์ ์๋ ์ํฌ๋ฆฟ ๋กํ ์ด์
์๋ ๋กํ ์ด์ ์ ์ํฌ๋ฆฟ์ด ๋ ธํํ๋ ๊ณต๊ฒฉ ๋ฒกํฐ๊ฐ ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ESO๋ Kubernetes ์ธก์ ์ฒ๋ฆฌํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์์ ์์ด ์ํฌ๋ฆฟ์ ๋ค์ ๋ก๋ํด์ผ ํฉ๋๋ค.
์ ๋ก ๋ค์ดํ์ ๋กํ ์ด์ ์ ์ํ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค:
ํ์ผ ๊ฐ์๋ฅผ ํตํ ๋ณผ๋ฅจ ๋ง์ดํธ ์ํฌ๋ฆฟ:
# deployment-volume-secrets.yaml
# ์๋์ผ๋ก ์
๋ฐ์ดํธ๋๋ ํ์ผ๋ก ์ํฌ๋ฆฟ ๋ง์ดํธ
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
template:
spec:
containers:
- name: api
image: api:v2.1.0
volumeMounts:
- name: secrets
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secrets
secret:
secretName: db-secretKubernetes๋ kubelet ๋๊ธฐํ ๊ธฐ๊ฐ ๋ด(๊ธฐ๋ณธ 1๋ถ)์ ๋ง์ดํธ๋ ์ํฌ๋ฆฟ ํ์ผ์ ์
๋ฐ์ดํธํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ /etc/secrets/password์์ ์๊ฒฉ ์ฆ๋ช
์ ์ฝ์ด ์ฌ์์ ์์ด ์ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
ํ๊ฒฝ ๋ณ์ ์ํฌ๋ฆฟ์ ์ํ Reloader:
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ Pod ์ฌ์์์ด ํ์ํฉ๋๋ค. Stakater Reloader๊ฐ ์ด๋ฅผ ์๋ํํฉ๋๋ค:
# deployment-with-reloader.yaml
# ์ด๋
ธํ
์ด์
์ด ์ํฌ๋ฆฟ ๋ณ๊ฒฝ ์ ๋กค๋ง ์ฌ์์์ ํธ๋ฆฌ๊ฑฐ
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
annotations:
reloader.stakater.com/auto: "true"
spec:
template:
spec:
containers:
- name: api
envFrom:
- secretRef:
name: db-secretReloader๋ Secret ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์ํ๊ณ ๋กค๋ง ์ฌ์์์ ์ํํ์ฌ ๋กํ ์ด์ ์ค ๊ฐ์ฉ์ฑ์ ์ ์งํฉ๋๋ค.
DevOps ๋ฉด์ ์ค๋น๊ฐ ๋์ จ๋์?
์ธํฐ๋ํฐ๋ธ ์๋ฎฌ๋ ์ดํฐ, flashcards, ๊ธฐ์ ํ ์คํธ๋ก ์ฐ์ตํ์ธ์.
Kubernetes ์ํฌ๋ฆฟ ๋ฉด์ ์ง๋ฌธ
DevOps ๋ฉด์ ์์๋ ์ํฌ๋ฆฟ ๊ด๋ฆฌ์ ๋ํ ์ดํด๋ฅผ ์ผ๊ด๋๊ฒ ํ ์คํธํฉ๋๋ค. ์ด๋ฌํ ์ง๋ฌธ์ ์ฃผ๋์ด๋ถํฐ ์๋์ด ๋ ๋ฒจ๊น์ง ์ถ์ ๋ฉ๋๋ค:
Q: Kubernetes Secret์ด ์ฌ์ฉํ๋ ์ธ์ฝ๋ฉ์ ๋ฌด์์ด๋ฉฐ, ์ ๋ณด์์ ๋ถ์ถฉ๋ถํฉ๋๊น?
Secret์ base64 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ๊ฐ์ญ ๋ณํ์ด์ง ์ํธํ๊ฐ ์๋๋๋ค. Secret์ ๋ํ get ๊ถํ์ด ์๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋์ฝ๋ฉํ ์ ์์ต๋๋ค. ๋ณด์์ ์ํด์๋ ์ ์ฅ ์ ์ํธํ(etcd ์ํธํ ํ์ฑํ)์ RBAC ๊ถํ ์ ํ์ด ํ์ํฉ๋๋ค. ๋ ๊น์ Kubernetes ๊ฐ๋
์ ๋ํด์๋ Kubernetes ๋ฉด์ ๊ธฐ์ด๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Q: GitOps๋ฅผ ์ฌ์ฉํ ๋ ์ํฌ๋ฆฟ์ด Git ์ ์ฅ์์ ๋ํ๋์ง ์๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
External Secrets Operator๋ ๊ฐ ์์ฒด๊ฐ ์๋ ์ํฌ๋ฆฟ์ ๋ํ ์ฐธ์กฐ๋ง Git์ ์ ์ฅํฉ๋๋ค. ExternalSecret ๋งค๋ํ์คํธ์๋ Vault ๋๋ AWS Secrets Manager์ ์ํฌ๋ฆฟ ๊ฒฝ๋ก๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ค์ ์ํฌ๋ฆฟ์ ์ ์ฅ์์ ์ ๋ ์ ์ดํ์ง ์์ต๋๋ค. Bitnami์ Sealed Secrets๋ ๋น๋์นญ ์ํธํ๋ฅผ ์ฌ์ฉํ๋ ๋์์ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
Q: SecretStore์ ClusterSecretStore์ ์ฐจ์ด์ ์ ์ค๋ช ํ์ญ์์ค.
SecretStore๋ ๋ค์์คํ์ด์ค ๋ฒ์์ ๋๋ค: ๋์ผํ ๋ค์์คํ์ด์ค์ ExternalSecrets๊ฐ ์ด๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ClusterSecretStore๋ ํด๋ฌ์คํฐ ์ ์ฒด ๋ฒ์์ ๋๋ค: ๋ชจ๋ ๋ค์์คํ์ด์ค์์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ํ์ด ๋จ์ผ Vault ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ ๋๋ ClusterSecretStore๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฐ ๋ค์์คํ์ด์ค๊ฐ ๊ฒฉ๋ฆฌ๋ ์ํฌ๋ฆฟ ๋ฐฑ์๋๋ฅผ ๊ฐ์ง ๋๋ SecretStore๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Q: ๋ฐฐํฌ ํ Pod๊ฐ ์ํฌ๋ฆฟ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ํธ๋ฌ๋ธ์ํ ํ์๊ฒ ์ต๋๊น?
ExternalSecret ์ํ๋ถํฐ ์์ํฉ๋๋ค:
# troubleshoot-secrets.sh
# ExternalSecret ๋๊ธฐํ ์ํ ๋ฐ ์กฐ๊ฑด ํ์ธ
kubectl get externalsecret database-credentials -o yaml
# Secret์ด ์์ฑ๋์๋์ง ํ์ธ
kubectl get secret db-secret -o yaml
# ์ธ์ฆ ์ค๋ฅ์ ๋ํด ESO ์ปจํธ๋กค๋ฌ ๋ก๊ทธ ํ์ธ
kubectl logs -n external-secrets deployment/external-secrets์ผ๋ฐ์ ์ธ ์คํจ ์์ธ์ผ๋ก๋ ๋ง๋ฃ๋ Vault ํ ํฐ, ์๋ชป๋ ์ํฌ๋ฆฟ ๊ฒฝ๋ก, ClusterSecretStore์ RBAC ๊ตฌ์ฑ ์ค๋ฅ๊ฐ ์์ต๋๋ค.
Q: ํ๋ก๋์ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๊ฒฉ ์ฆ๋ช ์ ์ํฌ๋ฆฟ ๋กํ ์ด์ ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์๊ฒ ์ต๋๊น?
Vault์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํฌ๋ฆฟ ์์ง์ ๋์ ์ด๊ณ ์๋ช
์ด ์งง์ ์๊ฒฉ ์ฆ๋ช
์ ์์ฑํฉ๋๋ค. ์๊ฒฉ ์ฆ๋ช
TTL๋ณด๋ค ์งง์ refreshInterval๋ก ESO๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๋กํ
์ด์
์ด ํ์ํ ์ ์ ์๊ฒฉ ์ฆ๋ช
์ ๊ฒฝ์ฐ, Vault์ ๋กํ
์ด์
API์ Reloader๋ฅผ ๊ฒฐํฉํ์ฌ ์
๋ฐ์ดํธ ํ Pod๋ฅผ ์ฌ์์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋กํ
์ด์
๊ธฐ๊ฐ ๋์ ์ฐ๊ฒฐ ์คํจ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
AWS Secrets Manager์ ESO
AWS Secrets Manager ์ฐ๋์๋ ์๋น์ค ๊ณ์ ์ฉ IAM ์ญํ (IRSA)์ด ํ์ํฉ๋๋ค. ์ด ํจํด์ ์ ์ ์๊ฒฉ ์ฆ๋ช ์ ์์ ํ ์ ๊ฑฐํฉ๋๋ค:
# aws-secret-store.yaml
# IRSA๋ฅผ ์ฌ์ฉํ AWS Secrets Manager์ฉ ClusterSecretStore
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: aws-secrets
spec:
provider:
aws:
service: SecretsManager
region: ap-northeast-2
auth:
jwt:
serviceAccountRef:
name: external-secrets-sa
namespace: external-secrets์๋น์ค ๊ณ์ ์ด๋ ธํ ์ด์ ์ด IAM ์ญํ ์ ์ฐ๊ฒฐ๋ฉ๋๋ค:
# service-account-irsa.yaml
# IAM ์ญํ ์ด๋
ธํ
์ด์
์ด ์๋ ์๋น์ค ๊ณ์
apiVersion: v1
kind: ServiceAccount
metadata:
name: external-secrets-sa
namespace: external-secrets
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789:role/external-secretsAWS๋ Lambda ํจ์๋ฅผ ์ฌ์ฉํ์ฌ Secrets Manager์์ ์์ฑ๋ ์ํฌ๋ฆฟ์ ์๋์ผ๋ก ๋กํ ์ด์ ํฉ๋๋ค. ESO์ ๋ฆฌํ๋ ์ ๊ฐ๊ฒฉ๊ณผ ๊ฒฐํฉํ๋ฉด, ๊ตฌ์ฑ๋ ํด๋ง ๊ธฐ๊ฐ ๋ด์ ์ํฌ๋ฆฟ์ด Kubernetes๋ก ์ ํ๋ฉ๋๋ค.
๋ฉํฐ ํด๋ฌ์คํฐ ์ํฌ๋ฆฟ ๋๊ธฐํ
์ฌ๋ฌ ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๋ ์กฐ์ง์๋ ์ผ๊ด๋ ์ํฌ๋ฆฟ ๋ฐฐํฌ๊ฐ ํ์ํฉ๋๋ค. ์ด ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ๋ ๋ ๊ฐ์ง ํจํด์ด ์์ต๋๋ค:
ClusterSecretStore๋ฅผ ์ฌ์ฉํ ํ๋ธ ์ค ์คํฌํฌ:
๋ชจ๋ ํด๋ฌ์คํฐ๊ฐ ์ค์ Vault ์ธ์คํด์ค์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๊ฐ ํด๋ฌ์คํฐ์ ESO ์ค์น๊ฐ ๋์ผํ ์ํฌ๋ฆฟ์ ์ฐธ์กฐํ๊ณ , Vault๊ฐ ๋ค์์คํ์ด์ค ๊ธฐ๋ฐ ์ ์ฑ ์ ํตํด ์ ๊ทผ ์ ์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
Vault Enterprise๋ฅผ ํตํ ๋ณต์ :
Vault Enterprise๋ ๋ฆฌ์ ๊ฐ ์ฑ๋ฅ ๋ณต์ ๋ฅผ ์ง์ํฉ๋๋ค. ๊ฐ ํด๋ฌ์คํฐ๊ฐ ๋ก์ปฌ Vault ๋ณต์ ๋ณธ์ ์ฐ๊ฒฐํ์ฌ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์ ์ง์ฐ ์๊ฐ์ ์ค์ ๋๋ค. Vault ๋ณต์ ๋ฌธ์์์ ์ฌํด ๋ณต๊ตฌ ๋ฐ ์ฑ๋ฅ ๋ณต์ ๋ชจ๋๋ฅผ ๋ค๋ฃน๋๋ค.
ArgoCD๋ฅผ ์ฌ์ฉํ๋ ํ์ ๊ฒฝ์ฐ, GitOps ๋ฐฐํฌ ํจํด ๋ฌธ์์์ ์ฌ๋ฌ ํด๋ฌ์คํฐ์ ExternalSecrets๋ฅผ ๋ฐฐํฌํ๋ ApplicationSets๋ฅผ ์ค๋ช ํฉ๋๋ค.
์ํฌ๋ฆฟ ์ ๊ทผ์ ์ํ RBAC ๊ฐํ
๊ธฐ๋ณธ ํด๋ฌ์คํฐ ์ญํ ์ ๊ณผ๋ํ ์ํฌ๋ฆฟ ์ ๊ทผ์ ๋ถ์ฌํฉ๋๋ค. ์ต์ํ์ ์ญํ ์ ์์ฑํ์ฌ RBAC๋ฅผ ๊ฐํํฉ๋๋ค:
# restricted-role.yaml
# ํน์ ๋ค์์คํ์ด์ค์์๋ง ์ํฌ๋ฆฟ ์ ๊ทผ์ ํ์ฉํ๋ ์ญํ
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: secret-reader
namespace: production
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get"]
resourceNames: ["db-secret", "api-key"]resourceNames ํ๋๋ ๋ช
์์ ์ผ๋ก ๋์ด๋ ์ํฌ๋ฆฟ์ ๋ํ ์ ๊ทผ์ ์ ํํฉ๋๋ค. ์ด ํ๋๊ฐ ์์ผ๋ฉด ์ญํ ์ ๋ค์์คํ์ด์ค์ ๋ชจ๋ ์ํฌ๋ฆฟ์ ๋ํ ์ ๊ทผ์ ๋ถ์ฌํฉ๋๋ค.
๊ฒฐ๋ก
Kubernetes ์ํฌ๋ฆฟ ๊ด๋ฆฌ๋ base64 ์ธ์ฝ๋ฉ์ ํ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์์ ์์ํฉ๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ External Secrets Operator๋ฅผ ํตํ HashiCorp Vault ๋๋ AWS Secrets Manager์ ๊ฐ์ ์ธ๋ถ ์ํฌ๋ฆฟ ๊ด๋ฆฌ์๊ฐ ํ์ํฉ๋๋ค.
ํต์ฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: ๋ค์ดํฐ๋ธ Secret์ ์ํธํ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค, ESO๋ ์ธ๋ถ ๋ฐฑ์๋์์ ๋๊ธฐํ๋ฅผ ์๋ํํฉ๋๋ค, Vault๋ ๋์ ์ํฌ๋ฆฟ๊ณผ ๊ฐ์ฌ ๋ก๊น ์ ์ ๊ณตํฉ๋๋ค, ๊ทธ๋ฆฌ๊ณ RBAC๋ ์ต์ ๊ถํ ์์น์ ๋ฐ๋ผ ๊ฐํํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ๋ ์ DevOps ๋ฉด์ ์์ ์ ๊ธฐ์ ์ผ๋ก ํ ์คํธ๋๋ฉฐ, ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์ ์ํฌ๋ฆฟ ๊ด๋ฆฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ์ฑํฉ๋๋ค.
DevOps ์ฝ๋์ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ์ ์๋์
์ค์ ์ฝ๋ ํ ์กฐ๊ฐ, ์จ์ ๋ฒ๊ทธ ํ๋, ํ๋ฃจ ํ ๋ฒ. ๊ณ์ ์์ด ๋ฐ๋ก ๋์ ํ ์ ์์ต๋๋ค.

์์ฑ์
Anthony Fillion-MailletSharpSkill ์ฐฝ์ ์
10๋ ์ด์ ํ์คํ ๊ฐ๋ฐ์ ํด์์ต๋๋ค. SharpSkill์ ์ด์ํ๋ฉฐ ์ด๊ณณ์ ๊ฒ์๋๋ ๋ชจ๋ ๋ด์ฉ์ ์ฑ ์์ ์ง๋๋ค.
2026๋ 9์ 2์ผ ์ ๋ฐ์ดํธ
ํ๊ทธ
๊ณต์
๊ด๋ จ ๊ธฐ์ฌ

Kubernetes Helm Charts ์๋ฒฝ ๊ฐ์ด๋ 2026: ํจํค์ง, ๋ฐฐํฌ, ๋ฉด์ ์ง๋ฌธ
Helm 3์ ์ฌ์ฉํ Kubernetes ์ ํ๋ฆฌ์ผ์ด์ ํจํค์ง๊ณผ ๋ฐฐํฌ ๋ฐฉ๋ฒ์ ์์ธํ ์ค๋ช ํฉ๋๋ค. ์ฐจํธ ๊ตฌ์กฐ, ํ ํ๋ฆฟ ์์ฑ, ์์กด์ฑ ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ ๋ฉด์ ์์ ์์ฃผ ๋์ค๋ ์ง๋ฌธ๊ณผ ๋ต๋ณ์ ๋ค๋ฃน๋๋ค.

ArgoCD์ GitOps ์๋ฒฝ ๊ฐ์ด๋ 2026: Kubernetes ์ง์์ ๋ฐฐํฌ ์ ๋ต๊ณผ ๋ฉด์ ํต์ฌ ์ง๋ฌธ
ArgoCD 3.4 GitOps ํํ ๋ฆฌ์ผ. Kubernetes ์ง์์ ๋ฐฐํฌ, Application CRD, Sync Waves, ๋ฉํฐํด๋ฌ์คํฐ ๊ด๋ฆฌ, Flux ๋น๊ต, ๋ฉด์ ๋น์ถ ์ง๋ฌธ์ YAML ์์ ์ ํจ๊ป ํด์คํฉ๋๋ค.

Kubernetes ๋ฉด์ ์๋ฒฝ ๊ฐ์ด๋: Pod, Service, Deployment ํต์ฌ ์ ๋ฆฌ
Kubernetes ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ Pod, Service, Deployment์ ํต์ฌ ๊ฐ๋ ์ YAML ์์ ์ ํจ๊ป ์์ธํ ์ ๋ฆฌํฉ๋๋ค. 2026๋ ์ต์ ํธ๋ ๋๋ฅผ ๋ฐ์ํ ์ค์ ๋๋น ๊ฐ์ด๋์ ๋๋ค.