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

时间:2015-10-19 21:09:27

标签: google-cloud-platform kubernetes google-kubernetes-engine

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

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

2 个答案:

答案 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}\"} ]}}}"

应该这样做!

小心复制粘贴,我的头和尾为我工作,因为我只有一个应用程序在运行,但你可能会看到不同的顺序。