Điểm:0

Kubernetes quản lý nhiều máy chủ UDP riêng biệt trên GKE

lá cờ au

Tôi đang cố gắng thiết lập một hệ thống có thể tự động quay lên và xuống các máy chủ trò chơi điện tử dưới dạng hình ảnh docker. Trong trường hợp này, factoriotools/factorio-docker. Mỗi trò chơi là một triển khai nhóm đơn khác biệt, riêng biệt của vùng chứa đó và do đó (trong trường hợp đơn giản hóa) cần có địa chỉ IP riêng để có thể nghe trên một cổng UDP cụ thể. Bộ cân bằng tải là dư thừa và không liên quan, đồng thời Cloud NAT dường như không cho phép lưu lượng truy cập vào một cách dễ dàng.

Có một số cách tôi biết để làm cho nó hoạt động, cả hai đều có những thỏa hiệp khá lớn:

  • Tôi có thể sử dụng dịch vụ NodePort và mất quyền kiểm soát cổng nào mà máy khách cần kết nối. Đó là một vấn đề vì máy chủ tự đăng ký với danh sách máy chủ.
  • Tôi có thể sử dụng mạng máy chủ. Nếu thông tin của tôi là chính xác, điều đó yêu cầu các vùng chứa đặc quyền, điều này Chắc chắn là Không tốt.
  • Tôi có thể sử dụng bộ cân bằng tải UDP, nhưng ngay cả khi nó tồn tại và hoạt động, thì nó vẫn rất đắt.

Có thể có nhiều cách để khắc phục những hạn chế của một trong hai cách tiếp cận (đối với cách thứ hai, hãy giữ cho máy chủ tồn tại trong thời gian ngắn và giữ tường lửa nghiêm ngặt, và nó hầu như sẽ ổn chứ?), nhưng tôi không thể không nghĩ rằng có một lựa chọn tốt hơn mà tôi không thể tìm thấy được mô tả trong tài liệu kubernetes chính thức. Traefik có mẹo nào mà tôi không biết không? Có cách nào để có được một biến thể của MetalLB có thể phân bổ động các địa chỉ IP công cộng khi tôi cần không?

Làm cách nào để mỗi bộ chứa máy chủ lắng nghe trên một địa chỉ IP công cộng khác với một cổng UDP cụ thể mà không làm cho quá trình bảo mật trở nên bất khả thi?

Chỉnh sửa:

  • Cổng có thể được định cấu hình, miễn là tôi biết máy chủ cần chạy trên cổng nào trước khi nhóm khởi động.
  • Trừ khi tôi hiểu sai tài liệu máy chủ, máy khách cần có khả năng kết nối với cùng một cổng mà máy chủ đang lắng nghe. Sự khác biệt mà k8 rút ra giữa cổng nghe ứng dụng và cổng kết nối máy khách là không hữu ích trong trường hợp của tôi.
  • địa chỉ câu hỏi này , Tôi không muốn có bộ cân bằng tải vì nó thực sự không có tác dụng gì đối với tôi. Thay đổi địa chỉ IP không thành vấn đề, hệ thống được thiết kế để xử lý việc đó. Nếu máy chủ ngừng hoạt động trong 15 giây, mọi người sẽ phải kết nối lại và sau đó họ sẽ tìm thấy địa chỉ IP mới. Máy chủ không thể xử lý nhiều nhóm trên cùng một trò chơi, vì vậy sẽ không bao giờ có nhiều hơn một bản sao.
  • Tôi vừa thử một Nút Cổng dịch vụ có cổng công khai ngẫu nhiên (chưa thấy rằng tôi có thể chọn cổng bên ngoài) và tôi có kết nối trực tiếp để hoạt động chứ không phải kết nối danh sách máy chủ.Trước tiên, quy trình liệt kê máy chủ sẽ tự động phát hiện cách kết nối với máy chủ bằng cách yêu cầu máy chủ gửi lưu lượng truy cập UDP ra bên ngoài đến một điểm cuối nhất định. Vì vậy, tôi không chỉ cần kiểm soát cổng mà lưu lượng truy cập vào kết nối với, mà tôi còn cần kiểm soát cách định tuyến lưu lượng truy cập ra, bao gồm bất kỳ NAT nào có thể được sử dụng.
Dawid Kruk avatar
lá cờ cn
Tôi cho rằng cách được đề xuất để thực hiện việc này là tạo `Triển khai` với `Dịch vụ` thuộc loại `LoadBalancer` cho mỗi trò chơi. Điều này sẽ phát sinh chi phí tương ứng với: https://cloud.google.com/vpc/network-pricing.Thêm vào đó, tôi không chắc rằng Traefik có khả năng "định tuyến" các gói UDP: [nguồn](https://doc.traefik.io/traefik/routing/routers/#conforming-udp-routers). Trong thiết lập này, bạn có 2 cổng cần được định cấu hình (`port` (máy khách kết nối với nó) và `targetPort` (ứng dụng lắng nghe)). `Cổng` có thể được thay đổi hay phải giống nhau trong mỗi trò chơi không?
xenrelay avatar
lá cờ au
Những chỉnh sửa đó có giúp được gì không?
Dawid Kruk avatar
lá cờ cn
vâng những người trong thực tế giúp đỡ. Tôi không có nhiều kiến ​​thức về `Factorio` nhưng tôi cho rằng bạn có thể đặt `Triển khai` cho mỗi trò chơi sẽ được sao lưu bằng `Dịch vụ` thuộc loại `nodePort` [với một cổng nodePort cụ thể](https:/ /stackoverflow.com/a/60116792/12257134). Thừa nhận các điểm khác của bạn (bỏ qua `Dịch vụ` của loại `LoadBalancer`), tôi không thể nói giải pháp nào khác sẽ hoạt động trong trường hợp đó. Vui lòng cho biết nếu điều đó sẽ phù hợp với bạn hoặc bạn có những mối quan tâm khác.
xenrelay avatar
lá cờ au
Tôi sẽ phải kiểm tra xem liệu NodePort có hoạt động theo cách mà liên kết mô tả hay không, nhưng nếu có, điều đó sẽ giúp ích rất nhiều. Tuy nhiên, tình huống với lưu lượng truy cập ra được định tuyến lại đến một cổng khác và tác động đến danh sách máy chủ có lẽ xứng đáng là một câu hỏi mới.
Điểm:1
lá cờ cn

