IT/Cloud & DevOps

Kubernetes ConfigMap과 Secret을 사용한 환경변수 관리

iamhyeon 2025. 4. 25. 12:21

💡 ConfigMap

- 여러 가지 설정 정보들을 기록해두는 공간이다 

- 설정값(환경변수, 설정파일 등)을 키-값 형태로 저장하고, Pod에 주입할 수 있게 해주는 오브젝트이다 

- 여러 종류의 Pod에 동일하게 적용해야 하는 환경 변수가 있을 때
- Pod 안 애플리케이션의 동작을 바꾸고 싶을 때 (예: 타이틀, 포트, 외부 API 주소)
- 같은 컨테이너 이미지이지만 환경마다 설정을 다르게 하고 싶을 때
- 보안 민감도가 낮다 (예: 앱 이름, 공개 포트, 타이틀 등)
- 텍스트 데이터만 저장 가능하다
- Pod 안에서 환경 변수, 커맨드라인 인자, 파일 등으로 전달 가능하다 

 

 

💡 Secret

- 비밀번호, API 토큰, 인증 정보 등 민감한 데이터를 저장하고, Pod에 안전하게 주입하는 오브젝트이다 
- 데이터베이스 비밀번호, OAuth 토큰, 인증 키 등 보안이 필요한 값 전달할 때
- 모든 값은 Base64 인코딩해서 저장한다 (보안이 아닌 인코딩일 뿐)
- API 서버에서는 암호화 저장 가능하다 (옵션 설정 시)
- ConfigMap과 동일하게 환경변수, 파일 등으로 주입 가능하다 

 


✔️ 디렉토리 구조
├─ `디렉토리명`
│      Dockerfile
│      sample-configmap.yaml
│      sample-pod.yaml
│      sample-secret.yaml

 

 

📁 실습을 위한 Dockerfile 작성 

FROM nginx:1.27.0

ENV TITLE=NONE

CMD ["/bin/sh", "-c", "echo \"Hello, $TITLE\" > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"]

 

 

✅ GCP - Artifact Registry 에  'configmap-sample' 리포지토리 생성하기

✅ 도커, 레지스트리 연결

✅ 위에 작성한 도커 이미지 빌드, 푸시

참고 ⬇️

2025.04.18 - [IT/Cloud & DevOps] - 컨테이너 레지스트리란? GCP Artifact Registry 로 실습해보기

 

 

✅ pod 생성

apiVersion: v1
kind: Pos
metadata: 
  name: sample-pod
  namespace: default
spec:
  containers:
    - name: nginx
      image: asia-northeast3-docker.pkg.dev/rare-shadow-457105-s7/configmap-sample/configmap-sample:1.0.0      
      ports:
      - containerPort: 80
kubectl apply -f sample-pod.yaml
kubectl port-forward sample-pod 8080:80

 

 

✅ Pod에서  환경변수 지정 

env 추가하고 아래 명령어 실행 

kubectl delete pod `Pod명`
kubectl apply -f `Pod파일명`
kubectl port-forward `Pod명` `호스트포트`:`컨테이너포트`

 

 

💡 Pod 마다 env 지정이 번거롭기 때문에 configmap을 만든다!!!

 

🔶 ConfigMap 만들어서 사용해보기 

 

✅ sample-configmap.yaml 작성

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-configmap
  namespace: default
data:
  PUBLIC_NAME: KUBE
kubectl apply -f sample-configmap.yaml

 

 

✅ sample-pod.yaml 수정

apiVersion: v1
kind: Pod
metadata: 
  name: sample-pod
  namespace: default
spec:
  containers:
    - name: nginx
      image: asia-northeast3-docker.pkg.dev/rare-shadow-457105-s7/configmap-sample/configmap-sample:1.0.0      
      env:
      - name: TITLE
        valueFrom:
          configMapKeyRef:
            name: sample-configmap
            key: PUBLIC_NAME
      ports:
      - containerPort: 80
kubectl delete pod `Pod명`
kubectl apply -f `Pod파일명`
kubectl port-forward `Pod명` `호스트포트`:`컨테이너포트`

 

 

🔶 Secret 만들어서 사용해보기 

 

✅ sample-secret.yaml 작성

apiVersion: v1
kind: Secret
metadata:
  name: sample-secret
  namespace: default
data:
  SECRET_NAME: MTIzNA==

SECRET_NAME  BASE64 인코딩해서 넣어줘야 한다  <=  안하면 에러난다 

kubectl apply -f sample-secret.yaml
kubectl get secrets

 

✅ sample-pod.yaml 수정 

kubectl delete pod `Pod명`
kubectl apply -f `Pod파일명`
kubectl port-forward `Pod명` `호스트포트`:`컨테이너포트`