컨테이너의 환경 변수 정의하기
컨테이너의 환경 변수 정의하기
Pod 안에서 실행되는 컨테이너에 환경 변수를 넣고 싶을 때가 많죠. 이 페이지에서는 Pod를 만들 때 컨테이너의 환경 변수를 정의하고, 그 변수를 컨테이너 명령어나 인자에서 어떻게 재사용하는지 하나씩 살펴볼게요.
출처: Define Environment Variables for a Container — Kubernetes 공식 문서
본문
컨테이너의 환경 변수 정의하기
Pod를 만들 때, 그 Pod 안에서 실행되는 컨테이너의 환경 변수를 설정할 수 있어요. 환경 변수를 설정하려면 설정 파일에 env 또는 envFrom 필드를 넣으면 돼요.
그런데 env와 envFrom은 동작 방식이 조금 달라요.
env
: 컨테이너의 환경 변수를 직접 설정할 때 써요. 이름을 지정한 각 변수에 값을 하나하나 넣을 수 있어요.
envFrom
: ConfigMap이나 Secret을 참조해서 환경 변수를 설정할 때 써요. envFrom을 쓰면 참조한 ConfigMap 또는 Secret의 모든 키-값 쌍이 그 컨테이너의 환경 변수로 설정돼요. 공통 접두사 문자열도 지정할 수 있죠.
ConfigMap과 Secret에 대한 더 자세한 내용은 ConfigMap과 Secret 문서를 참고하세요.
이 페이지에서는 env를 사용하는 방법을 설명할게요. 이번 실습에서는 컨테이너 하나를 실행하는 Pod를 만들 건데, 이 Pod의 설정 파일이 DEMO_GREETING이라는 환경 변수를 값 "Hello from the environment"로 정의해요.
apiVersion: v1
kind: Pod
metadata:
name: envar-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/hello-app:2.0
env:
- name: DEMO_GREETING
value: "Hello from the environment"
- name: DEMO_FAREWELL
value: "Such a sweet sorrow"
-
이 매니페스트를 바탕으로 Pod를 만들어요.
kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml -
실행 중인 Pod를 조회해요.
kubectl get pods -l purpose=demonstrate-envars출력은 대략 이렇게 나와요.
NAME READY STATUS RESTARTS AGE envar-demo 1/1 Running 0 9s -
Pod의 컨테이너 환경 변수를 확인해요.
kubectl exec envar-demo -- printenv출력은 대략 이렇게 나와요.
NODE_VERSION=4.4.2 EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237 HOSTNAME=envar-demo ... DEMO_GREETING=Hello from the environment DEMO_FAREWELL=Such a sweet sorrow
참고
env또는envFrom필드로 설정한 환경 변수는 컨테이너 이미지에 지정된 환경 변수를 덮어써요.
참고 환경 변수끼리 서로 참조할 수도 있는데, 이때 순서가 중요해요. 같은 문맥에서 정의된 다른 변수를 참조하는 변수는 목록에서 더 뒤에 나와야 하고, 순환 참조는 피해야 해요.
설정 안에서 환경 변수 사용하기
Pod 설정의 .spec.containers[*].env[*] 아래 정의한 환경 변수는 설정 파일의 다른 곳, 예를 들어 컨테이너에 설정한 명령어나 인자에서도 쓸 수 있어요. 아래 예제 설정에서는 GREETING, HONORIFIC, NAME 환경 변수를 각각 Warm greetings to, The Most Honorable, Kubernetes로 설정했어요. MESSAGE 환경 변수는 이 변수들을 모두 조합한 다음, env-print-demo 컨테이너에 넘기는 CLI 인자로 사용됐죠.
환경 변수 이름은 '='를 제외한 출력 가능한 ASCII 문자로만 구성될 수 있어요.
apiVersion: v1
kind: Pod
metadata:
name: print-greeting
spec:
containers:
- name: env-print-demo
image: bash
env:
- name: GREETING
value: "Warm greetings to"
- name: HONORIFIC
value: "The Most Honorable"
- name: NAME
value: "Kubernetes"
- name: MESSAGE
value: "$(GREETING) $(HONORIFIC) $(NAME)"
command: ["echo"]
args: ["$(MESSAGE)"]
이 Pod가 만들어지면, 컨테이너에서 echo Warm greetings to The Most Honorable Kubernetes 명령이 실행돼요.
더 알아보기
- 환경 변수에 대해 더 알아보기
- Secret을 환경 변수로 사용
- EnvVarSource