Config 설정
쿠버네티스엔 설정값을 따로 모아두거나 상황에 꺼내 쓸 수 있습니다.
이런 통을 ConfigMap이라 부릅니다.
이을 통해 설정값을 불러와 Pod에 전달하는 법을 알아봅시다.
ConfigMap 리소스 생성
ConfigMap 리소스는 메타데이터(설정값)를 저장하는 리소스입니다.
여기에 모든 설정값을 저장해 Pod에서 불러올 수 있지요.

이렇게 my.properties 파일을 만들어둡니다.
kubectl create configmap my-config --from-file=my.properties
--from-file 옵션으로 my.properties 파일을 my-config라는 이름의 ConfigMap으로 만듭니다.
kubectl get configmap my-config -o yaml # 축약하여 cm
만들어진 ConfigMap을 상세 조회하면 잘 나오는 걸 볼 수 있습니다.

파일로 지정하는 방법 외에
--from-literal 옵션을 통한 설정
kubectl create configmap special-config \
--from-literal=special.power=10 \
--from-literal=special.strength=20
# configmap/special-config created
YAML 정의서를 통한 생성
# monster-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: monster-config
namespace: default
data:
monsterType: fire
monsterNum: "5"
monsterLife: "3"
kubectl apply -f monster-config.yaml
다양한 방법으로 생성이 가능합니다.
ConfigMap 활용
볼륨연결
ConfigMap을 볼륨으로 마운트하여 파일처럼 사용이 가능합니다.
# my-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-volume
spec:
restartPolicy: OnFailure
containers:
- name: my-volume
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "cat /etc/config/my.properties" ]
volumeMounts:
- name: my-volume
mountPath: /etc/config
volumes:
- name: my-volume
configMap:
name: my-config
volumes에서 hostPath, emptyDir 외에 configMap이라는 볼륨을 사용할 수 있습니다.
name으로 사용할 ConfigMap 이름을 지정해주고요.
환경변수 - valueFrom
ConifgMap을 Pod의 환경변수로도 사용할 수 있습니다.
# my-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: special-env
spec:
restartPolicy: OnFailure
containers:
- name: my-env
image: k8s.gcr.io/busybox
command: [ "printenv" ]
args: [ "my_env" ]
env:
- name: my_env
valueFrom:
configMapKeyRef:
name: my-config
key: name
- env - 환경변수 사용을 선언
- name - 환경변수의 key 지정
- valueFrom - 다른 리소스의 정보를 참조한다는 것을 선언
- name: ConfigMap의 이름
- key: ConfigMap내에 포함된 설정값 중 특정 설정값을 명시적으로 선택
위 YAML파일은 my-config라는 ConfigMap 중 name이라는 설정값을 환경변수 my-env로 활용하라는 것을 의미합니다.
환경변수 - envFrom
이번엔 1개의 설정값이 아닌 ConfigMap 모든 설정값을 환경변수로 사용하는법입니다.
아래처럼 envFrom property를 사용하면 됩니다.
# yeachan-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: yeachan-env
spec:
restartPolicy: OnFailure
containers:
- name: yeachan-env
image: k8s.gcr.io/busybox
command: [ "printenv" ]
# env 대신에 envFrom 사용
envFrom:
- configMapRef:
name: my-config
기존 env 대신 envFrom을 사용해 ConfigMap설정값을 환경변수 전체로 사용하는 것을 선언합니다.
- ConfigMapRef: 특정 키가 아닌 전체 ConfigMap을 사용하도록 설정
- name: ConfigMap의 이름을 지정
민감 데이터 관리
Secret리소스는 각 노드에서 사용될 때
디스크에 저장되지 않고 tmpfs라는 메모리 기반 파일 시스템을 사용해 보안에 강합니다.
또한 평문 조회가 아닌 base64로 한번 인코딩되어 포시됩니다.
Secret 리소스 생성
먼저 계정, 비밀번호로 사용할 값들을 base64로 인코딩 합니다.

위 값을 이용해 Secret 리소스를 만들어봅시다.

- type: Secret 리소스의 타입을 설정합니다. 기본적으론 Opaque을 사용합니다.
- data: 저장할 민감 데이터를 입력합니다.

