kubectl apply -f manifest.yaml, chuyện gì thật sự diễn ra?Hãy hình dung Kubernetes như một bộ máy điều phối rất kỷ luật: bạn không nói “hãy chạy container này ngay”, bạn nói “đây là trạng thái tôi muốn”, rồi cả hệ thống cùng phối hợp để biến mong muốn đó thành Running Pod.
Nắm được luồng từ kubectl đến Running Pod, hiểu ai gửi gì, ai phản hồi gì, và vì sao Kubernetes vận hành theo kiểu declarative.
Sơ đồ tổng thể của hành trình request. Bấm vào từng khối để xem giải thích nhanh.
Gửi request từ manifest YAML
Validate, authorize, persist
Lưu desired state nhất quán
Chọn Node phù hợp
Thi hành Pod spec trên Node
Tạo container thực tế
Trạng thái mong muốn thành hiện thực
Đây là điểm bắt đầu. Người dùng áp dụng manifest YAML, và kubectl gửi HTTP request đến kube-apiserver.
Hãy xem Kubernetes như một chuỗi vận hành trong một trung tâm xử lý hồ sơ.
Bạn điền manifest YAML như một lá đơn mô tả bạn muốn gì. Bạn không tự chạy vào phòng máy, bạn nộp yêu cầu đúng cửa.
Nơi này kiểm tra đơn có hợp lệ không, bạn có quyền nộp không, rồi đưa hồ sơ vào hệ thống chính thức.
Mọi hồ sơ chuẩn hóa được lưu ở đây. Đây là nguồn sự thật trung tâm để cả hệ thống cùng nhìn vào.
Thấy một Pod chưa có nơi chạy, Scheduler nhìn tài nguyên, ràng buộc, policy rồi quyết định giao cho Node nào.
Khi Node được giao việc, kubelet giống quản lý hiện trường. Nó đọc Pod spec và đảm bảo công việc được làm đúng trên Node đó.
Đây là phần lao động tay chân: pull image, tạo container, khởi động tiến trình. Kết quả cuối cùng là Running Pod.
Một đoạn hội thoại ngắn để thấy các thành phần “nói chuyện” với nhau.
Mỗi bước đều có loại giao tiếp, dữ liệu truyền đi và phản hồi quay về.
kubectl apply -f manifest.yaml
kubectl đọc file YAML phía client, chuyển nó thành object phù hợp và gửi lên kube-apiserver bằng HTTP request.
POST, PATCH hoặc PUT tùy tình huống apply/create/update.Schema, authn/authz, admission, persistence
API Server là cửa chính của control plane. Nó kiểm tra request có đúng định dạng, người gửi có quyền hay không, rồi mới ghi desired state vào etcd.
Pod mới xuất hiện nhưng chưa có nơi chạy
Scheduler không cần ai gọi trực tiếp. Nó hoạt động theo mô hình watch, liên tục quan sát các object trong cluster để phát hiện Pod chưa có nodeName.
watch hoặc list-watch tới API Server.Từ nhiều Node, chọn một nơi phù hợp nhất
Sau khi lọc và chấm điểm các Node, Scheduler chọn đích đến rồi cập nhật kết quả lên API Server. Từ đây Pod đã có “địa chỉ thi hành”.
Node agent bắt đầu thi hành desired state
kubelet trên mỗi Node cũng đang watch API Server. Khi thấy Pod được gán cho Node của mình, nó tải Pod spec và chuẩn bị dựng workload.
Biến spec thành process thực thi
kubelet gọi Container Runtime như containerd hoặc CRI-O thông qua CRI. Runtime sẽ pull image, tạo sandbox, khởi động containers.
Desired state bắt đầu khớp với actual state
Khi containers đã start và kubelet cập nhật status, Pod có thể chuyển sang Running. Từ đây các controller vẫn tiếp tục quan sát để đảm bảo trạng thái này được duy trì.
kubectl get pods.Những ý rất đáng biết để hiểu Kubernetes sâu hơn, không chỉ thuộc luồng.
Imperative là nói hệ thống phải làm từng động tác cụ thể. Declarative là khai báo trạng thái mong muốn, ví dụ “tôi muốn có 3 replicas”. Kubernetes thiên về declarative: bạn mô tả đích đến, control plane tự lo đường đi.
Controllers luôn so sánh desired state với actual state. Nếu lệch nhau, chúng tạo hành động để kéo thực tế quay về mục tiêu. Vì vậy cluster giống một bộ máy tự chỉnh hơn là một script chạy một lần rồi thôi.
etcd là nơi giữ state cốt lõi của cluster. Nếu dữ liệu ở đây không nhất quán, các thành phần khác sẽ nhìn thấy “sự thật” khác nhau, và cả dàn nhạc điều phối sẽ lệch nhịp. Tính nhất quán giúp quyết định scheduling, status và reconciliation đáng tin cậy.
Nếu kubelet trên một Node ngừng báo cáo, Node có thể chuyển sang trạng thái không khỏe. Sau ngưỡng timeout, control plane có thể đánh giá Node gặp vấn đề, và workloads có thể được tạo lại ở nơi khác tùy controller và policy liên quan.
Thay vì liên tục hỏi đi hỏi lại “có gì mới chưa?”, nhiều thành phần dùng watch với API Server để nhận event khi object thay đổi. Cách này giảm polling thừa và giúp cluster phản ứng như một bảng điều khiển có dây thần kinh sống.