我正在尝试将外部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负载平衡器:
设置外部负载均衡器后不久,我可以看到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
根据我的理解,您的问题是-“当设置外部负载均衡器时,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更好的入口控制候选者?