连接外部HTTPS负载平衡器,NGINX入口暴露为区域NEG



我想要实现的目标

我正在尝试连接一个外部HTTPS(L7)负载均衡器和一个作为区域网络端点组(NEG)公开的NGINX入口。我的Kubernetes集群(在GKE中)包含两个web应用程序部署,我已经将它们作为ClusterIP服务公开。

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

理想的架构是这样的:

HTTPS请求-->外部HTTPS负载平衡器-->HTTP请求-->NGINX入口区域NEG->合适的web应用程序

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

我所做的

NGINX入口配置

我使用的是官方kubernetes/Ingress-NGINX项目中的默认NGINX-Ingress配置。具体来说,这个YAML文件https://github.com/kubernetes/ingress-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入口路由

我已经独立测试了NGINX入口到我的web应用程序的基于路径的路由规则。当使用TCP负载均衡器配置NGINX入口时,这一点有效。我已经用通常的方式设置了我的应用程序部署和服务配置。

外部HTTPS负载均衡器

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

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

什么不起作用

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

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

  • 我在NGINX入口控制器的/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

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

从本质上讲,该服务的注释cloud.google.com/neg:"{quot;ingress":true}"可以实现容器本机负载平衡。创建Ingress之后,将在项目中创建一个HTTP(S)负载均衡器,并在集群运行的每个区域中创建NEG。NEG中的端点和服务的端点保持同步。请参阅链接[1]。

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

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

您可以运行以下命令来检查端点是否正常,并参考链接[2]以获得相同的结果-gcloud计算网络端点组列出网络端点名称\--区域=区域

要排除未到达端点的流量,请验证运行状况检查防火墙规则是否允许传入TCP流量到达130.211.0.0/22和35.191.0.0/16范围内的端点。但正如您所提到的,您已经正确配置了此规则。有关健康检查配置,请参阅链接[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

最新更新