티스토리 뷰

반응형

쿠버네티스 실습: ConfigMap과 Secret으로 환경 설정 관리하기

앞선 글에서는 YAML 매니페스트로 Deployment와 Service를 선언해 Nginx 웹 서버를 배포했습니다.
이번에는 쿠버네티스에서 환경 설정을 안전하고 유연하게 관리하는 방법ConfigMapSecret을 실습합니다.


1) 왜 ConfigMap과 Secret인가?

  • ConfigMap: 애플리케이션이 사용하는 일반 설정값을 저장하는 객체.
    (예: 환경 변수, 설정 파일 내용, 키-값 쌍)
  • Secret: 민감한 데이터(DB 비밀번호, API Key 등)를 저장하는 객체.
    Base64로 인코딩되며, Pod 내부에 환경 변수나 파일로 안전하게 전달.

👉 핵심: 코드(이미지)와 설정을 분리해서 관리하면 배포/운영이 훨씬 유연해집니다.


2) ConfigMap 만들기 (환경 변수 예시)

nginx-configmap.yaml 작성:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  WELCOME_MSG: "Hello from Kubernetes ConfigMap"

적용:

kubectl apply -f nginx-configmap.yaml

확인:

kubectl get configmap nginx-config -o yaml

3) Secret 만들기 (민감 정보 예시)

반응형

nginx-secret.yaml 작성:

apiVersion: v1
kind: Secret
metadata:
  name: nginx-secret
type: Opaque
data:
  PASSWORD: c3VwZXJzZWNyZXQ=   # "supersecret" 문자열을 Base64 인코딩한 값

Base64 인코딩 확인법 (터미널에서):

echo -n "supersecret" | base64

적용:

kubectl apply -f nginx-secret.yaml

확인:

kubectl get secret nginx-secret -o yaml

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

nginx-deployment-config.yaml 작성:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-nginx
  template:
    metadata:
      labels:
        app: hello-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80
        env:
        - name: WELCOME_MSG
          valueFrom:
            configMapKeyRef:
              name: nginx-config
              key: WELCOME_MSG
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: nginx-secret
              key: PASSWORD

적용:

kubectl apply -f nginx-deployment-config.yaml

5) 파드 안에서 값 확인하기

Pod 이름 확인:

kubectl get pods

Pod 내부 진입:

kubectl exec -it <POD_NAME> -- /bin/bash

환경 변수 확인:

echo $WELCOME_MSG
echo $PASSWORD

출력 예시:

Hello from Kubernetes ConfigMap
supersecret

6) 구조 이해

  • ConfigMap/Secret → etcd에 저장됨 → Pod 스펙의 env나 volumeMounts로 주입 가능
  • Deployment가 새로 뜰 때마다 자동으로 해당 값을 컨테이너 환경에 전달
  • 코드 수정 없이 설정만 바꾸면 Pod 재시작으로 반영 가능

7) 삭제/정리

kubectl delete -f nginx-deployment-config.yaml
kubectl delete -f nginx-configmap.yaml
kubectl delete -f nginx-secret.yaml

8) 정리

  • ConfigMap: 일반 설정값 저장
  • Secret: 민감 데이터 저장 (Base64 인코딩)
  • Pod는 env 또는 파일 마운트 방식으로 해당 값을 사용할 수 있다.
  • 운영에서는 DB URL, API 키, 토큰 등을 Secret으로 관리하는 것이 필수적이다.

다음 글에서는 PersistentVolume과 PersistentVolumeClaim을 활용해 데이터가 유지되는 스토리지를 연결하는 방법을 실습합니다. (예: PostgreSQL 데이터 저장소)


 

쿠버네티스,ConfigMap,Secret,환경변수관리,보안설정,Minikube,DevOps,K8s튜토리얼,쿠버네티스보안,Pod환경설정

 

 

 

1. Secret은 Base64 인코딩일 뿐, 암호화는 아님

  • Base64는 단순한 인코딩 방식일 뿐이며, 실제로 데이터를 보호하지 않습니다. 누구든 Base64 디코딩만 하면 원본 데이터를 쉽게 확인할 수 있습니다.
    (Stack Overflow)
  • 기본적인 쿠버네티스 클러스터는 Secrets도 etcd에 평문 형태로 저장됩니다. 즉, etcd에 접근할 수 있다면 누구든 Secret 데이터에 접근할 수 있으므로, 기본 설정 그대로는 보안상 취약할 수 있습니다.
    (DevOps.dev)
  • 보안 강화 방법:
    1. etcd에 저장된 Secret 데이터를 암호화된 상태로 저장하도록 설정 (Encryption at rest).
    2. RBAC 정책을 최소 권한으로 구성.
    3. 외부 Secret 관리 시스템(예: HashiCorp Vault, AWS KMS) 연동을 고려.
      (Kubernetes, spectrocloud.com)

2. ConfigMap도 보안 대책 없이 사용하면 위험할 수 있음

  • ConfigMap은 비밀 데이터가 아니니 안전하다는 오해가 있습니다. 하지만 ConfigMap도 etcd에 평문으로 저장되며, 접근 권한이 있는 유저는 누구든 데이터를 열람할 수 있습니다.
    (groundcover.com)
  • 따라서 민감하지 않은 설정만 ConfigMap에 저장하고, 보안이 필요한 데이터는 반드시 Secret으로 분리하는 것이 안전합니다.

3. 올바른 차별화와 활용 방식 정리

리소스 사용 목적 저장 방식 보안 수준

ConfigMap 비민감 설정 (환경 변수, 설정 파일 등) 평문 key-value 보안 없음 (etcd에 평문)
Secret 민감 정보 (비밀번호, API 키 등) base64 인코딩, 평문 저장 암호화 없음 (추가 설정 필요)

Reddit 실제 사용자 인사이트

“Secrets are no more (or less) secure than ConfigMaps. The only difference being that secrets encode their values in base64.”
— Reddit 사용자
(spectrocloud.com, plural.sh, Kubernetes, DevOps.dev, getambassador.io, Reddit)

이 표현은 오해의 여지가 있지만, 실제로는 다음과 같은 이유에서 의미가 있습니다:

  • 둘 다 etcd에 저장된다.
  • Secret만 Base64 인코딩되어 있어 ‘위장’ 수준의 보호만 제공한다.

추가 제안: 실습 개선 팁

  • Secret을 생성하거나 사용할 때, 단순히 base64로 인코딩하는 것 외에도 stringData 필드 사용으로 읽기 쉬운 문자열 그대로 입력 후 내부적으로 base64 처리할 수도 있습니다.
    (DevOps.dev)
  • ConfigMap과 Secret을 파일로 마운트하는 방식도 함께 실습하면, 환경 변수 방식 vs 파일 방식의 차이점과 장단점을 명확히 보여줄 수 있어 유익합니다.
    (plural.sh, Kubernetes)
  • 클러스터에서 실습할 경우, Secret 데이터 암호화를 활성화하는 방법이나 외부 Secret 연동 방법까지 미리 언급하면 더욱 전문적인 톤을 유지할 수 있습니다.
    (Kubernetes, spectrocloud.com)

요약 정리

  • Base64 ≠ 암호화: Secret은 암호화된 저장소가 아니므로 별도 보안 조치가 필요합니다.
  • ConfigMap도 평문 저장: 오직 비민감 설정만, 보안 설정은 별도로 분리.
  • 보안 강화 필요 시: Encryption at rest, External Secrets, RBAC 최소 권한 설정 등을 고려하세요.

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함
반응형