.conf
파일이 있으면 config를 수정할 때 매번 컨테이너에 접속해서 .conf
파일을 수정하기란 너무 번거롭습니다. Pod가 수 십개, 수 백개로 늘어난다면 매번 이렇게 수정하기란 쉽지 않습니다.configmap
이라고 하는 공간에 key:value 형식으로 모아놓습니다.configmap
에 기록합니다.configmap
생성 방법
% kubectl create configmap <configmap 이름> [--from-file=source] [--from-literal=key1=value1]
다음의 변수를 configMap eshop
으로 등록하세요.
등록한 eshop
configMap의 DBNAME
을 eshop-configmap
이라는 이름의 nginx 컨테이너에 DB
라는 환경변수로 할당하세요.
% kubectl create configmap eshop --from-literal=DBNAME=mysql --from-literal=USER=admin
configmap/eshop created
% kubectl get configmap
NAME DATA AGE
eshop 2 4s
kube-root-ca.crt 1 173d
% kubectl describe configmaps eshop
Name: eshop
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
DBNAME:
----
mysql
USER:
----
admin
BinaryData
====
Events: <none>
% kubectl run eshop-configmap --image=nginx --dry-run=client -o yaml > eshop-configmap.yaml
% vim eshop-configmap.yaml
# 아래와 같이 편집
apiVersion: v1
kind: Pod
metadata:
name: eshop-configmap
spec:
containers:
- image: nginx
name: eshop-configmap
env:
- name: DB
valueFrom:
configMapKeyRef:
name: eshop
key: DBNAME
% kubectl apply -f eshop-configmap.yaml
pod/eshop-configmap created
% kubectl get pod eshop-configmap
NAME READY STATUS RESTARTS AGE
eshop-configmap 0/1 ContainerCreating 0 4s
컨테이너에 직접 접근해서 환경 변수를 확인해봅시다.
% kubectl exec -it eshop-configmap -- /bin/bash
# DB라는 이름의 환경변수의 값이 configmap의 DBNAME의 값인지 확인합니다.
% env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=eshop-configmap
PWD=/
PKG_RELEASE=1~bullseye
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
DB=mysql
NJS_VERSION=0.7.5
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.23.0
_=/usr/bin/env
password, auth token, ssh key
와 같은 중요한 정보를 저장하고 민감한 구성정보를 base64
로 인코딩해서 한 곳에 모아서 관리합니다.configMap을 사용
하고 민감한 데이터는 secret을 사용
합니다.secret
을 생성하고 입력된 value 값을 확인해봅시다.
% kubectl create secret generic eshop-secret --from-literal=DBNAME=mysql --from-literal=USER=admin
% kubectl get secret
# value가 확인되지 않고 byte만 나타나는 것을 볼 수 있습니다.
% kubectl describe secret eshop-secret
# secret을 yaml 형식으로 보면 인코딩된 value를 볼 수 있습니다.
% kubectl get secret eshop-secret -o yaml
Secret Name: super-secret
Password: bob
Create a pod named pod-secrets-via-file
, using the redis
image, which mounts
a secret named super-secret
at /secrets
Create a second pod named pod-secrets-via-env
, using the redis
image, which exports Password as CONFIDENTIAL
% kubectl create secret generic super-secret --from-literal=Password=bob
secret/super-secret created
% kubectl get secret
NAME TYPE DATA AGE
default-token-gvdn7 kubernetes.io/service-account-token 3 173d
super-secret Opaque 1 5s
% kubectl describe secret super-secret
Name: super-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
Password: 3 bytes
% kubectl run pod-secrets-via-file --image=redis --dry-run=client -o yaml > pod-secrets-via-file.yaml
% vim pod-secrets-via-file.yaml
# 아래와 같이 편집
apiVersion: v1
kind: Pod
metadata:
name: pod-secrets-via-file
spec:
containers:
- name: pod-secrets-via-file
image: redis
volumeMounts:
- name: foo
mountPath: "/secrets"
volumes:
- name: foo
secret:
secretName: super-secret
% kubectl apply -f pod-secrets-via-file.yaml
pod/pod-secrets-via-file created
secret에 담긴 key=value
의 데이터는 볼륨 마운트 시 마운트 경로 밑에 key
이름으로 된 파일이 생성되고 그 파일의 내용에 value
가 들어가게 됩니다.
% kubectl exec -it pod-secrets-via-file -- /bin/bash
% cd /secrets
% ls
Password
% cat Password
bob
% kubectl run pod-secrets-via-env --image=redis --dry-run=client -o yaml > pod-secrets-via-env.yaml
% vim pod-secrets-via-env.yaml
# 아래와 같이 편집
apiVersion: v1
kind: Pod
metadata:
name: pod-secrets-via-env
spec:
containers:
- name: pod-secrets-via-env
image: redis
env:
- name: CONFIDENTIAL
valueFrom:
secretKeyRef:
name: super-secret
key: Password
% kubectl apply -f pod-secrets-via-env.yaml
pod/pod-secrets-via-env created
% kubectl exec -it pod-secrets-via-env -- /bin/bash
% env
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod-secrets-via-env
REDIS_DOWNLOAD_SHA=2cde7d17214ffe305953da9fff12333e8a72caa57fd4923e4872f6362a208e73
PWD=/data
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
REDIS_VERSION=7.0.3
GOSU_VERSION=1.14
CONFIDENTIAL=bob
TERM=xterm
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.3.tar.gz
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env