26Y01f

Young-Kyoo Kim·3일 전

쿠버네티스 Job이나 CronJob에서 MinIO 접속 키와 같은 민감한 정보를 안전하게 참조할 수 있도록 Kubernetes Secret(시크릿)을 생성하고 연동하는 방법입니다.

실무에서 가장 가볍게 쓸 수 있는 명령어(CLI) 방식과 GitOps 저장소 관리에 적합한 선언형(YAML) 방식 두 가지 중 편한 방법을 선택해 생성하시면 됩니다.


1. Secret 생성하기

우리 파이프라인 코드는 os.getenv("MINIO_ENDPOINT") 형태로 대문자 환경변수를 다이렉트 호출하므로, Secret 내부의 Key 명칭도 환경변수명과 똑같이 대문자로 일치시켜 생성하는 것이 가장 좋습니다.

방법 A: 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이-실행될-네임스페이스>

방법 B: YAML 매니페스트 파일로 생성 (GitOps/형상관리용)

형상관리 툴로 선언형 관리를 할 때 사용하는 방식입니다. YAML 파일에 기술할 때는 모든 Value 값을 base64로 인코딩해서 주입해야 합니다.

  • 로컬 터미널에서 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

2. Kubernetes Job 매니페스트에 Secret 연동하기

생성된 시크릿 풀(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

💡 인프라 운영자 관점의 보안 팁

  1. 네임스페이스 격리 법칙: 쿠버네티스의 시크릿 자산은 Job 매니페스트와 반드시 동일한 Namespace에 생성되어야 파드가 뜰 때 컨테이너 커널 메모리로 상속받을 수 있습니다. 다르면 참조 에러(Secret Not Found)를 뿜으며 파드가 뜨지 않습니다.
  2. GitOps 백업 가드: 방법 B(YAML) 방식으로 시크릿을 형상 관리할 때, base64는 평문 복구가 너무 쉬우므로 Git 원격 저장소에 원본 YAML을 그냥 커밋하면 보안 감사에 적발됩니다. 사내에 HashiCorp Vault 인프라나 ArgoCD ExternalSecrets 컨트롤러가 연동되어 있다면, 시크릿 매니페스트를 직접 관리하는 대신 ExternalSecret 객체를 선언하여 Vault에서 실시간으로 가져오도록 구성하는 것이 가장 무결한 아키텍처입니다.

0개의 댓글