Trong series: DevOps
  1. 1 API Gateway là gì? Cổng vào thống nhất cho Microservices
  2. 2 NAT là gì? Network Address Translation trong mạng máy tính
  3. 3 GitLab CI/CD là gì? Pipeline tự động hóa build, test và deploy
  4. 4 Kafka là gì? Nền tảng Event Streaming phân tán cho hệ thống lớn
  5. 5 Serverless là gì? FaaS, Cold Start và khi nào nên dùng Serverless
  6. 6 Subnet và CIDR là gì? Chia mạng IP và định tuyến hiện đại
  7. 7 Kubernetes là gì? Nền tảng điều phối container phổ biến nhất hiện nay
  8. 8 Proxy là gì? Forward Proxy, Reverse Proxy và SOCKS5
  9. 9 Nginx là gì? Web server, reverse proxy và load balancer trong một
✦ Tóm tắt nhanh
Kubernetes là gì? Tìm hiểu nền tảng điều phối container mạnh nhất hiện nay: kiến trúc, Pod, Deployment, Service, auto-scaling và khi nào nên dùng K8s.
Bài này thế nào?

Khi số lượng container trong hệ thống tăng từ vài chiếc lên hàng trăm, hàng nghìn, việc quản lý thủ công trở nên bất khả thi. Kubernetes ra đời để giải quyết chính xác bài toán đó — tự động lên lịch, scale và phục hồi container trên toàn bộ cụm máy chủ mà không cần con người can thiệp từng bước. Bài viết này giải thích Kubernetes là gì, kiến trúc hoạt động ra sao và khi nào thực sự cần dùng đến nó.

Kubernetes là gì?

Kubernetes (hay K8s — viết tắt vì có 8 chữ cái giữa K và s) là nền tảng mã nguồn mở dùng để điều phối container (container orchestration), tức là tự động triển khai, scale và quản lý vòng đời của container trên cụm nhiều máy chủ. Google phát triển nội bộ từ hệ thống Borg, sau đó mã nguồn mở hóa vào năm 2014 và trao cho Cloud Native Computing Foundation (CNCF) quản lý.

Hình dung Kubernetes như nhạc trưởng của một dàn nhạc container. Mỗi nhạc cụ (container) biết phần của mình, nhưng cần nhạc trưởng để phân công ai chơi khi nào, thay thế nhạc công bị ốm, và đảm bảo cả dàn hòa âm đúng nhịp. Kubernetes làm đúng điều đó: phân công container lên node nào, khởi động lại khi container chết, tăng số bản sao khi tải tăng.

Vấn đề Kubernetes giải quyết

Khi bạn chỉ có một ứng dụng nhỏ, Docker hoàn toàn đủ dùng. Nhưng với kiến trúc microservices gồm vài chục service, mỗi service chạy nhiều bản sao trên nhiều máy chủ, bạn gặp ngay các vấn đề sau:

  • Lên lịch thủ công: Service nào chạy trên máy nào? Máy nào còn tài nguyên? Làm thủ công cực kỳ tốn thời gian.
  • Không có self-healing: Container crash lúc 3 giờ sáng — ai restart? Kubernetes tự làm điều này.
  • Scale phức tạp: Traffic tăng đột biến, cần tăng từ 2 lên 10 bản sao ngay lập tức — không thể SSH vào từng máy một.
  • Rolling update rủi ro: Deploy phiên bản mới mà không down time đòi hỏi chiến lược phức tạp.
  • Service discovery: Container A cần gọi Container B — IP thay đổi liên tục sau mỗi lần restart, làm sao biết địa chỉ?

Kubernetes giải quyết tất cả bằng một bộ API khai báo (declarative API): bạn mô tả trạng thái mong muốn, K8s lo đưa hệ thống về trạng thái đó và duy trì nó.

Docker và Kubernetes không cạnh tranh nhau

Docker đóng gói ứng dụng thành container image. Kubernetes điều phối các container đó trên cluster. Trong thực tế, bạn dùng Docker để build image, đẩy lên registry, rồi Kubernetes kéo image về và chạy. Hai công cụ bổ trợ cho nhau.

