🎯 쿠버네티스 9장 - 효과적인 애플리케이션 구성 및 관리
📑 목차
1. ConfigMap을 이용한 애플리케이션 설정 관리
핵심 개념
ConfigMap은 애플리케이션의 설정 정보를 컨테이너 이미지와 분리하여 관리할 수 있게 해주는 쿠버네티스 오브젝트입니다.
💡 ConfigMap이 필요한 이유
🤔 질문: “애플리케이션은 이미 잘 동작하고 있지 않나요?”
📋 정해진 길로만 가는 애플리케이션의 문제점
실제 상황
- 문제: 애플리케이션 설정이 컨테이너 이미지에 하드코딩됨
- 감지: 환경별(개발/테스트/운영) 설정 변경 시 이미지 재빌드 필요
- 조치: ConfigMap으로 설정 외부화
- 결과: 동일 이미지로 다양한 환경 배포 가능
💻 ConfigMap 생성 및 사용 방법
📊 ConfigMap 생성 방식
| 방식 | 명령어 | 용도 |
|---|---|---|
| YAML 파일 | kubectl apply -f configmap.yaml | 복잡한 설정 |
| 명령줄 | kubectl create configmap | 간단한 설정 |
| 파일에서 | --from-file | 설정 파일 전체 |
📋 ConfigMap YAML 구조
# 📊 ConfigMap-sleepy-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: sleepy-config
data:
STATUS: "WAKE UP"
NOTE: "TestBed Configuration"💻 Pod에서 ConfigMap 사용 방법
1. envFrom으로 전체 ConfigMap 참조
# 📊 deploy-configMapRef.yaml
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- image: sysnet4admin/sleepy
name: sleepy
command: ["/bin/sh","-c"]
args:
- |
echo "sleepy $STATUS"
echo "NOTE: $NOTE"
sleep 3600
envFrom:
- configMapRef:
name: sleepy-config2. valueFrom으로 특정 키 참조
# 📊 deploy-configMapKeyRef.yaml
env:
- name: APP_STATUS
valueFrom:
configMapKeyRef:
name: sleepy-config
key: STATUS3. Volume Mount로 파일로 마운트
# 📊 deploy-vol-configMap.yaml
volumeMounts:
- name: appconfigvol
mountPath: /etc/sleepy.d
volumes:
- name: appconfigvol
configMap:
name: sleepy-config2. Secret을 이용한 민감 정보 관리
중요한 현실
Secret은 Base64 인코딩일 뿐 진짜 암호화가 아닙니다. 실제 운영 환경에서는 더 강력한 보안 솔루션이 필요합니다.
💡 Secret의 한계와 실제 보안
🤔 질문: “애플리케이션에 중요 정보는 어떻게 넣나요? (예: 아이디/암호)”
📋 Base64의 현실적 한계
Base64는 암호화가 아님
# 누구나 쉽게 디코딩 가능 echo "ZGItdXNlcg==" | base64 -d # 결과: db-userBase64는 단순 인코딩으로 보안이라고 할 수 없음
🛡️ 실제 보안 메커니즘
| 보안 레이어 | Secret의 실제 보호 방식 |
|---|---|
| etcd 암호화 | 클러스터 레벨에서 AES 암호화 |
| 전송 암호화 | TLS로 API 통신 보호 |
| 접근 제어 | RBAC로 권한 관리 |
| 메모리 저장 | tmpfs에만 마운트 (디스크 저장 X) |
💻 Secret 생성 및 사용 방법
📊 Secret 빌트인 타입
| 타입 | 사용처 |
|---|---|
| Opaque | 임의의 사용자 정의 데이터 |
| kubernetes.io/service-account-token | 서비스 어카운트 토큰 |
| kubernetes.io/dockercfg | Docker 설정 파일 |
| kubernetes.io/basic-auth | 기본 인증 자격 증명 |
| kubernetes.io/ssh-auth | SSH 자격 증명 |
| kubernetes.io/tls | TLS 클라이언트/서버 데이터 |
📋 Secret 생성 방법
# 명령줄로 Secret 생성
kubectl create secret generic mysql-cred \
--from-literal=username='db-user' \
--from-literal=password='hoon'# 📊 secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-cred
namespace: default
data:
username: ZGItdXNlcg== # Base64: db-user
password: aG9vbg== # Base64: hoon
type: Opaque💻 Pod에서 Secret 사용
# 📊 deploy-secretKeyRef-w-pvc.yaml
env:
# MySQL 초기화용
- name: MYSQL_ROOT_PASSWORD
value: rootpassword
# Secret에서 사용자 정보 가져오기
- name: MYSQL_USER_ID
valueFrom:
secretKeyRef:
name: mysql-cred
key: username
- name: MYSQL_USER_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-cred
key: password⚙️ Immutable Secret과 ConfigMap
중요 기능
immutable: true설정으로 변경 불가능한 Secret/ConfigMap 생성 가능
📋 Immutable의 장점
성능 및 안정성 향상
- 보호: 우발적 업데이트로부터 보호
- 성능: kube-apiserver 부하 감소로 클러스터 성능 향상
# 📊 secrets-immutable.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-cred
data:
username: ZGItdXNlcg==
password: aG9vbg==
type: Opaque
immutable: true # 변경 불가능 설정🏭 실제 운영 환경에서 사용하는 보안 솔루션
운영 환경 권장사항
쿠버네티스 네이티브 Secret은 학습용/개발용으로만 사용하고, 실제 운영에서는 전문 보안 도구를 사용하세요.
📊 실무에서 사용되는 Secret 관리 도구
| 솔루션 | 특징 | 사용 시나리오 |
|---|---|---|
| Sealed Secrets | 공개키 암호화, GitOps 친화적 | CI/CD 파이프라인 |
| External Secrets Operator | 외부 Vault 연동 | AWS/Azure/GCP 네이티브 |
| Helm Secrets | sops/age 암호화 | Helm 차트 배포 |
| HashiCorp Vault | 전문 비밀 관리 | 엔터프라이즈 환경 |
| AWS Secrets Manager | AWS 네이티브 | AWS 환경 |
| Azure Key Vault | Azure 네이티브 | Azure 환경 |
💻 External Secrets Operator 예시
# 실제 운영에서 사용하는 방식
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: aws-secrets-manager
spec:
provider:
aws:
service: SecretsManager
region: us-east-1
auth:
secretRef:
accessKeyID:
name: awssm-secret
key: access-key
---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: mysql-credentials
spec:
refreshInterval: 15s
secretStoreRef:
name: aws-secrets-manager
kind: SecretStore
target:
name: mysql-cred
creationPolicy: Owner
data:
- secretKey: username
remoteRef:
key: /mysql/credentials
property: username
- secretKey: password
remoteRef:
key: /mysql/credentials
property: password🔧 Sealed Secrets 예시
# Sealed Secrets 설치
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.18.0/controller.yaml
# 일반 Secret을 Sealed Secret으로 변환
echo -n mypassword | kubectl create secret generic mysecret --dry-run=client --from-file=password=/dev/stdin -o yaml | kubeseal -o yaml > mysealedsecret.yaml
# Git에 안전하게 커밋 가능한 암호화된 Secret
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: mysecret
spec:
encryptedData:
password: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEQAx...현실적 조언
- 학습/개발: 쿠버네티스 네이티브 Secret 사용
- 스테이징: Sealed Secrets나 External Secrets 도입
- 운영환경: 반드시 전문 Key Management Service 사용
🎯 실전 예시
💡 현실적인 보안 수준 비교
| 구분 | ConfigMap | K8s Native Secret | External Secrets |
|---|---|---|---|
| 용도 | 일반 설정 정보 | 개발/학습용 민감 정보 | 운영용 민감 정보 |
| 저장 방식 | 평문 | Base64 인코딩 (디코딩 쉬움) | 실제 암호화 |
| 실제 보안 수준 | 낮음 | 낮음 (착각하기 쉬움) | 높음 |
| Git 저장 가능성 | 가능 | 위험함 | 안전함 (암호화됨) |
| 사용 환경 | 모든 환경 | 개발/테스트만 | 스테이징/운영 |
📋 실습 파일 구조
ch9/9.2/ # ConfigMap 실습
├── ConfigMap-sleepy-config.yaml
├── ConfigMap-sleepy-config-chg.yaml
├── deploy-configMapRef.yaml
├── deploy-configMapKeyRef.yaml
└── deploy-vol-configMap.yaml
ch9/9.3/ # Secret 실습
├── secrets.yaml
├── secrets-immutable.yaml
└── deploy-secretKeyRef-w-pvc.yaml
🔧 주요 실습 명령어
# ConfigMap 생성
kubectl apply -f ConfigMap-sleepy-config.yaml
# ConfigMap을 사용하는 Deployment 배포
kubectl apply -f deploy-configMapRef.yaml
# Secret 생성
kubectl create secret generic mysql-cred \
--from-literal=username='db-user' \
--from-literal=password='hoon'
# Secret을 사용하는 MySQL Deployment 배포
kubectl apply -f deploy-secretKeyRef-w-pvc.yaml
# ConfigMap/Secret 확인
kubectl get configmap
kubectl get secret
kubectl describe secret mysql-cred다음 강의 예고
9.4 애플리케이션 롤링 업데이트
kubectl set명령어 활용kubectl rollout명령어로 배포 관리