Skip to main content

컨피그맵

ConfigMap

  • 컨테이너 구성 정보를 한곳에 모아서 관리

example

kubectl create configmap NAME [--from-file=source] [--from-literal=key1=value1]

configmap

note

다음의 변수를 configMap eshop으로 등록하세요.

  • DBNAME: mysql
  • USER: admin

등록한 eshop configMap의 DBNAME을 eshop-configmap라는 이름의 nginx 컨테이너에 DB라는 환경변수로 할당하세요.

# configmap 생성
kubectl create configmap eshop --from-literal=DBNAME=mysql --from-literal=USER=admin

# 생성된 configmap 확인
kubectl get configmap
...
NAME DATA AGE
eshop 2 10s
kube-root-ca.crt 1 43h

# 상세 확인 (평문 확인 가능)
kubectl describe configmap eshop

# eshop-configmap 파드 yaml 파일로 생성
kubectl run eshop-configmap --image=nginx --dry-run=client -o yaml
kubectl run eshop-configmap --image=nginx --dry-run=client -o yaml > eshop.yaml

# vi eshop.yaml
apiVersion: v1
kind: Pod
metadata:
name: eshop-configmap
spec:
containers:
- image: nginx
name: eshop-configmap
env:
- name: DB
valueFrom:
configMapKeyRef:
name: eshop # configmap 이름
key: DBNAME # 환경변수 DB에 DBNAME의 value 저장

# 파드 생성
kubectl apply -f eshop.yaml

# eshop-configmap 파드 확인
kubectl get pod eshop-configmap

# 파드 내부 컨테이너 접속
kubectl exec -it eshop-configmap -- /bin/bash

# 환경변수 확인
$ env
DB=mysql

$ echo $DB
mysql

Secret

  • ConfigMap: 컨테이너 구성 정보를 한곳에 모아서 관리
  • Secret: 컨테이너가 사용하는 password, auth token, ssh key와 같은 중요한 정보를 저장하고 민감한 구성정보를 base64로 인코딩해서 한 곳에 모아서 관리
  • 민감하지 않은 일반 설정파일 configMap을 사용하고 민감한 데이터는 secret을 사용
# secret 생성
kubectl create secret generic eshop --from-literal=DBNAME=mysql --from-literal=USER=admin

# 생성 확인
kubectl get secret
...
NAME TYPE DATA AGE
eshop Opaque 2 9s

# 씨크릿 상세 확인
kubectl describe secrets eshop
...
Name: eshop
Namespace: default
Labels: <none>
Annotations: <none>

Type: Opaque

Data
====
DBNAME: 5 bytes
USER: 5 bytes

# yaml 확인
kubectl get secrets eshop -o yaml
apiVersion: v1
data:
DBNAME: bXlzcWw= # base64 인코딩
USER: YWRtaW4= # base64 인코딩
kind: Secret
metadata:
creationTimestamp: "2023-01-22T13:03:10Z"
name: eshop
namespace: default
resourceVersion: "375464"
uid: 728f0cfe-32dc-45c4-a84e-c20e02e013e5
type: Opaque
note
  • Secret Name: super-secret
  • Password: bob Create a pod named pod-secrets-via-file, using the redis image, which mounts a secrets named super-secret at /secrets.

secret 파일 마운트

# secret 생성
kubectl create secret generic super-secret --from-literal=Password=bob

# 생성 확인
kubectl get secrets
kubectl describe secrets super-secret

# 파드 yaml 파일 생성
kubectl run pod-secret-via-file --image=redis --dry-run=client -o yaml
kubectl run pod-secret-via-file --image=redis --dry-run=client -o yaml > pod-secret-via-file.yaml

# vi pod-secret-via-file.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-via-file
spec:
containers:
- image: redis
name: pod-secret-via-file
volumeMounts:
- name: foo
mountPath: "/secrets"

volumes:
- name: foo
secret:
secretName: super-secret

# pod 생성
kubectl apply -f pod-secret-via-file.yaml

# 생성 확인
kubectl get pods

# 파드 접속
kubectl exec pod-secret-via-file -it -- /bin/bash

# 마운트 파일 확인
cat /secrets/Password
...
bob
note

Create a second pod named pod-secrets-via-env, using the redis image, which exports password as CONFIDENTIAL

secret 환경변수 마운트

# 파드 yaml 파일 생성
kubectl run pod-secret-via-env --image=redis --dry-run=client -o yaml
kubectl run pod-secret-via-env --image=redis --dry-run=client -o yaml > pod-secret-via-env.yaml

# vi pod-secret-via-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-secret-via-env
spec:
containers:
- image: redis
name: pod-secret-via-env
env:
- name: CONFIDENTIAL # 환경변수 CONFIDENTIAL을 설정하는데
valueFrom: # 값을
secretKeyRef: # secret으로부터 참조하고
name: super-secret # 해당 super-secret의
key: Password # 키가 Password인 값을 저장한다.

# 파드 생성
kubectl apply -f pod-secret-via-env.yaml

# 파드 정보 확인
kubectl get pod pod-secret-via-env

# 파드 내 컨테이너 접속
kubectl exec -it pod-secret-via-env -- /bin/bash

# 환경변수 확인
$ env
$ echo $CONFIDENTIAL