Có image Website AI rồi, câu hỏi tiếp theo trong team là Kubernetes là gì và nó làm được gì mà một nhóm Cloud VPS chạy nginx, PHP-FPM không làm được. Bài này trả lời câu hỏi Kubernetes là gì cho dev PHP đã quen SSH vào minion, chạy php artisan và đọc log nginx: các thành phần của control plane, node và pod, một lần deploy chạy qua chúng thế nào, và nên chọn Kubernetes dạng managed như LKE hay tự dựng.
1. Kubernetes là gì, nói ngắn gọn
Trả lời câu hỏi Kubernetes là gì bằng một câu: đó là hệ thống điều phối container, nhận mô tả "trạng thái mong muốn" và liên tục làm cho trạng thái thực tế khớp với mô tả đó. Bạn không ra lệnh "SSH vào máy 3, chạy container X". Bạn khai báo "site A cần một bản chạy image Website AI phiên bản Y, mở cổng 80", và Kubernetes tự chọn máy, tự chạy, tự chạy lại khi container chết.
Kubernetes là dự án mã nguồn mở do Google khởi xướng, dựa trên kinh nghiệm vận hành hệ thống nội bộ Borg, hiện do CNCF quản lý. Mỗi năm có khoảng ba phiên bản minor, nên hãy kiểm tra phiên bản đang được hỗ trợ trước khi tạo cluster. Định nghĩa chính thức và sơ đồ các thành phần nằm ở trang Kubernetes Components trên kubernetes.io.
Một cluster Kubernetes gồm hai phần: control plane ra quyết định, và các node chạy công việc. Hiểu hai phần này là hiểu được phần lớn Kubernetes là gì.
2. Kubernetes là gì nếu nhìn từ mô hình Cloud VPS ba tầng
Với người đã vận hành mô hình Balancer – Minion – Database trên Cloud VPS, cách nhanh nhất để hình dung Kubernetes là gì là đặt hai bên cạnh nhau:
| Trên Cloud VPS | Trong Kubernetes |
|---|---|
| Minion chạy nginx + PHP-FPM | Node (máy worker) chạy pod |
Thư mục /var/www/<domain> | Pod chạy image của site, cấu hình nạp từ bên ngoài |
| Người vận hành chọn minion cho site | Scheduler tự chọn node còn đủ tài nguyên |
supervisor autorestart=true | kubelet chạy lại container, controller tạo lại pod |
| Tên máy trong DNS nội bộ | Tên Service trong DNS của cluster |
| Balancer với file cấu hình cho từng domain | Service kiểu LoadBalancer và Ingress (bài sau) |
| Pipeline SSH vào máy chạy lệnh | Gửi file YAML tới API server |
Khác biệt lớn nhất nằm ở dòng cuối: trên Cloud VPS, thay đổi là chuỗi lệnh chạy theo thứ tự, chạy dở là hệ thống ở trạng thái nửa vời; trong Kubernetes, thay đổi là một bản mô tả mới và các thành phần tự tìm cách đi tới đó. Tên máy trong DNS nội bộ cũng nhường chỗ cho tên Service.
3. Control plane: bộ não của cluster
Phần lớn câu trả lời cho "Kubernetes là gì" nằm ở bốn thành phần của control plane:
- kube-apiserver: cửa vào duy nhất của cluster.
kubectl, pipeline CI hay chính các thành phần khác đều nói chuyện qua REST API của nó. API server xác thực, kiểm tra quyền, kiểm tra tính hợp lệ của object rồi mới ghi xuống etcd. Giống một ứng dụng Laravel chỉ có API, có middleware xác thực và validation trước khi lưu. - etcd: kho key-value phân tán, nơi lưu toàn bộ trạng thái cluster: mọi Deployment, Service, ConfigMap, Secret. etcd dùng thuật toán đồng thuận Raft, cần đa số thành viên còn sống mới ghi được. Mất etcd mà không có bản sao lưu là mất cả cluster.
- kube-scheduler: với mỗi pod chưa có node, scheduler lọc ra các node đủ điều kiện (còn đủ CPU, RAM theo mức đăng ký, khớp nhãn, không bị chặn), chấm điểm rồi gán pod vào node tốt nhất. Trước giờ chúng tôi làm việc này bằng tay khi chọn minion cho site mới.
- kube-controller-manager: chạy hàng loạt vòng lặp điều khiển (controller). Controller của Deployment thấy cần 2 bản mà chỉ có 1 thì tạo thêm. Controller của node thấy một node im lặng quá lâu thì đánh dấu và cho pod trên đó được chuyển đi.
Trên nền tảng cloud còn có cloud-controller-manager, cầu nối với API của nhà cung cấp. Khi khai báo một Service kiểu LoadBalancer trên LKE, chính thành phần này tạo ra một NodeBalancer của Linode. Nắm được các thành phần trên là trả lời được một nửa câu hỏi Kubernetes là gì.
4. Node: nơi pod thực sự chạy
Nửa còn lại của câu hỏi Kubernetes là gì nằm ở node: máy ảo hoặc máy vật lý chạy workload. Trên mỗi node có ba thành phần chính:
- kubelet: tác tử của Kubernetes trên node. Nó đăng ký node với API server, theo dõi những pod được gán cho node mình, yêu cầu container runtime chạy chúng, kiểm tra sức khoẻ (probe) và báo trạng thái về. Nếu container chết, kubelet chạy lại theo chính sách khởi động lại của pod.
- kube-proxy: biến địa chỉ ảo của Service thành luật iptables hoặc IPVS trên node, để gói tin gửi tới Service được chuyển tới một pod đang chạy.
- Container runtime: phần mềm thực sự chạy container, phổ biến nhất là containerd. Từ phiên bản 1.24, Kubernetes đã bỏ dockershim, tức là không còn dùng Docker Engine làm runtime. Image build bằng Docker vẫn chạy bình thường vì đều theo chuẩn OCI. Docker vẫn là công cụ build image trên máy dev như ở bài Docker hoá Laravel cho Website AI.
Ngoài ra, cluster cần plugin mạng (CNI) để pod trên các node gọi được nhau, và DNS nội bộ (thường là CoreDNS) để phân giải tên Service.
5. Pod: đơn vị nhỏ nhất mà Kubernetes quản lý
Dev PHP khi hỏi Kubernetes là gì thường nghĩ tới container, nhưng đơn vị mà Kubernetes lên lịch là pod. Một pod gồm một hoặc vài container:
- Dùng chung một địa chỉ IP và network namespace, nên gọi nhau qua
localhost, giống nginx và PHP-FPM trên cùng một minion. - Có thể dùng chung volume.
- Luôn được xếp lên cùng một node, sống và chết cùng nhau.
Pod mang tính tạm thời. IP của pod đổi mỗi lần pod được tạo lại, và file ghi trong container mất theo pod. Vì vậy không ai gọi thẳng IP của pod, mà gọi qua Service. Cũng vì vậy hầu như không ai tạo pod trực tiếp: pod tạo trực tiếp bị xoá là mất hẳn, còn pod do Deployment quản lý thì được tạo lại tự động. Với Website AI, một site sẽ là một (hoặc vài) pod chạy image all-in-one, phía trước là một Service. Nếu chỉ nhớ một điều khi tìm hiểu Kubernetes là gì, hãy nhớ: pod là tạm thời.
6. Một lần deploy đi qua các thành phần như thế nào
Cách dễ nhất để thấy Kubernetes là gì trong thực tế là theo dõi một lần deploy, từ lúc gõ lệnh tới lúc site trả lời:
kubectl apply -f site-a.yaml
│
▼
kube-apiserver ── xác thực, kiểm tra, ghi Deployment vào etcd
│
▼
controller Deployment ── tạo ReplicaSet
controller ReplicaSet ── tạo Pod (chưa có node)
│
▼
kube-scheduler ── chọn node còn đủ CPU/RAM, gán Pod vào node
│
▼
kubelet trên node ── gọi containerd kéo image, chạy container
│ chạy probe, báo trạng thái Running/Ready
▼
Service ── thêm IP của Pod vào danh sách endpoint, bắt đầu nhận trafficKhông thành phần nào gọi trực tiếp thành phần nào. Tất cả cùng theo dõi API server và phản ứng khi có thay đổi. Nhờ vậy, nếu node đang chạy pod bị tắt, chuỗi từ controller trở xuống tự chạy lại để tạo pod mới ở node khác, không cần ai bấm gì. Đó là phần "tự hồi phục" hay được nhắc tới khi giới thiệu Kubernetes là gì.
7. Managed (LKE) hay tự dựng?
Khi đã hiểu Kubernetes là gì, câu hỏi thực tế là ai vận hành control plane. Có hai hướng:
| Tiêu chí | Managed (LKE) | Tự dựng (kubeadm, k3s…) |
|---|---|---|
| Control plane, etcd | Nhà cung cấp vận hành, mình không SSH vào được | Tự cài, tự sao lưu etcd, tự xử lý khi hỏng |
| Node | Chọn gói máy theo node pool, thêm bớt trên giao diện hoặc API | Tự tạo VPS, cài runtime, join vào cluster |
| Nâng cấp phiên bản | Bấm nâng cấp, node được thay mới lần lượt | Tự nâng từng minor một, không được nhảy cóc |
| Tích hợp hạ tầng | Service LoadBalancer tạo NodeBalancer, PVC tạo Block Storage | Tự cài thêm thành phần tương ứng |
| Mức kiểm soát | Thấp hơn: không chỉnh được tham số control plane | Toàn quyền |
Với một đội vận hành nhỏ đang học, chúng tôi nghiêng về LKE. Chi phí khi đó chủ yếu nằm ở các node (là máy Linode thông thường), NodeBalancer và ổ Block Storage. Đổi lại, chúng tôi chấp nhận không chạm được vào control plane. Mỗi bản minor của Kubernetes chỉ được hỗ trợ khoảng hơn một năm, nên nâng cấp định kỳ là việc bắt buộc, managed hay tự dựng đều vậy.
8. Kubernetes là gì và không là gì: những hiểu lầm thường gặp
- "Lên Kubernetes là tự scale." Không. Mặc định số bản chạy đúng bằng con số bạn khai báo. Tự co giãn cần cấu hình thêm và cần số liệu tài nguyên.
- "Kubernetes thay thế database." Kubernetes chạy được MySQL, nhưng sao lưu, khôi phục, hiệu năng đĩa vẫn là việc của mình. Chạy database trong cluster hay ngoài cluster là quyết định riêng.
- "Ghi file vào pod như ghi vào minion." File ghi trong container mất khi pod được tạo lại. Upload, theme đã chỉnh phải nằm trên volume bền hoặc object storage.
9. Đánh đổi khi chọn Kubernetes cho Website AI
Hiểu Kubernetes là gì cũng là hiểu cái giá của nó. Đổi lại việc tự xếp lịch, tự hồi phục và deploy theo kiểu khai báo, team phải học nhiều khái niệm mới, chấp nhận thêm một tầng trừu tượng giữa code và máy, và debug theo cách khác. Với hàng chục site Website AI dùng chung một core như đã kể ở bài mở đầu series, chúng tôi tin cái giá đó đáng trả. Với một vài site riêng lẻ ít thay đổi, Cloud VPS vẫn đơn giản và rẻ hơn. Nói cách khác, câu trả lời cho Kubernetes là gì với chúng tôi là: một công cụ đáng học cho bài toán nhiều site giống nhau, không phải đích đến cho mọi website.
Bài tiếp theo
Pod, Deployment, Service và Namespace: dùng Kubernetes thế nào. Biết Kubernetes là gì rồi, bài tới chuyển từ khái niệm sang thao tác: vòng đời pod, rolling update, Service và các lệnh kubectl hằng ngày.
