DDevArchive
Đăng nhập

Kubernetes 101: orchestration cho container ở quy mô lớn

Docker đóng gói app thành container. Nhưng khi có 50 container chạy cùng lúc — ai khởi động lại container chết? Ai chia traffic? Ai scale khi tải tăng? Đó là việc của Kubernetes (K8s) — "bộ não" điều phối container.

Kubernetes giải quyết vấn đề gì?

Docker chạy 1 container. Kubernetes chạy hàng trăm container trên nhiều máy, tự động: khởi động lại khi crash, scale khi tải tăng, cân bằng traffic, rolling update không downtime.

Vấn đềDocker ComposeKubernetes
Container crashPhải tự restartTự restart trong vài giây
Scale lên 10 bảnSửa docker-compose, restartMột lệnh: kubectl scale —replicas=10
Update không downtimePhải tắt rồi bậtRolling update tự động
Nhiều máy chủKhông hỗ trợTự phân bổ container lên các máy
Health checkCơ bảnLiveness + Readiness probe

Các khái niệm cốt lõi

Khái niệmGiải thíchTương đương Docker
PodĐơn vị nhỏ nhất, chứa 1+ containerContainer
DeploymentQuản lý nhiều Pod giống nhau, auto-scaledocker-compose service
ServiceCổng vào ổn định cho Pod (IP cố định)Port mapping
IngressĐiều hướng HTTP từ domain vào ServiceNginx reverse proxy
ConfigMap / SecretBiến môi trường và secret.env file
NamespaceTách môi trường (dev, staging, prod)Separate docker-compose files

Viết file cấu hình Kubernetes

// File: deployment.yaml
# deployment.yaml — chạy 3 bản app
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-api
spec:
  replicas: 3          # chạy 3 Pod giống nhau
  selector:
    matchLabels:
      app: my-api
  template:
    metadata:
      labels:
        app: my-api
    spec:
      containers:
        - name: api
          image: my-api:1.0.0
          ports:
            - containerPort: 3000
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: url
          # Health check: K8s tự restart nếu app không khoẻ
          livenessProbe:
            httpGet:
              path: /health
              port: 3000
            initialDelaySeconds: 10
            periodSeconds: 30
// File: service.yaml
# service.yaml — cổng vào ổn định
apiVersion: v1
kind: Service
metadata:
  name: my-api-service
spec:
  selector:
    app: my-api        # kết nối tới Pod có label app=my-api
  ports:
    - port: 80         # port bên ngoài
      targetPort: 3000 # port container
  type: ClusterIP      # chỉ truy cập nội bộ cluster

Lệnh kubectl cơ bản

// File: kubectl.sh
# Apply cấu hình
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# Xem trạng thái
kubectl get pods                    # danh sách Pod
kubectl get deployments             # danh sách Deployment
kubectl get services                # danh sách Service

# Scale lên/xuống
kubectl scale deployment my-api --replicas=5

# Xem log của 1 Pod
kubectl logs my-api-xyz123 -f       # -f = follow (live)

# Vào bên trong container (debug)
kubectl exec -it my-api-xyz123 -- /bin/sh

# Rolling update: đổi image → K8s tự deploy từng Pod
kubectl set image deployment/my-api api=my-api:2.0.0
💡 Bắt đầu với Minikube hoặc Docker Desktop

Không cần cloud để học K8s. Minikube tạo cluster K8s trên máy local. Docker Desktop cũng có K8s built-in (Settings → Kubernetes → Enable). Hoặc dùng k3d/kind — nhẹ hơn Minikube.

❓ Pod trong Kubernetes khác container Docker thế nào?

  • Giải thích vì sao cần K8s khi có nhiều container
  • Nói được 5 khái niệm cốt lõi: Pod, Deployment, Service, Ingress, Secret
  • Viết file Deployment + Service YAML
  • Dùng kubectl cơ bản: apply, get, scale, logs