시크릿 기본 개념 및 YAML 구조
시크릿(Secret
)은 암호, API 키, 인증 토큰과 같이 민감한 데이터를 저장하고 관리하기 위한 쿠버네티스 오브젝트다. 시크릿을 사용하면 이러한 민감한 정보를 파드 정의(YAML) 파일에 직접 하드코딩하는 것을 피할 수 있어 보안을 강화하고 설정 관리를 유연하게 할 수 있다.
기본 시크릿 YAML 예시
가장 일반적인 Opaque
타입의 시크릿 예시다. stringData
필드를 사용하면 값을 Base64로 인코딩하지 않고 평문으로 편리하게 작성할 수 있다.
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
stringData:
username: "admin"
password: "my-secure-password"
YAML 주요 필드 설명
apiVersion
: 이 오브젝트를 생성하는 데 사용할 쿠버네티스 API 버전을 명시한다. (v1
)kind
: 생성하려는 오브젝트의 종류를 명시한다. (Secret
)metadata
: 오브젝트를 식별하는 데 도움이 되는 데이터를 포함한다.name
: 시크릿의 고유한 이름을 지정한다.
type
: 시크릿의 타입을 지정한다. 용도에 따라 여러 타입이 있으며,Opaque
는 특별한 형식 없이 key-value 데이터를 저장하는 기본 타입이다. (예:kubernetes.io/dockerconfigjson
,kubernetes.io/tls
)data
/stringData
: 시크릿 데이터를 저장하는 필드다.stringData
: 값을 평문으로 저장하면 쿠버네티스가 자동으로 Base64 인코딩하여 내부적으로 처리한다. (권장)data
: 값을 반드시 Base64로 인코딩하여 저장해야 한다.stringData
와data
를 동시에 사용할 수는 없다.
이렇게 생성된 시크릿은 환경 변수나 볼륨 마운트 방식을 통해 파드에서 안전하게 참조하여 사용할 수 있다.
시크릿은 암호, OAuth 토큰, SSH 키와 같은 민감한 정보를 저장하고 관리하기 위한 오브젝트다. YAML 파일에 민감한 데이터를 직접 하드코딩하는 대신 시크릿을 사용하면 보안을 강화하고 설정 관리를 유연하게 할 수 있다.
참고 자료: 쿠버네티스 공식 문서 - 시크릿
시크릿 생성 방법 (CKA 핵심)
CKA 시험에서는 kubectl
명령어를 사용하여 빠르고 정확하게 시크릿을 생성하는 능력이 중요하다.
- Imperative (명령형) 생성:
generic
:--from-file
또는--from-literal
옵션을 사용해 일반적인 시크릿을 생성한다.docker-registry
: 프라이빗 이미지 레지스트리 인증 정보를 담는 시크릿을 생성한다.tls
: TLS 인증서와 키를 담는 시크릿을 생성한다.
- Declarative (선언형) 생성 (YAML 파일):
data
필드: 값을 반드시 Base64로 인코딩하여 저장해야 한다.- 인코딩:
echo -n 'my-password' | base64
(-n
옵션 필수) - 디코딩:
echo 'bXktcGFzc3dvcmQ=' | base64 --decode
- 인코딩:
stringData
필드: 평문으로 값을 넣으면 쿠버네티스가 자동으로 인코딩하여 저장한다. (YAML 작성 시 편리)
CKA Tip: 시험에서는 보통 파일을 제공하고 --from-file
옵션으로 시크릿을 만들라고 요구하는 경우가 많다.
파드에서 시크릿 사용하기
생성된 시크릿은 다음 세 가지 주요 방법으로 파드에 전달된다. CKA 시험에서는 각각의 방법을 모두 사용하여 파드를 설정하는 문제가 출제될 수 있으므로 YAML 구조를 정확히 암기해야 한다.
- 환경 변수로 주입 (
env
,valueFrom
):- 시크릿의 특정 키 값을 컨테이너의 환경 변수로 주입한다.
- CKA Tip: "my-secret 시크릿의
user
키 값을APP_USER
환경변수로 사용하는 파드를 만들어라" 와 같은 형태의 문제가 자주 출제된다.valueFrom
과secretKeyRef
구조를 정확히 기억해야 한다.
- 모든 데이터를 환경 변수로 주입 (
envFrom
):- 시크릿의 모든 키-값 쌍을 한 번에 환경 변수로 만든다.
- 볼륨으로 마운트:
- 시크릿 데이터를 파일 형태로 컨테이너의 특정 경로에 마운트한다.
- 마운트된 파일 이름은 시크릿의
key
가 된다.
CKA 실전 예제 YAML:
apiVersion: v1
kind: Pod
metadata:
name: secret-pod-example
spec:
containers:
- name: my-container
image: nginx
env:
# 방법 1: 특정 키 값을 환경 변수로 주입
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: my-secret # 사용할 시크릿 이름
key: username # 시크릿 내의 키
envFrom:
# 방법 2: 시크릿의 모든 데이터를 환경 변수로 주입
- secretRef:
name: my-secret
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret" # 마운트할 컨테이너 내부 경로
readOnly: true
volumes:
# 방법 3: 볼륨으로 마운트
- name: secret-volume
secret:
secretName: my-secret
참고 자료: 쿠버네티스 공식 문서 - 파드에서 시크릿 사용하기
시크릿과 보안
- ETCD 저장: 시크릿 데이터는 기본적으로 Base64로 인코딩만 될 뿐, 암호화되지 않은 상태로 etcd에 저장된다. Base64는 암호화가 아니다.
- RBAC:
get
,list
,watch
와 같은 동사를 사용하여 시크릿에 접근할 수 있는 권한을 RBAC으로 엄격하게 제어해야 한다. - Etcd 암호화 (Encryption at Rest): 프로덕션 환경에서는
EncryptionConfiguration
을 설정하여 etcd에 저장되는 시크릿 데이터를 암호화해야 한다.
참고 자료: 쿠버네티스 공식 문서 - 저장 데이터 암호화
'CKA' 카테고리의 다른 글
인증과 권한 관리 정리 (0) | 2025.07.04 |
---|---|
파드 스케줄링 정리 (1) | 2025.07.03 |
컨피그맵 정리 (0) | 2025.06.27 |
레이블과 애너테이션 정리 (0) | 2025.06.27 |
인그레스 정리 (1) | 2025.06.26 |