我想要完成的
我正在尝试将外部 HTTPS (L7) 负载均衡器与暴露为区域网络端点组 (NEG) 的 NGINX 入口连接。我的 Kubernetes 集群(在 GKE 中)包含几个我已公开为 ClusterIP 服务的 Web 应用程序部署。
我知道 NGINX Ingress 对象可以直接暴露为 TCP 负载均衡器。但是,这不是我想要的。相反,在我的架构中,我想使用外部 HTTPS 负载平衡器对 HTTPS 请求进行负载平衡。我希望这个外部负载均衡器提供 SSL/TLS 终止并将 HTTP 请求转发到我的 Ingress 资源。
理想的架构应该是这样的:
HTTPS 请求 --> 外部 HTTPS 负载均衡器 --> HTTP 请求 --> NGINX 入口区域 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 控制器服务部分更改如下:
添加了 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 负载均衡器:
- 后端:添加了命名为后端的区域 NEG
NGINX_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 下创建了一个新端点。但这显示为“不健康”。对外部 HTTPS 负载平衡器的请求返回 502 错误。
我不确定在 GCP 日志记录中从哪里开始调试此配置。我已启用运行状况检查的日志记录,但日志中没有显示任何内容。
/healthz
我在 NGINX Ingress 控制器的路径上配置了健康检查。那似乎也不起作用。
任何有关如何使其工作的提示将不胜感激。谢谢!
编辑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