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

8

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

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

2个回答

5

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


1
请发布您的YAML或JSON。另外,请运行“kubectl get service <name> -o yaml”,以便我们可以查看服务器认为它收到了什么。 - Tim Hockin
猜测:我怀疑您使用的是较旧的kubectl命令行(我认为gcloud捆绑版本正在等待新的gcloud推送)。 - Tim Hockin
4
该死,现在它可以工作了。我总是把类型设为“全球”,但显然它需要是“区域性”的?为什么会这样? - Marco Lamina
1
@MarcoLamina 您的评论需要单独作为答案,因为这是正确的做法。 - Moataz Elmasry
1
@MarcoLamina 我非常确定这是因为 Kubernetes 创建的负载均衡器类型(TCP)不支持全局类型。你必须使用 HTTP 负载均衡器来实现。 - Bob
显示剩余7条评论

4
我最终解决了这个问题。要做到这一点,您可以请求 GKE 为您设置一个外部负载均衡器,然后有选择地替换堆栈的部分。好消息是,在此过程中,您还可以设置 HTTP 健康检查,而 GKE 默认不会执行此操作。
请确保从 Google Cloud 平台获取可用的静态 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 Service,允许从新IP进行入站:

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

应该就这样了!

小心复制粘贴,我的头部和尾部适用于我只运行一个应用程序的情况,但您可能会看到不同顺序的事情。


Zach —— 我很高兴你能够解决这个问题。当你在 GKE 中创建一个服务时,你应该能够请求将其分配给特定的 IP 地址。因此,如果你创建了一个静态 IP,你应该能够将其分配给你的服务。 - Robert Bailey
感谢您的回复,@RobertBailey!我看到这是一个kubctl expose的命令行标志。如果我使用“kubectl create”,我应该在我的*_controller.json中放置公共IP地址?我认为我仍然需要进一步了解并附加HTTP健康检查,因此探索其设置方式非常有帮助。 - Zach Brock
我认为你想要的字段是deprecatedPublicIPs(https://github.com/kubernetes/kubernetes/blob/master/pkg/api/v1/types.go#L1534-L1539),但它也可能是上面的新externalIPs字段。这应该放在*_service.json文件中,而不是复制控制器配置中。 - Robert Bailey
@RobertBailey:不幸的是,我认为这个方法行不通。我尝试了带有kubectl expose rc api-server-controller --name=api-server --port=8081 --create-external-load-balancer=true --public-ip="146.148.83.156"命令行版本。当我运行kubectl get -o json services api-server时,它在"deprecatedPublicIPs": ["146.148.83.156"]中显示IP地址,但是gcloud compute addresses list仍然显示该地址被保留,而没有使用。gcloud compute forwarding-rules list显示它选择了一个临时地址。 - Zach Brock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接