개요
CKAD 시험에서 출제된 Kubernetes Secret 문제 풀이를 기록합니다. Deployment의 환경변수(ENV)에 하드코딩된 민감 정보를 Secret 리소스로 분리하고, Deployment에서 Secret을 envFrom 또는 env.valueFrom으로 참조하도록 수정하는 문제입니다.
출제 문제
※ 기억에 의존해 복기하는 문제라 오류가 있을 수 있습니다.
참고만 부탁 드립니다.
- postgres deployment의 env에 하드코딩 된 argument를 참고하여 secret 생성
secret name : postgres
namespace : devops
key name : username, database, password - 생성된 postgres secret을 postgres deployment의 env에 하드코딩 된 argument를 수정 반영
※ postgres deployment YAML파일을 제공하고 수정해서 재배포하라고 나왔을 수 있음
해결 방법
# postgres deployment의 env 확인
$ kubectl describe deployment -n devops postgres | grep -A3 Environment
Environment:
PG_USERNAME: pgadmin
PG_DATABASE: pgdatabase
PG_PASSWORD: pgpwd1234
# Secret 생성 $ kubectl create secret generic postgres --from-literal=username=pgadmin --from-literal=database=pgdatabase --from-literal=password=pgpwd1234 -n devops $ kubectl get secrets -n devops
# 제공된 postgres deployment의 yaml 수정 및 저장
$ vi postgres-deployment.yaml
...
spec:
containers:
- name: postgres
image: postgres:stable
env:
- name: PG_USERNAME
valueFrom:
secretKeyRef:
name: postgres
key: username
- name: PG_DATABASE
valueFrom:
secretKeyRef:
name: postgres
key: database
- name: PG_PASSWORD
valueFrom:
secretKeyRef:
name: postgres
key: password
...
# deployment 재배포
$ kubectl apply -f postgres-deployment.yaml
# Environment 값 확인
$ kubectl describe deployment -n devops postgres
Secret 타입과 주입 방식 이해
Kubernetes Secret은 민감한 데이터(비밀번호, API 키, 인증서 등)를 Pod 스펙에서 분리하여 관리하는 리소스입니다. 기본 타입은 Opaque이며 kubectl create secret generic으로 생성합니다. 그 외에 TLS 인증서를 위한 kubernetes.io/tls, 이미지 풀 인증을 위한 kubernetes.io/dockerconfigjson 등 특수 목적 타입도 있습니다.
Pod에 Secret을 주입하는 방식은 두 가지입니다. env.valueFrom.secretKeyRef는 Secret의 특정 키 하나를 지정한 환경변수 이름으로 주입합니다. envFrom.secretRef는 Secret의 모든 키를 그대로 환경변수로 주입합니다. 이 문제처럼 하드코딩된 ENV를 Secret으로 교체할 때는 키 이름이 환경변수 이름과 달라질 수 있으므로 valueFrom 방식으로 이름을 명시적으로 매핑하는 것이 안전합니다.
# Secret 생성 확인 (값은 base64로 저장됨)
kubectl get secret postgres -n devops -o yaml
# Secret 값 디코딩 확인
kubectl get secret postgres -n devops -o jsonpath='{.data.password}' | base64 -d
# Secret 전체 키를 envFrom으로 주입하는 방식 (키 이름 = ENV 이름)
# spec.containers[].envFrom:
# - secretRef:
# name: postgres
Secret은 기본적으로 etcd에 base64 인코딩으로 저장됩니다(암호화 아님). 운영 환경에서 실질적인 보안을 위해서는 etcd encryption at rest 활성화, RBAC으로 Secret 접근 제한, Vault 같은 외부 시크릿 관리 솔루션 연동을 고려해야 합니다.
Secret 보안 강화와 운영 주의사항
Kubernetes Secret은 기본적으로 etcd에 base64 인코딩 상태로 저장되며, 이는 암호화가 아닙니다. RBAC으로 Secret 리소스에 대한 get/list 권한을 최소화하고, 시험 환경 외 운영 환경에서는 POSTGRES_PASSWORD: pgpwd1234 같은 테스트용 비밀번호를 절대 사용해서는 안 됩니다.
Secret은 생성 후 값 변경이 어렵고 애플리케이션을 재시작해야 반영됩니다. 이를 보완하기 위해 Secrets Store CSI Driver와 HashiCorp Vault, AWS Secrets Manager 같은 외부 시크릿 관리 솔루션을 연동하면 Secret 값을 동적으로 교체하고 감사 로그를 남기는 것이 가능합니다. CKAD 시험 범위 밖이지만, 실무에서는 Secret 관리 방식이 보안 성숙도의 중요한 지표가 됩니다.
참고
참고 문서: kubectl로 Secret 관리 · Pod에 Secret 주입하기