참고
애플리케이션 환경변수 & 생명주기 관리
NOTE
쿠버네티스에서 애플리케이션의 환경변수를 어떻게 정의하는가?
쿠버네티스에서는 3가지 방법이 존재한다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
# 아래 env 부분에서 환경 변수를 설정한다.
env:
- name: APP_COLOR # 컨테이너가 사용할 수 있는 환경 변수의 이름
value: pink # 환경 변수의 값
YAML
복사
가장 기본적인 방법 (스펙정의에 환경변수도 같이 설정!)
위의 방식은 가장 기본적인 방식인 Key-Value 방식이다.
•
하지만 환경변수는 상황에 따라서 환경변수의 값만 다르고 내용은 동일한 YAML 파일을 여러개 사용하는 경우가 발생한다.
•
이 경우, 파드 정의 YAML 파일에서 환경변수만을 분리해서 관리하면 더 수월해진다!
ConfigMap
NOTE
ConfigMap ⇒ Pod정의 YAML 파일 밖에서 환경변수를 관리하는 방식!
ConfigMap을 사용하지 않는 경우 (환경설정별로 이미지 생성)
ConfigMap을 사용하는 경우 (하나의 이미지로 환경설정 따로관리 가능)
# Configmap 생성 - 명령형
kubectl create configmap <config-name> --from-literal=<key>=<value>
kubectl create configmap app-config --from-literal=APP_COLOR=blue --from-iteral=APP_MOD=prod
# ConfigMap 생성 - properties파일 활용
kubectl create --from-file=<path-to-file>
kubectl create configmap app-config --from-file=app_config.properties
# Configmap 생성 - 선언형
kubectl apply -f config-map.yaml
# ConfigMap 조회
kubectl get configMap
Bash
복사
apiVersion: v1
kind: ConfigMap # kind는 ConfigMap으로 설정한다.
metadata:
name: app-config
data: # 아래 부분에 ConfigMap 내용을 적어준다.
APP_COLOR: blue
APP_MODE: prod
YAML
복사
config-map.yaml
ConfigMap 주입
NOTE
ConfigMap을 생성했다면, 생성된 Configmap을 Pod에 주입해야한다!
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_COLOR: blue
APP_MODE: prod
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx
port: 80
envFrom:
- configMapRef:
name: app-config
YAML
복사
app-config(ConfigMap)을 nginx(Pod)에 주입한다!
# 기본적인 주입 (ConfigMap 이름)
envFrom:
- configMapRef:
name: app-config # ConfigMap 정의 YAML 파일의 metadata 이름
# 하나의 키만 가져온다 (ConfigMap 이름으로 가져오고, 특정값 지정)
env:
- name: APP_COLOR
valueFrom:
configMapKeyRef:
name: app-config # ConfigMap 정의 YAML 파일의 metadata 이름을 적는다.
key: APP_COLOR # 가져오고자 하는 키 값을 입력한다.
# 볼륨에서 전체 데이터를 파일로 가져오는 경우
volumes:
- name: app-config-volume
configmap:
name: app-config # ConfigMap 정의 YAMl파일의 metadata의 이름
YAML
복사
주입하는 방법들
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# key:value 속성
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# file 속성
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
YAML
복사
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env:
- name: PLAYER_INITIAL_LIVES # cm에 정의한 변수를 사용한다.
valueFrom:
configMapKeyRef:
name: game-demo
key: player_initial_lives
- name: UI_PROPERTIES_FILE_NAME # cm에 정의한 변수를 사용한다.
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
- name: config # config 이름으로 설정
configMap:
name: game-demo # cm이름 맞추기
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
YAML
복사
Secret
NOTE
ConfigMap과 유사하지만 보안 정보를 관리하기 위해 Secret을 별도로 제공한다!
base64로 저장된다는 점 말고는 ConfigMap과 다를게 없음
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_Host: mysql
DB_User: root
DB_Password: passwrd
---
# Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DB_Host: bXlzcWw=
DB_User: cm9vdA==
DB_Password: cGFzd3Jk
YAML
복사
Secret는 사람이 알아볼수 없는 해시형태로 표현되어있다.
Secret 생성하기
NOTE
# 시크릿 생성 (명령형)
k create secret generic [시크릿 이름] --from-literal [키]=[값]
k create secret generic app-secret \
--from-literal=DB_Host=mysql \
--from-literal=DB_User=root \
--from-literal=DB_Password=passwrd
# 파일사용
k create secret generic [시크릿 이름] --from-file [파일경로]
k create secret generic app-secret --from-file-app_secret.properties
# 시크릿 생성 (선언형)
k apply -f secret-data.yaml
YAML
복사
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DB_Host: host
DB_User: user
DB_Password: 1234
YAML
복사
secret-data.yaml
echo -n "암호화 값" | base64 # 암호값
echo -n "암호화 값" | base64 --decode # 복호화값
Bash
복사
암호화된 값을 확인하는 방법
Secret 주입하기
NOTE
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
labels:
app: myapp
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
envFrom:
- secretRef:
name: app-secret
---
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DB_HOST: ~~
DB_USER: ~~
DB_Password: ~~
YAML
복사
pod-definition- app-secret 주입
# 기본적인 주입
envFrom:
- secretMapRef:
name: app-secret # Secret 정의 YAML 파일에 설정한 metadata 이름을 적는다.
# 또는 하나의 키 값만 가져오는 경우
env:
- name: DB_Password
valueFrom:
SecretKeyRef:
name: app-secret # Secret 정의 YAML 파일에 설정한 metadata 이름을 적는다.
key: DB_Password # 가져오고자 하는 키 값을 입력한다.
# 볼륨에서 전체 데이터를 파일로 가져옴
volumes:
- name: app-secret-volime
secret:
name: app-secert # Secret 정의 YAML 파일에 설정한 metadata 이름을 적는다.
YAML
복사
app-secret.yaml