# [쿠버네티스 패턴 19장 & 20장] EnvVar Configuration & Configuration Resource

bocopile·2025년 12월 20일

쿠버네티스 패턴

목록 보기
18/28

내용에 들어가기 앞서서 우선 루즈해진 스터디에 대한 분위기를 끌어 올리기 위해 2개 챕터를 동시에 진행하고자 합니다.

19. EnvVar Configuration (환경 변수 설정)

1. Problem (문제점)

데이터베이스 연결 정보나 튜닝 파라미터를 코드 내부에 하드코딩하면, 설정이 바뀔 때마다 이미지를 새로 빌드해야 합니다. 이는 배포 유연성을 떨어뜨립니다.

2. Solution (해결책)

쿠버네티스는 Pod 정의(spec)에서 컨테이너 실행 시점에 환경 변수를 주입하는 표준화된 방법을 제공합니다.

A. Basic Declaration (기본 선언 및 참조)

환경 변수는 리터럴 값뿐만 아니라 ConfigMap이나 Secret의 특정 키(Key)를 참조하여 설정할 수 있습니다.

Example 19-4: 다양한 소스에서 환경 변수 설정

apiVersion: v1
kind: Pod
metadata:
  name: random-generator
spec:
  containers:
    - name: random-generator
      image: k8spatterns/random-generator:1.0
      env:
        # 1. 리터럴 값 직접 할당
        - name: LOG_FILE
          value: /tmp/random.log
        # 2. ConfigMap에서 특정 키 참조
        - name: PATTERN
          valueFrom:
            configMapKeyRef:
              name: random-generator-config
              key: pattern
        # 3. Secret에서 특정 키 참조 (보안 데이터)
        - name: SEED
          valueFrom:
            secretKeyRef:
              name: random-generator-secret
              key: seed

B. Dependent Environment Variables (의존적 변수)

$(VAR_NAME) 문법을 사용하여 이미 정의된 다른 환경 변수나 Downward API(Pod 메타데이터) 값을 조합할 수 있습니다.

Example 19-5: Downward API와 변수 조합

    env:
      - name: PORT
        value: "8080"
      # Downward API: 현재 Pod의 IP를 가져옴
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
      # 위에서 정의된 변수들을 조합 (순서 중요!)
      - name: SERVICE_URL
        value: "http://$(MY_POD_IP):$(PORT)"

C. Command Arguments (커맨드 인자 전달)

레거시 애플리케이션이 환경 변수를 읽지 못하고 CLI 인자만 받는 경우, 환경 변수를 커맨드에 주입할 수 있습니다.

Example 19-6: 시작 명령어에 환경 변수 사용

    command: [ "java", "MyApp", "$(OUTPUT_FILE)" ]
    env:
      - name: OUTPUT_FILE
        value: "/var/log/app.log"

20. Configuration Resource (설정 리소스)

환경 변수의 한계를 넘어, 복잡한 설정 파일이나 보안 데이터를 관리하기 위해 ConfigMapSecret을 사용합니다.

1. ConfigMap vs Secret

  • ConfigMap: application.properties, nginx.conf 등 일반 설정 파일 저장.
  • Secret: 패스워드, 인증서 등 민감 정보 저장 (Base64 인코딩, tmpfs 메모리 마운트).

2. Usage Patterns (사용 패턴)

A. Batch Loading (일괄 주입)

변수가 수십 개일 때 하나씩 나열하는 대신, envFrom을 사용하여 통째로 주입합니다. 이때 prefix를 사용하여 네임스페이스 충돌을 방지합니다.

Example 20-4: Prefix를 사용한 일괄 환경 변수 주입

    envFrom:
      - configMapRef:
          name: random-generator-config
          prefix: APP_  # ConfigMap의 'DEBUG' 키는 'APP_DEBUG' 환경변수가 됨

B. Volume Mount (볼륨 마운트)

설정 파일 자체를 컨테이너 내부의 특정 경로에 파일로 생성합니다. Hot Reload(실시간 갱신)가 필요한 경우 유리합니다.

Example 20-6: 선택적 파일 마운트

    volumeMounts:
      - name: config-vol
        mountPath: /app/config/app.properties
        subPath: app.properties # 전체 디렉토리가 아닌 특정 파일만 마운트
    volumes:
      - name: config-vol
        configMap:
          name: my-config

C. Immutable Configuration (불변 설정)

운영 안정성을 위해 설정이 변경되지 않도록 고정합니다. Kubelet의 API 폴링 부하를 줄여 성능상 이점도 있습니다.

Example 20-7: Immutable Secret

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
immutable: true # 생성 후 수정 불가
data:
  password: ...`

Kubernetes v1.34 Update: Init Container 혁신 (Alpha)

v1.34부터는 Init Container가 생성한 동적 설정값을 메인 컨테이너에 전달하는 방식이 획기적으로 간소화되었습니다.

  • 기존 방식 (Anti-pattern): Init Container가 공유 볼륨에 파일 쓰기 -> Main Container가 볼륨 마운트 -> 시작 스크립트에서 source 명령어로 로드.
  • v1.34 방식 (fileKeyRef): Main Container는 볼륨 마운트 없이, emptyDir에 있는 파일을 직접 환경 변수로 참조합니다.
# v1.34 Concept Code
apiVersion: v1
kind: Pod
spec:
  initContainers:
    - name: token-generator
      image: busybox
      # Init Container가 공유 볼륨에 파일 생성
      command: ["sh", "-c", "echo 'AUTH_TOKEN=secret123' > /config/token.env"]
      volumeMounts:
        - name: shared-vol
          mountPath: /config
  containers:
    - name: app
      image: my-app
      env:
        # v1.34 New Feature: 볼륨 마운트 없이 파일에서 값 직접 추출
        - name: APP_TOKEN
          valueFrom:
            fileKeyRef: 
              name: shared-vol
              key: AUTH_TOKEN
              path: token.env
  volumes:
    - name: shared-vol
      emptyDir: {}

Operational Deep Dive (운영 심화)

실무 운영 환경(Production)에서 반드시 고려해야 할 아키텍처 및 관리 전략입니다.

1. 보안 아키텍처: Secret Store CSI Driver

금융권 등 보안이 중요한 환경에서는 Secret 데이터를 Etcd(쿠버네티스 DB)에 저장하는 것조차 금지될 수 있습니다.

  • Secrets Store CSI Driver: Vault나 AWS Secrets Manager의 데이터를 가져와 Pod의 메모리 볼륨(tmpfs)에만 마운트합니다.
  • 특징: 쿠버네티스 Secret 리소스를 아예 생성하지 않으므로 Etcd에 민감 정보가 남지 않습니다. 가장 높은 수준의 보안 패턴입니다.

2. 성능 가드레일: Etcd 1MB 제한

  • 제약: Etcd는 키-값 쌍 하나당 최대 1MB의 제한이 있습니다.
  • 가이드: ConfigMap에 jar 파일이나 큰 바이너리를 넣지 마세요. 이는 API 서버를 느려지게 만들고 클러스터 장애를 유발합니다. 대용량 설정은 S3 등 외부 스토리지를 이용해야 합니다.

출처 및 참고:

profile
DevOps Engineer

2개의 댓글

comment-user-thumbnail
2025년 12월 21일

안녕하세요~ 블로그 글 잘 봤습니다.
Secret 관련해서 정말 안전한지 의문을 가지고 있는데요. 보안을 강화하기 위해서 하신 작업이 있으신지 궁금합니다.

1개의 답글