Bỏ qua đến nội dung chính
KubernetesK8scontainer orchestrationDevOpscloud native

Kubernetes Là Gì? Cluster, Pod, Service Cho Người Mới

Kubernetes là gì giải thích từ 0: cluster, node, pod, service, deployment. Khi nào nên dùng K8s, khi nào Compose đủ. Code YAML thực tế.

Xuất bản 9 phút đọc

Kubernetes là gì? Câu trả lời ngắn: container orchestration — chạy hàng trăm container trên nhiều server với auto-scale, self-healing, rolling deploy. Bài này đi từ khái niệm cơ bản đến deploy app Node.js đầu tiên lên K8s.

Vì sao cần K8s?

Docker chạy container trên 1 host. Khi anh có 100 container trên 10 server, câu hỏi xuất hiện:

  • Container nào chạy trên server nào?
  • Nếu server crash, container chạy lại ở đâu?
  • Auto-scale khi traffic spike?
  • Deploy mới không downtime?
  • Service A tìm service B thế nào?

K8s giải tất cả. Trade-off: setup phức tạp, learning curve cao. Đó là lý do chỉ adopt khi quy mô đủ lớn.

Kiến trúc K8s

┌─ Control Plane (master) ───────────┐
│  api-server  scheduler  controller │
│  etcd (key-value store)            │
└────────────────────────────────────┘
         │
    ┌────┴────────────────┐
    ▼                     ▼
┌─ Node 1 ──────┐   ┌─ Node 2 ──────┐
│  kubelet      │   │  kubelet      │
│  pod  pod     │   │  pod          │
│   container   │   │   container   │
└───────────────┘   └───────────────┘
  • Control plane: bộ não. API server nhận lệnh kubectl, scheduler chọn node, controller đảm bảo state mong muốn.
  • etcd: lưu mọi state cluster. Backup etcd = backup cluster.
  • Node: server worker chạy pod. Mỗi node có kubelet (agent), runtime (containerd).

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

ObjectVai trò
PodĐơn vị deploy nhỏ nhất. 1+ container chia sẻ network/storage.
DeploymentQuản lý nhiều replica của pod. Rolling update, rollback.
ServiceStable endpoint cho pod (IP/DNS không đổi khi pod restart).
IngressRoute HTTP từ ngoài vào service theo host/path.
ConfigMapConfig non-secret (env var, file config).
SecretConfig secret (password, key) — base64 (nên thêm encryption).
NamespaceGroup resource. Tách dev/staging/prod hoặc team.

Deploy app Node.js đầu tiên

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: alodev-api
  labels: { app: alodev-api }
spec:
  replicas: 3
  selector:
    matchLabels: { app: alodev-api }
  template:
    metadata:
      labels: { app: alodev-api }
    spec:
      containers:
      - name: app
        image: ghcr.io/alodev/api:v1.2.3
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef: { name: app-secrets, key: database_url }
        resources:
          requests: { memory: "256Mi", cpu: "100m" }
          limits:   { memory: "512Mi", cpu: "500m" }
        readinessProbe:
          httpGet: { path: /healthz, port: 3000 }
          initialDelaySeconds: 5
        livenessProbe:
          httpGet: { path: /healthz, port: 3000 }
          initialDelaySeconds: 30
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: alodev-api
spec:
  selector: { app: alodev-api }
  ports:
  - port: 80
    targetPort: 3000
kubectl apply -f deployment.yaml -f service.yaml
kubectl get pods
kubectl logs -f deploy/alodev-api
kubectl describe pod alodev-api-xxx
kubectl scale deploy/alodev-api --replicas=10

Readiness vs Liveness probe

  • Readiness: pod sẵn sàng nhận traffic chưa? Fail = remove khỏi service. App khởi động chậm dùng để delay.
  • Liveness: pod còn alive? Fail = restart pod. Phát hiện deadlock, leak.

Đừng dùng cùng endpoint cho cả 2 nếu app phụ thuộc DB. Liveness fail vì DB tạm rớt = restart hết pod = đè DB chết hơn.

Ingress cho HTTPS

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alodev
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts: [api.alodev.vn]
    secretName: alodev-tls
  rules:
  - host: api.alodev.vn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: alodev-api
            port: { number: 80 }

cert-manager auto issue cert Let's Encrypt. Ingress controller (nginx-ingress, Traefik) handle TLS termination + routing.

Auto-scale theo CPU/memory

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: alodev-api
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: alodev-api
  minReplicas: 3
  maxReplicas: 30
  metrics:
  - type: Resource
    resource:
      name: cpu
      target: { type: Utilization, averageUtilization: 70 }

Khi CPU trung bình > 70% trong vài phút → scale up. Custom metric (request/s, queue depth) cần Prometheus + KEDA.

Khi nào nên dùng K8s?

✓ Có lý do:

  • ≥5 service nội bộ
  • Multi-region, multi-cloud
  • Team ≥ 20 engineer
  • Cần auto-scale, self-healing đa node
  • Compliance yêu cầu on-premise

✗ Đừng adopt nếu:

  • 1 app, 1 server vẫn đủ
  • Team < 5 người, chưa có DevOps dedicated
  • Chỉ vì AWS/Google nói thế

Cho team nhỏ: Cloud Run, Fly.io, Railway, Render — managed simple, bill theo usage. Khi growth lớn rồi migrate K8s sau.

Kết luận

Kubernetes là gì? Đó là engine chạy mọi container production trên thế giới hiện đại. Mạnh mẽ nhưng phức tạp. Bắt đầu với managed K8s (GKE/EKS), Helm chart cho deployment, đừng tự host control plane. Chỉ adopt khi pain thực sự xuất hiện — Compose vẫn đủ cho dự án vừa và nhỏ.

Zalo