본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 3. · 15 Views
K8s 베스트 프랙티스 완벽 가이드
Kubernetes를 프로덕션 환경에서 안전하고 효율적으로 운영하기 위한 핵심 베스트 프랙티스를 다룹니다. 리소스 관리, 보안, 모니터링, 배포 전략 등 실무에서 꼭 필요한 내용을 실제 코드 예제와 함께 학습할 수 있습니다.
들어가며
이 글에서는 K8s 베스트 프랙티스 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 리소스_제한_설정
- ConfigMap으로_설정_분리
- Liveness_Readiness_Probe
- Rolling_Update_전략
- PodDisruptionBudget_설정
- Secret으로_민감_정보_관리
- Namespace로_리소스_격리
- HorizontalPodAutoscaler_설정
- NetworkPolicy로_트래픽_제어
- Init_Container_활용
- Affinity로_파드_배치_제어
- ServiceAccount와_RBAC
1. 리소스 제한 설정
개요
파드의 CPU와 메모리 사용량을 제한하여 클러스터 리소스를 효율적으로 관리하고, 한 파드가 전체 노드 리소스를 독점하는 것을 방지합니다.
코드 예제
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
설명
requests는 파드가 필요한 최소 리소스를, limits는 사용 가능한 최대 리소스를 정의합니다. 이를 통해 안정적인 스케줄링과 리소스 관리가 가능합니다.
2. ConfigMap으로 설정 분리
개요
애플리케이션 코드와 설정을 분리하여 환경별로 다른 설정을 쉽게 적용하고, 설정 변경 시 이미지 재빌드 없이 배포할 수 있습니다.
코드 예제
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_URL: "postgres://db:5432"
LOG_LEVEL: "info"
---
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
설명
ConfigMap에 설정 값을 저장하고 envFrom을 통해 환경 변수로 주입하여, 코드 수정 없이 설정을 관리할 수 있습니다.
3. Liveness Readiness Probe
개요
헬스 체크를 통해 비정상 컨테이너를 자동으로 재시작하고, 트래픽은 준비된 파드에만 전달하여 서비스 안정성을 높입니다.
코드 예제
apiVersion: v1
kind: Pod
metadata:
name: health-check
spec:
containers:
- name: app
image: myapp:1.0
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
설명
livenessProbe는 컨테이너가 살아있는지 확인하여 실패 시 재시작하고, readinessProbe는 트래픽을 받을 준비가 되었는지 확인합니다.
4. Rolling Update 전략
개요
무중단 배포를 위해 점진적으로 파드를 업데이트하며, 문제 발생 시 이전 버전으로 빠르게 롤백할 수 있습니다.
코드 예제
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: myapp:2.0
설명
maxSurge는 동시에 생성할 수 있는 추가 파드 수, maxUnavailable은 업데이트 중 사용 불가능한 파드 수를 제한하여 안전한 배포를 보장합니다.
5. PodDisruptionBudget 설정
개요
자발적 중단(노드 드레인, 클러스터 업그레이드 등) 시에도 최소한의 파드 수를 유지하여 서비스 가용성을 보장합니다.
코드 예제
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: myapp
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
설명
3개의 레플리카 중 최소 2개는 항상 실행 상태를 유지하도록 보장하여, 유지보수 작업 중에도 서비스가 중단되지 않습니다.
6. Secret으로 민감 정보 관리
개요
비밀번호, API 키 등 민감한 정보를 안전하게 저장하고 파드에 주입하여 코드에 하드코딩하지 않습니다.
코드 예제
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
password: cGFzc3dvcmQxMjM=
---
apiVersion: v1
kind: Pod
spec:
containers:
- name: app
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
설명
Secret의 data는 base64로 인코딩되어 저장되며, secretKeyRef를 통해 환경 변수로 안전하게 주입됩니다.
7. Namespace로 리소스 격리
개요
네임스페이스를 사용하여 개발, 스테이징, 프로덕션 환경을 논리적으로 분리하고 리소스 쿼터를 설정할 수 있습니다.
코드 예제
apiVersion: v1
kind: Namespace
metadata:
name: production
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: prod-quota
namespace: production
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
pods: "50"
설명
네임스페이스별로 CPU, 메모리, 파드 개수 등의 리소스 쿼터를 설정하여 리소스 사용을 제어하고 환경을 격리합니다.
8. HorizontalPodAutoscaler 설정
개요
CPU 또는 메모리 사용률에 따라 파드 수를 자동으로 조정하여 트래픽 변화에 탄력적으로 대응합니다.
코드 예제
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
설명
CPU 사용률이 70%를 초과하면 자동으로 파드를 추가하고, 낮아지면 축소하여 2~10개 사이에서 유지합니다.
9. NetworkPolicy로 트래픽 제어
개요
파드 간 네트워크 트래픽을 제어하여 보안을 강화하고, 필요한 통신만 허용합니다.
코드 예제
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-policy
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
설명
api 파드는 frontend 라벨을 가진 파드로부터만 8080 포트로 들어오는 트래픽을 허용하여 불필요한 접근을 차단합니다.
10. Init Container 활용
개요
메인 컨테이너 실행 전에 초기화 작업(DB 마이그레이션, 설정 파일 다운로드 등)을 수행합니다.
코드 예제
apiVersion: v1
kind: Pod
metadata:
name: app-with-init
spec:
initContainers:
- name: migration
image: myapp:1.0
command: ['sh', '-c', 'npm run migrate']
- name: setup
image: busybox
command: ['sh', '-c', 'echo "Setup done"']
containers:
- name: app
image: myapp:1.0
설명
initContainers는 순서대로 실행되며 모두 성공해야 메인 컨테이너가 시작됩니다. DB 스키마 업데이트 등 사전 작업에 적합합니다.
11. Affinity로 파드 배치 제어
개요
노드의 특성이나 다른 파드의 위치를 고려하여 파드를 배치함으로써 가용성을 높이고 성능을 최적화합니다.
코드 예제
apiVersion: v1
kind: Pod
metadata:
name: app-with-affinity
spec:
affinity:
podAntiAffinity:
requiredDuringScheduling:
- labelSelector:
matchLabels:
app: myapp
topologyKey: kubernetes.io/hostname
containers:
- name: app
image: myapp:1.0
설명
podAntiAffinity를 사용하여 같은 app 라벨을 가진 파드들이 서로 다른 노드에 배치되도록 강제하여 단일 노드 장애 시 전체 서비스 중단을 방지합니다.
12. ServiceAccount와 RBAC
개요
파드에 필요한 최소한의 권한만 부여하여 보안을 강화하고, 불필요한 API 접근을 차단합니다.
코드 예제
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
---
apiVersion: v1
kind: Pod
spec:
serviceAccountName: app-sa
containers:
- name: app
image: myapp:1.0
설명
ServiceAccount와 Role을 생성하여 파드가 파드 목록 조회만 가능하도록 제한하며, 최소 권한 원칙을 적용합니다.
마치며
이번 글에서는 K8s 베스트 프랙티스 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Kubernetes #ResourceLimits #ConfigMap #HealthCheck #Deployment
댓글 (0)
함께 보면 좋은 카드 뉴스
Istio 보안 완벽 가이드
마이크로서비스 환경에서 필수적인 Istio 보안 기능을 실무 중심으로 설명합니다. mTLS부터 인증, 인가까지 단계별로 학습하여 안전한 서비스 메시를 구축할 수 있습니다.
Istio 트래픽 관리 완벽 가이드
Istio의 트래픽 관리 기능을 마스터하는 완벽 가이드입니다. VirtualService와 DestinationRule을 활용한 라우팅부터 트래픽 분할, 헤더 기반 라우팅까지 실무에 필요한 모든 내용을 다룹니다.
Istio 설치와 구성 완벽 가이드
Kubernetes 환경에서 Istio 서비스 메시를 설치하고 구성하는 방법을 초급 개발자도 쉽게 이해할 수 있도록 실무 스토리와 비유로 풀어낸 가이드입니다. istioctl 설치부터 사이드카 주입까지 단계별로 학습합니다.
서비스 메시 완벽 가이드
마이크로서비스 간 통신을 안전하고 효율적으로 관리하는 서비스 메시의 핵심 개념부터 실전 도입까지, 초급 개발자를 위한 완벽한 입문서입니다. Istio와 Linkerd 비교, 사이드카 패턴, 실무 적용 노하우를 담았습니다.
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.