CKAD Secrets 문제 후기 – 20250618

개요

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 주입하기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.