一点背景:我有一个使用gRPC与客户端应用程序通信的Go服务。 gRPC使用HTTP2,因此我无法使用Google App Engine或Google Cloud HTTP负载均衡器。我需要从互联网到Go应用程序的原始TCP负载平衡。
我浏览了GKE教程并阅读了各种文档,我找不到任何方法为我的应用程序提供静态IP地址。那么如何在GKE中运行的东西上附加静态IP?
答案 0 :(得分:5)
kubernetes v1.0.x不支持此功能,但在v1.1.x中,它将以service.spec.loadBalancerIP
的形式提供。只要您真正拥有该IP,我们就会使用它。
答案 1 :(得分:4)
我最终想出来了。为此,您要求GKE为您设置外部负载平衡器,然后您有选择地替换堆栈的各个部分。好消息是,在此过程中您还可以设置HTTP运行状况检查,GKE默认情况下不会这样做。
确保您拥有Google Cloud Platform提供的静态IP。您可以在控制台中请求。
使用以下内容启动并运行您的服务:
kubectl expose rc api-server --name=api-server --port=8080,8081 --create-external-load-balancer=true
(我使用端口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)
将运行状况检查附加到目标池
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
创建新的转发规则以替换GKE生成的转发规则
gcloud compute forwarding-rules create api-server \
--region us-central1 --port-range 8080-8081 \
--address ${EXTERNAL_IP} --target-pool ${TARGET_POOL_NAME}
删除原始GKE转发规则
gcloud compute forwarding-rules delete $(gcloud compute forwarding-rules list | head -n 2 | tail -n 1 | cut -d " " -f 1)
更新Kubernetes服务以允许从新IP进入:
kubectl patch services api-server -p "{\"status\":{\"loadBalancer\":{\"ingress\": [{\"ip\": \"${EXTERNAL_IP}\"} ]}}}"
应该这样做!
小心复制粘贴,我的头和尾为我工作,因为我只有一个应用程序在运行,但你可能会看到不同的顺序。