首页 > 解决方案 > gke nginx ingress 创建额外的负载均衡器

问题描述

我有一组服务,我想作为入口负载均衡器公开。我选择 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 而选择 gcp 作为入口的所有内容。

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

gcplb

kubectl 的输出获取服务

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 services 入口的屏幕截图,包含错误信息

入口

这是预期的吗?

我是否错过了任何配置来阻止创建这个额外的负载均衡器?

标签: nginxkuberneteskubernetes-ingressgoogle-kubernetes-enginenginx-ingress

解决方案


在 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中所述-gce 入口控制器


推荐阅读