Tôi hiện đang chạy Kubernetes với Calico v3.20.2 làm CNI. Tôi có một trường hợp rất đặc biệt khi tôi cần gửi lưu lượng truy cập UDP từ một DaemonSet Pod cụ thể đến một máy chủ bên ngoài. Máy chủ này sẽ đọc tổ hợp sourceIP:sourcePort của các tiêu đề IP và gửi phản hồi bằng cách đặt hai trường đó làm trường destIP:destPort. Vì các phiên UDP khác nhau sẽ chọn ngẫu nhiên các cổng nguồn ngẫu nhiên khác nhau (phạm vi 1024-65535) và phản hồi là được cân bằng tải thông qua MetalLB, tôi sẽ cần thiết lập trình nghe UDP trên mỗi nhóm của DaemonSet, lắng nghe mọi yêu cầu gửi đi cổng nguồn, cũng như cấu hình lại LB để nó lắng nghe trên cổng đó và phân phối lưu lượng.Điều này rõ ràng là không thể thay đổi quy mô và cũng không hiệu quả do độ trễ của các cấu hình như vậy mất nhiều thời gian hơn so với phản hồi cần được trả về, cũng như khả năng không khớp của các cấu hình lại LB song song.
Do đó, tôi muốn mở một trình nghe duy nhất cho mỗi Pod trên một cổng cụ thể (ví dụ: 20000) và SNAT tất cả lưu lượng truy cập đi từ mọi Pod để cổng nguồn sau khi mỗi gói dữ liệu UDP rời khỏi nút là 20000. Máy chủ bên ngoài sẽ gửi phản hồi đến Cổng đích này và phản hồi cuối cùng sẽ đến được một trong những người nghe UDP trên một trong các DaemonSet Pods. Tôi đã thử điều này bằng cách thực hiện
sudo iptables -t nat -I POSTROUTING 1 -d <EXT-SERVER-IP>/32 -p udp --dport <EXT-SERVER-PORT> -j SNAT --to-source <WORKER-NODE-IP>:20000
Khi tôi cố gắng triển khai điều này trong IPtables, Calico luôn viết lại những thay đổi tôi thực hiện và thực thi cấu hình của chính nó, dẫn đến các cổng nguồn ngẫu nhiên lại rời khỏi nút. Mặt khác, khi tôi đặt cờ natOutgoing thành false và cố gắng thiết lập các quy tắc của riêng mình, chỉ một gói dữ liệu UDP duy nhất rời khỏi nút có thay đổi SNAT chính xác trước khi tất cả các gói dữ liệu khác bị chặn và không bao giờ rời khỏi nút worker tại tất cả (bằng chứng là máy chủ bên ngoài cũng như tcpdump trên nút worker)
Khắc phục một trong hai trường hợp này sẽ giải quyết được vấn đề tổng thể và mọi đề xuất đều được đánh giá cao!