1. Yêu cầu phần cứng và hệ điều hành tối thiểu
Để triển khai Service Mesh với Cilium và eBPF hiệu quả, môi trường vật lý hoặc ảo hóa cần đáp ứng các tiêu chuẩn khắt khe hơn so với Kubernetes thông thường do overhead của eBPF và proxy.
Yêu cầu CPU và RAM tối thiểu cho mỗi node (Worker Node):
- CPU: Tối thiểu 4 vCPU. eBPF cần nhiều core để xử lý packet processing ở mức kernel mà không gây tắc nghẽn CPU.
- RAM: Tối thiểu 8GB. Cilium + Istio (Sidecar) + eBPF maps tiêu tốn đáng kể bộ nhớ.
- Disk: Tối thiểu 40GB NVMe SSD. eBPF logs và tracing data cần tốc độ I/O cao.
- Network: Hỗ trợ IPTables/NFTables, ưu tiên có sẵn hardware offloading nếu có.
Yêu cầu về Kernel Linux (Quan trọng nhất):
- Version: Tối thiểu Linux Kernel 5.15 (Khuyến nghị 5.17 trở lên để hỗ trợ đầy đủ các tính năng của Cilium v1.12+).
- Config: Kernel phải được compile với các option sau:
CONFIG_BPF_SYSCALL=y, CONFIG_CGROUP_BPF=y, CONFIG_NETFILTER=y, CONFIG_BRIDGE_NETFILTER=y.
- Distribution: Ubuntu 22.04 LTS, Rocky Linux 9, hoặc Debian 12. Tránh các bản CentOS 7 cũ (kernel 3.10 không hỗ trợ eBPF).
Verify Kernel hiện tại:
Chạy lệnh sau để kiểm tra version và các flag cần thiết:
uname -r
Kết quả mong đợi: Số version >= 5.15 (ví dụ: 5.15.0-91-generic).
grep -E 'BPF_SYSCALL|CGROUP_BPF' /boot/config-$(uname -r)
Kết quả mong đợi: Thấy dòng CONFIG_BPF_SYSCALL=y và CONFIG_CGROUP_BPF=y.
2. Cài đặt Kubernetes Cluster với Kernel hỗ trợ eBPF
2.1. Cài đặt K3s (Khuyến nghị cho môi trường Dev/Test)
K3s là bản Kubernetes nhẹ, đã được tối ưu sẵn cho các môi trường cần eBPF. Chúng ta sẽ sử dụng K3s với chế độ CNI mặc định tạm thời (sẽ thay bằng Cilium ở phần sau) hoặc disable CNI mặc định để Cilium quản lý hoàn toàn.
Tải và cài đặt K3s với các flag đặc biệt để hỗ trợ eBPF và CNI Cilium sau này:
curl -sfL https://get.k3s.io | K3S_CNI=none K3S_KUBECONFIG_MODE="644" sh -
Giải thích: K3S_CNI=none tắt CNI mặc định của K3s (Flannel) để tránh xung đột với Cilium. K3S_KUBECONFIG_MODE="644" cho phép user root đọc file kubeconfig mà không cần sudo.
Kết quả mong đợi: Script chạy xong, xuất hiện thông báo k3s is installed.
2.2. Cấu hình file kubeconfig cho user hiện tại
Sao chép file kubeconfig từ root sang thư mục home của user hiện tại để sử dụng kubectl mà không cần gõ sudo.
mkdir -p $HOME/.kube
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kết quả mong đợi: File ~/.kube/config được tạo thành công.
2.3. Verify Cluster đang chạy
Kiểm tra trạng thái các node và component của Kubernetes.
kubectl get nodes
Kết quả mong đợi: Thấy node với trạng thái Ready.
kubectl get pods -A
Kết quả mong đợi: Các pod trong namespace kube-system đang ở trạng thái Running hoặc ContainerCreating.
3. Cài đặt các công cụ quản lý và quan sát
3.1. Cài đặt Kubectl và Krew
Đảm bảo kubectl đã được cài đặt (thường đi kèm với K3s hoặc cài riêng). Cài đặt kubectl plugin manager (krew) để mở rộng chức năng.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
Kết quả mong đợi: Lệnh kubectl version chạy được.
curl -sS https://get.krew.sh | bash
Cấu hình shell (bash/zsh) để thêm krew vào PATH:
echo 'export KREW_ROOT=~/.krew' >> ~/.bashrc
echo 'export PATH="$KREW_ROOT/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
Kết quả mong đợi: Lệnh krew search chạy được.
3.2. Cài đặt Helm (Package Manager cho Kubernetes)
Helm là công cụ bắt buộc để deploy Cilium, Istio và các chart quan sát trong các phần sau.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Verify phiên bản Helm:
helm version
Kết quả mong đợi: Thông báo phiên bản Helm v3.x.x.
3.3. Cài đặt công cụ quan sát cơ bản (Hubble CLI)
Hubble là CLI của Cilium để quan sát lưu lượng eBPF. Cài đặt trước để chuẩn bị cho phần sau.
kubectl krew install hubble
Kết quả mong đợi: Plugin hubble được thêm vào kubectl. Lệnh kubectl hubble version hiện thông báo chưa có server (bình thường vì chưa cài Cilium).
4. Kiểm tra tính sẵn sàng của Kernel và Module eBPF
4.1. Kiểm tra BPF Loader
Chúng ta cần đảm bảo kernel cho phép load các BPF program. Đây là bước quan trọng nhất trước khi deploy Cilium.
cat /proc/sys/kernel/unprivileged_bpf_disabled
Kết quả mong đợi: Giá trị 0 (cho phép unprivileged) hoặc 1 (chỉ cho root, vẫn chấp nhận được cho Cilium).
Test khả năng load BPF program bằng script nhỏ:
cat > /tmp/test_bpf.c
Thay vì compile C (phụ thuộc vào build tools), chúng ta dùng lệnh đơn giản hơn để kiểm tra sysctl BPF:
sysctl -a | grep bpf
Kết quả mong đợi: Xuất hiện các dòng như net.core.bpf_jit_enable = 1 và kernel.unprivileged_bpf_disabled = 0.
4.2. Kiểm tra Module eBPF (Cilium Dependency)
Cilium yêu cầu một số module kernel cụ thể để hoạt động. Kiểm tra xem các module này có được load chưa.
modprobe br_netfilter
lsmod | grep br_netfilter
Kết quả mong đợi: Thấy dòng br_netfilter trong danh sách module.
Enable bridge netfilter (Cilium cần điều này để inspect traffic trong bridge):
cat
Kết quả mong đợi: Không có lỗi, file config được tạo và sysctl reload thành công.
4.3. Verify cuối cùng: Test BPF Map
Chạy một script Python nhỏ (hoặc dùng bpftrace nếu có) để tạo một BPF map đơn giản và ghi dữ liệu vào đó.
python3 -c "import ctypes; print('Python ctypes available for BPF testing')" 2>&1 || echo "Install python3-dev"
Tuy nhiên, cách chính xác nhất để verify môi trường eBPF chuẩn bị cho Cilium là dùng lệnh cilium-bpf (nếu đã cài Cilium) hoặc kiểm tra /sys/fs/bpf.
ls -la /sys/fs/bpf
Kết quả mong đợi: Thư mục tồn tại. Nếu không tồn tại, mount nó:
mount bpffs -t bpf /sys/fs/bpf
Kiểm tra lại:
ls -la /sys/fs/bpf
Kết quả mong đợi: Thư mục /sys/fs/bpf tồn tại và có thể ghi vào (ví dụ: touch /sys/fs/bpf/test_map).
5. Tổng hợp và Verify toàn bộ môi trường
Chạy script kiểm tra tổng hợp để đảm bảo mọi thứ sẵn sàng cho Phần 2 (Triển khai Cilium).
echo "=== K8s Cluster Status ===" && kubectl get nodes -o wide
echo "=== Helm Version ===" && helm version --short
echo "=== Kubectl Version ===" && kubectl version --short
echo "=== Kernel eBPF Support ===" && uname -r && grep BPF_SYSCALL /boot/config-$(uname -r)
echo "=== Bridge Netfilter ===" && sysctl net.bridge.bridge-nf-call-iptables
echo "=== BPF FS ===" && ls /sys/fs/bpf
Kết quả mong đợi: Tất cả các lệnh trên chạy không lỗi, node Ready, kernel >= 5.15, và BPF support được bật.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Service Mesh nội bộ an toàn với Istio, Cilium và eBPF trên Kubernetes để quản lý lưu lượng mạng, bảo mật và quan sát chi tiết
Phần 2: Triển khai Cilium làm CNI và nền tảng eBPF »