Data Engineering/Kubernetes

Kubernetes Secret 생성과 Pod에서 사용하는 방법

jjaehyeok 2026. 5. 7. 17:17

1. Secret이란?

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

https://www.in4it.com/blog/kubernetes-secrets-management.html

  • 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가 설정과 실행 환경을 어떻게 분리하는지

를 자연스럽게 이해할 수 있다.