Làm cách nào để hiển thị các dịch vụ TCP, không phải HTTP trong Kubernetes?


8

Tôi đang chạy cụm Kubernetes trong đám mây công cộng (Azure / AWS / Google Cloud) và tôi có một số dịch vụ không phải HTTP mà tôi muốn cung cấp cho người dùng.

Đối với các dịch vụ HTTP, tôi thường sử dụng tài nguyên Ingress để hiển thị công khai dịch vụ đó thông qua mục nhập DNS có địa chỉ.

Đối với các dịch vụ không dựa trên HTTP, dựa trên TCP (ví dụ: cơ sở dữ liệu như PostgreQuery), tôi nên trưng bày những dịch vụ này như thế nào cho tiêu dùng công cộng?

Tôi đã cân nhắc sử dụng NodePortcác dịch vụ, nhưng điều này đòi hỏi bản thân các nút phải được truy cập công khai (dựa vào kube-proxyđịnh tuyến đến nút thích hợp). Tôi muốn tránh điều này nếu có thể.

LoadBalancercác dịch vụ có vẻ như là một tùy chọn khác, mặc dù tôi không muốn tạo một bộ cân bằng tải đám mây chuyên dụng cho mỗi dịch vụ TCP mà tôi muốn trưng ra.

Tôi biết rằng bộ điều khiển NGINX Ingress hỗ trợ hiển thị các dịch vụ TCP và UDP , nhưng dường như điều đó đòi hỏi một định nghĩa tĩnh về các dịch vụ bạn muốn trưng ra. Đối với trường hợp sử dụng của tôi, các dịch vụ này đang được tạo và hủy một cách linh hoạt, do đó không thể xác định các ánh xạ dịch vụ này ở phía trước trong một tĩnh ConfigMap.

Câu trả lời:


1

Có lẽ quy trình công việc này có thể giúp:

(Tôi đưa ra giả định rằng nhà cung cấp đám mây là AWS)

  • Bảng điều khiển AWS: Tạo một VPC tách riêng và tạo các thể hiện Kubernetes ec2 (hoặc nhóm tự động hóa) vô hiệu hóa việc tạo IP công cộng. Điều này khiến cho không thể truy cập thể hiện từ Internet, bạn vẫn có thể truy cập thông qua IP riêng (ví dụ: 172.30.1.10) thông qua VPN Site 2 hoặc thông qua một thể hiện ec2 thứ cấp trong cùng VPC với IP công cộng.

  • Kubernetes: Tạo một dịch vụ với NodePort cố định (ví dụ 35432 cho Postgres).

  • Bảng điều khiển AWS: tạo Trình tải lớp cổ điển o Lớp 4 bên trong cùng một VPC của các nút của bạn, trong Tab Trình nghe mở cổng 35432 (và các cổng khác mà bạn có thể cần) chỉ vào một hoặc tất cả các nút của bạn thông qua "Nhóm mục tiêu". Không có phí trong số lượng cổng.

Tại thời điểm này, tôi không biết cách tự động cập nhật các nút sống hiện tại trong Nhóm mục tiêu của Trình cân bằng tải, đây có thể là một vấn đề với các tính năng Tự động hóa, nếu có ... Có thể là một công việc Cron với kéo tập lệnh bash Thông tin từ API AWS và cập nhật Nhóm mục tiêu?


Cảm ơn - điều này rất hữu ích. Mặc dù rõ ràng đây không phải là một giải pháp chung cho bất kỳ môi trường Kubernetes nào và được liên kết chặt chẽ với nhà cung cấp đám mây mà bạn lựa chọn. Có lẽ một Nhà khai thác có thể phù hợp với một giải pháp che giấu các chi tiết của nhà cung cấp đám mây được lựa chọn?
cjheppell

0

Đối với các dịch vụ không dựa trên HTTP, dựa trên TCP (ví dụ: cơ sở dữ liệu như PostgreQuery), tôi nên trưng bày những dịch vụ này như thế nào cho tiêu dùng công cộng?

Chà, điều đó phụ thuộc vào cách bạn mong đợi người dùng cuối cùng giải quyết các Dịch vụ đó? Như bạn đã chỉ ra, với một Ingress, có thể sử dụng lưu trữ ảo để định tuyến tất cả các yêu cầu đến cùng một bộ điều khiển Ingress, sau đó sử dụng Host:tiêu đề để gửi trong cụm.

Với dịch vụ TCP, chẳng hạn như PostgreSQL, không có tiêu đề như vậy. Vì vậy, bạn nhất thiết phải có một cơ chế dựa trên IP hoặc gán cho mỗi cổng một cổng riêng trên IP đối diện với Internet của bạn

Nếu khách hàng của bạn biết IPv6, việc gán cho mỗi Dịch vụ một địa chỉ IP chuyên dụng là hoàn toàn hợp lý, với không gian IP hoàn toàn lớn mà IPv6 cung cấp. Nhưng nếu không, bạn có hai nút để bật: IP và cổng.

Từ đó, cách bạn chuyển các kết nối đó trong cụm của mình sang đúng Dịch vụ sẽ phụ thuộc vào cách bạn giải quyết vấn đề đầu tiên


Cảm ơn câu trả lời của bạn. Tôi hiểu rằng mỗi dịch vụ đều có cổng độc đáo của riêng mình. Vấn đề của tôi là các loại dịch vụ Kubernetes hiện tại có vẻ không phù hợp với trường hợp sử dụng của tôi. NodePorts yêu cầu mở các cổng trên các nút công khai không lý tưởng theo quan điểm bảo mật. LoadBalancer mỗi dịch vụ đắt tiền. Giả sử tôi có thể định tuyến chính xác đến máy chủ lưu trữ, dịch vụ Kubernetes nào tôi nên sử dụng để làm cho những kết nối công khai đó, đặc biệt khi chúng được đưa lên và xuống một cách linh hoạt?
cjheppell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.