Đây là phần tiếp theo của một câu hỏi trước đây tôi đã hỏi, nhưng với cách hỏi/tiếp cận khác. Trong trường hợp có vấn đề, tôi đang sử dụng GKE, nhưng tôi hy vọng sẽ có câu trả lời về đám mây.
Tôi đang cố chạy vùng chứa factoriotools/factorio
, nhưng ứng dụng có một số yêu cầu cụ thể do sử dụng chức năng liệt kê máy chủ công cộng dành riêng cho ứng dụng, như đã thấy trong nhiều trò chơi điện tử sử dụng máy chủ do người dùng lưu trữ.
Cho đến nay, tôi đã có thể khiến mọi thứ hoạt động với mạng máy chủ và kết nối trực tiếp để hoạt động với Dịch vụ NodePort.Tuy nhiên, chức năng liệt kê máy chủ công cộng của ứng dụng vẫn là một vấn đề đối với các vùng chứa không có đặc quyền.
Đây là cách Factorio tìm ra cách quản lý danh sách máy chủ công cộng:
- Vùng chứa lắng nghe trên một ổ cắm, giả sử Cổng UDP 34197.
- Dịch vụ NodePort định tuyến công khai lưu lượng đến 20635.
- Vùng chứa gửi lệnh ping qua cổng lắng nghe của nó (34197) tới máy chủ bóng bàn và máy chủ bóng bàn trả lời bằng địa chỉ IP và cổng mà nó nhận được lệnh ping từ đó. Ngoài k8s, đây vẫn là cổng 34197.
- Sau đó, vùng chứa sẽ sử dụng thông tin này để đăng ký với danh sách máy chủ. Địa chỉ IP, cổng, tên máy chủ và một số thông tin khác.
- Trong GKE, quả bóng bàn được định tuyến đến một cổng không sử dụng tùy ý (ví dụ: 40792).
- Bộ chứa tin rằng nó đang lắng nghe trên một cổng khác với cổng tôi đã thiết lập (20534), sau đó đăng ký với danh sách máy chủ công cộng bằng cổng sai (40792, vì máy chủ bóng bàn đã thông báo như vậy).
- Mọi nỗ lực kết nối từ danh sách máy chủ công cộng đều thất bại; máy khách tin rằng máy chủ đang lắng nghe trên cổng mà máy chủ bóng bàn chứng kiến (40792), nhưng vùng chứa đã tương tác với cổng nghe của nó (34197) trong suốt thời gian qua.
(Tôi được biết quá trình này là một biến thể của cách thức hoạt động của ICE/STUN)
Vì vậy, điều đó có nghĩa là nếu vùng chứa lắng nghe trên 34197, nhưng Kubernetes định tuyến đến 20635 bên ngoài, thì cả lưu lượng truy cập vào và ra cần phải đi qua 20635 ở phía công khai để chức năng liệt kê máy chủ tích hợp của ứng dụng hoạt động.
Nếu tôi bỏ qua danh sách máy chủ công cộng và kết nối trực tiếp với địa chỉ IP công khai của nút vùng chứa bằng cổng 20635, thì nó sẽ hoạt động hoàn hảo. Nhưng đó là một sự thỏa hiệp khá lớn đối với những gì tôi đang làm.
Mạng máy chủ bỏ qua toàn bộ vấn đề này bằng cách cho phép vùng chứa mở trực tiếp bất kỳ cổng nào nó muốn trên máy chủ.Đối với các máy chủ đã được hiển thị công khai, điều này có nghĩa là không có gì trên máy chủ (đặc biệt là k8) có thể định tuyến lại lưu lượng vùng chứa qua các lớp bổ sung và thay đổi số cổng. Vì vậy, khi bộ chứa mở cổng 34197, nó sẽ nhận được cổng 34197. Khi nó gửi trên cổng 34197, lưu lượng đó được gửi trên cổng 34197. Máy chủ bóng bàn sẽ thấy cổng mà nó phải thấy. Và bởi vì đó là một cổng UDP công khai, nên việc ai gửi lưu lượng trước không quan trọng; traffic là traffic, port là port.
Tuy nhiên, nếu tôi hiểu chính xác các tài liệu, thì việc chạy một vùng chứa trên ngăn xếp mạng của Máy chủ lưu trữ yêu cầu một vùng chứa đặc quyền, đây là quyền truy cập root hiệu quả trên Máy chủ, điều này rất tệ trong sản xuất. Vì vậy, đối với các vùng chứa không có đặc quyền, cần có một giải pháp khác ngoài việc dựa vào mạng máy chủ. Tôi không thể tìm thấy "giải pháp khác" đó.
Tôi không thể tìm thấy tài liệu ở bất cứ đâu về cách thực hiện việc này hoặc thậm chí bằng chứng cho thấy bất kỳ ai đang nghĩ về nó. Làm thế nào để tôi thực hiện công việc này?