내용에 들어가기 앞서서 우선 루즈해진 스터디에 대한 분위기를 끌어 올리기 위해 2개 챕터를 동시에 진행하고자 합니다.
데이터베이스 연결 정보나 튜닝 파라미터를 코드 내부에 하드코딩하면, 설정이 바뀔 때마다 이미지를 새로 빌드해야 합니다. 이는 배포 유연성을 떨어뜨립니다.
쿠버네티스는 Pod 정의(spec)에서 컨테이너 실행 시점에 환경 변수를 주입하는 표준화된 방법을 제공합니다.
환경 변수는 리터럴 값뿐만 아니라 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
$(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)"
레거시 애플리케이션이 환경 변수를 읽지 못하고 CLI 인자만 받는 경우, 환경 변수를 커맨드에 주입할 수 있습니다.
Example 19-6: 시작 명령어에 환경 변수 사용
command: [ "java", "MyApp", "$(OUTPUT_FILE)" ]
env:
- name: OUTPUT_FILE
value: "/var/log/app.log"
환경 변수의 한계를 넘어, 복잡한 설정 파일이나 보안 데이터를 관리하기 위해 ConfigMap과 Secret을 사용합니다.
application.properties, nginx.conf 등 일반 설정 파일 저장.변수가 수십 개일 때 하나씩 나열하는 대신, envFrom을 사용하여 통째로 주입합니다. 이때 prefix를 사용하여 네임스페이스 충돌을 방지합니다.
Example 20-4: Prefix를 사용한 일괄 환경 변수 주입
envFrom:
- configMapRef:
name: random-generator-config
prefix: APP_ # ConfigMap의 'DEBUG' 키는 'APP_DEBUG' 환경변수가 됨
설정 파일 자체를 컨테이너 내부의 특정 경로에 파일로 생성합니다. 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
운영 안정성을 위해 설정이 변경되지 않도록 고정합니다. Kubelet의 API 폴링 부하를 줄여 성능상 이점도 있습니다.
Example 20-7: Immutable Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
immutable: true # 생성 후 수정 불가
data:
password: ...`
v1.34부터는 Init Container가 생성한 동적 설정값을 메인 컨테이너에 전달하는 방식이 획기적으로 간소화되었습니다.
source 명령어로 로드.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: {}
실무 운영 환경(Production)에서 반드시 고려해야 할 아키텍처 및 관리 전략입니다.
금융권 등 보안이 중요한 환경에서는 Secret 데이터를 Etcd(쿠버네티스 DB)에 저장하는 것조차 금지될 수 있습니다.
Secret 리소스를 아예 생성하지 않으므로 Etcd에 민감 정보가 남지 않습니다. 가장 높은 수준의 보안 패턴입니다.출처 및 참고:
안녕하세요~ 블로그 글 잘 봤습니다.
Secret 관련해서 정말 안전한지 의문을 가지고 있는데요. 보안을 강화하기 위해서 하신 작업이 있으신지 궁금합니다.