Kubernetes Từ Số Không
Dựng một cluster Kubernetes hoàn chỉnh bằng tay — không kubeadm, không script — từ certificate đầu tiên tới một cluster HA chạy thật, rồi dùng chính nó làm phòng thí nghiệm để deep-dive toàn bộ concept của Kubernetes. Phần một: PKI/TLS, etcd, control plane, worker, mạng pod, CoreDNS. Phần hai: Pods, workload controllers, scheduling, storage, networking nâng cao (Cilium eBPF), bảo mật, mở rộng API, vận hành. Mỗi thành phần vừa được giải thích cơ chế bên trong, vừa tự dựng/cấu hình tay. Test thật trên AWS EC2 với Kubernetes v1.36, manifest/script lưu tại github.com/nghiadaulau/kubernetes-from-scratch. Bám docs chính thức kubernetes.io.
Vì Sao Dựng Kubernetes Bằng Tay, và Ta Sẽ Dựng Cái Gì
Mở đầu series: 'from scratch' nghĩa là tự tay tạo từng certificate, bootstrap từng binary, nối mạng pod — không kubeadm, không script. Vì sao đi đường dài này lại giúp hiểu Kubernetes nhanh hơn, ta sẽ dựng một cluster HA ra sao, rồi dùng chính nó làm phòng thí nghiệm để đi sâu vào toàn bộ concept của Kubernetes.
Kiến Trúc Kubernetes Nhìn Sâu: Vòng Lặp, Watch và API Server
Đào sâu hơn sơ đồ control plane / node quen thuộc: control loop chạy ở đâu, cơ chế list-watch giúp các thành phần phối hợp mà không cần biết nhau, vì sao mọi thứ đi qua api-server, và một lệnh kubectl apply đi qua những chặng nào trước khi container chạy.
PKI và TLS: Vì Sao Cluster Cần Nhiều Certificate Đến Vậy
Một cluster Kubernetes cần tới cả chục certificate và ba CA riêng. Bài này giải thích mô hình PKI/TLS làm nền cho mọi kết nối trong cluster: CA ký cho ai, mTLS hai chiều hoạt động ra sao, và một điểm hay quên — trường CN và O trong certificate chính là danh tính và nhóm RBAC mà api-server tin.
Dựng Sáu Máy EC2 và Chuẩn Bị Hệ Điều Hành
Bài hands-on đầu tiên: dựng một VPC riêng trên AWS với sáu máy EC2 (1 load balancer, 3 controller, 2 worker), gán IP private cố định, rồi chuẩn bị hệ điều hành — hostname, /etc/hosts, kernel module, sysctl, tắt swap — và cài bộ công cụ kubectl, cfssl. Toàn bộ làm từng bước, chạy thật.
Tự Tay Ký Toàn Bộ Certificate Bằng cfssl
Phần lõi của 'from scratch': dùng cfssl tạo ba CA (Kubernetes, etcd, front-proxy) rồi ký toàn bộ certificate cho từng thành phần — apiserver với SAN đầy đủ, kubelet từng worker với CN/O đặc biệt, controller-manager, scheduler, kube-proxy, client cho etcd, và cặp khóa service-account. Làm từng cái, đúng từng trường, rồi verify chuỗi tin cậy.
Gói Cert Thành kubeconfig và Cấu Hình Mã Hóa Secret
Certificate đã có, nhưng các binary Kubernetes đọc chúng qua một dạng file gói sẵn: kubeconfig. Bài này sinh kubeconfig cho admin, controller-manager, scheduler, kube-proxy và từng kubelet — giải thích mô hình cluster/user/context và vì sao control plane trỏ về 127.0.0.1 còn worker trỏ qua load balancer. Cuối bài tạo file mã hóa Secret at rest cho etcd.
etcd: Quorum, Raft và Dựng Cluster Ba Node
Thành phần đầu tiên của control plane, và là nền móng cho mọi thứ phía trên: etcd. Bài này giải thích etcd lưu gì, vì sao nó cần số node lẻ và quorum nghĩa là gì qua thuật toán Raft — rồi dựng một cluster etcd ba node trên các controller với TLS, và kiểm chứng leader cùng sức khỏe cluster.
kube-apiserver: Cổng Vào Cluster và Dây Chuyền Xử Lý Request
Thành phần ngồi ngay trước etcd và là cổng vào duy nhất của cluster. Bài này đi sâu vào dây chuyền authn → authz → admission mà mọi request phải qua, rồi dựng kube-apiserver trên cả ba controller: nối vào etcd bằng TLS, bật mã hóa Secret, và kiểm chứng thật rằng Secret đã được mã hóa khi đọc thẳng bytes trong etcd.
controller-manager và scheduler: Control Loop và Leader Election
Hai thành phần biến trạng thái mong muốn thành hành động: kube-controller-manager chạy hàng chục control loop, kube-scheduler chọn node cho pod. Bài này dựng cả hai trên ba controller, giải thích cách scheduler lọc và chấm điểm node, rồi xem leader election hoạt động thật — ba bản chạy nhưng chỉ một làm việc.
HAProxy Gom Ba API Server và kubectl Từ Xa
Ba api-server đang chạy nhưng client phải biết gọi cái nào. Bài này dựng HAProxy trên lb-0 để gom chúng thành một địa chỉ duy nhất ở chế độ TCP passthrough — giữ nguyên mTLS đầu-cuối, rồi cấu hình kubectl trên laptop trỏ qua Elastic IP và thiết lập RBAC để api-server gọi được xuống kubelet.
Container Runtime và CRI: Cài containerd Trên Worker
kubelet không tự chạy container — nó ủy thác việc đó cho một container runtime qua một giao diện chuẩn tên là CRI. Bài này giải thích CRI là gì, ai trong chồng kubelet → containerd → runc làm việc gì, rồi cài containerd v2.3 cùng runc trên hai worker, chỉnh cgroup driver cho khớp kubelet, và kiểm chứng bằng crictl.
kubelet: Đưa Worker Vào Cluster
kubelet là tiến trình duy nhất trên worker nói chuyện với api-server và ra lệnh cho containerd. Bài này phân phối certificate cho từng node, viết KubeletConfiguration trỏ vào socket containerd, dựng systemd unit, rồi xem hai worker đăng ký vào cluster — và hiểu vì sao chúng hiện ra ở trạng thái NotReady chứ chưa phải Ready.