ConfigMap과 Secret
- ConfigMap : 컨테이너 구성 정보를 한곳에 모아서 관리
- Secret : 컨테이너가 사용하는 password, auth token, ssh key와 같은 중요한 정보를 저장하고 민감한 구성정보를
base64로 인코딩해서 한곳에 모아서 관리
- 민감하지 않은 일반 설정파일 configmap을 사용하고 민감한 데이터는 secret을 사용
- Secret 데이터 전달 방법
1. Command-line Agrument
2. Environment Variable
3. Volume Mount
Secret 만들기
kubectl create secret <Available Commands> name [flags] [options]
※ Available Commands 로 3개 타입을 사용할 수 있고, 3개 중 1개를 꼭 사용해야함
또한, Available Commands에 따라 들어가는 옵션이 달라짐
1. docker-registry : Create a secret for use with a Docker registry
2. generic : Create a secret from a local file, directory or literal value
3. tls : Create a TLS secret
genid-web-config 디렉토리 내 cat nginx-config.conf 준비
genid-web-config# cat nginx-config.conf
server {
listen 80;
server_name www.example.com;
gzip on;
gzip_types text/plain application/xml;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
generic 타입의 secret를 생성
# kubectl create secret generic ttabae-secret --from-literal=INTERVAL=2 --from-file=./genid-web-config/
secret/ttabae-secret created
# kubectl get secrets
NAME TYPE DATA AGE
ttabae-secret Opaque 2 5m42s
※ Secret 타입
tyep | 의미 |
Opaque | 임의의 사용자 정의 데이터 |
kubernetes.io/service-account-token | 서비스 어카운트 토큰 |
kubernetes.io/dockercfg | 직렬화 된(serialized) ~/.dockercfg 파일 |
kubernetes.io/dockerconfigjson | 직렬화 된 ~/.docker/config.json 파일 |
kubernetes.io/basic-auth | 기본 인증을 위한 자격 증명(credentail) |
kubernetes.io/ssh-auth | SSH를 위한 자격 증명 |
kubernetes.io/tls | TLS 클라이언트나 서버를 위한 데이터 |
bootstrap.kubernetes.io/token | 부트스트랩 토큰 데이 |
describe와 yaml 형식으로 secret의 정보를 확인해보면 바이트 정보와 인코딩된 정보밖에 확인이 안된다.
대신, pod로 전달될때는 디코딩 되어 전달된다. (민감한 정보에 사용)
# kubectl describe secrets ttabae-secret
Name: ttabae-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
INTERVAL: 1 bytes
nginx-config.conf: 218 bytes
# kubectl get secrets ttabae-secret -o yaml
apiVersion: v1
data:
INTERVAL: Mg==
nginx-config.conf: c2VydmVyIHsKICAgIGxpc3RlbiAgIDgwOwogICAgc2VydmVyX25hbWUgIHd3dy5leGFtcGxlLmNvbTsKCiAgICBnemlwIG9uOwogICAgZ3ppcF90eXBlcyB0ZXh0L3BsYWluIGFwcGxpY2F0aW9uL3htbDsKCiAgICBsb2NhdGlvbiAvIHsKICAgICAgICByb290ICAgL3Vzci9zaGFyZS9uZ2lueC9odG1sOwogICAgICAgIGluZGV4ICBpbmRleC5odG1sIGluZGV4Lmh0bTsKICAgIH0KfQo=
kind: Secret
metadata:
creationTimestamp: "2022-12-21T02:25:53Z"
name: ttabae-secret
namespace: default
resourceVersion: "149454"
uid: 00168cd8-f63c-4a40-a1dc-5616aa40a357
type: Opaque
Secret 사용하기
- 정의된 Secret을 Pod의 Cotainer에 전달하는 방법
1. environment variable로 전달
2. Command-line Argument로 전달
3. Volume에 secret을 사용하여 컨테이너 디렉토리에 Mount
genid-env-secret.yaml
- 생성한 secret을 컨테이너 환경변수(env)로 전달
apiVersion: v1
kind: Pod
metadata:
name: genid-env-secret
spec:
containers:
- image: smlinux/genid:env
env:
- name: INTERVAL
valueFrom:
secretKeyRef:
name: ttabae-secret
key: INTERVAL
name: fakeid-generator
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
2초마다 랜덤한 키 파일 생성 확인 가능
# kubectl create -f genid-env-secret.yaml
pod/genid-env-secret created
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
genid-boy 2/2 Running 2 (37m ago) 12h 10.36.0.2 node1.example.com <none> <none>
genid-env-secret 2/2 Running 0 6s 10.36.0.3 node1.example.com <none> <none>
genid-stone 2/2 Running 2 (36m ago) 12h 10.44.0.1 node2.example.com <none> <none>
genid-volume 2/2 Running 2 (36m ago) 12h 10.44.0.2 node2.example.com <none> <none>
# curl 10.36.0.3
+----------------------+
| Brianna Williams |
| 298 West Street Terr |
| Massillon, OH 44646 |
| (216) xxx-xxxx |
+----------------------+
# curl 10.36.0.3
+-------------------+
| Rocco Summers |
| 737 Cooper St |
| Beloit, WI 53511 |
| (608) xxx-xxxx |
+-------------------+
# curl 10.36.0.3
+-------------------+
| Pauline Aguirre |
| 731 Rider Blvd |
| Dayton, OH 45401 |
| (513) xxx-xxxx |
+-------------------+
genid-volume-secret.yaml
- 생성한 secret을 컨테이너 volume mount로 전달
apiVersion: v1
kind: Pod
metadata:
name: genid-volume-secret
spec:
containers:
- image: smlinux/genid:env
env:
- name: INTERVAL
valueFrom:
secretKeyRef:
name: ttabae-secret
key: INTERVAL
name: fakeid-generator
volumeMounts:
- name: html
mountPath: /webdata
- image: nginx:1.14
name: web-server
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
- name: config
mountPath: /etc/nginx/conf.d
readOnly: true
ports:
- containerPort: 80
volumes:
- name: html
emptyDir: {}
- name: config
secret:
secretName: ttabae-secret
items:
- key: nginx-config.conf
path: nginx-config.conf
동작중인 pod에 접근하여 파일 확인
- pod에 접근하면 secret의 내용은 디코딩 되어서 텍스트 값으로 확인 할 수 있다.
# kubectl create -f genid-volume-secret.yaml
pod/genid-volume-secret created
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
genid-boy 2/2 Running 2 (41m ago) 12h 10.36.0.2 node1.example.com <none> <none>
genid-env-secret 2/2 Running 0 4m24s 10.36.0.3 node1.example.com <none> <none>
genid-stone 2/2 Running 2 (40m ago) 12h 10.44.0.1 node2.example.com <none> <none>
genid-volume 2/2 Running 2 (40m ago) 12h 10.44.0.2 node2.example.com <none> <none>
genid-volume-secret 2/2 Running 0 6s 10.44.0.3 node2.example.com <none> <none>
# kubectl exec -it genid-volume-secret -c web-server -- /bin/bash
root@genid-volume-secret:/# cd /etc/nginx/conf.d/
root@genid-volume-secret:/etc/nginx/conf.d# ls
nginx-config.conf
root@genid-volume-secret:/etc/nginx/conf.d# cat nginx-config.conf
server {
listen 80;
server_name www.example.com;
gzip on;
gzip_types text/plain application/xml;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
root@genid-volume-secret:/etc/nginx/conf.d# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 20G 13G 5.6G 70% /
tmpfs 64M 0 64M 0% /dev
tmpfs 485M 0 485M 0% /sys/fs/cgroup
/dev/sda5 20G 13G 5.6G 70% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 870M 4.0K 870M 1% /etc/nginx/conf.d
tmpfs 870M 12K 870M 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 485M 0 485M 0% /proc/acpi
tmpfs 485M 0 485M 0% /proc/scsi
tmpfs 485M 0 485M 0% /sys/firmware
root@genid-volume-secret:/etc/nginx/conf.d# ls -l
total 0
lrwxrwxrwx 1 root root 24 Dec 21 02:50 nginx-config.conf -> ..data/nginx-config.conf
Secret 데이터 용량 제한
- Secret etcd에 암호화 하지 않은 텍스트로 저장되므로 secret value가 커지면 메모리 용량을 많이 사용하게 됨
- secret의 최대 크기는 1MB (configmap도 동일)
[참고]
- https://www.youtube.com/watch?v=aW2RAVnOHFY
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Pod Scheduling (1) | 2023.01.26 |
---|---|
[Kubernetes] Istio 정리 (0) | 2023.01.25 |
[Kubernetes] ConfigMap (0) | 2022.12.20 |
[Kubernetes] kubernetes Canary Deployment (0) | 2022.12.17 |
[Kubernetes] Annotation (0) | 2022.12.17 |