Kiến trúc Kubernetes

Một Kubernetes cluster gồm hai lớp chính: Control PlaneWorker Node.

Control Plane

Control Plane là não bộ của cluster, gồm:

  • API Server: Điểm vào duy nhất cho mọi tương tác với cluster. Mọi lệnh kubectl, webhook, hay CI/CD pipeline đều gọi qua đây.
  • etcd: Cơ sở dữ liệu key-value phân tán lưu toàn bộ trạng thái cluster. Đây là thành phần quan trọng nhất — mất etcd là mất cluster.
  • Scheduler: Quyết định Pod mới sẽ chạy trên Worker Node nào dựa trên tài nguyên còn trống, affinity rule và priority.
  • Controller Manager: Bộ vòng lặp liên tục so sánh trạng thái hiện tại với trạng thái mong muốn và thực hiện hành động cần thiết (restart Pod chết, tạo Pod mới khi scale...).

Worker Node

Worker Node là máy chủ thực sự chạy container, gồm:

  • kubelet: Agent chạy trên mỗi node, nhận lệnh từ API Server và đảm bảo container chạy đúng spec.
  • kube-proxy: Xử lý networking, điều hướng traffic vào đúng Pod theo Service rule.
  • Container Runtime: Thành phần thực sự chạy container (containerd, CRI-O — không nhất thiết phải là Docker).

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

Pod

Pod là đơn vị triển khai nhỏ nhất trong Kubernetes. Mỗi Pod chứa một hoặc nhiều container chia sẻ cùng địa chỉ IP, cùng network namespace và storage volume. Trong thực tế, 90% Pod chỉ có một container. Kubernetes không quản lý container trực tiếp — nó luôn làm việc qua Pod.

Deployment

Deployment là đối tượng khai báo số lượng bản sao (replica) của Pod cần chạy và cách cập nhật chúng. Khi bạn deploy version mới, Deployment thực hiện rolling update — dần thay Pod cũ bằng Pod mới, đảm bảo không có downtime. Nếu version mới lỗi, kubectl rollout undo quay về ngay.

Service

Service cấp một địa chỉ IP ổn định và DNS name cho một nhóm Pod, dù Pod restart hay đổi IP thì địa chỉ Service không đổi. Có ba loại chính: ClusterIP (nội bộ cluster), NodePort (mở port trên node), LoadBalancer (tích hợp load balancer của cloud).

Ingress

Ingress là lớp điều hướng HTTP/HTTPS từ bên ngoài vào cluster, hỗ trợ virtual hosting và path-based routing. Ví dụ: api.example.com/users → Service A, api.example.com/orders → Service B, tất cả qua một điểm vào duy nhất.

Namespace

Namespace là cơ chế phân vùng logic bên trong một cluster, dùng để tách môi trường (dev, staging, production) hoặc tách team trong cùng cluster vật lý.

Tự động hóa: Scale, Update, Self-Healing

Auto-Scaling

Kubernetes cung cấp ba cấp độ auto-scaling:

  • HPA (Horizontal Pod Autoscaler): Tăng/giảm số Pod dựa trên CPU, memory hoặc custom metric.
  • VPA (Vertical Pod Autoscaler): Tự điều chỉnh CPU/memory request của Pod.
  • Cluster Autoscaler: Tự thêm/xóa Node vật lý khi cluster cần thêm hoặc thừa tài nguyên (tích hợp với GKE, EKS, AKS).

Rolling Update và Rollback

Bash
1# Cập nhật image của Deployment
2kubectl set image deployment/my-app app=my-app:v2.1.0
3
4# Theo dõi tiến độ rolling update
5kubectl rollout status deployment/my-app
6
7# Rollback về phiên bản trước nếu có lỗi
8kubectl rollout undo deployment/my-app

Self-Healing

Controller Manager liên tục kiểm tra: nếu một Pod crash, nó lập tức khởi tạo Pod thay thế trên node còn tài nguyên. Nếu cả một node bị chết, toàn bộ Pod trên node đó được reschedule sang node khác — tự động, không cần can thiệp.

