쿠버네티스는 일반적으로 ConfigMap과 Secret을 사용하여 환경 변수를 설정하며, 이는 추가적인 API 호출과 복잡성을 야기합니다. 예를 들어, 워크로드의 파드와 해당 구성을 별도로 관리해야 하며, 구성과 워크로드 파드 모두에 대한 질서 있는 업데이트를 보장해야 합니다.
또는, 라이선스 키나 일회성 토큰과 같은 환경 변수를 필요로 하는 공급업체 제공 컨테이너를 사용하고 있지만, 이를 하드코딩하거나 단순히 작업을 위해 볼륨을 마운트하고 싶지 않을 수 있습니다.
만약 그런 상황이라면, 이제 이를 달성할 수 있는 새로운 (알파) 방법이 있습니다. 클러스터 전체에 EnvFiles 피처 게이트가 활성화되어 있다면, kubelet에게 컨테이너의 환경 변수를 볼륨에서 로드하도록 지시할 수 있습니다 (이 볼륨은 컨테이너가 속한 파드의 일부여야 합니다). 이 피처 게이트를 통해 해당 파일을 컨테이너에 실제로 마운트하지 않고도 emptyDir 볼륨에 있는 파일에서 환경 변수를 직접 로드할 수 있습니다. 이는 놀라울 정도로 흔한 몇 가지 문제에 대한 간단하면서도 우아한 해결책입니다.
이것은 무엇인가요?
핵심적으로, 이 기능은 initContainer가 생성한 파일을 컨테이너에 지정하고, 쿠버네티스가 해당 파일을 파싱하여 환경 변수를 설정하도록 합니다. 이 파일은 emptyDir 볼륨(파드가 존재하는 동안 유지되는 임시 저장 공간)에 저장되며, 메인 컨테이너는 이 볼륨을 마운트할 필요가 없습니다. kubelet은 컨테이너 시작 시 파일을 읽어 이 변수들을 주입합니다.
작동 방식
다음은 간단한 예시입니다:
apiVersion: v1
kind: Pod
spec:
initContainers:
- name: generate-config
image: busybox
command: ['sh','-c','echo "CONFIG_VAR=HELLO" > /config/config.env']
volumeMounts:
- name: config-volume
mountPath: /config
containers:
- name: app-container
image: gcr.io/distroless/static
env:
- name: CONFIG_VAR
valueFrom:
fileKeyRef:
path: config.env
volumeName: config-volume
key: CONFIG_VAR
volumes:
- name: config-volume
emptyDir: {}
이 접근 방식을 사용하면 매우 쉽습니다. fileKeyRef 필드를 사용하여 파드 스펙에 환경 변수를 정의하면, 쿠버네티스에게 파일의 위치와 가져올 키를 알려줍니다. 파일 자체는 표준 .env 구문(KEY=VALUE 형식)과 유사하며, (적어도 이 알파 단계에서는) 반드시 emptyDir 볼륨에 작성되어야 합니다. 다른 볼륨 유형은 이 기능에서 지원되지 않습니다. 최소한 하나의 init 컨테이너가 emptyDir 볼륨을 마운트(파일을 작성하기 위해)해야 하지만, 메인 컨테이너는 그럴 필요가 없습니다—시작 시 변수들을 전달받기만 하면 됩니다.
보안에 대한 한마디
이 기능은 키나 토큰과 같은 민감한 데이터를 처리하는 것을 지원하지만, 구현 방식이 파드에 마운트된 emptyDir 볼륨에 의존한다는 점에 유의해야 합니다. 따라서 노드 파일 시스템에 접근할 수 있는 운영자는 파드 디렉터리 경로를 통해 이 민감한 데이터를 쉽게 검색할 수 있습니다.
이 기능을 사용하여 키나 토큰과 같은 민감한 데이터를 저장하는 경우, 기밀 정보 노출을 방지하기 위해 클러스터 보안 정책이 무단 접근으로부터 노드를 효과적으로 보호하는지 확인하십시오.
요약
이 기능은 현재 사용되는 많은 복잡한 해결책들을 제거하여 앱 작성 작업을 단순화하고 더 많은 사용 사례를 위한 문을 열어줄 것입니다. 쿠버네티스는 유연하며 피드백에 열려 있습니다. 이 기능을 어떻게 사용하시는지 또는 부족한 점이 무엇인지 알려주세요.