5

Một chút nền: Tôi có dịch vụ Go sử dụng gRPC để giao tiếp với ứng dụng của khách hàng. gRPC sử dụng HTTP2, vì vậy tôi không thể sử dụng Google App Engine hoặc Google Cloud HTTP Load Balancer. Tôi cần cân bằng tải TCP nguyên từ internet đến ứng dụng Go của tôi.Làm cách nào để bạn đặt địa chỉ IP tĩnh cho dịch vụ Google Container Engine (GKE)?

Tôi đã đi qua các hướng dẫn GKE và đọc các tài liệu khác nhau và tôi không thể tìm thấy bất kỳ cách nào để cung cấp cho ứng dụng của tôi một địa chỉ IP tĩnh. Vậy làm thế nào để bạn có được một IP tĩnh gắn liền với một cái gì đó đang chạy trong GKE?

Trả lời

3

Cuối cùng tôi đã tìm ra điều này. Để làm điều này, bạn yêu cầu GKE thiết lập bộ cân bằng tải bên ngoài cho bạn, sau đó bạn thay thế một cách có chọn lọc các phần của chồng. Tin tốt là trên đường đi, bạn cũng có thể thiết lập kiểm tra sức khỏe HTTP, mà GKE không thực hiện theo mặc định.

Đảm bảo bạn có IP tĩnh có sẵn từ Google Cloud Platform. Bạn có thể yêu cầu trong Bảng điều khiển.

Nhận dịch vụ của bạn và chạy với một cái gì đó như:

kubectl expose rc api-server --name=api-server --port=8080,8081 --create-external-load-balancer=true 

(Tôi đang sử dụng cổng 8080 để kiểm tra sức khỏe HTTP và 8081 để phục vụ yêu cầu gRPC).

--create-external-load-balancer=true cập nhật dịch vụ Kubernetes với quy tắc nhập, thiết lập nhóm đích, thiết lập cân bằng tải mạng và thêm quy tắc tường lửa. Chúng ta sẽ phải sửa # 1 và # 3.

Tìm ra nơi mọi thứ đang chạy.

export TARGET_POOL_NAME=$(gcloud compute target-pools list | head -n 2 | tail -n 1 | cut -d " " -f 1) 

export EXTERNAL_IP=$(gcloud compute addresses list | head -n 2 | tail -n 1 | cut -d " " -f 3) 

Gắn kiểm tra sức khỏe đến hồ bơi tiêu

gcloud compute http-health-checks create api-server-http-basic-check --port 8080 --request-path "/_health" 

gcloud compute target-pools add-health-checks ${TARGET_POOL_NAME} --http-health-check api-server-http-basic-check 

Tạo một quy tắc chuyển tiếp mới để thay thế một tạo ra bởi GKE

gcloud compute forwarding-rules create api-server \ 
--region us-central1 --port-range 8080-8081 \ 
--address ${EXTERNAL_IP} --target-pool ${TARGET_POOL_NAME} 

Xóa quy tắc chuyển tiếp GKE gốc

gcloud compute forwarding-rules delete $(gcloud compute forwarding-rules list | head -n 2 | tail -n 1 | cut -d " " -f 1) 

Cập nhật Dịch vụ Kubernetes để cho phép xâm nhập từ IP mới:

kubectl patch services api-server -p "{\"status\":{\"loadBalancer\":{\"ingress\": [{\"ip\": \"${EXTERNAL_IP}\"} ]}}}" 

Điều đó nên làm điều đó!

Hãy cẩn thận với việc dán sao chép, đầu và đuôi của tôi hoạt động vì tôi chỉ có một ứng dụng đang chạy, nhưng bạn có thể thấy mọi thứ theo một thứ tự khác.

+0

Zach - Tôi rất vui khi bạn có thể tìm ra điều này. Khi bạn tạo một dịch vụ trong GKE, bạn sẽ có thể yêu cầu nó được gán cho một địa chỉ IP cụ thể. Vì vậy, nếu bạn tạo một IP tĩnh, bạn sẽ có thể có được gán cho dịch vụ của bạn. –

+0

Cảm ơn bạn đã phản hồi @RobertBailey! Tôi thấy rằng như một cờ dòng lệnh để kubctl phơi bày. Tôi đặt ip công khai trong * _controller.json của mình ở đâu nếu tôi đang sử dụng 'kubectl create'? Tôi nghĩ rằng tôi vẫn cần tiếp cận để đính kèm kiểm tra sức khỏe http, vì vậy hãy khám phá cách thức thiết lập đã kết thúc thực sự mang tính thông tin. –

+0

Tôi nghĩ rằng việc không dùng nữaPublicIPs là trường bạn muốn (https://github.com/kubernetes/kubernetes/blob/master/pkg/api/v1/types.go#L1534-L1539) nhưng có thể là trường externalIPs mới ở trên nó. Và điều này nằm trong tệp * _service.json của bạn chứ không phải cấu hình bộ điều khiển nhân bản. –

4

Điều này không được hỗ trợ trong kubernetes v1.0.x nhưng trong v1.1.x nó sẽ có sẵn dưới dạng service.spec.loadBalancerIP. Miễn là bạn thực sự sở hữu IP đó, chúng tôi sẽ sử dụng nó.

+0

Tôi đang cố sử dụng 'loadBalancerIP' trên dịch vụ GKE (v1.1.1) của mình. Đã tạo một địa chỉ IP tĩnh trong bảng điều khiển đám mây và thêm nó vào định nghĩa dịch vụ. Tuy nhiên, dịch vụ nhận được một địa chỉ IP khác và IP tĩnh vẫn chưa được gán - tôi có làm gì sai không? –

+1

đăng YAML hoặc JSON của bạn, vui lòng? Ngoài ra, hãy chạy 'kubectl get service -o yaml' để chúng ta có thể thấy máy chủ nghĩ gì. –

+0

Dự đoán hoang dã: Tôi nghi ngờ bạn có một dòng lệnh kubectl cũ hơn (tôi nghĩ rằng phiên bản gói gcloud đang đợi một lần đẩy gcloud mới) –

Các vấn đề liên quan