【问题标题】:Connect external HTTPS load balancer with NGINX Ingress exposed as zonal NEG将外部 HTTPS 负载均衡器与公开为区域 NEG 的 NGINX 入口连接
【发布时间】:2021-05-25 22:20:27
【问题描述】:

我想要完成的事情

我正在尝试将外部 HTTPS (L7) 负载平衡器与公开为区域网络端点组 (NEG) 的 NGINX 入口连接。我的 Kubernetes 集群(在 GKE 中)包含几个我已公开为 ClusterIP 服务的 Web 应用程序部署。

我知道 NGINX Ingress 对象可以直接暴露为 TCP 负载均衡器。但是,这不是我想要的。相反,在我的架构中,我想使用外部 HTTPS 负载平衡器对 HTTPS 请求进行负载平衡。我希望这个外部负载均衡器提供 SSL/TLS 终止并将 HTTP 请求转发到我的 Ingress 资源。

理想的架构应该是这样的:

HTTPS 请求 --> 外部 HTTPS 负载平衡器 --> HTTP 请求 --> NGINX Ingress 区域 NEG --> 适当的 Web 应用程序

我想将来自 NGINX Ingress 的区域 NEG 添加为 HTTPS 负载平衡器的后端。这就是事情分崩离析的地方。

我做了什么

NGINX 入口配置

我正在使用来自官方 kubernetes/ingress-nginx 项目的默认 NGINX Ingress 配置。具体来说,这个 YAML 文件 https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/provider/cloud/deploy.yaml。 请注意,我已将 NGINX-controller Service 部分更改如下:

  • 添加了 NEG 注释

  • 将服务类型从LoadBalancer 更改为ClusterIP

# Source: ingress-nginx/templates/controller-service.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    # added NEG annotation
    cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "NGINX_NEG"}}}'
  labels:
    helm.sh/chart: ingress-nginx-3.30.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.46.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller
---

NGINX 入口路由

我已经独立测试了 NGINX Ingress 到我的 Web 应用程序的基于路径的路由规则。当 NGINX Ingress 配置了 TCP 负载均衡器时,此方法有效。我已经按照通常的方式设置了我的应用程序部署和服务配置。

外部 HTTPS 负载平衡器

我使用以下设置创建了一个外部 HTTPS 负载平衡器:

什么不工作

设置外部负载平衡器后不久,我可以看到 GCP 在一个区域 NEG 下创建了一个新端点。但这显示为“不健康”。对外部 HTTPS 负载平衡器的请求返回 502 错误。

  • 我不确定在 GCP 日志记录中从哪里开始调试此配置。我已启用运行状况检查的日志记录,但日志中没有显示任何内容。

  • 我在 NGINX Ingress 控制器的 /healthz 路径上配置了健康检查。这似乎也不起作用。

任何有关如何使其工作的提示将不胜感激。谢谢!

编辑 1:根据要求,我运行了 kubectl get svcneg -o yaml --namespace=<namespace>,这是输出

apiVersion: networking.gke.io/v1beta1
kind: ServiceNetworkEndpointGroup
metadata:
  creationTimestamp: "2021-05-07T19:04:01Z"
  finalizers:
  - networking.gke.io/neg-finalizer
  generation: 418
  labels:
    networking.gke.io/managed-by: neg-controller
    networking.gke.io/service-name: ingress-nginx-controller
    networking.gke.io/service-port: "80"
  name: NGINX_NEG
  namespace: ingress-nginx
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: false
    controller: true
    kind: Service
    name: ingress-nginx-controller
    uid: <unique ID>
  resourceVersion: "2922506"
  selfLink: /apis/networking.gke.io/v1beta1/namespaces/ingress-nginx/servicenetworkendpointgroups/NGINX_NEG
  uid: <unique ID>
spec: {}
status:
  conditions:
  - lastTransitionTime: "2021-05-07T19:04:08Z"
    message: ""
    reason: NegInitializationSuccessful
    status: "True"
    type: Initialized
  - lastTransitionTime: "2021-05-07T19:04:10Z"
    message: ""
    reason: NegSyncSuccessful
    status: "True"
    type: Synced
  lastSyncTime: "2021-05-10T15:02:06Z"
  networkEndpointGroups:
  - id: <id1>
    networkEndpointType: GCE_VM_IP_PORT
    selfLink: https://www.googleapis.com/compute/v1/projects/<project>/zones/us-central1-a/networkEndpointGroups/NGINX_NEG
  - id: <id2>
    networkEndpointType: GCE_VM_IP_PORT
    selfLink: https://www.googleapis.com/compute/v1/projects/<project>/zones/us-central1-b/networkEndpointGroups/NGINX_NEG
  - id: <id3>
    networkEndpointType: GCE_VM_IP_PORT
    selfLink: https://www.googleapis.com/compute/v1/projects/<project>/zones/us-central1-f/networkEndpointGroups/NGINX_NEG

【问题讨论】:

  • 您使用的是哪个版本的 GKE?如果您使用的是`1.18.6-gke.6400`或更高版本,您可以发布kubectl get svcneg NGINX_NEG -o yaml的输出吗?
  • 感谢您的回复!我在原始描述中添加了kubectl get svcneg... 输出。

标签: nginx kubernetes google-kubernetes-engine gcp-load-balancer


【解决方案1】:

根据我的理解,您的问题是 -“当设置了外部负载均衡器时,GCP 在其中一个区域 NEG 下创建一个新端点,它显示“不健康”并请求外部 HTTPS 负载均衡器返回一个502 错误”。

本质上,服务的注释 cloud.google.com/neg: '{"ingress": true}' 启用容器原生负载平衡。创建 Ingress 后,会在项目中创建 HTTP(S) 负载均衡器,并在运行集群的每个可用区中创建 NEG。 NEG 中的端点和服务的端点保持同步。 请参阅链接 [1]。

新端点通常在将它们附加到负载平衡器后变得可访问,前提是它们响应运行状况检查。如果流量无法到达端点,您可能会遇到 502 错误或连接被拒绝。

您在区域 NEG 中的一个端点显示不正常,因此请确认其他端点的状态以及有多少端点分布在后端的区域中。 如果所有后端都不正常,那么您的防火墙、Ingress 或服务可能配置错误。

您可以运行以下命令来检查您的端点是否健康,并参考链接 [2] - gcloud compute network-endpoint-groups list-network-endpoints NAME \ --zone=ZONE

要对未到达端点的流量进行故障排除,请验证运行状况检查防火墙规则是否允许传入 TCP 流量到 130.211.0.0/22 和 35.191.0.0/16 范围内的端点。但是正如您提到的,您已经正确配置了此规则。健康检查配置请参考链接[3]。

对您的 LB IP 运行 Curl 命令以检查响应 -
卷曲 [LB IP]

[1]https://cloud.google.com/kubernetes-engine/docs/concepts/ingress-xlb

[2]https://cloud.google.com/load-balancing/docs/negs/zonal-neg-concepts#troubleshooting

[3]https://cloud.google.com/kubernetes-engine/docs/concepts/ingress#health_checks

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2021-08-20
    • 2019-08-05
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多