【问题标题】:gke nginx ingress create additional load balancergke nginx ingress 创建额外的负载均衡器
【发布时间】:2019-06-20 06:09:26
【问题描述】:

我有一组服务要公开为入口负载均衡器。我选择 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。

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 服务视图的入口的屏幕截图,其中包含错误信息

这是预期的吗?

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

【问题讨论】:

  • 您能否包含一些输出来说明您对附加负载平衡器的意思?你在哪里看到的?
  • 添加了@RyanDawson
  • 如果您在另一个命名空间中有 LoadBalancer 服务,您能否包含“kubectl get services”或“kubectl get services --all-namespaces”的输出。
  • 添加了@RyanDawson

标签: nginx kubernetes kubernetes-ingress google-kubernetes-engine nginx-ingress


【解决方案1】:

在 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 中提到的那样

【讨论】:

    【解决方案2】:

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

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

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

    $ kubectl get ingress
    $ kubectl get svc
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多