Liveness và Readiness Probe

Kubernetes dùng liveness probe để phát hiện container bị treo (hung) và restart nó, và readiness probe để biết container đã sẵn sàng nhận traffic chưa. Cấu hình hai probe này đúng cách là bước quan trọng để self-healing hoạt động hiệu quả.

Công cụ: kubectl và Helm

kubectl

kubectl là CLI chính để tương tác với cluster. Ví dụ manifest YAML khai báo một Deployment đơn giản:

YAML
 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: my-app
 5  namespace: production
 6spec:
 7  replicas: 3
 8  selector:
 9    matchLabels:
10      app: my-app
11  template:
12    metadata:
13      labels:
14        app: my-app
15    spec:
16      containers:
17        - name: app
18          image: my-app:v2.1.0
19          ports:
20            - containerPort: 8080
21          resources:
22            requests:
23              cpu: "100m"
24              memory: "128Mi"
25            limits:
26              cpu: "500m"
27              memory: "256Mi"
28          readinessProbe:
29            httpGet:
30              path: /healthz
31              port: 8080
32            initialDelaySeconds: 5
33            periodSeconds: 10

Áp dụng manifest:

Bash
1kubectl apply -f deployment.yaml
2kubectl get pods -n production
3kubectl describe pod <pod-name> -n production

Helm — Package Manager cho Kubernetes

Helm là công cụ quản lý package (gọi là chart) cho Kubernetes, tương tự npm cho Node.js. Thay vì viết hàng chục file YAML riêng lẻ, Helm đóng gói thành một chart có thể tham số hóa và tái sử dụng. Một chart Helm gồm các template YAML với biến được điền qua file values.yaml, giúp cùng một chart deploy được trên môi trường dev, staging và production chỉ bằng cách thay values.yaml.

Bash
 1# Cài đặt nginx-ingress qua Helm
 2helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
 3helm install ingress-nginx ingress-nginx/ingress-nginx \
 4  --namespace ingress-nginx \
 5  --create-namespace
 6
 7# Override giá trị mặc định cho môi trường production
 8helm upgrade --install my-app ./chart \
 9  -f values.production.yaml \
10  --namespace production

Helm còn lưu lịch sử release, cho phép helm rollback my-app 1 để quay về phiên bản trước — tương tự kubectl rollout undo nhưng áp dụng cho toàn bộ stack gồm nhiều resource. Kết hợp Helm với một pipeline CI/CD là cách phổ biến nhất để tự động hóa deploy lên Kubernetes trong môi trường production.

ConfigMap và Secret

Hai đối tượng này tách cấu hình ra khỏi container image. ConfigMap lưu cấu hình không nhạy cảm (database host, feature flag); Secret lưu dữ liệu nhạy cảm (password, API key) dưới dạng base64-encoded. Cả hai đều được inject vào Pod qua biến môi trường hoặc volume mount, giúp cùng một image chạy được ở nhiều môi trường khác nhau mà không cần build lại.

So sánh: Managed K8s vs Self-Hosted

Managed Kubernetes vs Self-Hosted
Tested on 2026-06-12 Kubernetes deployment options
| Tiêu chí | Managed (GKE/EKS/AKS) | Self-Hosted (kubeadm) | |---|---|---| | **Cài đặt Control Plane** | Tự động, vài phút | Thủ công, vài giờ | | **Nâng cấp K8s** | 1 click / tự động | Thủ công từng bước | | **etcd backup** | Tích hợp sẵn | Tự cấu hình | | **Chi phí** | Trả thêm phí managed | Tiết kiệm phí cloud | | **Tùy chỉnh Control Plane** | Giới hạn | Toàn quyền | | **Phù hợp** | Hầu hết doanh nghiệp | Cần tùy chỉnh sâu |

Khi nào CẦN Kubernetes — và khi nào là overkill

