Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Medium Level #13] 비밀 정보 관리 (Secrets & ConfigMaps) 및 외부 Vault 연동

ygtoken 2025. 3. 17. 12:01
728x90

 

쿠버네티스 환경에서는 데이터베이스 비밀번호, API 키와 같은 중요한 정보를 안전하게 관리하는 것이 필수적입니다.

이를 위해 Kubernetes Secrets & ConfigMaps를 활용하여 비밀 정보를 안전하게 저장하고, HashiCorp Vault와 연동하여 보안을 강화하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1. Kubernetes Secrets을 사용하여 비밀번호 및 API 키를 안전하게 저장하는 방법

2. ConfigMaps를 활용하여 애플리케이션 환경 변수를 동적으로 관리하는 방법

3. HashiCorp Vault를 활용한 쿠버네티스 외부 비밀 저장소 연동

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ Kubernetes Secrets을 사용하여 비밀번호 및 API 키를 안전하게 저장하는 방법

 

❓ 문제 상황

 

운영팀에서 애플리케이션이 데이터베이스 비밀번호와 API 키를 필요로 하지만, 보안 강화를 위해 직접 코드에 포함시키지 않아야 합니다.

이를 해결하기 위해 Kubernetes Secrets을 활용하여 비밀 정보를 안전하게 저장하고, Pod에서 이를 참조하도록 설정해야 합니다.

비밀번호를 Base64 인코딩하여 Secret으로 저장

Pod 내 환경 변수로 Secret 값을 주입하여 사용

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. 비밀번호 및 API 키를 Base64로 인코딩하여 Kubernetes Secret을 생성합니다.

 

2. Pod 내에서 Secret을 환경 변수로 사용하도록 설정합니다.

 


✅ 정답 Manifest (Secret 및 Pod 설정)

 

🔹 비밀 정보를 저장하는 Secret 생성

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  DB_USER: dXNlcm5hbWU=  # "username"을 Base64 인코딩
  DB_PASSWORD: cGFzc3dvcmQ=  # "password"를 Base64 인코딩

 

🔹 Secret을 환경 변수로 사용하는 Pod 설정

apiVersion: v1
kind: Pod
metadata:
  name: db-app
spec:
  containers:
  - name: db-container
    image: mysql:5.7
    env:
    - name: MYSQL_USER
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: DB_USER
    - name: MYSQL_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: DB_PASSWORD

Pod이 Secret을 안전하게 환경 변수로 사용하도록 설정됨

 


📌 적용 후 예상 결과 값

 

1. Secret이 정상적으로 생성되었는지 확인

kubectl get secrets

 

💡 예상 출력 값

NAME         TYPE     DATA   AGE
db-secret    Opaque   2      10s

 

2. Pod에서 환경 변수 조회

kubectl exec -it db-app -- printenv | grep MYSQL

 

💡 예상 출력 값

MYSQL_USER=username
MYSQL_PASSWORD=password

애플리케이션이 Kubernetes Secret을 사용하여 민감한 데이터를 안전하게 관리함

 


2️⃣ ConfigMaps를 활용하여 애플리케이션 환경 변수를 동적으로 관리하는 방법

 

❓ 문제 상황

 

운영팀에서 애플리케이션이 환경 변수로 설정되는 여러 개의 구성 값을 필요로 하지만, 코드 변경 없이 동적으로 수정할 수 있어야 합니다.

이를 해결하기 위해 ConfigMaps를 활용하여 설정을 관리하고, 애플리케이션에서 이를 동적으로 참조하도록 설정해야 합니다.

ConfigMaps을 사용하여 애플리케이션 설정 관리

Pod 내 환경 변수 또는 볼륨 마운트 방식으로 ConfigMaps 적용

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. ConfigMaps를 생성하여 애플리케이션의 설정 값을 저장합니다.

 

2. Pod 내에서 ConfigMaps를 환경 변수로 참조하거나, 볼륨 마운트하여 설정 파일로 사용합니다.

 


✅ 정답 Manifest (ConfigMaps 및 Pod 설정)

 

🔹 애플리케이션 설정을 저장하는 ConfigMaps 생성

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_MODE: "production"
  LOG_LEVEL: "debug"

 

🔹 ConfigMaps를 환경 변수로 사용하는 Pod 설정

apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  containers:
  - name: app-container
    image: nginx
    env:
    - name: APP_MODE
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: APP_MODE
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: LOG_LEVEL

ConfigMaps를 활용하여 애플리케이션 설정을 동적으로 관리 가능

 


📌 적용 후 예상 결과 값

 

1. ConfigMaps가 정상적으로 생성되었는지 확인

kubectl get configmap

 

💡 예상 출력 값

NAME          DATA   AGE
app-config    2      5s

 

2. Pod에서 환경 변수 조회

kubectl exec -it app-pod -- printenv | grep APP

 

💡 예상 출력 값

APP_MODE=production
LOG_LEVEL=debug

ConfigMaps를 활용하여 코드 변경 없이 환경 변수를 동적으로 관리 가능

 


3️⃣ HashiCorp Vault를 활용한 쿠버네티스 외부 비밀 저장소 연동

 

❓ 문제 상황

 

운영팀에서 Kubernetes Secret을 직접 관리하는 대신, HashiCorp Vault를 활용하여 보안이 강화된 외부 비밀 저장소를 사용해야 합니다.

이를 위해 Vault와 Kubernetes를 연동하여 Pod이 동적으로 비밀 정보를 가져올 수 있도록 설정해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. HashiCorp Vault를 배포하고 Kubernetes 인증을 설정합니다.

 

2. Vault Agent Injector를 사용하여 Pod이 동적으로 비밀 정보를 가져올 수 있도록 구성합니다.

 


✅ HashiCorp Vault와 Kubernetes 연동 설정

 

🔹 Vault 배포

helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault

 

🔹 Vault에서 Kubernetes 인증 활성화

vault auth enable kubernetes

 

🔹 Secret을 Vault에 저장

vault kv put secret/db DB_USER=username DB_PASSWORD=password

이제 Pod이 HashiCorp Vault에서 비밀 정보를 동적으로 가져올 수 있음

 


📌 적용 후 예상 결과 값

 

1. Vault에서 Secret 조회

vault kv get secret/db

 

💡 예상 출력 값

DB_USER=username
DB_PASSWORD=password

외부 Vault를 활용하여 Kubernetes 비밀 정보를 안전하게 관리 가능

728x90