我有一个安装了 k3s 的 Linux 虚拟机,并安装了 Nginx-Ingress 控制器。我在 Kubernetes 集群中设置 Nginx Ingress 控制器时遇到问题。我的目标是在前端设置 https,但通过 Ingress URL 访问我的应用程序时,我不断遇到持续的 502 Bad Gateway 错误 (
app.192.168.[something].nip.io
)。
这些是前端服务的详细信息。 (kubectl 描述 svc)
Ingress-NginX 的错误日志显示:
connect() failed (111: Connection refused) while conencting to upstream, client: 192.168.223.229, server: app.192.168.[something].nip.io, request:
"GET / HTTP/ 2.0", upstream: "http://10.43.141.56:3000/", host: "app.192.168.[something].nip.io"
前端运行,pod 启动,我不知道从这里去哪里。
Ingress 资源:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/service-upstream: "true"
spec:
ingressClassName: nginx
tls:
- secretName: dailygrind-tls
hosts:
- app.192.168.[something].nip.io
rules:
- host: app.192.168.[something].nip.io
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: frontend
port:
number: 3000
请注意,位于
frontend
命名空间中的服务 default
是 LoadBalancer
类型,我认为它应该是 ClusterIP
,因为您不想公开公开您的服务,然后通过入口连接到它。
该问题与 Nginx Ingress Controller 和在端口 3000 上运行的后端服务(前端)之间的通信有关。连接到上游时出现错误消息 connect() failed (111: Connection Beenrejected) 表示 Nginx 无法与上游建立连接后端服务。
以下是解决该问题的一些步骤:
验证后端服务:确保前端服务正在集群内运行且可访问。您可以通过检查前端 pod (kubectl get pods) 的状态并确保它们处于正在运行状态来完成此操作。 检查服务IP和端口:确认前端服务的IP地址和端口与Ingress资源(kubectl描述svc frontend)中指定的值匹配。确保该服务正在侦听端口 3000。 验证 Ingress 配置:仔细检查 Ingress 配置,确保其正确指定后端服务(前端)和端口 3000。注意路径和后端部分中的任何拼写错误或错误配置。 检查网络策略:如果您在集群中启用了网络策略,请确保没有策略阻止 Nginx 入口控制器和后端服务之间的流量。 检查 Nginx 入口日志:在 Nginx 入口控制器 pod 的日志 (kubectl 日志) 中查找任何错误或警告。这可以让您更深入地了解为什么与上游服务的连接被拒绝。 测试连接:尝试使用curl或telnet等工具从集群内手动连接到后端服务,以验证其是否可访问(curl http://frontend:3000)。如果无法访问,则服务本身或其网络配置可能存在问题。