[Kubernetes] ConfigMap & Secret

배창민·2025년 12월 4일
post-thumbnail

Kubernetes ConfigMap과 Secret 핵심 정리

쿠버네티스에서 애플리케이션 설정을 다룰 때 자주 사용하는 리소스가 ConfigMapSecret이다.
둘 다 설정값을 저장하지만, 용도와 보안 수준이 다르다.


1. ConfigMap vs Secret 한눈에 보기

1-1. 공통점

  • 키–값 형태로 데이터를 저장

  • Pod에

    • 환경 변수로 주입하거나
    • 파일 형태로 마운트해서 사용
  • 애플리케이션 설정을 클러스터 레벨에서 관리하게 해주는 리소스

1-2. 차이점

항목ConfigMapSecret
용도비밀이 아닌 일반 설정값비밀번호, 토큰, API 키 같은 민감 정보
저장 방식평문Base64 인코딩된 값
접근 제어기본적인 리소스 권한으로 제어RBAC 등으로 더 엄격하게 관리하는 것이 일반적
대표 예시DB URL, 타임아웃 값, 기능 플래그DB 계정/비밀번호, OAuth 토큰, 인증서 등

2. ConfigMap 기본 사용

2-1. ConfigMap 개념

ConfigMap은 비밀이 아닌 설정 값을 저장하는 리소스다.

  • 예: DB 접속 URL, 타임아웃 값, 환경별 설정 값 등
  • 코드에 하드코딩하지 않고, 클러스터 설정으로 관리할 수 있게 해준다.

2-2. 예제: configmap.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config
data:
  database_url: "jdbc:mariadb://localhost:3306/menudb"
  timeout: "30"
  • db-config라는 이름의 ConfigMap 생성
  • database_url, timeout 두 개의 설정 값 보관

3. Secret 기본 사용

3-1. Secret 개념

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

  • 비밀번호, 계정 정보, API 키, 토큰 등

  • 데이터는 Base64로 인코딩된 형태로 저장된다.

    • 암호화는 아니지만, 최소한의 노출 방지 역할을 한다.
  • 접근 권한을 최소화해서 관리해야 한다.

3-2. Base64 인코딩

Secret의 data 필드는 Base64 인코딩된 문자열을 사용한다.

# Linux / macOS
echo -n 'swcamp' | base64

# Windows PowerShell
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("swcamp"))

위 결과 (c3djYW1w)를 Secret에 넣는다.

3-3. 예제: secret.yml

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: c3djYW1w
  password: c3djYW1w
  • db-secret Secret 생성
  • username, password 값은 Base64 인코딩된 문자열

4. Deployment에서 ConfigMap & Secret 사용하기

4-1. 환경 변수로 주입하는 예제

Deployment에서 ConfigMap과 Secret을 환경 변수로 읽어오는 예시.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: boot005dep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: boot005kube
  template:
    metadata:
      labels:
        app: boot005kube
    spec:
      containers:
        - name: boot-container
          image: limu810/k8s-boot-ing:latest
          env:
            - name: DATABASE_URL
              valueFrom:
                configMapKeyRef:
                  name: db-config
                  key: database_url
            - name: TIMEOUT
              valueFrom:
                configMapKeyRef:
                  name: db-config
                  key: timeout
            - name: USERNAME
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: username
            - name: PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: password
  • DATABASE_URL, TIMEOUT
    db-config ConfigMap에서 값 가져옴
  • USERNAME, PASSWORD
    db-secret Secret에서 값 가져옴

애플리케이션은 그냥 환경 변수만 읽으면 되고, 실제 값 관리는 Kubernetes 리소스에서 담당한다.


5. 실제 적용 및 확인 흐름

5-1. 리소스 생성

# 1) ConfigMap 생성
kubectl apply -f configmap.yml

# 2) Secret 생성
kubectl apply -f secret.yml

# 3) Deployment 생성
kubectl apply -f boot005dep.yml

Pod 상태 확인:

kubectl get pods

5-2. Pod 내부에서 환경 변수 확인

  1. Pod 이름 확인 후, 쉘로 진입:
kubectl exec -it <pod-name> -- /bin/sh
  1. 환경 변수 확인:
echo $DATABASE_URL   # ConfigMap 값
echo $TIMEOUT        # ConfigMap 값
echo $USERNAME       # Secret 값
echo $PASSWORD       # Secret 값

# 또는
printenv DATABASE_URL
printenv TIMEOUT
printenv USERNAME
printenv PASSWORD

값이 의도한 대로 출력되면 ConfigMap과 Secret이 정상적으로 주입된 상태다.


정리

  • ConfigMap

    • 비밀이 아닌 일반 설정 값 저장
    • 환경 변수, 설정 파일 형태로 컨테이너에 주입
  • Secret

    • 비밀번호, 토큰, API 키 등 민감 정보 저장
    • Base64 인코딩 + RBAC로 접근 제어
  • Deployment 활용

    • env.valueFrom.configMapKeyRef로 ConfigMap 읽기
    • env.valueFrom.secretKeyRef로 Secret 읽기
    • 애플리케이션 코드는 환경 변수만 사용하고, 설정 관리는 쿠버네티스가 담당하는 구조가 된다.
profile
개발자 희망자

0개의 댓글