ConfigMap, Secret
언제 사용하나
- 개발환경과 상용환경이 있음
- 개발환경의 A 서비스는 일반 접근과 보안 접근을 지원
- 개발환경에서 보안 접근을 해제할 수 있는 옵션이 있음
- 보안 접근을 한다면, 접근 User와 Key 설정
- 상용환경으로 배포하면, 보안 접속을 설정, User, Key 값도 변해야 함
- 개발과 상용환경의 다른 환경때문에 각각 다른 이미지로 보관하는 건 낭비
- 낭비하지 않으려고 ConfigMap, Secret 오브젝트가 있음
- 파드 생성 시 ConfigMap, Secret을 연결 시킴
- 연결된 파드의 컨테이너의 A서비스는 ConfigMap과 Secret으로 로직을 처리
사용 방법
- ConfigMap, Secert은 데이터로 상수, 환경변수 파일, Volume Mount 파일로 설정 가능
- 각각 Env(Literal), Env(File), Volume Mount(File)임
1. Env(Literal)
- 가장 기본적인 형태인 상수를 넣는 형태
- key와 value로 구성
- ConfigMap에 필요한 상수를 정의하면 파드를 생성할 때 ConfigMap을 가져와서 환경변수(env)에 설정함
- Secret에는 보안적인 요소인 인증키와 패스워드를 저장하고, 값은 base64 인코딩 되어 있음
- Secret이 파드로 주입될 땐 base64 디코딩되어 저장됨
- Secret은 DB가 아닌 메모리에 저장되어 보안에 좋음
- Secert은 1MB만 넣을 수 있음
Sample YAML
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-dev
data:
SSH: 'false'
User: dev
Secert
apiVersion: v1
kind: Secret
metadata:
name: sec-dev
data:
Key: MTIzNA==
- Key가 base64 인코딩 되어있네
Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container
image: kubetm/init
envFrom:
- configMapRef:
name: cm-dev
- secretRef:
name: sec-dev
2. Env(File)
- 파일을 통째로 ConfigMap에 담음
- 파일 이름이 key, 내용이 value
- Key : Value --> file.txt : Content
- 파드 환경변수에 넣을 때, name을 새로 정의하고 content만 넣음
- name: file, value: Content
- 파일을 ConfigMap으로 만드는 건 대시보드가 지원 안 해서 Master 콘솔로 만들어야 함
ConfigMap 생성
echo "Content" >> file-c.txt
kubectl create configmap cm-file --from-file=./file-c.txt
Secret 생성
echo "Content" >> file-s.txt
kubectl create secret generic sec-file --from-file=./file-s.txt
- 이 명령어로 파일 내용이 base64로 변경 됨
- 그러니까 파일 내용을 base64 인코딩할 필요가 없음
Pod yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-file
spec:
containers:
- name: container
image: kubetm/init
env:
- name: file-c
valueFrom:
configMapKeyRef:
name: cm-file
key: file-c.txt
- name: file-s
valueFrom:
secretKeyRef:
name: sec-file
key: file-s.txt
- configMapKeyRef, secretKeyRef로 ConfigMap, Secert 설정
3. Volume Mount (File)
- 파일을 ConfigMap에 담는 것 까진 Env(File)과 같음
- 파드를 만들 때 컨테이너 안의 마운트 path를 정의하고 path 안에 파일을 마운트 할 수 있음
Pod YAML
apiVersion: v1
kind: Pod
metadata:
name: pod-mount
spec:
containers:
- name: container
image: kubetm/init
volumeMounts:
- name: file-volume
mountPath: /mount
volumes:
- name: file-volume
configMap:
name: cm-file
- 컨테이너 안에 volumeMounts가 있고 마운트할 이름과 path가 있음
- volumes에 마운트할 이름이 있고, configMap이 cm-file 파일에 있다고 적혀있네
그래서 Env(File)과 Volume Mount(File)이 머선 차이고
- 파드 생성 후 둘의 ConfigMap을 변경하면 어떻게 될까??
- Env는 파드에 한 번 주입하면 끝이여서 파드에 영향을 주지 않음
- 파드가 죽고 재생성되어야 변한 ConfigMap이 정의됨
- Volume Mount는 변한 ConfigMap이 현재 생성된 파드에도 반영이 됨
출처
인프런 - 대세는 쿠버네티스
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 10. Namespace, ResourceQuota, LimitRange (0) | 2021.02.10 |
---|---|
[k8s] 9. ConfigMap, Secret - 실습 (0) | 2021.02.08 |
[k8s] 7. Volume - 실습 (0) | 2021.02.07 |
[k8s] 6. Volume - emptyDir, hostPath, PV/PVC (0) | 2021.02.04 |
[k8s] 5. Service - 실습 (0) | 2021.02.03 |