9 điểm bởi lemonmint 2025-04-10 | 1 bình luận | Chia sẻ qua WhatsApp
  • Giới thiệu một trường hợp PR mà một chỉnh sửa mã quy mô nhỏ (chỉ thêm đúng một câu lệnh if) đã đóng góp lớn cho độ ổn định của hệ thống
  • Tác động và tầm quan trọng của PR bpf:nat: Restore ORG NAT entry if it's not found

Nguyên lý cơ bản của NAT (Network Address Translation)

  • NAT là công nghệ cho phép nhiều thiết bị cùng chia sẻ một IP công cộng
  • Cho phép giao tiếp giữa thiết bị nội bộ (Private IP:Port) và Internet bên ngoài
  • Bảng NAT lưu thông tin ánh xạ giữa địa chỉ gốc và địa chỉ đã được chuyển đổi
  • Quy trình:
    1. Thiết bị nội bộ thử kết nối tới máy chủ bên ngoài
    2. Thiết bị NAT chuyển đổi IP/cổng nguồn thành IP/cổng công cộng (SNAT)
    3. Phản hồi từ máy chủ bên ngoài lại được chuyển đổi về thiết bị nội bộ (DNAT)

Ứng dụng của NAT trong Kubernetes

  • Hai trường hợp chính mà NAT được sử dụng quan trọng trong Kubernetes:
    1. Giao tiếp từ Pod ra ngoài cluster: chuyển IP nội bộ của Pod thành IP công cộng của node
    2. Giao tiếp từ bên ngoài vào Pod thông qua NodePort: định tuyến yêu cầu bên ngoài tới một Pod cụ thể

Cách Cilium triển khai NAT

  • Thông thường trên Linux, NAT được xử lý bằng conntrack và iptables
  • Cilium sử dụng công nghệ eBPF để vượt qua network stack Linux truyền thống
  • Cilium trực tiếp quản lý bảng NAT bằng LRU hash map (BPF_MAP_TYPE_LRU_HASH)

Nguyên nhân phát sinh vấn đề

  • Vấn đề tra cứu: để xử lý packet hai chiều (ra/vào), cùng một dữ liệu được lưu hai lần (RevSNAT)
  • Giới hạn của LRU: do tài nguyên có hạn, các mục ít được sử dụng có thể bị loại bỏ
  • **Mất kết nối # Trường hợp Cilium đạt được cải thiện lớn về độ ổn định mạng chỉ với một chỉnh sửa mã nhỏ

Giới thiệu: tác động lớn của một thay đổi mã nhỏ

  • Một trường hợp mà chỉ cần thêm đúng một khối if đã đóng góp cực lớn cho độ ổn định của hệ thống
  • PR liên quan: bpf:nat: Restore ORG NAT entry if it's not found
  • Giải thích để cả người không chuyên về mạng cũng có thể hiểu

Nguyên lý cơ bản của NAT (Network Address Translation)

  • NAT là công nghệ cho phép nhiều thiết bị dùng chung một IP công cộng
  • Nó hoạt động bằng cách ánh xạ tổ hợp Private IP:Port nội bộ sang Public IP:Port bên ngoài
  • Quy trình hoạt động:
    • Thiết bị nội bộ thử truy cập máy chủ bên ngoài
    • Thiết bị NAT chuyển đổi lưu lượng nội bộ thành lưu lượng bên ngoài (SNAT)
    • Khi phản hồi quay lại, nó lại được chuyển đổi về giao tiếp nội bộ ban đầu (DNAT)
    • Thông tin chuyển đổi được ghi vào bảng NAT

Ứng dụng NAT trong Kubernetes

  • Kubernetes có cấu trúc mạng phức tạp và NAT được dùng ở nhiều nơi
  • Các trường hợp sử dụng NAT chính:
    1. Giao tiếp từ Pod ra ngoài cluster: chuyển private IP của Pod thành public IP của node (SNAT)
    2. Giao tiếp từ bên ngoài vào Pod qua NodePort: đồng thời thực hiện DNAT và SNAT để chuyển lưu lượng ngoài tới Pod phù hợp

Cách tiếp cận đặc biệt của Cilium

  • Trong các hệ thống Linux thông thường, NAT được quản lý bằng subsystem conntrack và iptables
  • Cilium dùng công nghệ eBPF để bỏ qua network stack Linux truyền thống
  • Để xử lý SNAT, Cilium trực tiếp quản lý bảng SNAT dưới dạng LRU hash map (BPF_MAP_TYPE_LRU_HASH)

Nguyên nhân và triệu chứng của vấn đề

  • Vấn đề tra cứu (Lookup):

    • Cần tra cứu hash table để xác minh xử lý NAT
    • Để tra cứu nhanh, cùng một dữ liệu được chèn hai lần vào bảng dưới dạng RevSNAT bằng cách đảo giá trị srcdst
  • Vấn đề LRU (Least Recently Used):

    • Do giới hạn tài nguyên, dữ liệu có thể bị logic LRU loại bỏ
  • Các vấn đề kết hợp:

    • Với một kết nối TCP, cùng một dữ liệu bị ghi hai lần
    • Chỉ cần một trong hai dữ liệu bị LRU loại bỏ thì toàn bộ kết nối có thể bị ngắt

Giải pháp đơn giản nhưng hiệu quả

  • Ý tưởng cốt lõi: khi quan sát packet theo một hướng thì đồng thời cập nhật luôn mục của hướng ngược lại
  • Với cách tiếp cận đơn giản này:
    • Cả hai mục hai chiều đều được cập nhật, nên ít bị ưu tiên loại bỏ bởi LRU hơn
    • Giảm khả năng xảy ra kịch bản chỉ một mục bị xóa khiến toàn bộ giao tiếp bị đứt
    • Các bài benchmark cho thấy độ ổn định mạng được cải thiện rõ rệt

Kết luận và bài học

  • Đây là ví dụ cho thấy ngay cả trong hệ thống phức tạp, một ý tưởng đơn giản cũng có thể tạo ra thay đổi lớn
  • Giải quyết vấn đề dựa trên kiến thức CS nền tảng (cách NAT hoạt động)
  • Một cách khác để tránh vấn đề: tăng kích thước bảng NAT
  • Bày tỏ sự kính trọng với niềm đam mê của nhà phát triển đã phân tích kỹ vấn đề và đóng góp bằng dữ liệu bằng chứng khách quan

Giá trị của cách tiếp cận kỹ thuật

  • Tầm quan trọng của việc hiểu và xử lý nguyên nhân gốc rễ của vấn đề
  • Bài học rằng một chỉnh sửa mã đơn giản có thể cải thiện mạnh độ ổn định của toàn hệ thống
  • Tầm quan trọng của việc hiểu các nguyên lý cơ bản ngay cả trong những hệ thống phức tạp

1 bình luận

 
ethanhur 2025-04-14

Cảm ơn bạn đã chia sẻ một trải nghiệm thật tuyệt vời!