1. Secret이란?
Secret은 민감한 정보를 저장하는 Kubernetes 리소스다.

- DB 비밀번호
- API Key
- Access Token
- 인증 정보
Kubernetes에서 Secret과 ConfigMap이 Pod에 연결되고, 이후 Kubernetes API Server를 통해 ETCD에 저장되는 흐름을 나타낸다.
먼저 사용자는 Secret 또는 ConfigMap 리소스를 생성한다.
- Secret
→ 비밀번호, API Key 같은 민감 정보 저장 - ConfigMap
→ 일반 설정 값 저장
이후 Pod는 필요한 Secret이나 ConfigMap을 참조하여 값을 사용하게 된다.
그리고 Kubernetes 내부에서는:
Pod → API Server → ETCD
구조로 리소스 정보가 저장·관리된다.
여기서:
- API Server
→ Kubernetes의 중앙 관리 컴포넌트 - ETCD
→ Kubernetes 클러스터 상태 정보를 저장하는 Key-Value 저장소
역할을 담당한다.
다만 중요한 점은, Kubernetes Secret은 기본적으로 완전한 암호화 저장 기능이라기보다 민감 정보를 일반 YAML과 분리해서 관리하기 위한 기능에 가깝다는 점이다.
Secret 값은 내부적으로 base64 인코딩되어 저장되며, 이는 암호화(encryption)가 아니라 단순 인코딩(encoding) 방식이다.
즉 Secret만으로 강력한 보안이 보장되는 것은 아니며, 실제 운영 환경에서는:
- ETCD Encryption
- RBAC 권한 관리
- 외부 Secret Manager
같은 추가 보안 구성을 함께 사용하는 경우가 많다.
아래처럼 Pod YAML에 직접 작성하는 경우
env:
- name: DB_PASSWORD
value: "1234"
- GitHub 노출 가능성
- YAML 공유 시 정보 유출
- 운영 환경 보안 문제
가 발생할 수 있다. 그래서 Kubernetes에서는 Secret으로 분리해서 관리한다.
2. Secret 생성 방법
가장 기본적인 방식은 kubectl create secret generic 명령을 사용하는 것이다.
2-1) 단일 값 저장
kubectl create secret generic db-secret \
--from-literal=password=1234

의미:
Secret 이름: db-secret
key: password
value: 1234
2-2) 여러 값 저장
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=1234
3. Secret 확인 방법
3-1) Secret 목록 확인
kubectl get secret
출력:

여기서:
Opaque
는 일반 Secret 타입을 의미한다.
3-2) 상세 정보 확인
kubectl describe secret db-secret
출력:

Data
====
password: 4 bytes
실제 값은 보안상 바로 출력되지 않는다.
그러나 base64로 디코딩을 하는경우 바로 출력이 된다. 그렇기 때문에 누구나 해독이 가능하다.

4. Pod에서 Secret 사용하는 방법
Secret은 보통 두 가지 방식으로 사용한다.
- 환경 변수(Environment Variable)
- Volume 마운트
5. 환경 변수로 사용하는 방법
먼저 Secret을 생성한다.
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=1234
이후 Pod YAML에서 Secret 값을 환경 변수로 연결한다.
5-1) Pod YAML
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: nginx
image: nginx
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
5-2) 코드 설명
위 YAML은 db-secret에 저장된 값을 컨테이너 내부 환경 변수로 주입하는 구조다.
예를 들어 아래 부분:
- name: DB_USERNAME
는 컨테이너 내부 환경 변수 이름이다.
즉 애플리케이션 내부에서는:
echo $DB_USERNAME
처럼 사용할 수 있다. 그리고 실제 값은 아래에서 가져온다.
secretKeyRef:
name: db-secret
key: username
각 항목 의미는 다음과 같다.
- name: db-secret
→ 사용할 Secret 이름 - key: username
→ Secret 내부에서 가져올 값
즉 Kubernetes가:
db-secret 안의 username 값
을 읽어서:
DB_USERNAME=admin
형태로 컨테이너 내부에 자동 주입한다.
최종적으로 컨테이너 내부에서는:
DB_USERNAME=admin
DB_PASSWORD=1234
환경 변수를 사용할 수 있게 된다.
5-3) 환경변수 확인
Pod 내부에서 확인할 수 있다.
kubectl exec -it secret-pod -- env
출력 예시:
DB_USERNAME=admin
DB_PASSWORD=1234
6. Volume으로 사용하는 방법
Secret을 파일처럼 마운트할 수도 있다.
6-1) Pod YAML
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
volumes:
- name: secret-volume
secret:
secretName: db-secret
6-2) Secret 파일 확인
Pod 내부에서 확인:
kubectl exec -it secret-volume-pod -- ls /etc/secret
출력:
password
username
파일 내용 확인:
kubectl exec -it secret-volume-pod -- cat /etc/secret/password
출력:
1234
즉 Secret 값이 파일 형태로 저장된다.
7. Secret이 내부적으로 저장되는 방식
Secret은 내부적으로 base64 인코딩되어 저장된다.
예:
echo -n "1234" | base64
출력:
MTIzNA==
중요한 점은: base64는 암호화가 아니라 단순 인코딩이라는 점이다. Secret만으로 완전한 보안이 보장되는 것은 아니다.
8. 마치며
Kubernetes에서는 비밀번호나 API Key 같은 민감 정보를 직접 YAML에 작성하기보다 Secret 리소스로 분리해서 관리한다.
그리고 Pod에서는:
- 환경 변수
- Volume
방식으로 Secret 값을 주입해 사용한다.
이 구조를 이해하면:
- 왜 ConfigMap과 Secret이 분리되는지
- 왜 운영 환경에서 Secret 관리가 중요한지
- Kubernetes가 설정과 실행 환경을 어떻게 분리하는지
를 자연스럽게 이해할 수 있다.
'Data Engineering > Kubernetes' 카테고리의 다른 글
| Kubernetes NodePort란 (0) | 2026.04.30 |
|---|---|
| Kubernetes 롤링 업데이트 이해 (0) | 2026.04.30 |
| Kubernetes 객체 이해 (Pod / Deployment / Service) (0) | 2026.04.30 |
| Kubernetes 상태 유지 구조 (Controller & Reconciliation Loop) (0) | 2026.04.21 |
| Kubernetes 아키텍처 이해 (1) | 2026.04.21 |