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
===========================