gke nginx ingress 创建额外的负载均衡器

gke nginx ingress create additional load balancer

我有一组服务想公开为入口负载均衡器。我 select nginx 是入口,因为它能够强制 http 到 https 重定向。

具有类似

的入口配置
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-https
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: true
    nginx.ingress.kubernetes.io/force-ssl-redirect: true
    nginx.org/ssl-services: "api,spa"
    kubernetes.io/ingress.class: nginx
spec:
  tls:
    - hosts:
        - api.some.com
        - www.some.com
      secretName: secret
  rules:
    - host: api.some.com
      http:
        paths:
          - path: /
            backend:
              serviceName: api
              servicePort: 8080
    - host: www.some.com
      http:
        paths:
          - path: /
            backend:
              serviceName: spa
              servicePort: 8081

gke 创建了 nginx 入口负载均衡器,但也创建了另一个带有后端的负载均衡器,如果不是 nginx selected 但 gcp 作为入口。

下面的屏幕截图以红色显示了两个意外的 LB,以蓝色显示了两个 nginx 入口 LB,分别用于我们的 qa 和 prod env。

kubectl get services 的输出

xyz@cloudshell:~ (xyz)$ kubectl get services
NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                         AGE
api                             NodePort       1.2.3.4         <none>           8080:32332/TCP,4433:31866/TCP   10d
nginx-ingress-controller        LoadBalancer   1.2.6.9         12.13.14.15      80:32321/TCP,443:32514/TCP      2d
nginx-ingress-default-backend   ClusterIP      1.2.7.10        <none>           80/TCP                          2d
spa                             NodePort       1.2.8.11        <none>           8082:31847/TCP,4435:31116/TCP   6d

入口的 gcp gke 服务视图屏幕截图,信息错误

这是预期的吗?

我是否遗漏了任何配置来阻止创建这个额外的负载平衡器?

当您在 GKE 集群上创建部署时,您有两种公开它的可能性:

  1. 使用类型为 LoadBalancer 的服务并公开它 - 这将 创建一个 TCP 负载平衡器
  2. 将服务创建为 NodePort 或集群 IP 并将其公开为 Ingress - 这将创建 HTTP 负载平衡器

如果您可以在负载均衡器中看到它们,这意味着您可能已经创建了一个服务类型 LoadBalancer,然后将其暴露为 Ingress。您正在打开同一个部署,以便通过服务和 Ingress 从两个不同的 IP 进行访问。要确认此尝试:

$ kubectl get ingress
$ kubectl get svc

您将从这 2 个命令中获得 2 个 ips,并且它们都会向您显示相同的页面。

配置它的更好方法是拥有服务类型 NodePort,并将该服务公开为入口。这特别有用,因为您可以使用同一个入口来公开更多服务。

通过这种方式,您可以节省暴露的 IP 数量(并且可以通过不使用多个负载均衡器来节省资金)。

在 GCP GKE 上,gcp 入口控制器默认启用,并且在任何入口定义中始终会导致新的 LB,即使指定了 .class。

https://github.com/kubernetes/ingress-nginx/issues/3703

所以要修复它,我们应该从集群中删除 gcp 入口控制器,如 https://github.com/kubernetes/ingress-gce/blob/master/docs/faq/gce.md#how-do-i-disable-the-gce-ingress-controller

中所述