Kubernetes (K8s) cho người mới bắt đầu: Quản lý Container hiệu quả
Kubernetes, viết tắt K8s, là nền tảng mã nguồn mở giúp tự động triển khai, mở rộng và quản lý ứng dụng container trên một cụm nhiều máy. Thay vì tự tay khởi động container trên từng máy chủ, bạn mô tả trạng thái mong muốn bằng file YAML, và Kubernetes liên tục làm việc để thực tế khớp với mô tả đó. Bài này giới thiệu các khái niệm cốt lõi theo thứ tự bạn sẽ gặp khi triển khai ứng dụng đầu tiên.
Bài giả định bạn đã biết container và Docker là gì. Nếu chưa, hãy đọc trước giới thiệu Docker và containerization.
Tư duy khai báo: chìa khóa để hiểu Kubernetes
Với Docker trên một máy, bạn ra lệnh: "chạy container này". Với Kubernetes, bạn khai báo: "tôi muốn luôn có ba bản sao của ứng dụng web phiên bản 1.4". Các thành phần điều khiển (controller) của Kubernetes chạy một vòng lặp liên tục: so sánh trạng thái thực tế với trạng thái mong muốn, và hành động để thu hẹp khoảng cách. Một container chết, chỉ còn hai bản sao, controller tạo bản thứ ba. Bạn đổi phiên bản thành 1.5, controller thay dần các bản cũ.
Hiểu được vòng lặp điều hòa (reconciliation loop) này, phần lớn hành vi của Kubernetes trở nên dễ đoán.
Kiến trúc một cụm Kubernetes
Một cụm gồm hai nhóm thành phần:
Control plane (mặt phẳng điều khiển)
- kube-apiserver: cổng giao tiếp duy nhất; mọi lệnh kubectl, mọi thành phần khác đều nói chuyện qua API này.
- etcd: kho dữ liệu khóa-giá trị lưu toàn bộ trạng thái cụm.
- kube-scheduler: quyết định Pod mới sẽ chạy trên node nào dựa trên tài nguyên và ràng buộc.
- kube-controller-manager: chạy các controller thực hiện vòng lặp điều hòa.
Worker node (máy chạy ứng dụng)
- kubelet: tác tử trên mỗi node, đảm bảo các container được giao đang chạy.
- Container runtime: như containerd, thực sự khởi chạy container.
- kube-proxy: cấu hình quy tắc mạng để Service hoạt động.
Với dịch vụ Kubernetes được quản lý như Amazon EKS, Google GKE hay Azure AKS, nhà cung cấp vận hành control plane; bạn chủ yếu làm việc với worker node và tài nguyên ứng dụng.
Các đối tượng cơ bản bạn sẽ dùng hằng ngày
| Đối tượng | Vai trò | So sánh dễ hiểu |
|---|---|---|
| Pod | Đơn vị triển khai nhỏ nhất, chứa một hoặc vài container dùng chung mạng và ổ đĩa | Một "căn phòng" cho container |
| Deployment | Quản lý số bản sao Pod và quá trình cập nhật phiên bản | Người quản lý đảm bảo đủ nhân sự |
| Service | Địa chỉ và tên ổn định để truy cập một nhóm Pod, kèm cân bằng tải | Số tổng đài chuyển tới nhân viên đang trực |
| Ingress | Định tuyến HTTP/HTTPS từ bên ngoài vào các Service theo tên miền, đường dẫn | Lễ tân hướng khách tới đúng phòng ban |
| ConfigMap, Secret | Cấu hình và dữ liệu nhạy cảm tách khỏi image | Hồ sơ cấu hình đưa vào khi khởi động |
| Namespace | Phân vùng logic trong cụm cho từng đội hoặc môi trường | Các tầng của tòa nhà |
| PersistentVolumeClaim | Yêu cầu ổ lưu trữ bền vững cho Pod | Tủ đồ riêng không mất khi đổi phòng |
Vì sao không tạo Pod trực tiếp
Pod là tạm thời. Khi node hỏng, Pod trên đó mất đi và không tự được tạo lại nếu bạn tạo nó trực tiếp. Deployment (thông qua ReplicaSet) mới là thứ đảm bảo luôn có đủ Pod. Vì vậy, với ứng dụng không trạng thái, bạn gần như luôn dùng Deployment.
Vì sao cần Service
Mỗi Pod có địa chỉ IP riêng nhưng địa chỉ này thay đổi mỗi khi Pod được tạo lại. Service chọn Pod theo nhãn (label) và cung cấp một tên DNS cố định trong cụm, ví dụ dịch vụ web gọi tới cơ sở dữ liệu qua tên postgres thay vì IP.
Một ứng dụng đầu tiên trên Kubernetes
Quy trình triển khai một ứng dụng web điển hình gồm:
- Build image và đẩy lên registry mà cụm truy cập được.
- Viết manifest Deployment: tên image, số bản sao, cổng container, yêu cầu tài nguyên CPU và bộ nhớ, probe kiểm tra sức khỏe.
- Viết manifest Service trỏ tới các Pod của Deployment qua nhãn.
- Nếu cần truy cập từ Internet, thêm Ingress kèm Ingress controller (ví dụ ingress-nginx) hoặc dùng Service kiểu LoadBalancer trên cloud.
- Áp dụng bằng kubectl apply -f và theo dõi bằng kubectl get pods, kubectl describe, kubectl logs.
Những tính năng khiến K8s đáng học
Tự phục hồi
Liveness probe cho Kubernetes biết khi nào container bị treo và cần khởi động lại; readiness probe cho biết khi nào Pod sẵn sàng nhận lưu lượng. Cấu hình đúng hai probe này giúp ứng dụng tự hồi phục và không nhận yêu cầu khi đang khởi động.
Cập nhật cuốn chiếu và rollback
Khi bạn đổi image trong Deployment, Kubernetes tạo Pod mới và gỡ Pod cũ dần dần, giữ dịch vụ liên tục. Nếu phiên bản mới lỗi, kubectl rollout undo quay về bản trước.
Tự động mở rộng
Horizontal Pod Autoscaler tăng giảm số Pod theo CPU, bộ nhớ hoặc chỉ số tùy chỉnh. Ở tầng hạ tầng, Cluster Autoscaler hoặc công cụ như Karpenter thêm bớt node khi Pod không còn chỗ chạy.
Requests và limits
Mỗi container nên khai báo requests (tài nguyên tối thiểu để scheduler xếp chỗ) và limits (mức tối đa được dùng). Thiếu khai báo này, một Pod ngốn tài nguyên có thể làm chậm cả node.
Lỗi thường gặp của người mới
- ImagePullBackOff: sai tên image, sai tag hoặc cụm không có quyền kéo từ registry riêng.
- CrashLoopBackOff: container khởi động rồi thoát liên tục; xem kubectl logs với cờ --previous để đọc log lần chạy trước.
- Pending mãi: không node nào đủ tài nguyên theo requests, hoặc PersistentVolumeClaim chưa được cấp ổ.
- Service không có endpoint: selector của Service không khớp nhãn của Pod.
Lưu ý bảo mật cơ bản
- Bật RBAC và cấp quyền tối thiểu cho người dùng và ServiceAccount.
- Secret mặc định chỉ được mã hóa base64, không phải mã hóa thật; bật mã hóa etcd hoặc dùng công cụ quản lý bí mật bên ngoài.
- Dùng NetworkPolicy để giới hạn Pod nào được nói chuyện với Pod nào.
- Áp dụng Pod Security Standards để chặn container chạy đặc quyền.
Những thực hành này nằm trong bức tranh lớn hơn của DevSecOps trên môi trường đám mây.
Lộ trình thực hành gợi ý
- Cài kubectl và một cụm cục bộ bằng kind, minikube hoặc k3d.
- Triển khai một ứng dụng web có sẵn bằng Deployment và Service, thử xóa Pod để thấy nó tự được tạo lại.
- Đổi phiên bản image, quan sát rolling update, rồi rollback.
- Thêm ConfigMap, Secret và probe kiểm tra sức khỏe.
- Thử Ingress và HorizontalPodAutoscaler.
- Học Helm hoặc Kustomize để quản lý manifest cho nhiều môi trường.
- Thử một cụm được quản lý trên cloud, nhớ xóa cụm sau khi học để tránh chi phí.
Câu hỏi thường gặp
Học Kubernetes mất bao lâu?
Tùy nền tảng của bạn. Nếu đã quen Linux và Docker, vài tuần thực hành đều đặn là đủ để triển khai ứng dụng cơ bản. Vận hành cụm production ổn định với bảo mật, giám sát, nâng cấp là kỹ năng cần nhiều tháng tích lũy.
Chứng chỉ Kubernetes nào phổ biến?
Cloud Native Computing Foundation cung cấp các chứng chỉ như CKAD cho nhà phát triển, CKA cho quản trị viên và CKS cho bảo mật. Các bài thi dạng thực hành trên dòng lệnh nên đòi hỏi kinh nghiệm thao tác thật.
Có nên tự dựng cụm Kubernetes hay dùng dịch vụ managed?
Với đa số đội, dịch vụ managed như EKS, GKE, AKS giảm đáng kể gánh nặng vận hành control plane và nâng cấp. Tự dựng cụm phù hợp khi cần chạy tại chỗ, có yêu cầu đặc thù hoặc muốn học sâu.
Kubernetes có phù hợp cho cơ sở dữ liệu không?
Có thể chạy cơ sở dữ liệu trên Kubernetes với StatefulSet và operator chuyên dụng, nhưng việc vận hành phức tạp hơn ứng dụng không trạng thái. Nhiều đội chọn dịch vụ cơ sở dữ liệu managed của cloud và chỉ chạy ứng dụng trên K8s.
Bài liên quan

Bảo mật đám mây: DevSecOps và những nguyên tắc cốt lõi
DevSecOps đưa bảo mật vào từng bước phát triển và vận hành trên cloud. Tìm hiểu các nguyên tắc cốt lõi, công cụ và cách bắt đầu cho đội nhỏ.

CI/CD Pipeline: Tự động hóa quy trình deploy với GitHub Actions
Hướng dẫn xây pipeline CI/CD bằng GitHub Actions: cấu trúc workflow, job test và build, deploy theo môi trường, bảo mật secrets và mẹo tăng tốc.

CI/CD Pipeline: Tự động hóa quy trình phát triển và kiểm thử phần mềm
CI/CD là gì, khác nhau giữa Continuous Delivery và Deployment, nên đặt unit test, integration test, E2E ở đâu trong pipeline và cách đo hiệu quả.

Docker và Kubernetes: Containerization cho người mới bắt đầu
Container là gì, Docker giải quyết vấn đề gì, khi nào cần đến Kubernetes. Giải thích dễ hiểu kèm lộ trình học Docker và K8s cho người mới bắt đầu.