如何为Google容器引擎(GKE)服务设置静态IP地址?

Zac*_*ock 7 google-cloud-platform kubernetes google-kubernetes-engine

一点背景:我有一个使用gRPC与客户端应用程序通信的Go服务.gRPC使用HTTP2,因此我无法使用Google App Engine或Google Cloud HTTP负载均衡器.我需要从互联网到我的Go应用程序的原始TCP负载平衡.

我浏览了GKE教程并阅读了各种文档,但我找不到任何方法来为我的应用程序提供静态IP地址.那么如何在GKE中运行的东西上附加静态IP?

Tim*_*kin 5

kubernetes v1.0.x不支持此功能,但在v1.1.x中它将以service.spec.loadBalancerIP.只要您真正拥有该IP,我们就会使用它.

  • 该死的,它现在正在运作.我总是将类型设置为"全局",但显然它需要是"区域"?这是为什么? (4认同)

Zac*_*ock 4

我最终明白了这一点。为此,您要求 GKE 为您设置一个外部负载均衡器,然后您有选择地替换堆栈的各个部分。好消息是,在此过程中您还可以设置 HTTP 运行状况检查,而 GKE 默认情况下不会执行此操作。

确保您拥有 Google Cloud Platform 提供的静态 IP。您可以在控制台中请求。

使用以下命令启动并运行您的服务:

kubectl expose rc api-server --name=api-server --port=8080,8081 --create-external-load-balancer=true
Run Code Online (Sandbox Code Playgroud)

(我使用端口 8080 进行 HTTP 运行状况检查,使用 8081 来服务 gRPC 请求)。

--create-external-load-balancer=true使用入口规则更新 Kubernetes 服务、设置目标池、设置网络负载均衡器并添加防火墙规则。我们必须修复#1 和#3。

弄清楚一切都已经在哪里运行。

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)
Run Code Online (Sandbox Code Playgroud)

将健康检查附加到目标池

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
Run Code Online (Sandbox Code Playgroud)

创建一个新的转发规则来替换 GKE 生成的规则

gcloud compute forwarding-rules create api-server \
--region us-central1 --port-range 8080-8081 \
--address ${EXTERNAL_IP} --target-pool ${TARGET_POOL_NAME}
Run Code Online (Sandbox Code Playgroud)

删除原GKE转发规则

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

更新 Kubernetes 服务以允许从新 IP 进入:

kubectl patch services api-server -p "{\"status\":{\"loadBalancer\":{\"ingress\": [{\"ip\": \"${EXTERNAL_IP}\"} ]}}}"
Run Code Online (Sandbox Code Playgroud)

应该这样做!

复制粘贴时要小心,我的头和尾对我有用,因为我只运行一个应用程序,但您可能会以不同的顺序看到事物。