Yêu cầu phần cứng và hệ điều hành cho cụm Kubernetes
Để triển khai Service Mesh với Linkerd và eBPF, cụm Kubernetes cần đáp ứng các yêu cầu phần cứng tối thiểu để đảm bảo hiệu năng và ổn định.
Mỗi node trong cụm (bao gồm cả Control Plane và Worker Nodes) cần có cấu hình như sau:
- CPU: Tối thiểu 2 cores (khuyến nghị 4 cores trở lên để chạy các overlay network và eBPF programs).
- RAM: Tối thiểu 4GB (Linkerd và các component eBPF tiêu tốn RAM đáng kể, khuyến nghị 8GB).
- Disk: Tối thiểu 40GB SSD (khuyến nghị 100GB+ để lưu trữ logs và container images).
- Hệ điều hành: Ubuntu 22.04 LTS, Debian 11+, hoặc CentOS Stream 9. Kernel version phải >= 5.15 để hỗ trợ đầy đủ các tính năng eBPF.
Trước khi cài đặt Kubernetes, cần kiểm tra xem kernel có hỗ trợ các module cần thiết hay không và đảm bảo CPU hỗ trợ virtualization (KVM) nếu cần.
Kiểm tra phiên bản kernel và các module eBPF cần thiết:
uname -r
lsmod | grep bpf
lsmod | grep overlay
Kết quả mong đợi: Phiên bản kernel trả về >= 5.15. Các module bpf và overlay phải xuất hiện trong danh sách module đang chạy. Nếu thiếu module bpf, cần tải lại kernel hoặc enable module trong GRUB.
Cài đặt Kubernetes phiên bản mới nhất với kubeadm
Chúng ta sẽ sử dụng kubeadm để cài đặt cụm Kubernetes chuẩn (Vanilla K8s) trên Ubuntu 22.04. Phương pháp này phù hợp nhất để học sâu về kiến trúc và tích hợp eBPF so với các phân phối all-in-one như k3s.
Bước đầu tiên là tắt swap và mở rộng các tính năng cần thiết trên tất cả các node (Master và Worker). Swap gây xung đột với kubelet và các cơ chế scheduling của Kubernetes.
Tắt swap trên tất cả các node:
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Kết quả mong đợi: Lệnh free -h sẽ trả về 0B ở cột swap. Dòng trong file /etc/fstab liên quan đến swap đã bị comment.
Thiết lập repository của Kubernetes và cài đặt các công cụ cần thiết: kubeadm, kubelet, kubectl, và cri-tools.
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://packages.cloud.google.com/apt kubernetes-$(lsb_release -cs) main' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl cri-tools containerd
Kết quả mong đợi: Các gói phần mềm được cài đặt thành công, không báo lỗi về repository hoặc key signing.
Cấu hình containerd để sử dụng runtime mặc định của Kubernetes (cgroupfs hoặc systemd). Cần tạo file cấu hình /etc/containerd/config.toml.
Tạo file cấu hình containerd với nội dung hoàn chỉnh:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
Kết quả mong đợi: File /etc/containerd/config.toml được tạo với dòng SystemdCgroup = true. Service containerd chạy ổn định (trạng thái active).
Khởi tạo Control Plane node (Master node) với phiên bản Kubernetes mới nhất. Lưu ý: thay thế 192.168.1.10 bằng IP thật của Master node.
kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint 192.168.1.10:6443
Kết quả mong đợi: Quá trình khởi tạo hoàn tất, xuất hiện thông báo "Your Kubernetes control-plane has initialized successfully!" kèm theo lệnh kubeadm join dành cho worker nodes.
Thiết lập cấu hình kubectl cho người dùng hiện tại trên Master node:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kết quả mong đợi: File ~/.kube/config được tạo, cho phép chạy lệnh kubectl get nodes mà không cần sudo.
Trên các Worker Node, chạy lệnh kubeadm join được hiển thị từ bước khởi tạo Master:
kubeadm join 192.168.1.10:6443 --token --discovery-token-ca-cert-hash sha256:
Kết quả mong đợi: Worker node tham gia cụm thành công, thông báo "This node has joined the cluster: [component="kubelet"]"
Cài đặt và cấu hình CLI tools: kubectl, helm, và linkerd2
Trên Control Plane node (hoặc máy phát triển có quyền truy cập), chúng ta cần cài đặt thêm helm để quản lý chart và linkerd2 CLI để tương tác với Service Mesh.
Cài đặt helm phiên bản mới nhất từ repository chính thức của CNCF:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash
Kết quả mong đợi: Lệnh helm version trả về phiên bản mới nhất (ví dụ: v3.13.x) mà không cần sudo.
Cài đặt linkerd2 CLI. Linkerd yêu cầu tải trực tiếp binary từ trang web chính thức hoặc sử dụng brew (trên macOS). Trên Linux, chúng ta dùng curl để tải và đặt vào /usr/local/bin.
curl --proto '=https' --tlsv1.2 -sSf https://run.linkerd.io/install | sudo sh
sudo ln -s /usr/local/bin/linkerd /usr/local/bin/linkerd2
Kết quả mong đợi: File binary linkerd2 được tạo tại /usr/local/bin/linkerd2. Lệnh linkerd2 version chạy được.
Thêm repository Helm của Linkerd vào local client để có thể deploy các component của Linkerd qua Helm trong các bài sau:
helm repo add linkerd https://helm.linkerd.io/stable
helm repo update
Kết quả mong đợi: Repository "linkerd" được thêm vào danh sách helm repo list và cập nhật thành công.
Triển khai Pod Network và Kiểm tra sức khỏe cụm
Kubernetes mới cài đặt bằng kubeadm chưa có Pod Network (CNI). Service Mesh như Linkerd yêu cầu CNI để routing traffic giữa các pod. Chúng ta sẽ sử dụng Calico hoặc Cilium (khuyến nghị Cilium để tối ưu eBPF, nhưng ở phần 1 dùng Calico cho tính tương thích cao).
Triển khai Calico CNI thông qua manifest:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
Kết quả mong đợi: Các resource DaemonSet, CustomResourceDefinition của Calico được tạo. Sau 1-2 phút, tất cả node trong cụm chuyển trạng thái từ NotReady sang Ready.
Kiểm tra sức khỏe toàn bộ cụm Kubernetes:
kubectl get nodes
kubectl get pods -A
kubectl get componentstatus
Kết quả mong đợi:
kubectl get nodes: Tất cả node có trạng thái Ready.
kubectl get pods -A: Các pod trong namespace kube-system (kube-proxy, calico-node, etcd, api-server, controller-manager, scheduler) đều ở trạng thái Running.
kubectl get componentstatus: Tất cả component đều Healthy.
Kiểm tra quyền truy cập admin và khả năng tạo resource. Tạo một namespace và một pod đơn giản để xác minh lưu lượng mạng nội bộ hoạt động:
kubectl create namespace test-mesh
kubectl run nginx --image=nginx:latest -n test-mesh --port=80
kubectl get pods -n test-mesh -o wide
Kết quả mong đợi: Namespace test-mesh được tạo. Pod nginx chuyển sang trạng thái Running và có địa chỉ IP Pod (ví dụ: 10.244.x.x). Lệnh kubectl exec -it nginx -n test-mesh -- curl -s http://localhost trả về HTML của nginx.
Chuẩn bị môi trường cho Linkerd bằng cách chạy lệnh pre-check. Đây là bước quan trọng nhất trước khi cài đặt Linkerd:
linkerd2 check --pre
Kết quả mong đợi: Tất cả các bước kiểm tra (control plane, kubernetes, etc.) đều hiển thị ok. Nếu có lỗi (ví dụ: "kube-system" namespace không đủ RAM), cần điều chỉnh lại tài nguyên hoặc cài đặt lại.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Service Mesh trên Kubernetes với Linkerd và eBPF
Phần 2: Triển khai Linkerd cơ bản và kiểm tra hoạt động »