我遇到过这样的情况:Kubernetes 显然无法再为服务分配外部 IP 地址kubectl create -f Deployment.yaml
。kubectl describe service <my-service>
报告如下错误:
CreatingLoadBalancerFailed
Error creating load balancer (will retry): Failed to create load balancer
for service default/<my-service>: requested ip <my-address> is
neither static nor assigned to LB <id>(default/<my-service>): <nil>
但gcloud compute addresses list
表明这my-address
是一个静态 IP 地址:
NAME REGION ADDRESS STATUS
<my-address> europe-west1 <ip-address> RESERVED
并包含分配给负载均衡器Deployment.yaml
的规范:<my-service>
<my-address>
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: UDP
port: <my-port>
type: LoadBalancer
loadBalancerIP: <my-address>
特别奇怪的是:(几乎)相同的部署以前也成功过。我已经尝试过重新创建我的集群,但这也无济于事。还有什么可能出错,我该如何克服错误,使我的服务再次可从外部访问?
更新我已经保留了一个新的静态(这次也是全局)IP 地址,gcloud compute addresses create test-address --global
并相应地更改了对 LB 的分配:loadBalancerIP: test-address
。但同样的错误仍然存在。
更新如果我没有loadBalancerIP
在 中指定Deployment.yaml
,则部署成功且不会出现错误,并且会为 分配一个新的外部 IP 地址my-service
。可以从外部通过此地址 ping 通该服务。
更新如果我使用 删除我以前的地址gcloud compute addresses delete my-address --region europe-west1
,使用 提升新的外部地址gcloud compute addresses create --addresses <ip-address> --region europe-west1
,然后使用loadBalancerIP: my-address
恢复的原始线路重新部署Deployment.yaml
,则相同的错误会再次出现。
答案1
我遇到了类似的问题。事实证明,如果 IP 地址保留为全局,则它将不起作用。我删除了我的保留,并将其更改为与我的 kubernetes 集群相同的区域。 --global
我必须使用--region europe-west2
- 与我的 k8s 集群相同的区域。
之前:失败
gcloud compute addresses create my-secure-sftp --global
之后:成功
gcloud compute addresses create my-secure-sftp --region europe-west2
答案2
问题在于Deployment.yaml
我引用的地址loadBalancerIp
是符号名称,而不是数字 IP 地址(分别显示为和NAME
)。如果我改用数字 IP 地址,负载平衡器就会启动,我的服务可以通过此地址(通过负载平衡器)从外部访问。(ADDRESS
gcloud compute addresses list
这之前的回答让我走上了正确的道路。我可能错误地认为使用符号名称以前是有效的。)
背景因为我交换切换到自己的 VM 实例(而不是 Google Cloud shell)来开发容器映像,我收到了"Insufficient Permission"
来自该 VM 实例的错误gcloud compute addressess list
。我明白我可以通过以下方式改进此问题重新创建具有范围的 VM 实例 https://www.googleapis.com/auth/compute.readonly
不管怎样,这个限制显然和当前的问题无关。
答案3
你应该创造区域地址:
gcloud 计算地址创建 my-secure-sftp --region europe-west2
它为入口控制器分配全局 IP(状态 IN_USE),这正是您所需要的。
在您的情况下,全局静态和内部静态将不起作用。
答案4
你应该创建一个区域地址相同地区,区和项目在 GCP 上
我遇到一个问题,因为我在配置 LoadBalancer 的另一个项目上创建了一个 IP。