Kubernetes (K8s)
컨테이너 오케스트레이션 플랫폼. 컨테이너의 배포, 스케일링, 자가 복구를 자동화한다.
핵심 개념
| 오브젝트 | 설명 |
|---|---|
| Pod | 최소 배포 단위, 1개 이상의 컨테이너 묶음 |
| Deployment | Pod 복제본 관리, 롤링 업데이트 |
| Service | Pod에 대한 안정적인 네트워크 엔드포인트 |
| Ingress | 외부 HTTP 트래픽 라우팅 규칙 |
| ConfigMap | 설정 데이터 저장 |
| Secret | 민감한 데이터 저장 (base64 인코딩) |
| PVC | 영속 볼륨 요청 |
| Namespace | 클러스터 내 논리적 분리 |
클러스터 구조
클러스터
├── Control Plane
│ ├── API Server (모든 통신의 게이트웨이)
│ ├── etcd (클러스터 상태 저장)
│ ├── Scheduler (Pod 노드 배치 결정)
│ └── Controller (현재 상태 → 원하는 상태 유지)
└── Worker Node
├── kubelet (Pod 실행 관리)
├── kube-proxy (네트워크 규칙 관리)
└── Container Runtime (Docker 등)
주요 매니페스트
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: production
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"Service
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 3000
type: ClusterIP # ClusterIP | NodePort | LoadBalancerIngress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-svc
port:
number: 80Secret / ConfigMap
apiVersion: v1
kind: Secret
metadata:
name: myapp-secret
type: Opaque
data:
DB_PASS: base64encodedvalue==
---
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
NODE_ENV: production
LOG_LEVEL: infokubectl 명령어
# 클러스터 정보
kubectl cluster-info
kubectl get nodes
# 리소스 조회
kubectl get pods
kubectl get pods -n namespace
kubectl get all
kubectl describe pod <pod-name>
kubectl logs <pod-name> -f
kubectl logs <pod-name> -c <container>
# 배포
kubectl apply -f manifest.yaml
kubectl apply -f ./k8s/
kubectl delete -f manifest.yaml
# 디버깅
kubectl exec -it <pod-name> -- bash
kubectl port-forward pod/<pod-name> 8080:3000
# 스케일
kubectl scale deployment myapp --replicas=5
# 롤아웃
kubectl rollout status deployment/myapp
kubectl rollout history deployment/myapp
kubectl rollout undo deployment/myapp