Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 如何为Google容器引擎(GKE)服务设置静态IP地址?_Google Cloud Platform_Kubernetes_Google Kubernetes Engine - Fatal编程技术网

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

Google cloud platform 如何为Google容器引擎(GKE)服务设置静态IP地址?,google-cloud-platform,kubernetes,google-kubernetes-engine,Google Cloud Platform,Kubernetes,Google Kubernetes Engine,一点背景:我有一个Go服务,它使用gRPC与客户端应用程序进行通信。gRPC使用HTTP2,所以我不能使用googleappengine或googlecloudhttp负载平衡器。我需要从internet到Go应用程序的原始TCP负载平衡 我阅读了GKE教程并阅读了各种文档,但我找不到任何方法为我的应用程序提供静态IP地址。那么,如何将静态IP连接到GKE中运行的某个东西上呢?我最终找到了答案。为此,您要求GKE为您设置一个外部负载平衡器,然后有选择地替换堆栈的各个部分。好消息是,在此过程中,您

一点背景:我有一个Go服务,它使用gRPC与客户端应用程序进行通信。gRPC使用HTTP2,所以我不能使用googleappengine或googlecloudhttp负载平衡器。我需要从internet到Go应用程序的原始TCP负载平衡


我阅读了GKE教程并阅读了各种文档,但我找不到任何方法为我的应用程序提供静态IP地址。那么,如何将静态IP连接到GKE中运行的某个东西上呢?

我最终找到了答案。为此,您要求GKE为您设置一个外部负载平衡器,然后有选择地替换堆栈的各个部分。好消息是,在此过程中,您还可以设置HTTP健康检查,而GKE在默认情况下不会这样做

确保您有一个可从谷歌云平台获得的静态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}\"} ]}}}"
那就够了


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

kubernetes v1.0.x不支持这一点,但在v1.1.x中它将作为
service.spec.loadBalancerIP
提供。只要你真的拥有这个IP,我们就会使用它。

Zach——我很高兴你能弄明白这一点。在GKE中创建服务时,应该能够请求将其分配到特定的IP地址。因此,如果您创建一个静态IP,您应该能够将其分配给您的服务。感谢@RobertBailey的回复!我将其视为kubctl expose的命令行标志。如果我使用的是
kubectl create
,我应该在我的*\u controller.json中将公共ip放在哪里?我认为我仍然需要连接http运行状况检查,因此探索它是如何设置的结果非常有用。我认为DeprecatedPublicis是您想要的字段(),但它可能是它上面的新externalIPs字段。这将放在你的*_service.json文件中,而不是复制控制器配置中。@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
显示它拾取了一个临时地址。我正在尝试在我的GKE(v1.1.1)服务上使用“loadBalancerIP”。在云控制台中创建了一个静态IP地址,并将其添加到服务定义中。尽管如此,该服务获得了不同的IP地址,静态IP仍然没有分配-我做错了什么吗?请发布您的YAML或JSON?另外,请运行
kubectl get service-o yaml
,这样我们就可以看到服务器认为它得到了什么。该死,它正在工作。我总是将类型设置为“Global”,但显然它需要“Regional”?为什么会这样?@Marcolla你的评论需要在一个单独的答案中,因为这是解决问题的正确方法go@MarcoLamina我很确定这是因为kubernetes创建的负载平衡器(TCP)类型不支持全局类型。为此,您必须使用http负载平衡器。