Tan Kim

kubernetes

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 | LoadBalancer

Ingress

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: 80

Secret / 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: info

kubectl 명령어

# 클러스터 정보
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

메모