쿠버네티스 Job이나 CronJob에서 MinIO 접속 키와 같은 민감한 정보를 안전하게 참조할 수 있도록 Kubernetes Secret(시크릿)을 생성하고 연동하는 방법입니다.
실무에서 가장 가볍게 쓸 수 있는 명령어(CLI) 방식과 GitOps 저장소 관리에 적합한 선언형(YAML) 방식 두 가지 중 편한 방법을 선택해 생성하시면 됩니다.
우리 파이프라인 코드는 os.getenv("MINIO_ENDPOINT") 형태로 대문자 환경변수를 다이렉트 호출하므로, Secret 내부의 Key 명칭도 환경변수명과 똑같이 대문자로 일치시켜 생성하는 것이 가장 좋습니다.
kubectl 명령어로 즉시 생성 (추천)가장 빠르고 안전한 방법입니다. 별도의 base64 인코딩 없이 평문 문자열(Literal)을 그대로 입력하면 쿠버네티스가 알아서 암호화하여 저장합니다.
kubectl create secret generic minio-creds \
--from-literal=MINIO_ENDPOINT="http://minio-service.internal.zone:9000" \
--from-literal=MINIO_ACCESS_KEY="admin" \
--from-literal=MINIO_SECRET_KEY="password" \
--from-literal=MINIO_RAW_BUCKET="devops-test" \
--from-literal=MINIO_REPORT_BUCKET="devops-test" \
--namespace=<Job이-실행될-네임스페이스>
형상관리 툴로 선언형 관리를 할 때 사용하는 방식입니다. YAML 파일에 기술할 때는 모든 Value 값을 base64로 인코딩해서 주입해야 합니다.
-n 필수):echo -n "http://minio-service.internal.zone:9000" | base64
# 출력결과 예시: aHR0cDovL21pbmlvLXNlcnZpY2UuaW50ZXJuYWwuem9uZTo5MDAw
minio-secret.yaml 파일 작성:apiVersion: v1
kind: Secret
metadata:
name: minio-creds
namespace: <Job이-실행될-네임스페이스>
type: Opaque
data:
# 암호화된 base64 결과값들을 아래에 매핑합니다.
MINIO_ENDPOINT: aHR0cDovL21pbmlvLXNlcnZpY2UuaW50ZXJuYWwuem9uZTo5MDAw
MINIO_ACCESS_KEY: YWRtaW4=
MINIO_SECRET_KEY: cGFzc3dvcmQ=
MINIO_RAW_BUCKET: ZGV2b3BzLXRlc3Q=
MINIO_REPORT_BUCKET: ZGV2b3BzLXRlc3Q=
# 매니페스트 반영
kubectl apply -f minio-secret.yaml
생성된 시크릿 풀(minio-creds)을 파이프라인 컨테이너 내부로 인젝션하는 방법입니다. 우리 코드는 키 명칭과 환경변수명이 1:1로 정확히 일치하므로, 개별로 맵핑할 필요 없이 envFrom 구문을 통해 통째로 쏟아붓는 방식이 가장 깔끔합니다.
job-pipeline.yaml 가동 명세서 예시:
apiVersion: batch/v1
kind: Job
metadata:
name: finops-step2-batch
namespace: <Secret과-동일한-네임스페이스>
spec:
# 가동 실패 시 최대 재시도 횟수 가드레일
backoffLimit: 2
template:
spec:
containers:
- name: finops-reprocessor
image: harbor.internal.zone/devops/finops-pipeline:v2
command: ["python3", "step2_pipeline.py", "--cluster", "COMPUTE"]
# ─── 🛡️ [핵심] Secret 내부의 모든 대문자 Key들을 환경변수로 자동 주입 ───
envFrom:
- secretRef:
name: minio-creds
# 타노스 쿼리 주소 등 공통 인프라 주소는 일반 env로 결합 가능
env:
- name: THANOS_QUERY_URL
value: "http://thanos-query.internal.zone:9090"
restartPolicy: OnFailure
Secret Not Found)를 뿜으며 파드가 뜨지 않습니다.ExternalSecret 객체를 선언하여 Vault에서 실시간으로 가져오도록 구성하는 것이 가장 무결한 아키텍처입니다.