[Retry, k8s] 21. 컨피그 & 스토리지 API - 환경 변수

Date:     Updated:

카테고리:

태그:

[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) 파드 정보

# 해당 예제를 통해 파드가 기동하고 있는 노드의 이름을 확인할 수 있다.
$ 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) 컨테이너 정보

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}


KUBERNETES 카테고리 내 다른 글 보러가기

댓글 남기기