개요
container 환경 변수를 사용하는 방법을 알아보겠습니다.
환경 변수 사용방식
환경 변수를 사용하는 방법에는 총 3가지의 방법이 아래 와같이 존재합니다.
- Environment Variable
- ConfigMap
- Secret
Environment Variable
env 필드에서 key-value 형식으로 사용됩니다.
아래에서 밖같 박스 부분이 환견 변수를 사용한 부분이며, 환경 변수를 container 하위에서 설정하면 됩니다.
Configmap 개요
사용 이유
container에 영향을 주는 환경변수를 외부에서 관리함으로써 container의 실행 환경을 제어할 때 사용합니다.
사용 절차
1. configmap 생성
2. configmap 확인
3. configmap 사용방법
제한 사항
configmap의 개별 Object는 1 MiB의 크기 제한을 받습니다.
즉, 2개의 Object를 합쳐서 2 MiB 일 경우에도 문제가 없습니다.
configmap 생성
생성 방법은 2가지(명령어로 생성, yaml 파일로 생성)가 있습니다.
명령어로 생성
1. key : value 형식
Ex) kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
2. key : value(파일 내용) 형식
Ex) kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt
/path/to/bar/file1.txt의 내용이 value가 됩니다
3. key(file 이름) : value(파일 내용) 형식
Ex) kubectl create configmap my-config --from-file=path/to/bar
path/to/bar 경로 하위의 "파일 명이 key"가 되고 "파일의 내용의 value"가 됩니다.
4. key(file의 key) : value(file의 value) 형식
Ex) kubectl create configmap my-config-dir3 --from-env-file=./env
한 개에 파일에 여러 개의 key=value를 한 번에 지정하여 configmap의 data로 만드는 방식
root@master:~/2# cat env
test1=test_1
test2=test_2
root@master:~/2# kubectl describe configmap my-config-dir3
Name: my-config-dir3
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
test1:
----
test_1
test2:
----
test_2
yaml로 생성
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# 1개의 key와 value를 쌍으로 생성
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# 한개의 key에 여러개의 value를 입력
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
configmap 확인
kubectl describe configmap {configmap object 이름)
root@master:~# kubectl describe configmap game-demo
Name: game-demo
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
game.properties:
----
enemy.types=aliens,monsters
player.maximum-lives=5
player_initial_lives:
----
3
ui_properties_file_name:
----
user-interface.properties
user-interface.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
BinaryData
====
Events: <none>
configmap 사용법
container에서 configmap을 어떻게 사용할 수 있는지 알아보겠습니다.
my-config를 기준으로 테스트가 진행됩니다.
모든 테스트 https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/ 를 기반으로 작성했습니다.
1. configmap 전체를 참조
apiVersion: v1
kind: Pod
metadata:
labels:
run: config-pod
name: config-pod
spec:
containers:
- image: busybox
name: config-pod
command: ["sleep","36000"]
envFrom:
- configMapRef:
name: my-config
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
ENV 확인 방법
kubectl exec -it {POD 이름} -- sh
/ # echo $key1
config1
/ # echo $key2
config2
2. configmap의 일부 key만을 참조
configmap의 일부 key만을 사용하는 방법입니다.
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: config-pod
name: config-pod
spec:
containers:
- image: busybox
name: config-pod
command: ["sleep","36000"]
env:
- name: TEST_1
valueFrom:
configMapKeyRef:
name: my-config
key: key1
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
ENV 확인 방법
kubectl exec -it {POD 이름} -- sh
/ # echo $TEST_1
config1
3. configmap의 volume mount
configmap을 volume처럼 사용하는 방법입니다.
다음의 yaml 파일은 /etc/config에 configmap Object를 Mount 합니다.
apiVersion: v1
kind: Pod
metadata:
labels:
run: config-pod-volume
name: config-pod-volume
spec:
containers:
- image: busybox
name: config-pod-volume
command: ["sleep", "36000"]
volumeMounts:
- mountPath: /etc/config
name: my-config
volumes:
- name: my-config
configMap:
name: my-config
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
ENV 확인 방법
key를 파일명으로 configmap이 mount가 됩니다.
kubectl exec -it {POD 이름} -- sh
/ # cd /etc/config
4. configmap의 일부 key를 volume mount
configmap에서 일부 key만 volume처럼 사용하는 방법입니다.
다음의 yaml 파일은 /etc/config에 configmap Object를 Mount 합니다.
apiVersion: v1
kind: Pod
metadata:
labels:
run: config-pod-volume-key
name: config-pod-volume-key
spec:
containers:
- image: busybox
name: config-pod-volume-key
command: ["sleep", "36000"]
volumeMounts:
- mountPath: /etc/config
name: my-config
volumes:
- name: my-config
configMap:
name: my-config
items:
- key: key1
path: key1_data
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
ENV 확인 방법
key를 파일명으로 configmap이 mount가 됩니다.
kubectl exec -it {POD 이름} -- sh
/ # cd /etc/config
Secret 개요
사용 이유
configmap이 평문으로 저장이 되는데 이걸 encoding 하여 살짝 안전하게 사용하기 위해서 사용 됩니다.
그러나 encrytion된것이 아니기때문에 안전하지 않습니다. 그래서 개인적으로 왜 사용하는지 아직도 잘모르겠음.. 그나마 정보가 tmpfs 에 저장되기 때문에 node의 storage에 저장되지 않는 점이 조금 괜찮은거 같습니다.
secret 생성
configmap 생성과 동일합니다.
딱 한가지 차이 점이 있다면 --from-env-file 옵션 을 지원 하지 않습니다.
명령어 생성
Configmap과 비교하여 설명 하겠습니다.
주황색 부분이 다른 부분 입니다.
1. key : value 형식
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret
2. key : value(파일 내용) 형식
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt
kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa
secret 사용법
1. secret 전체를 참조
configmap과 유사 하며, configMap 부분이 secret으로 변경되면 됩니다.
configmap 설정
envFrom:
- configMapRef: -> secretRef
name: my-config
Secret 설정
apiVersion: v1
kind: Pod
metadata:
name: envfrom-secret
spec:
containers:
- name: envars-test-container
image: nginx
envFrom:
- secretRef:
name: test-secret
2. secret의 일부 key만을 참조
configmap과 유사 하며, configMap 부분이 secret으로 변경되면 됩니다.
configmap 설정
env:
- name: TEST_1
valueFrom:
configMapKeyRef: -> secretKeyRef
name: my-config
key: key1
secret 설정
apiVersion: v1
kind: Pod
metadata:
name: envvars-multiple-secrets
spec:
containers:
- name: envars-test-container
image: nginx
env:
- name: BACKEND_USERNAME
valueFrom:
secretKeyRef:
name: backend-user
key: backend-username
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-user
key: db-username
3. secret의 volume mount
configmap의 설정을 secret으로 변경하면됩니다.
4. secret의 일부 key를 volume mount
configmap의 설정을 secret으로 변경하면됩니다.
정리
k8s에서 환경 변수를 관리하기 위해서 configmap을 지원하며 configmap을 container서 사용하는 방법은
기본 적으로 2가지 방법이 존재합니다.
1. configmap을 직접 Pod에서 사용
2. configmap을 volume으로 mount해서 사용
'Cloud > k8s-CKAD' 카테고리의 다른 글
[CKAD] Resource 제어, resource/LimitRange/ResourceQuotas (0) | 2024.08.12 |
---|---|
[CKAD] Service Account (0) | 2024.07.16 |
[CKAD] Security Context (0) | 2024.04.23 |
[CKAD] Dockerfile과 yaml 실행 필드 관련 관계 (1) | 2024.01.29 |
[CKAD] Dockerfile의 모든것 (0) | 2024.01.10 |