init 컨테이너로 환경 변수 값 정의하기

init 컨테이너로 환경 변수 값 정의하기

이 페이지는 파일을 통해 파드 안의 컨테이너에 대한 환경 변수를 구성하는 방법을 보여줘요.

출처: 문서

본문

시작하기 전에

Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.

Kubernetes 서버가 v1.34 이상 버전이어야 해요. 버전을 확인하려면 kubectl version을 입력해요.

설계가 작동하는 방식

이 연습에서는 파일에서 환경 변수를 가져와 실행 중인 컨테이너에 그 값을 프로젝션하는 파드를 만들어요.

apiVersion: v1
kind: Pod
metadata:
  name: envfile-test-pod
spec:
  initContainers:
    - name: setup-envfile
      image:  nginx
      command: ['sh', '-c', "echo \"DB_ADDRESS='address'\nREST_ENDPOINT='endpoint'\" > /data/config.env"]
      volumeMounts:
        - name: config
          mountPath: /data
  containers:
    - name: use-envfile
      image: nginx
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: DB_ADDRESS
          valueFrom:
            fileKeyRef:
              path: config.env
              volumeName: config
              key: DB_ADDRESS
              optional: false
  restartPolicy: Never
  volumes:
    - name: config
      emptyDir: {}

이 매니페스트를 보면 initContainer가 emptyDir 볼륨을 마운트하고 그 안의 파일에 환경 변수를 쓰며, 일반 컨테이너는 볼륨을 마운트할 필요 없이 fileKeyRef 필드를 통해 파일과 환경 변수 키를 모두 참조해요. optional 필드가 false로 설정되면 fileKeyRef의 지정된 키가 환경 변수 파일에 반드시 존재해야 해요.

볼륨은 파일을 쓰는 컨테이너(initContainer)에만 마운트되고, 환경 변수를 소비하는 소비자 컨테이너에는 볼륨이 마운트되지 않아요.

env 파일 형식은 kubernetes env 파일 표준을 따르는 하위 집합이에요.

컨테이너 초기화 동안 kubelet은 emptyDir 볼륨의 지정된 파일에서 환경 변수를 검색해 컨테이너에 노출해요.

모든 컨테이너 유형(initContainers, 일반 컨테이너, sidecars 컨테이너, 임시 컨테이너)이 파일에서 환경 변수 로딩을 지원해요.

이 환경 변수들이 민감한 정보를 저장할 수는 있지만, emptyDir 볼륨은 전용 Secret 객체와 같은 보호 메커니즘을 제공하지 않아요. 따라서 이 기능을 통해 기밀 환경 변수를 컨테이너에 노출하는 것은 보안 모범 사례로 간주되지 않아요.

파드를 생성해요.

kubectl apply -f https://k8s.io/examples/pods/inject/envars-file-container.yaml

파드의 컨테이너가 실행 중인지 확인해요.

# If the new Pod isn't yet healthy, rerun this command a few times.
kubectl get pods

환경 변수에 대한 컨테이너 로그를 확인해요.

kubectl logs envfile-test-pod -c use-envfile | grep DB_ADDRESS

출력은 선택된 환경 변수의 값을 보여줘요.

DB_ADDRESS=address

env 파일 문법 (Env file syntax)

Kubernetes가 사용하는 env 파일 형식은 POSIX 호환 bash의 환경 변수 의미론의 잘 정의된 하위 집합이에요. Kubernetes가 지원하는 모든 env 파일은 POSIX 호환 bash가 해석했을 때와 같은 환경 변수를 생성해요. 다만 POSIX 호환 bash는 Kubernetes가 받아들이지 않는 일부 추가 형식을 지원해요.

예시:

MY_VAR='my-literal-value'

규칙 (Rules)

  • 변수 선언: VAR='value' 형식을 사용해요. = 주변의 공백은 무시되고, 줄 앞의 공백은 무시되며, 빈 줄은 무시돼요.
  • 따옴표로 묶인 값: 값은 단일 따옴표(')로 묶여야 해요. 단일 따옴표 안의 내용은 그대로 보존돼요. 이스케이프 시퀀스 처리, 공백 접기, 문자 해석이 적용되지 않아요. 단일 따옴표 안의 줄바꿈은 보존돼요(여러 줄 값 지원).
  • 주석: #로 시작하는 줄은 주석으로 처리되어 무시돼요. 단일 따옴표 안의 # 문자는 주석이 아니에요.

예시:

# comment
DB_ADDRESS='address'

MULTI='line1
line2'

지원되지 않는 형식 (Unsupported forms)

  • 따옴표 없는 값은 금지돼요: VAR=value — 지원 안 함.
  • 이중 따옴표로 묶인 값은 금지돼요: VAR="value" — 지원 안 함.
  • 여러 개의 인접한 따옴표 문자열은 지원되지 않아요: VAR='val1''val2' — 지원 안 함.
  • 어떤 형태의 보간, 확장, 연결도 지원되지 않아요: VAR='a'$OTHER 또는 VAR=${OTHER} — 지원 안 함.

엄격한 단일 따옴표 요구 사항은 파일에서 환경 변수를 로딩할 때 kubelet이 값을 그대로 취하도록 보장해요.

다음 단계

더 알아보기 (Learn more)