반응형
목차
- Secret이란?
- ConfigMap과 Secret의 차이
- Secret의 주요 특징
- Secret 타입 종류
- Secret 생성 방법
- Secret을 Pod에서 사용하는 방법
- Secret 관리와 보안 패턴
- 실제 사용 시나리오
- 운영 환경에서의 보안 고려사항
- 자주 묻는 질문 (FAQ)
- 요약 정리
1. Secret이란?
Kubernetes Secret은 비밀번호, 인증 토큰, TLS 인증서처럼 민감한 데이터를 안전하게 저장하고, Pod나 다른 Kubernetes 리소스에서 참조할 수 있도록 하는 리소스입니다.
- 데이터는 Base64 인코딩 형태로 저장됩니다.
- API 서버와 etcd에 저장되며, 필요 시 암호화 설정 가능
- Pod에 환경변수 또는 볼륨 파일 형태로 주입 가능
중요: Base64는 암호화가 아닌 단순 인코딩입니다. 암호화 저장을 원하면 Kubernetes EncryptionConfiguration을 설정해야 합니다.
2. ConfigMap과 Secret의 차이
많은 초보자들이 Secret과 ConfigMap을 혼동합니다.
항목 | ConfigMap | Secret |
---|---|---|
목적 | 일반 설정 데이터 | 민감한 데이터 |
저장 형식 | Plain text | Base64 인코딩 |
보안성 | 낮음 | 높음 (암호화 가능) |
사용 예 | API endpoint URL, 환경 설정 값 | 비밀번호, API 토큰, TLS 키 |
3. Secret의 주요 특징
- 민감 데이터 관리: 중요한 값을 안전하게 저장
- Pod 주입 방식 다양: 환경변수 또는 볼륨 파일로 주입 가능
- RBAC 제어: 접근 권한을 세밀하게 제한 가능
- 플러그인 연동 가능: External Secrets, HashiCorp Vault 등과 연동 가능
4. Secret 타입 종류
타입 | 설명 | 사용 예 |
---|---|---|
Opaque |
기본 키-값 저장 | DB 계정, API 키 |
kubernetes.io/dockerconfigjson |
Docker 레지스트리 인증 | 이미지 Pull Secret |
kubernetes.io/tls |
TLS 인증서와 키 | HTTPS 서비스 인증서 |
그 외 커스텀 타입 | 특정 컨트롤러/플러그인용 | Sealed Secrets, External Secrets |
5. Secret 생성 방법
1) YAML로 생성
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # "admin"의 Base64
password: c2VjdXJlcGFzcw== # "securepass"의 Base64
Base64 인코딩 방법
echo -n "admin" | base64
2) CLI로 생성
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=securepass
3) 파일 기반 생성
kubectl create secret generic db-secret \
--from-file=username.txt \
--from-file=password.txt
6. Secret을 Pod에서 사용하는 방법
1) 환경변수로 주입
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: db-secret
key: username
2) 볼륨으로 주입
volumes:
- name: secret-vol
secret:
secretName: db-secret
이 방식은 파일로 마운트되어 Pod 내부에서 /etc/secret-volume/username
처럼 접근 가능
7. Secret 관리와 보안 패턴
운영 환경에서는 Secret을 단순 YAML로 저장하면 위험합니다.
권장 패턴
- RBAC 최소 권한 부여: Secret 조회/수정 권한은 꼭 필요한 사용자/서비스만 허용
- GitOps 시 암호화 저장: SOPS, Sealed Secrets 등을 사용
- 암호화 저장: etcd 암호화 활성화
- 네트워크 암호화: API 서버와의 통신을 TLS로 보호
- 정기 로테이션: 주기적으로 Secret 값 변경
8. 실제 사용 시나리오
- DB 접속 정보 관리
환경변수로 Pod에 주입하여 애플리케이션이 DB에 접속 - API 키 관리
외부 API 호출 시 필요한 인증 토큰 저장 - TLS 인증서 배포
Ingress Controller에 HTTPS 설정 적용 - Docker Registry 인증
Private 이미지 Pull을 위한 로그인 정보 저장
9. 운영 환경에서의 보안 고려사항
kubectl get secret -o yaml
명령으로 누구나 Base64 값을 읽을 수 있으므로 RBAC 제한 필수- Pod 로그나 환경변수 Dump 시 Secret 값이 노출될 수 있음 → 애플리케이션 로깅 주의
- Git에 Secret YAML을 저장하지 말 것 (암호화 도구 필수)
- Secret 갱신 시 Pod 재시작 필요 여부 확인 (환경변수 vs 볼륨 차이)
10. 자주 묻는 질문 (FAQ)
Q1. Secret 값은 자동으로 암호화되나요?
아니요, Base64 인코딩일 뿐입니다. 암호화를 원하면 etcd 암호화 설정 필요
Q2. Secret이 변경되면 Pod에 자동 반영되나요?
환경변수는 재시작 필요, 볼륨 마운트 방식은 자동 반영됨
Q3. Secret을 GitOps로 관리하려면?
SOPS, Sealed Secrets 등 암호화 툴을 활용하는 것이 안전
11. 요약 정리
- Secret은 Kubernetes의 민감 데이터 안전 저장소
- ConfigMap과 용도, 보안성에서 다름
- 운영 시 RBAC, 암호화, GitOps 보안 패턴 적용 필수
- 환경변수/볼륨 주입 방식에 따른 동작 차이 이해 필요
반응형
'개발 창고 > Server' 카테고리의 다른 글
Kubernetes Job: 완전 종료 보장형 일회성 작업 관리 (1) | 2025.08.08 |
---|---|
Kubernetes CronJob 완전 정복 : 정해진 스케줄에 반복 실행되는 작업을 안정적으로 관리하는 방법 (2) | 2025.08.07 |
Kubernetes Job 완전 정복 (1) | 2025.08.05 |
Kubernetes DaemonSet 완전 정복: 모든 노드에 Pod를 자동 배포하는 방법 (5) | 2025.08.04 |
Kubernetes Deployment 완전정복: Pod 배포와 업데이트 자동화의 핵심 리소스 (2) | 2025.08.03 |