kube-proxy
Để hiểu kube-proxy, cần nắm trước ba thứ: pod network, Service và CoreDNS.
1. Pod network
Cluster lab có 3 máy ảo: 192.168.81.101 (master), .102 (worker1), .103 (worker2). Khi một pod được tạo, có ba câu hỏi:
- Ai cấp IP cho pod?
- Ai nối "dây mạng" từ pod ra máy chủ?
- Pod ở worker1 gửi tới pod
10.244.2.7– làm sao biết IP đó nằm ở máy nào?
👉 Kubernetes KHÔNG tự làm những việc này. Nó chỉ đặt luật: mọi pod phải nói chuyện được với mọi pod, ở bất kỳ node nào, không cần NAT. Việc thực hiện được giao cho plugin mạng.
2. CNI và Calico
- CNI (Container Network Interface) là chuẩn giao tiếp giữa Kubernetes và plugin mạng – như luật xây dựng chung.
- Calico là một plugin theo chuẩn CNI – như một công ty làm đường cụ thể. Các công ty khác: Flannel, Weave, Cilium…
| Việc Calico làm | Ví von | Thực tế |
|---|---|---|
| ① Cấp IP cho pod | Gắn số nhà | kubelet gọi Calico qua CNI. Calico tạo dây mạng ảo (veth) nối pod với máy, cấp IP trong 10.244.0.0/16 |
| ② Ghi đường đi | Dựng biển chỉ đường | Agent calico-node ghi vào bảng route: "tới 10.244.2.x thì gửi qua 192.168.81.103" |
- Không có CNI: node
NotReady, pod kẹtContainerCreating. Saukubeadm initbắt buộc cài CNI. - Pod network do CNI tạo, không phải kube-proxy. Hai thứ này hay bị nhầm.
3. Service
Ví dụ App gọi Database bằng IP pod – nhưng pod chết thì IP đổi, kết nối hỏng. Service giải quyết bằng cách cho một nhóm pod một địa chỉ cố định (tên + IP).
apiVersion: v1
kind: Service
metadata:
name: db # tên để gọi: "db"
spec:
selector:
app: db # chuyển tới các pod có label app=db
ports:
- port: 5432 # cổng của Service
targetPort: 5432 # cổng của container
- apiserver cấp cho Service một ClusterIP cố định từ dải
--service-cluster-ip-range=10.96.0.0/12, ví dụ10.96.0.12. - Service không phải process, chỉ là một bản ghi trong etcd – một khái niệm ảo.
| Thành phần | Việc làm | Nằm ở đâu |
|---|---|---|
| EndpointSlice Controller | Tìm pod app=db đang Ready, ghi danh sách IP | kube-controller-manager |
| CoreDNS | db → 10.96.0.12 | Pod trong kube-system |
| kube-proxy | 10.96.0.12 → một IP pod | Mỗi node |
4. CoreDNS – danh bạ của cluster
- CoreDNS watch Service qua apiserver; có Service mới thì tự thêm bản ghi
db → 10.96.0.12. - kubelet ghi vào
/etc/resolv.confcủa mọi pod:nameserver 10.96.0.10(IP của Servicekube-dns). - Có thể gọi:
db(cùng namespace),db.default(khác namespace),db.default.svc.cluster.local(đầy đủ).
5. kube-proxy
- Là process chạy trên MỖI node.
- Watch Service và EndpointSlice. Có thay đổi → viết lại rule iptables trên node của mình để chuyển traffic từ IP Service sang IP pod thật.
iptables và DNAT
- iptables: tính năng có sẵn trong nhân Linux, như một trạm kiểm soát mọi gói tin đi qua máy: chặn, cho qua, hoặc sửa địa chỉ.
- DNAT (Destination NAT): sửa địa chỉ người nhận trên gói tin.
Bạn gửi thư tới "hộp thư 10.96.0.12". Bưu điện ngay trong tòa nhà bạn (node của pod gửi) có quy tắc: "thư gửi 10.96.0.12 thì dán đè thành căn h ộ 10.244.2.7". Sau đó thư đi đường thường (Calico) tới đúng căn hộ.
Nhiều pod phía sau → iptables chọn ngẫu nhiên một pod cho mỗi kết nối mới (cân bằng tải đơn giản).
Ai chuẩn bị gì từ trước?
| Chuẩn bị | Ai làm | Khi nào |
|---|---|---|
Cấp IP 10.244.2.7 cho pod db, ghi đường giữa các node | Calico | Lúc tạo pod |
Cấp ClusterIP 10.96.0.12 | kube-apiserver | Lúc tạo Service |
| Ghi danh sách pod phía sau Service | EndpointSlice Controller | Khi pod thêm/xóa/đổi Ready |
Thêm db → 10.96.0.12 vào danh bạ | CoreDNS | Khi tạo Service |
| Viết rule DNAT trên mọi node | kube-proxy | Khi Service hoặc danh sách pod đổi |
6. Lưu ý
- kube-proxy không "proxy" gói tin (tên dễ gây hiểu lầm). Nó chỉ viết biển chỉ đường; gói tin đi qua thì chính nhân Linux xử lý.
- kube-proxy chết → Service cũ vẫn chạy với rule cũ; chỉ thay đổi mới không được cập nhật.
Các chế độ (mode)
| Mode | Cách làm | Ghi chú |
|---|---|---|
| iptables | Rule iptables | Mặc định |
| ipvs | IPVS trong nhân Linux | Nhanh hơn khi có hàng nghìn Service |
| nftables | nftables | Mới hơn, thay dần iptables |
7. Cài đặt
Với kubeadm, kube-proxy và calico-node chạy dưới dạng DaemonSet:
kubectl get daemonset -n kube-system
- DaemonSet đảm bảo mỗi node chạy đúng một bản pod. Thêm node mới → pod tự được tạo; xóa node → pod mất theo.
- Rất hợp với thứ node nào cũng cần, như kube-proxy và calico-node.