[Retry, k8s] 21. 컨피그 & 스토리지 API - 환경 변수
카테고리: KUBERNETES
태그: kubernetes
[Retry, k8s] 21. 컨피그 & 스토리지 API - 환경 변수
🔔 환경 변수
k8s에서 환경 변수를 전달할 때는 파드 템플릿에 env 또는 envForm을 지정하며, 크게 나눠 “정적 설정”, “파드 정보”, “컨테이너 정보”, “시크릿 리소스 기밀 정보”, “컨피그맵 리소스 설정값” 환경 변수에 포함시킬 수 있다.
| 설정 | 설명 |
|---|---|
| env | 파드 템플릿에서 직접 환경 변수를 설정하는 방법 |
| envForm | 컨피그맵, 시크릿에서 환경 변수를 가져와서 파드 템플릿에 적용하는 방법 |
(1) 정적 설정
$ cat <<EOF > sample-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: sample-env
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
env:
- name: MAX_CONNECTION
value: "100"
- name: TZ
value: Asia/Seoul
EOF
$ kubectl exec -it sample-env -- env | grep MAX_CONNECTION
MAX_CONNECTION=100
(2) 파드 정보
-
fieldRef는 파드의 정보를 참조할 때 사용하는데, 파드의 대한 모든 정보를 참조할 수 있는것은 아니고 파드의 다운워드 API를 통해 파드의 정보 중 일부만을 참조할 수 있다.
-
[fieldRef - 다운워드 API 정보] : https://kubernetes.io/ko/docs/concepts/workloads/pods/downward-api/#downwardapi-fieldRef
# 해당 예제를 통해 파드가 기동하고 있는 노드의 이름을 확인할 수 있다.
$ cat <<EOF > sample-env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: sample-env-pod
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
env:
- name: K8S_NODE
valueFrom:
fieldRef:
fieldPath: spec.nodeName
EOF
$ kubectl get pod -o wide sample-env-pod
NAME READY STATUS RESTARTS AGE IP NODE
sample-env-pod 1/1 Running 0 45s 10.38.0.1 k8s-node02
$ kubectl exec -it sample-env-pod -- env | grep K8S_NODE
K8S_NODE=k8s-node02
(3) 컨테이너 정보
-
resourceFieldRef는 컨테이너 리소스의 정보를 참조할 때 사용하고, fieldRef와 마찬가지로 다운워드 API를 통해 일부만을 참조할 수 있다.
-
[resourceFieldRef - 다운워드 API 정보] : https://kubernetes.io/ko/docs/concepts/workloads/pods/downward-api/#downwardapi-resourceFieldRef
cat <<EOF > sample-env-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: sample-env-container
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
env:
- name: CPU_REQUESTS
valueFrom:
resourceFieldRef:
containerName: nginx-container
resource: requests.cpu
- name: CPU_LIMITS
valueFrom:
resourceFieldRef:
containerName: nginx-container
resource: limits.cpu
EOF
$ kubectl exec -it sample-env-container -- env | grep CPU
CPU_REQUESTS=0
CPU_LIMITS=2
(4) 환경 변수 이용 시 주의 사항
📜 예제-1
- command, args로 실행할 명령어를 지정할 때는 일반적인 방식으로 환경 변수를 사용할 수 없다. (즉, ${}가 아닌 $()를 사용해야 한다.)
apiVersion: v1
kind: Pod
metadata:
name: sample-env-fail
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
command: ["echo"]
args: ["$(TESTENV)", "$(HOSTNAME)"]
env:
- name: TESTENV
value: "100"
$ kubectl logs sample-env-fail
100 $(HOSTNAME)
-
command와 args에서 참조 가능한 것은 그 파드의 매니페스트 내부에 정의된 환경 변수만이라는 점에 주의해야 한다.
-
만약 OS에서만 참조할 수 있는 환경 변수를 사용하는 경우 Entrypoint(spec.containers[].command)를 entrypoint.sh 등의 쉘 스크립트로 하여 쉘 스크립트 내부에서 처리할 수 있도록 한다.
-
시크릿이나 컨피그맵에서 정의한 env, 파드나 컨테이너 정보를 fieldPath, resourceFieldRef에서 참조한 env도 마찬가지로 [$(SOME_ENVIRONMENT)] 형식으로만 사용할 수 있다.
$ cat sample-env-fail2.yaml
apiVersion: v1
kind: Pod
metadata:
name: sample-env-fail2
labels:
app: sample-app
spec:
containers:
- name: nginx-container
image: nginx:1.16
command: ["echo"]
args: ["$(K8S_NODE)", "${K8S_NODE}"]
env:
- name: K8S_NODE
valueFrom:
fieldRef:
fieldPath: spec.nodeName
$ kubectl logs sample-env-fail2
k8s-node02 ${K8S_NODE}
댓글 남기기