为什么我不能将服务类型 ClusterIP 附加到 GKE 上的 Ingress?

Why can't I attach a service type ClusterIP to Ingress on GKE?

在开始之前,我想说明一下,我使用的是 GKE 的免费试用版。 我在 GKE 集群中有一个简单的服务器 运行。我有一个用于公开服务器的服务。我正在尝试配置入口控制器并将其附加到此服务。

如果我的服务类型为 LoadBalancer、NodePort,则一切正常。但是,如果我的服务是 ClusterIP 类型,我会收到一条错误消息

error while evaluating the ingress spec: service "default/simple-server" is type "ClusterIP"
, expected "NodePort" or "LoadBalancer" 

GKE 然后停止尝试为入口提供 IP。为什么我不能提供 clusterIP 类型的服务,有解决办法吗?

我试过 annotations.kubernetes.io/ingress.class: "nginx" 但还是不行。

原生 GKE 入口控制器不支持 ClusterIP,但它与 LoadBalancerNodePort 类型完美配合。看看这个issue

非本地入口控制器 NginxClusterIP 一起工作。

这很正常,出现错误的原因也很简单。

ClusterIP 服务是 Kubernetes 集群内部的唯一服务,而您尝试创建的(据我所知)是使用入口的公开服务,这意味着您将创建一个 Google 负载均衡器。

现在它不支持 ClusterIP 的原因是因为当你创建入口时,在 google 云中创建的 LB 资源需要你的集群上的一个目标端口来调用为此你需要公开一个ip/port。

我不建议结合 LB 服务(默认情况下在云提供商上创建 LB)和入口,但保持 nodeport/ingress 更清洁的二重奏。

奖励:您使用的注解用于内部服务,入口链接到您的入口控制器。这将允许入口控制器列出主机和代理流量到正确的服务。

您可以通过设置注解使用Ingress访问GKE中的ClusterIP cloud.google.com/neg: '{"ingress": true}' 到服务。

apiVersion: v1
kind: Service
metadata:
  name: myapp
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
...

另见答案 in the related question