쿠버네티스
Kubernetes (K8s)
컨테이너 오케스트레이션 플랫폼. Google이 개발. 자동 배포, 스케일링, 복구 제공.
Kubernetes (K8s)
컨테이너 오케스트레이션 플랫폼. Google이 개발. 자동 배포, 스케일링, 복구 제공.
Kubernetes(쿠버네티스, K8s)는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식 가능하고 확장 가능한 오픈소스 플랫폼입니다. Google이 15년 이상의 프로덕션 워크로드 운영 경험을 바탕으로 2014년에 오픈소스로 공개했습니다.
K8s의 핵심 구성요소는 컨트롤 플레인(API Server, etcd, Scheduler, Controller Manager)과 워커 노드(kubelet, kube-proxy, Container Runtime)입니다. 선언적 구성(Declarative Configuration)을 통해 원하는 상태를 정의하면, K8s가 현재 상태를 원하는 상태로 자동 조정합니다.
Pod는 K8s의 최소 배포 단위로, 하나 이상의 컨테이너를 포함합니다. Deployment는 Pod의 복제본 수와 업데이트 전략을 관리하고, Service는 Pod 집합에 대한 안정적인 네트워크 엔드포인트를 제공합니다.
자동 스케일링(HPA, VPA, Cluster Autoscaler), 자가 치유(Self-healing), 롤링 업데이트, 서비스 디스커버리, 로드 밸런싱 등의 기능을 제공하여 대규모 분산 시스템 운영을 단순화합니다.
# Deployment: 애플리케이션 배포
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:v1.0.0
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
---
# Service: 네트워크 엔드포인트
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
type: ClusterIP
---
# HPA: 자동 스케일링
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
DevOps: "이번에 K8s 클러스터 업그레이드 해야 해요. 1.28에서 1.29로요. 노드 드레인하면서 롤링으로 진행할게요."
개발팀: "서비스 다운타임 있나요?"
DevOps: "아뇨, PodDisruptionBudget 설정되어 있어서 최소 레플리카는 유지돼요. 트래픽 전환도 자동이고요."
면접관: "Kubernetes에서 Pod가 죽으면 어떻게 복구되나요?"
지원자: "Deployment의 ReplicaSet이 원하는 Pod 수를 유지합니다. kubelet이 컨테이너 상태를 모니터링하고, livenessProbe 실패 시 컨테이너를 재시작합니다. Pod 레벨 장애는 컨트롤러가 감지하여 새 Pod를 스케줄링합니다."
리뷰어: "resources 섹션에 limits만 있고 requests가 없네요. requests 없으면 limits 값이 requests로 설정돼서 스케줄링에 영향 줄 수 있어요."
작성자: "아, requests를 limits의 50% 정도로 설정하겠습니다."