# 13장. 컨피그맵과 시크릿
컨테이너 이미지는 가능한한 재사용할 수 있게 만드는 것이 좋다.
컨피그맵\(ConfigMap\)과 시크릿\(Secret\)을 사용하면 이에 도움을 준다.
컨피그맵은 워크로드에 대한 컨피규레이션 정보를 제공하는 데 사용된다.
시크릿은 컨피그맵과 유사하지만 TLS 인증서, 자격증명 같은 민감한 정보를 담는 데 사용된다.
```{note}
[워크로드](https://kubernetes.io/ko/docs/concepts/workloads/)란 쿠버네티스에서 구동되는 애플리케이션이다.
워크로드를는 일련의 파드 집합 내에서 실행된다.
빌트인(built-in) 워크로드 리소스의 종류로는 Deployment, ReplicaSet 등이 있다.
```
## 컨피그맵
컨피그맵은 작은 파일 시스템을 정의하는 k8s 객체와 비슷하다.
또는 환경 변수나 커맨드라인을 정의하는 변수의 집합이다.
### 컨피그맵 생성
- my-config.txt
```ini
parameter1 = value1
parameter2 = value2
```
- kubectl create
```sh
kubectl create configmap my-config \
--from-file=my-config.txt \
--from-literal=extra-param=extra-value \
--from-literal=another-param=another-value
```
- kubectl get
```console
$ k get cm my-config -o yaml
apiVersion: v1
data:
another-param: another-value
extra-param: extra-value
my-config.txt: |-
parameter1 = value1
parameter2 = value2
kind: ConfigMap
metadata:
creationTimestamp: "2024-10-20T08:40:51Z"
name: my-config
namespace: default
resourceVersion: "532629"
uid: d97a3300-7d1a-4566-bde2-14c92e7e648e
```
### 컨피그맵 사용
- 파일 시스템
- 컨피그맵을 파드에 마운트할 수 있다.
- 환경 변수
- 환경 변수의 값을 동적으로 설정할 수 있다.
- 커맨드라인 인수
- 커맨드라인을 동적으로 생성할 수 있다.
- kuard-config.yaml
```yaml
apiVersion: v1
kind: Pod
metadata:
name: kuard-config
spec:
containers:
- name: test-container
image: gcr.io/kuar-demo/kuard-amd64:blue
imagePullPolicy: Always
command:
- "/kuard"
- "$(EXTRA_PARAM)" # 커맨드라인 사용
env:
- name: ANOTHER_PARAM # 환경 변수 사용
valueFrom:
configMapKeyRef:
name: my-config
key: another-param
- name: EXTRA_PARAM
valueFrom:
configMapKeyRef:
name: my-config
key: extra-param
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap: # 파일 시스템 사용
name: my-config
```
- kubectl apply
```sh
kubectl apply -f kuard-config.yaml
```
## 시크릿
비빈번호, 보안 토큰, 개인키 같은 데이터를 저장하는 **시크릿** 객체가 있다.
시크릿은 클러스터 etcd 스토리지에 평문으로 저장된다.
### 시크릿 생성
```console
$ curl -o kuard.crt https://storage.googleapis.com/kuar-demo/kuard.crt
$ curl -o kuard.key https://storage.googleapis.com/kuar-demo/kuard.key
$ kubectl create secret generic kuard-tls \
--from-file=kuard.crt \
--from-file=kuard.key
secret/kuard-tls created
$ k describe secret kuard-tls
Name: kuard-tls
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
kuard.crt: 1050 bytes
kuard.key: 1679 bytes
```
### 시크릿 사용
쿠버네티스 API를 호출하거나 시크릿 볼륨(Secret volume)을 사용한다.
시크릿 볼륨은 kubelet에 의해 관리되며 파드 생성 시점에 생성된다.
시크릿은 tmpfs 볼륨(RAM 디스크)에 저장되며 노드의 디스크에는 기록되지 않는다.
- kuard-secret.yml
```yaml
apiVersion: v1
kind: Pod
metadata:
name: kuard-tls
spec:
containers:
- name: kuard-tls
image: gcr.io/kuar-demo/kuard-amd64:blue
imagePullPolicy: Always
volumeMounts:
- name: tls-certs
mountPath: "/tls"
readOnly: true
volumes:
- name: tls-certs
secret:
secretName: kuard-tls
```
### 사설 컨테이너 레지스트리
쿠버네티스가 사설 레지스트리에 저장된 이미지 사용을 할 때 자격증명 저장 용도로 시크릿을 사용할 수 있다.
```console
$ kubectl create secret docker-registry my-image-pull-secret \
--docker-username= \
--docker-password= \
--docker-email=
```
- kuard-secret-ips.yaml
```yaml
apiVersion: v1
kind: Pod
metadata:
name: kuard-tls
spec:
containers:
- name: kuard-tls
image: gcr.io/kuar-demo/kuard-amd64:blue
imagePullPolicy: Always
volumeMounts:
- name: tls-certs
mountPath: "/tls"
readOnly: true
imagePullSecrets:
- name: my-image-pull-secret
volumes:
- name: tls-certs
secret:
secretName: kuard-tls
```
## 명명 규칙
컨피그맵과 시크릿의 키는 regex 제한이 있다.
```regex
^[.[?[a-zAZ0-9[([.[?[a-zA-Z0-9[+[-_a-zA-Z0-9[?)*$
```
## 컨피그맵과 시크릿 관리
### 조회
```console
$ k get secrets
NAME TYPE DATA AGE
kuard-tls Opaque 2 6m3s
sh.helm.release.v1.test.v1 helm.sh/release.v1 1 13d
$ k get cm
NAME DATA AGE
kube-root-ca.crt 1 13d
my-config 3 21m
$ k describe cm my-config
Name: my-config
Namespace: default
Labels:
Annotations:
Data
====
another-another:
----
extra-value
extra-param:
----
extra-value
my-config.txt:
----
parameter1 = value1
parameter2 = value2
BinaryData
====
Events:
```
### 생성
kubectl create을 통해 만들 수 있다.
- --from-file=<파일 이름>
- 파일 이름과 동일한 키로 생성
- --from-file=<키>=<파일 이름>
- 키를 지정하여 생성
- --from-file=<디렉터리>
- 디렉터리 내에서 키 이름을 순회하여 생성
- --from-literal=<키>=<값>
- 키/값 직접 지정
### 업데이트
#### 파일에서 업데이트
kubectl replace -f 사용
#### 재생성과 업데이트
```console
$ kubectl create secret generic kuard-tls \
--from-file=kuard.crt --from-file=kuard.key \
--dry-run -o yaml | kubectl replace -f -
```
#### 현재 버전 수정
```console
$ kubectl edit configmap my-config
```
#### 실시간 업데이트
마운트된 컨피그맵 또는 시크릿을 파드 내에서 실시간으로 데이터가 업데이트된다.
신호는 따로 존재하지 않는다.
## 요약
컨피그맵과 시크릿은 애플리케이션에 동적 컨피규레이션을 제공하는 좋은 방법이다.
컨피그맵과 시크릿을 사용해서 컨테이너 이미지를 재사용할 수 있다.
dev, test, prod 환경 등에서 동일 이미지를 사용할 수 있다.