- 1 API Gateway là gì? Cổng vào thống nhất cho Microservices
- 2 NAT là gì? Network Address Translation trong mạng máy tính
- 3 GitLab CI/CD là gì? Pipeline tự động hóa build, test và deploy
- 4 Kafka là gì? Nền tảng Event Streaming phân tán cho hệ thống lớn
- 5 Serverless là gì? FaaS, Cold Start và khi nào nên dùng Serverless
- 6 Subnet và CIDR là gì? Chia mạng IP và định tuyến hiện đại
- 7 Kubernetes là gì? Nền tảng điều phối container phổ biến nhất hiện nay
- 8 Proxy là gì? Forward Proxy, Reverse Proxy và SOCKS5
- 9 Nginx là gì? Web server, reverse proxy và load balancer trong một
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.
Cần giải pháp dữ liệu cho doanh nghiệp?
AlgoData đồng hành cùng doanh nghiệp về data engineering, phân tích & AI từ 2019.

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 đó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 Plane và Worker 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
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.
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:
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:
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.
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
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
- https://kubernetes.io/docs/concepts/overview/
- https://kubernetes.io/docs/concepts/architecture/
- https://kubernetes.io/docs/concepts/workloads/pods/
- https://helm.sh/docs/intro/quickstart/
- https://cloud.google.com/kubernetes-engine/docs/concepts/kubernetes-engine-overview
- https://martinfowler.com/articles/microservices.html

