1. Secret을 활용한 민감 정보 관리
Kubernetes의 Secret은 비밀번호, 인증 토큰, SSH 키와 같은 민감한 데이터를 안전하게 보관하기 위한 오브젝트입니다. 이미지를 빌드할 때 환경 변수나 파일로 직접 정보를 포함하는 것보다 보안성이 뛰어나며, 데이터를 필요로 하는 Pod에만 선택적으로 노출할 수 있습니다.
1.1 Secret의 주요 유형
- kubernetes.io/service-account-token: API 서버 접근을 위해 자동으로 생성되는 토큰입니다.
- Opaque: 일반적인 키-값 형태의 데이터를 저장하는 기본 타입입니다.
- kubernetes.io/dockerconfigjson: 프라이빗 컨테이너 레지스트리 인증을 위한 정보입니다.
- kubernetes.io/tls: HTTPS 통신을 위한 인증서와 개인키를 저장합니다.
1.2 Secret 생성 방법
명령형 커맨드(CLI) 방식
파일을 기반으로 Secret을 생성하는 예시입니다.
# 데이터 파일 생성
echo -n 'admin' > ./db-user.txt
echo -n 'password123' > ./db-pass.txt
# Secret 생성
kubectl create secret generic auth-data --from-file=./db-user.txt --from-file=./db-pass.txt
선언적 YAML 방식
YAML 파일을 사용할 때는 데이터를 반드시 Base64로 인코딩해야 합니다.
apiVersion: v1
kind: Secret
metadata:
name: app-credentials
type: Opaque
data:
username: YWRtaW4= # 'admin' 인코딩 결과
password: cGFzc3dvcmQxMjM= # 'password123' 인코딩 결과
1.3 Secret 적용 방식
볼륨 마운트 방식
Secret 데이터를 컨테이너 내부의 특정 경로에 파일로 노출합니다.
apiVersion: v1
kind: Pod
metadata:
name: backend-service
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- name: auth-volume
mountPath: "/etc/auth-configs"
readOnly: true
volumes:
- name: auth-volume
secret:
secretName: auth-data
환경 변수 방식
특정 키의 값을 환경 변수로 주입합니다.
env:
- name: DATABASE_USER
valueFrom:
secretKeyRef:
name: app-credentials
key: username
2. ConfigMap을 활용한 설정 데이터 관리
ConfigMap은 환경 변수, 설정 파일, 명령줄 인수와 같은 비민감성 데이터를 저장하기 위한 리소스입니다. 애플리케이션 코드와 설정을 분리하여 코드 수정 없이 환경마다 다른 설정을 적용할 수 있게 해줍니다.
2.1 ConfigMap과 Secret 비교
- 데이터 성격: ConfigMap은 공개된 설정 정보, Secret은 암호화가 필요한 보안 정보.
- 보안성: ConfigMap은 평문 저장, Secret은 Base64 인코딩(추가적인 암호화 레이어 적용 가능).
2.2 ConfigMap 생성 및 활용
리터럴 값을 이용한 생성
kubectl create configmap global-settings --from-literal=LOG_LEVEL=DEBUG --from-literal=APP_ENV=prod
파일을 통한 환경 변수 주입
apiVersion: v1
kind: Pod
metadata:
name: config-test-pod
spec:
containers:
- name: worker
image: busybox
command: ["sh", "-c", "env"]
envFrom:
- configMapRef:
name: global-settings
2.3 ConfigMap 실시간 업데이트 (Hot Update)
볼륨 마운트 방식으로 주입된 ConfigMap은 리소스를 수정하면 실행 중인 컨테이너 내의 파일도 일정 시간 후에 자동으로 업데이트됩니다. 하지만 subPath를 사용해 개별 파일을 마운트한 경우에는 자동 업데이트가 이루어지지 않으므로 주의가 필요합니다.
ConfigMap 수정 예시
kubectl edit configmap global-settings
2.4 변경 사항 발생 시 Pod 재시작 유도
ConfigMap 데이터가 변경되었을 때 Pod가 이를 즉시 감지하여 적용하게 하려면 Deployment의 annotations 필드에 버전 정보를 추가하여 롤링 업데이트를 강제할 수 있습니다.
spec:
template:
metadata:
annotations:
config-version: "20240520.1"
spec:
containers:
- name: app-server
image: my-app:1.0
ConfigMap과 Secret을 적절히 혼합하여 사용하면 애플리케이션의 이식성과 보안성을 동시에 확보할 수 있습니다. 민감도는 낮지만 유연한 변경이 필요한 값은 ConfigMap으로, 보안이 생명인 자격 증명 정보는 Secret으로 관리하는 것이 Kubernetes 클러스터 운영의 핵심입니다.