본문 바로가기
네트워크/k8s

[k8s] 8. ConfigMap, Secret - Env, Mount

by Lauren X Ming 2021. 2. 7.

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