Đăng câu trả lời wiki cộng đồng này để đặt thêm cách tiếp cận cơ bản cho câu hỏi này hơn là đưa ra giải pháp dứt khoát.

Vui lòng chỉnh sửa và mở rộng.


Bạn có thể hiển thị các ứng dụng của mình với Dịch vụ. Có một số tùy chọn trong đó mỗi tùy chọn khác nhau theo một số cách khác:

  • Cụm IP: Hiển thị Dịch vụ trên IP nội bộ của cụm. Việc chọn giá trị này làm cho Dịch vụ chỉ có thể truy cập được từ bên trong cụm. Đây là mặc định Loại dịch vụ.
  • Nút Cổng: Hiển thị Dịch vụ trên IP của mỗi Nút tại một cổng tĩnh (cổng Nút Cổng). Một Cụm IP Dịch vụ mà các Nút Cổng Các tuyến dịch vụ, được tạo tự động. Bạn sẽ có thể liên hệ với Nút Cổng Dịch vụ, từ bên ngoài cụm, bằng cách yêu cầu <NodeIP>:<NodePort>.
  • Cân bằng tải: Hiển thị Dịch vụ ra bên ngoài bằng bộ cân bằng tải của nhà cung cấp dịch vụ đám mây. Nút CổngCụm IP Các dịch vụ mà bộ cân bằng tải bên ngoài định tuyến đến sẽ được tạo tự động.
  • Tên bên ngoài: Ánh xạ Dịch vụ tới nội dung của tên bên ngoài trường (ví dụ: foo.bar.example.com), bằng cách trả lại một CNAME ghi lại với giá trị của nó. Không có ủy quyền của bất kỳ loại nào được thiết lập.

-- Kubernetes.io: Tài liệu: Khái niệm: Mạng dịch vụ: Dịch vụ: Dịch vụ xuất bản các loại dịch vụ

Tài liệu dành riêng cho việc hiển thị ứng dụng trên Công cụ Kubernetes của Google có thể được tìm thấy ở đây:


Tập trung cụ thể vào một số điểm có trong câu hỏi:


Tôi có thể sử dụng dịch vụ NodePort và mất quyền kiểm soát cổng nào mà máy khách cần kết nối. Đó là một vấn đề vì máy chủ tự đăng ký với danh sách máy chủ.

Bạn có thể chỉ định Nút Cổng cổng trong Dịch vụ YAML (như nútPort: 32137 hoặc nútPort: 30911).

Bạn có thể định cấu hình ứng dụng của mình để nghe trên cùng một cổng với nútPort:

  • Ứng dụng đang lắng nghe trên cổng 30000
  • Dịch vụ đang sử dụng một nútPort với Hải cảng:30000 (máy khách/người dùng nên kết nối với cổng này) và targetPort:30000. Trong trường hợp đó sẽ không có thay đổi cổng.

Một lưu ý phụ!

Theo mặc định các nútPort phạm vi cổng bị chặn bởi GCP Bức tường lửa. Bạn sẽ cần tạo một quy tắc (hoặc bộ quy tắc) cho phép điều đó.


Tôi có thể sử dụng mạng máy chủ. Nếu thông tin của tôi là chính xác, điều đó yêu cầu các vùng chứa đặc quyền, điều này Chắc chắn là Không tốt.

Tôi sẽ khuyên bạn không nên sử dụng vùng chứa đặc quyền trừ khi có lý do chính đáng đằng sau nó. Trích dẫn các tài liệu chính thức:

Chính sách Đặc quyền được mở có chủ đích và hoàn toàn không bị hạn chế. Loại chính sách này thường nhằm vào khối lượng công việc ở cấp hệ thống và cơ sở hạ tầng được quản lý bởi người dùng có đặc quyền, đáng tin cậy.

-- Kubernetes.io: Tài liệu: Khái niệm: Bảo mật: Tiêu chuẩn bảo mật Pod: Đặc quyền


Cổng có thể được định cấu hình, miễn là tôi biết máy chủ cần chạy trên cổng nào trước khi nhóm khởi động.

Vì bạn sẽ có vô số đơn vỏ quả (mỗi cái có một cái riêng triển khai) bạn có thể tham số hóa từng cái. Ý tôi là bạn có thể tạo một mẫu và chỉ sửa đổi các phần trong bảng kê khai của mình (như cổng, biến env, v.v.).

Bạn có thể chuyển biến môi trường cho vỏ để nó có thể được sử dụng như một tham số trong các lệnh của bạn. Bạn cũng có thể sửa đổi lệnh mà vỏ đang bắt đầu với

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.