또한 data필드값을 직접 base64로 인코딩하지 않고 쿠버네티스가 처리해주길 원한다면
stringData property를 사용하면 됩니다.


YAML 파일말고도 명령형 커맨드를 이용해 Secret리소스를 생성할 수 있습니다.
# user-info.properties
username=admin
password=password123
위 파일을 생성 후
kubectl create secret generic user-info-from-file \
--from-env-file=user-info.properties
위 명령을 통해 생성이 가능하지요.
Secret 활용
이제 Secret의 활용법을 알아보겠습니다.
볼륨 연결
Secert도 ConfigMap과 동일하게 볼륨 연결이 가능합니다.
volume property에 secret이라는 이름으로 볼륨을 연결할 수 있지요.
# secret-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-volume
spec:
restartPolicy: OnFailure
containers:
- name: secret-volume
image: k8s.gcr.io/busybox
command: [ "sh" ]
args: ["-c", "ls /secret; cat /secret/username"]
volumeMounts:
- name: secret
mountPath: "/secret"
volumes:
- name: secret
secret:
secretName: user-info
환경변수 - env
또한 환경변수로 정보를 추출 할 수 있습니다.
개별적인 환경변수를 지정할때 valueFrom, secretKyrRef property를 사용합니다.
# secret-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env
spec:
restartPolicy: OnFailure
containers:
- name: secret-env
image: k8s.gcr.io/busybox
command: [ "printenv" ]
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: user-info
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: user-info
key: password
환경변수 - envFrom
전체 환경변수를 부르고자 할 때 envFrom, secretRef property를 사용합니다.
# secret-envfrom.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-envfrom
spec:
restartPolicy: OnFailure
containers:
- name: secret-envfrom
image: k8s.gcr.io/busybox
command: [ "printenv" ]
envFrom:
- secretRef:
name: user-info
메타데이터 전달
쿠버네티스에서는 Pod의 메타데이터를 컨테이너에 전달 할 수 있습니다.
이를 Downward API라 부릅니다.
실행되는 Pod의 정보를 컨테이너에 노출하고 싶을 때 사용합니다.
ConfigMap, Secret과 마찬가지로 환경변수와 볼륨 연결을 통해 컨테이너에 정보를 전달할 수 있습니다.
볼륨 연결
# downward-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: downward-volume
labels:
zone: ap-north-east
cluster: cluster1
spec:
restartPolicy: OnFailure
containers:
- name: downward
image: k8s.gcr.io/busybox
command: ["sh", "-c"]
args: ["cat /etc/podinfo/labels"]
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
downwardAPI로 볼륨 사용을 선언합니다.
- items: 메타데이터로 사용할 아이템 리스트를 저장합니다.
- path: 볼륨과 연결될 컨테이너 내부 path를 지정합니다.
- fieldRef: 참조할 필드를 선언합니다.
- fieldPath: Pod의 메타데이터 필드를 지정합니다.
위처럼 YAML을 지정하면 metadata 의 cluster, zone 값을 /etc/podinfo/labels위치에 볼륨을 연결합니다.
파일 이름이 labels인 이유는 downwardAP.items[0].path가 labels이기 때문입니다.
환경변수 - env
Downward API도 마찬가지로 환경변수로 선언이 가능합니다.
# downward-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: downward-env
spec:
restartPolicy: OnFailure
containers:
- name: downward
image: k8s.gcr.io/busybox
command: [ "printenv"]
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: 환경변수의 키값을 지정합니다.
- valueFrom: 환경변수값을 선언합니다.
- fieldRef: 참조할 필드를 선언합니다.
- filedPath: Pod의 메타데이터 필드를 지정합니다.
- fieldRef: 참조할 필드를 선언합니다.
위처럼 지정하면 Pod의 이름, 네임스페이스, 아이피 등을 환경변수로 사용 할 수 있습니다.
마무리
여기까지 쿠버네티스의 기본 Pod리소스에 대해 알아보았습니다.
이후에 나오는 새로운 리소스 및 개념들은 대부분 Pod를 기반으로 확장되어 나온다고 합니다.
그만큼 Pod에 대한 깊은 이해가 필요합니다.
다음부턴 쿠버네티스의 네트워킹을 책임지는 Service 리소스에 대해 살표보도록 하겠습니다.