본문 바로가기

카테고리 없음

9. Object - ConfigMap | Secret

728x90

< < ENV - literal> >

 

- Pod 생성시, 환경 변수를 주입하기 위해 사용

- ConfigMap, Secret의 내용이 수정되면 Pod를 재생성해야 다시 반영됨

- key:value 형식으로 입력, key와 valuesms ahen String이기 때문에 true,false의 경우 'true' / 'false' 로 입력

- secret의 경우 value는 Base64 인코딩이 필수, 추후 Pod 내부 env로 들어갈 때는 디코딩이 된다;

 

1-1) Configmap : 일반 설정값 저장소(개발/운영모드, 서버 주소, 기능 ON/OFF, 포트번호, 로그레벨)

apiVersion: v1
kind: ConfigMap
metadata:
  # configmap 이름
  name: cm-dev
# data는 key:value 구조를 가진다.
data:
  SSH: 'false'
  User: dev

1-2) Secret : 민감 정보 저장소(DB 패스워드, API 토큰, TLS 인증서, 인증키 ..)

apiVersion: v1
kind: Secret
metadata:
  name: sec-dev
data:
  # base64로 인코딩된 값
  # 1234 --base64-->> MTIzNA==
  # 보안 때문에 사용하기 보단 바이너리/특수문자 안전 저장 면에서 사용
  # 다만 누구나 디코딩 가능하단 것을 필히 기억할 것.
  Key: MTIzNA==

1-3) Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container
    image: kubetm/init
    # ConfigMap/Secret 값을 환경변수로 전부 가져와!
    envFrom:
    - configMapRef:
        name: cm-dev
    - secretRef:
        name: sec-dev
        
=========================
[동작 구조가 대충 이러하다]
ConfigMap(cm-dev)
 ├ SSH=false
 └ User=dev

Secret(sec-dev)
 └ Key=1234

          ↓

Pod 환경변수 주입

          ↓

컨테이너 내부

$SSH=false
$User=dev
$Key=1234
=========================

※ ConfigMap의 철학 : 애플리케이션과 설정을 분리!!

 

 

[ConfigMap]
  └ 일반 설정 저장
      예: mode=dev, SSH=false

[Secret]
  └ 비밀번호/토큰 같은 민감 정보 저장

[Pod]
  └ ConfigMap + Secret 값을 환경변수로 가져다가 사용
  
설정 저장소 -> Pod에 주입 -> 컨테이너가 사용!!

 

ConfigMap VS Secret

용도 일반 설정 민감 정보
저장 방식 평문 Base64
보안 의도 낮음 높음

 

정리

ConfigMap 일반 설정 저장
Secret 민감 정보 저장
envFrom 설정값들을 환경변수로 주입
Pod ConfigMap/Secret 값을 사용

 

< < ENV - file > >

- Configmap의 key는 file-c.txt 가 되지만, 환경변수로 들어갔을 경우, .txt는 허용되지 않기 때문에 제거된다.

- Configmap의 key를 file로 만들고. value를 file-c.txt 안의 내용으로 넣고 싶다면 아래와 같이 명령어를 입력

[ kubectl create configmap cm-file --from-file=file=./file-c.txt ]

 

configmap - master node에서 입력

echo "Content" >> file-c.txt
kubectl create configmap cm-file --from-file=./file-c.txt

 

secret - master node에서 입력

echo "Content" >> file-s.txt
kubectl create secret generic sec-file --from-file=./file-s.txt
## 명령어로 Secret을 생성할 때는 내용을 자동으로 Base64 해줌.
## 별도로 "Content"를 Base64 해줄 필요 없음!!

 

apiVersion: v1
kind: Pod
metadata:
  name: pod-file
spec:
  containers:
  - name: container
    image: kubetm/init
    env:
    # 환경변수(file-c)를 ConfigMap에서 가져올거야!
    - name: file-c
      valueFrom:
        configMapKeyRef:
          name: cm-file
          key: file-c.txt
    - name: file-s
      valueFrom:
        secretKeyRef:
          name: sec-file
          key: file-s.txt

 

[env: 항목 의미]

name: file-c 컨테이너 내부 환경변수 이름
configMapKeyRef ConfigMap 참조
name: cm-file ConfigMap 이름
key: file-c.txt ConfigMap 내부 key

 

이렇게 하면 최종적으로 컨테이너 안에서는 아래와 같이 file-c라는 변수의 값이 나온다.

echo $file-c
Content

 

그리고 Pod 내부에서는 Base64가 자동 디코딩 된다.

[container에 접근하여 확인]

[root@pod-file /]# env

##file-c##
file-c=Content

## Kubernetes가 기본 Service인 kubernetes API Server 정보를 자동으로 환경변수에 넣어준 것
HOSTNAME=pod-file
TERM=xterm
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_HOST=10.96.0.1
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:

##file-s##
file-s=Content

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
container=docker
_=/usr/bin/env
[root@pod-file /]#

 

환경변수의미

HOSTNAME=pod-file 현재 컨테이너의 hostname. 보통 Pod 이름과 같게 보임
TERM=xterm 터미널 타입
PATH=... 명령어를 찾는 경로
PWD=/ 현재 위치가 / 라는 뜻
SHLVL=1 shell 깊이. 현재 첫 번째 shell
HOME=/root root 사용자의 홈 디렉터리
container=docker 컨테이너 환경에서 실행 중이라는 표시
_=/usr/bin/env 마지막으로 실행된 명령어 경로

 

 

3. Volume Mount

apiVersion: v1
kind: Pod
metadata:
  name: pod-mount
spec:
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    # file-volume이라는 Volume을 컨테이너 내부의 /mount 경로에 연결!
    # 컨테이너 안에 /mount라는 경로가 생기고, 그 안에 ConfigMap 데이터가 파일로 들어간다.
    - name: file-volume
      mountPath: /mount
  # Pod 레벨에서 Voulme이 하나 생성
  volumes:
  # volumeMounts와 이름이 연결되는 구조!
  - name: file-volume
    # Volume의 원본이 ConfigMap이고, ConfigMap cm-file의 내용을 Voulume 형태로 제공
    configMap:
      name: cm-file

===========================
ConfigMap (cm-file)
        │
        ▼
Volume (file-volume)
        │
        ▼
Container 내부 /mount
===========================