1. Yêu cầu phần cứng và hệ điều hành cho Kubernetes và eBPF
Mục đích: Xác định cấu hình tối thiểu để đảm bảo eBPF hoạt động ổn định, tránh lỗi "kernel not supported" sau khi cài đặt.
Lý do: eBPF yêu cầu kernel Linux phiên bản 4.17 trở lên (tối ưu là 5.4+). Cilium hoạt động tốt nhất với kernel hỗ trợ BPF JIT (Just-In-Time compilation). RAM và CPU cần đủ để chạy node Kubernetes cùng các container.
Yêu cầu tối thiểu cho mỗi Node:
- CPU: 2 vCPU trở lên (Intel/AMD với hỗ trợ VT-x/AMD-V).
- RAM: 4GB RAM trở lên (2GB dành cho OS, 2GB cho Kubernetes + eBPF).
- Disk: 40GB SSD (SSD là bắt buộc để giảm latency khi đọc ghi log và container images).
- OS: Ubuntu 22.04 LTS hoặc Rocky Linux 9. Kernel version >= 5.15.
Verify kết quả: Kiểm tra phiên bản kernel và kiến trúc CPU.
uname -r
uname -m
Kết quả mong đợi: Trả về version số lớn hơn 5.15 (ví dụ: 5.15.0-100-generic) và kiến trúc x86_64 hoặc aarch64.
2. Chuẩn bị Kernel và Modules cho eBPF
Mục đích: Đảm bảo kernel module br_netfilter được tải và cấu hình đúng để eBPF có thể intercept lưu lượng mạng qua bridge.
Lý do: Cilium sử dụng eBPF để hook vào layer network. Nếu br_netfilter không được enable hoặc cấu hình sai, traffic giữa các pod sẽ bị drop hoặc không được apply policy.
Thực hiện: Load module và disable các hook của iptables để eBPF (take over).
cat
Kết quả mong đợi: Module br_netfilter được load vào hệ thống.
lsmod | grep br_netfilter
Mục đích: Cấu hình sysctl để tắt NAT cho traffic nội bộ bridge, cho phép eBPF xử lý routing thay vì iptables.
Lý do: Mặc định Linux dùng iptables để NAT traffic qua bridge. Cilium cần tắt điều này để eBPF thực hiện routing hiệu quả hơn.
cat
Kết quả mong đợi: Các thông số trên được apply thành công, giá trị trả về là 1 hoặc 0 tùy dòng.
sysctl net.bridge.bridge-nf-call-iptables
Kết quả mong đợi: net.bridge.bridge-nf-call-iptables = 0
3. Cài đặt Kubernetes Cluster (k3s) và Công cụ quản lý
Mục đích: Triển khai một Kubernetes cluster đơn giản, nhẹ và tương thích cao với Cilium để làm môi trường thử nghiệm.
Lý do: k3s là bản fork của Kubernetes được Rancher tối ưu, tích hợp sẵn container runtime (containerd) và không cần kube-proxy (Cilium sẽ thay thế). Điều này giảm độ phức tạp khi debug eBPF.
Thực hiện: Cài đặt k3s trên node đầu tiên (Master/Worker).
curl -sfL https://get.k3s.io | sh -s - \
--disable-network-policy \
--disable-traefik \
--flannel-backend none
Lý do các flag:
--disable-network-policy: Tắt mặc định của k3s để Cilium quản lý policy.
--disable-traefik: Tắt ingress mặc định để tránh xung đột.
--flannel-backend none: Tắt Flannel vì Cilium sẽ là CNI (Container Network Interface).
Kết quả mong đợi: Cluster chạy, node ready, không có lỗi.
kubectl get nodes
Kết quả mong đợi: Trạng thái Ready của node.
Mục đích: Cấu hình kubectl để truy cập cluster mà không cần 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: Có thể chạy kubectl trực tiếp bằng user hiện tại.
kubectl cluster-info
4. Cài đặt các công cụ CLI cần thiết
Mục đích: Cài đặt cilium (CLI) để quản lý Cilium và bpftrace để debug eBPF raw.
Lý do: Cilium CLI cung cấp các lệnh cilium status, cilium monitor rất quan trọng. bpftrace giúp kiểm tra xem eBPF programs có thực sự chạy trên kernel hay không, độc lập với Cilium.
Thực hiện: Cài đặt Cilium CLI và bpftrace.
# Cài đặt Cilium CLI
curl -L https://raw.githubusercontent.com/cilium/cilium-cli/master/install.sh | bash
# Cài đặt bpftrace (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y bpftrace
Kết quả mong đợi: Các command cilium và bpftrace chạy được.
cilium version
bpftrace --version
5. Cấu hình mạng nội bộ và Verify môi trường eBPF
Mục đích: Kiểm tra toàn diện xem môi trường đã sẵn sàng cho eBPF chưa trước khi cài Cilium.
Lý do: Nếu bỏ qua bước này, việc debug sau khi cài Cilium sẽ rất khó khăn vì không biết lỗi do kernel, network config hay là do Cilium.
Thực hiện: Chạy lệnh check của Cilium CLI.
cilium status
Kết quả mong đợi:
- Trạng thái:
OK hoặc Warning (về việc chưa có Cilium agent chạy, nhưng kernel hỗ trợ tốt).
- Hạng mục
Kernel: OK (phiên bản kernel đủ mới).
- Hạng mục
Features: bpf và map phải là OK.
Mục đích: Verify khả năng compile và run eBPF programs đơn giản bằng bpftrace.
Lý do: Đảm bảo kernel module bpf đã load và quyền hạn (capabilities) của user hiện tại đủ để attach eBPF.
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("openat: %s\n", comm); }'
Hướng dẫn test: Giữ lệnh này chạy, sau đó mở một terminal khác chạy cat /etc/passwd.
Kết quả mong đợi: Terminal chạy bpftrace hiện ra dòng openat: bash hoặc openat: cat.
Mục đích: Kiểm tra network namespace của container runtime.
kubectl run test-pod --image=busybox --rm -it --restart=Never -- sleep 100
Kết quả mong đợi: Bạn vào được trong container, có thể ping hoặc check interface.
ifconfig
ping -c 2 8.8.8.8
Kết quả mong đợi: Có interface eth0 hoặc ens... và ping thành công (hoặc timeout nếu chưa có CNI, nhưng mạng host đã thông).
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Secure Service Mesh với eBPF, Cilium và Policy Engine
Phần 2: Triển khai Cilium và cấu hình nền tảng eBPF cơ bản »