Nên dùng Kubernetes khi:

  • Hệ thống có 5+ microservices cần deploy độc lập.
  • Cần auto-scaling theo tải thực tế (ví dụ: traffic tăng đột biến buổi tối).
  • Yêu cầu zero-downtime deployment và rollback nhanh.
  • Đội ngũ DevOps đã có kinh nghiệm vận hành cluster.
  • Hạ tầng đặt trên cloud server hỗ trợ managed K8s.

Kubernetes là overkill khi:

  • Dự án startup giai đoạn đầu với 1-3 service.
  • Team nhỏ, không có người chuyên vận hành K8s.
  • Traffic thấp và ổn định, không cần auto-scaling.
  • Ngân sách hạn chế — overhead của cluster (ít nhất 3 node) tốn kém hơn một VPS đơn.

Với dự án nhỏ, Docker Compose hoặc một pipeline CI/CD đơn giản deploy lên VPS là đủ. Kubernetes là công cụ mạnh nhưng đi kèm độ phức tạp cao — chỉ đầu tư khi thực sự cần thiết.

Kết luận: Kubernetes giải quyết bài toán điều phối container ở quy mô lớn mà không có công cụ nào làm tốt hơn hiện nay. Hiểu rõ kiến trúc Control Plane, các khái niệm Pod/Deployment/Service và biết khi nào nên dùng sẽ giúp bạn đưa ra quyết định đúng đắn — thay vì áp dụng K8s cho mọi dự án chỉ vì nó phổ biến.

Nguồn tham khảo
  1. https://kubernetes.io/docs/concepts/overview/
  2. https://kubernetes.io/docs/concepts/architecture/
  3. https://kubernetes.io/docs/concepts/workloads/pods/
  4. https://helm.sh/docs/intro/quickstart/
  5. https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview
  6. https://martinfowler.com/articles/microservices.html

Câu hỏi thường gặp

Câu hỏi thường gặpQ&A
Kubernetes khác Docker thế nào?
Docker là công cụ đóng gói và chạy từng container riêng lẻ trên một máy. Kubernetes là lớp điều phối bên trên, quản lý hàng trăm container phân tán trên nhiều máy chủ cùng lúc. Hai công nghệ bổ trợ nhau: Docker tạo ra container, Kubernetes lo việc lên lịch, scale và tự phục hồi khi container bị lỗi.
Pod trong Kubernetes là gì?
Pod là đơn vị triển khai nhỏ nhất trong Kubernetes, gồm một hoặc vài container chia sẻ cùng địa chỉ IP và storage. Thường mỗi Pod chứa một container chính; các container phụ (sidecar) trong cùng Pod dùng để xử lý logging, proxy hoặc config injection. Khi Pod bị lỗi, Kubernetes tự tạo Pod mới thay thế.
Dự án nhỏ có cần Kubernetes không?
Hầu hết dự án nhỏ dưới 5 service không cần Kubernetes. Chi phí vận hành cluster (cấu hình, giám sát, bảo mật) vượt lợi ích đem lại. Docker Compose hoặc một VPS đơn giản thường đủ dùng. Kubernetes phát huy giá trị khi bạn có nhiều microservices, cần auto-scaling hoặc triển khai zero-downtime thường xuyên.
Managed Kubernetes (GKE/EKS/AKS) khác self-hosted thế nào?
Managed Kubernetes do nhà cung cấp cloud vận hành Control Plane, tự động nâng cấp, vá lỗi bảo mật và cung cấp SLA uptime. Self-hosted cho toàn quyền tùy chỉnh nhưng đội DevOps phải tự lo etcd backup, certificate rotation và nâng cấp. Với hầu hết doanh nghiệp, managed là lựa chọn thực tế hơn để bắt đầu.
Học Kubernetes nên bắt đầu từ đâu?
Bắt đầu bằng cách nắm vững Docker cơ bản trước. Sau đó cài minikube hoặc kind trên máy local để thực hành. Học lần lượt: Pod → Deployment → Service → Ingress → ConfigMap/Secret. Tài liệu chính thức tại kubernetes.io/docs rất đầy đủ và có interactive tutorial ngay trên trình duyệt.