当前位置: 首页 > 知识库问答 >
问题:

将外部HTTPS负载均衡器与暴露为区域NEG的NGINX入口连接

谭献
2023-03-14

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

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

理想的架构如下所示:

HTTPS请求-

我想添加NGINX入口的区域neg作为HTTPS负载平衡器的后端。这就是事情分崩离析的地方。

NGINX入口配置

我使用的是来自官方kubernetes/ingress-nginx项目的默认NGINX入口配置。具体来说,这个YAML文件https://github.com/kubernetes/ingress-html" target="_blank">nginx/blob/master/deploy/static/provider/cloud/deploy.yaml.请注意,我已经更改了NGINX-控制器服务部分,如下所示:

>

  • 添加了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入口路由

    我已经独立地在我的Web应用程序中测试了NGINX入口的基于路径的路由规则。当NGINX入口配置了TCP负载均衡器时,这将起作用。我已经以通常的方式设置了我的应用程序部署和服务配置

    外部HTTPS负载平衡器

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

    • 后端:添加了名为NGINX\u NEG的分区NEG作为后端。后端配置为在端口80上接受HTTP请求。我通过TCP协议在服务端口上配置了健康检查。我添加了防火墙规则,以允许来自此处提到的130.211.0.0/22和35.191.0.0/16的传入流量https://cloud.google.com/kubernetes-engine/docs/how-to/standalone-neg#traffic_does_not_reach_the_endpoints

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

    >

  • 我不确定在GCP日志记录中从哪里开始调试此配置。我已经为健康检查启用了日志记录,但日志中没有显示任何内容。

    我在NGINX入口控制器的/Health z路径上配置了健康检查。这似乎也不起作用。

    任何关于如何使其发挥作用的提示都将不胜感激。谢谢

    编辑1:根据请求,我运行了kubectl get svcneg-o yaml--名称空间=

    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
    

  • 共有1个答案

    章景同
    2023-03-14

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

    本质上,服务的注释是云。谷歌。com/neg:“{“入口”:true}”,启用容器本机负载平衡。创建入口后,将在项目中创建HTTP(S)负载平衡器,并在集群运行的每个区域中创建NEG。NEG中的endpoint与服务的endpoint保持同步。请参阅链接[1]。

    在将新endpoint连接到负载平衡器之后,如果它们响应运行状况检查,通常可以访问它们。如果流量无法到达endpoint,则可能会遇到502个错误或拒绝的连接。

    区域NEG中的一个endpoint显示不健康,因此请确认其他endpoint的状态以及后端中分散在区域中的endpoint数量。如果所有后端都不健康,则您的防火墙、入口或服务可能配置错误。

    您可以运行以下命令来检查endpoint是否正常,并参考链接[2]了解相同内容-gcloud compute network endpoint groups list network endpoints NAME \--zone=zone

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

    对LB IP运行Curl命令以检查响应-
    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

     类似资料:
    • 负载均衡器的作用是将流量转发到主机。在这方面,ingress与负载均衡器有何不同?另外,与Amazon ELB和ALB相比,kubernetes内部的负载均衡器是什么概念?

    • 我知道,当我们想用一个负载平衡器/公共IP公开多个服务/路由时,可以使用入口。 现在我想公开我的Nginx服务器。我有两个选择 设置瞧,我得到了公共IP 使用Nginx入口控制器 现在我可以用选项1完成我的工作了,我什么时候或者为什么要选择选项2?使用带有入口的nginx而不使用入口有什么好处?

    • 我不确定负载平衡如何与入口一起工作<如果我理解正确,实际情况是这样的: 我看不到负载平衡是如何执行的<我画的上述方案有什么错<你能帮我纠正一下吗? 注意: -以下答案告诉我入口控制器本身属于“loadbalancer”类型:入口服务类型 -我使用kind ClusterIP,因为我不想将loadbalancer暴露给外部世界。以下文章不支持此声明,其中负载平衡器将由服务提供: https://me

    • 我在将https添加到我的EC2实例时遇到了一个问题,也许你们可以找到让它工作的答案。 我有一个负载平衡器,它正在将连接转发到我的EC2实例,我已将SSL证书添加到负载平衡器,一切正常,我已将侦听器添加到端口443,该端口将转发到我的实例的端口443,我已将Apache配置为在端口443和80上侦听,现在这里是我的负载平衡器的屏幕截图: SSL证书有效,在端口80(HTTP)上一切正常,但如果我尝

    • GCP为GKE负载平衡器提供了自己的托管入口控制器。我还看到了部署和利用Nginx入口控制器的文档。 https://cloud.google.com/community/tutorials/nginx-ingress-gke 内置入口控制器也在负载均衡器级别处理SSL终止。是否有特定的流量处理能力使Nginx成为GKE更好的入口控制候选者?