🎯 쿠버네티스 9장 - 효과적인 애플리케이션 구성 및 관리

📑 목차


1. ConfigMap을 이용한 애플리케이션 설정 관리

핵심 개념

ConfigMap은 애플리케이션의 설정 정보를 컨테이너 이미지와 분리하여 관리할 수 있게 해주는 쿠버네티스 오브젝트입니다.

💡 ConfigMap이 필요한 이유

🤔 질문: “애플리케이션은 이미 잘 동작하고 있지 않나요?”

📋 정해진 길로만 가는 애플리케이션의 문제점

실제 상황

  1. 문제: 애플리케이션 설정이 컨테이너 이미지에 하드코딩됨
  2. 감지: 환경별(개발/테스트/운영) 설정 변경 시 이미지 재빌드 필요
  3. 조치: ConfigMap으로 설정 외부화
  4. 결과: 동일 이미지로 다양한 환경 배포 가능

💻 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-config

2. valueFrom으로 특정 키 참조

# 📊 deploy-configMapKeyRef.yaml
env:
- name: APP_STATUS
  valueFrom:
    configMapKeyRef:
      name: sleepy-config
      key: STATUS

3. Volume Mount로 파일로 마운트

# 📊 deploy-vol-configMap.yaml
volumeMounts:
- name: appconfigvol
  mountPath: /etc/sleepy.d
volumes:
- name: appconfigvol
  configMap:
    name: sleepy-config

2. Secret을 이용한 민감 정보 관리

중요한 현실

Secret은 Base64 인코딩일 뿐 진짜 암호화가 아닙니다. 실제 운영 환경에서는 더 강력한 보안 솔루션이 필요합니다.

💡 Secret의 한계와 실제 보안

🤔 질문: “애플리케이션에 중요 정보는 어떻게 넣나요? (예: 아이디/암호)”

📋 Base64의 현실적 한계

Base64는 암호화가 아님

# 누구나 쉽게 디코딩 가능
echo "ZGItdXNlcg==" | base64 -d
# 결과: db-user

Base64는 단순 인코딩으로 보안이라고 할 수 없음

🛡️ 실제 보안 메커니즘

보안 레이어Secret의 실제 보호 방식
etcd 암호화클러스터 레벨에서 AES 암호화
전송 암호화TLS로 API 통신 보호
접근 제어RBAC로 권한 관리
메모리 저장tmpfs에만 마운트 (디스크 저장 X)

💻 Secret 생성 및 사용 방법

📊 Secret 빌트인 타입

타입사용처
Opaque임의의 사용자 정의 데이터
kubernetes.io/service-account-token서비스 어카운트 토큰
kubernetes.io/dockercfgDocker 설정 파일
kubernetes.io/basic-auth기본 인증 자격 증명
kubernetes.io/ssh-authSSH 자격 증명
kubernetes.io/tlsTLS 클라이언트/서버 데이터

📋 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의 장점

성능 및 안정성 향상

  1. 보호: 우발적 업데이트로부터 보호
  2. 성능: 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 Secretssops/age 암호화Helm 차트 배포
HashiCorp Vault전문 비밀 관리엔터프라이즈 환경
AWS Secrets ManagerAWS 네이티브AWS 환경
Azure Key VaultAzure 네이티브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 사용

🎯 실전 예시

💡 현실적인 보안 수준 비교

구분ConfigMapK8s Native SecretExternal 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 명령어로 배포 관리