Configure Environment Variables In Applications
ENV variables in Docker
$ docker run -e APP_COLOR=pink simple-webapp-color
Plain Text
복사
ENV variables in kubernetes
•
환경변수 지정을 위해 env 항목을 pod definition file에 추가.
•
ENV 속성은 배열 타입이다. ENV 하위 값은 Name과 Value 속으로 구성된다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
env:
- name: APP_COLOR
value: pink
Plain Text
복사
•
환경변수를 지정하는 다른 방법은 ConfigMaps and Secrets 을 사용하는 방법이 있다.
•
이 방식을 사용할 때는 Value를 명시하는 대신 valueFrom을 사용해서 ConfigMaps과Secret을 선택한다.
Configure ConfigMaps in Applications
ConfigMaps
•
ConfigMaps는 쿠버네티스 상에 설정 관련 데이터를 Key-Value 형태로 저장할 때 사용하는 오브젝트이다
•
ConfigMaps 구성의 2가지 단계.
◦
configMaps 생성
◦
configMaps를 Pod에 넣기
•
configmap을 만드는 2가지 방법.
◦
The Imperative way
$ kubectl create configmap app-config --from-literal=APP_COLOR=blue --from-literal=APP_MODE=prod
$ kubectl create configmap app-config --from-file=app_config.properties (Another way)
Plain Text
복사
◦
The Declarative way
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_COLOR: blue
APP_MODE: prod
$ kubectl create -f config-map.yaml
Plain Text
복사
View ConfigMaps
•
To view configMaps
$ kubectl get configmaps (or)
$ kubectl get cm
Plain Text
복사
•
To describe configmaps
$ kubectl describe configmaps
Plain Text
복사
ConfigMap in Pods
•
Pod에 Configmap 정의하기
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports
- containerPort: 8080
envFrom:
- configMapRef:
name: app-config
Plain Text
복사
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_COLOR: blue
APP_MODE: prod
Plain Text
복사
$ kubectl create -f pod-definition.yaml
Plain Text
복사
구성 변수를 포드에 삽입하는 다른 방법
•
Single Environment Variable 로 삽입
•
Volume 에 파일로 삽입
Secrets
•
ConfigMaps은 설정 관련 데이터를 일반적인 텍스트 포맷을 저장한다. 하지만 Secrets은 비밀스러운 데이터나 비밀번호, 비밀키 같은 민감한 데이터를 저장하기 위해 사용한다.
•
근본적으로 Secrets은 Configmaps와 같지만 데이터를 BASE64로 인코딩해서 저장한다는 점에서 차이가 있다.
•
Secrets을 매니페스트 파일로 정의해서 생성할 때는 반드시 데이터를 BASE64로 해시한 뒤 입력해야 한다
Web-Mysql Application
•
한 가지 방법은 앱 속성 / env를 configmap으로 이동하는 것입니다. 그러나 configmap은 데이터를 일반 텍스트 형식으로 저장합니다. 확실히 암호를 저장하기에 적합한 장소가 아닙니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_Host: mysql
DB_User: root
DB_Password: paswrd
Plain Text
복사
Secret을 사용하는 방법
•
1, secret 생성
•
2, Pod에 삽입
secret 생성하
•
The Imperative way
$ kubectl create secret generic app-secret --from-literal=DB_Host=mysql --from-literal=DB_User=root --from-literal=DB_Password=paswrd
$ kubectl create secret generic app-secret --from-file=app_secret.properties
Plain Text
복사
•
The Declarative way
Generate a hash value of the password and pass it to secret-data.yaml definition value as a value to DB_Password varaible.
$ echo -n "mysql" |base64
$ echo -n "root" |base64
$ echo -n "paswrd"|base64
Plain Text
복사
kubectl create 를 통해 pod 생성
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DB_Host: bX1zcWw=
DB_User: cm9vdA==
DB_Password: cGFzd3Jk
Plain Text
복사
$ kubectl create -f secret-data.yaml
Plain Text
복사
Encode Secrets
Secrets 조회
•
$ kubectl get secrets
$ kubectl describe secret
$ kubectl get secret app-secret -o yaml
Plain Text
복사
Decode Secrets
•
To decode secrets
$ echo -n "bX1zcWw=" |base64 --decode
$ echo -n "cm9vdA==" |base64 --decode
$ echo -n "cGFzd3Jk" |base64 --decode
Plain Text
복사
Pod에 secret 구성하기
•
Secret을 Pod에 삽입하려면 새 속성 envFrom 다음에 secretRef 이름을 추가 한 다음 포드 정의를 만듭니다.
apiVersion: v1
kind: Secret
metadata:
name: app-secret
data:
DB_Host: bX1zcWw=
DB_User: cm9vdA==
DB_Password: cGFzd3Jk
Plain Text
복사
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
ports:
- containerPort: 8080
envFrom:
- secretRef:
name: app-secret
Plain Text
복사
$ kubectl create -f pod-definition.yaml
Plain Text
복사
pods에 secret을 구성하는 다른 방법
•
Single ENV variable 로 삽입
•
Volume 에 파일처럼 전체 비밀을 삽입 할 수 있습니다.
Secrets in pods as volume
•
Secret의 각 속성은 Secret의 값을 내용으로하는 파일로 생성됩니다.