Chuyển tới nội dung chính

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:

  1. Ai cấp IP cho pod?
  2. Ai nối "dây mạng" từ pod ra máy chủ?
  3. 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àmVí vonThực tế
① Cấp IP cho podGắ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 điDựng biển chỉ đườngAgent calico-node ghi vào bảng route: "tới 10.244.2.x thì gửi qua 192.168.81.103"
cảnh báo
  • Không có CNI: node NotReady, pod kẹt ContainerCreating. Sau kubeadm init bắ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ầnViệc làmNằm ở đâu
EndpointSlice ControllerTìm pod app=db đang Ready, ghi danh sách IPkube-controller-manager
CoreDNSdb → 10.96.0.12Pod trong kube-system
kube-proxy10.96.0.12 → một IP podMỗ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.conf của mọi pod: nameserver 10.96.0.10 (IP của Service kube-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.
💡 Ví von

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àmKhi nào
Cấp IP 10.244.2.7 cho pod db, ghi đường giữa các nodeCalicoLúc tạo pod
Cấp ClusterIP 10.96.0.12kube-apiserverLúc tạo Service
Ghi danh sách pod phía sau ServiceEndpointSlice ControllerKhi pod thêm/xóa/đổi Ready
Thêm db → 10.96.0.12 vào danh bạCoreDNSKhi tạo Service
Viết rule DNAT trên mọi nodekube-proxyKhi 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)​

ModeCách làmGhi chú
iptablesRule iptablesMặc định
ipvsIPVS trong nhân LinuxNhanh hơn khi có hàng nghìn Service
nftablesnftablesMớ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.