ingress nginx 如何调试 502 页面,即使服务和 Ingress 中的端口是正确的?

ingress nginx how to debug 502 page even though the ports in service and Ingress are correct?

我在端口 5001 上的工作节点上的集群 ip 内有一个 Web 应用程序 运行,我也在使用 k3s 进行集群部署,我检查了集群连接 运行 正常

部署将容器端口设置为 5001:

ports:
  - containerPort:5001

这是服务文件:

apiVersion: v1
kind: Service
metadata:
  labels:
    io.kompose.service: user-ms
  name: user-ms
spec:
  ports:
    - name: http
      port: 80
      targetPort: 5001
  selector:
    io.kompose.service: user-ms
status:
  loadBalancer: {}

这是入口文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
   name: user-ms-ingress
spec:
   rules:
   - http:
      paths:
      - path: / 
        pathType: Prefix
        backend:
           service:
             name: user-ms
             port: 
               number: 80

每当我输入我的 worker 或 master ip 地址时,我都会收到 502 Bad Gateway 错误

预期:它应该 return Web 应用程序页面

我在网上看了看,大多数人都提到了错误的服务和入口端口,但我的端口是正确的,是的,我检查了三次:

try calling user-ms service on port 80 from another pod -> worked try calling cluster ip on worker node on port 5001 -> worked

端口 运行 正确,为什么入口 returning 502?

这是入口描述:

这里是 nginx ingress controller pod 的描述:

nginx ingress pod 运行 正常:

这里是 nginx ingress pod 的日志:

对不起图片,但我正在使用流媒体机访问终端,所以我无法复制粘贴

我应该如何调试这个错误?

您可以在 nginx 上打开访问日志记录,这将使您能够在 ingress-controller 上看到更多日志,并且还可以跟踪通过入口路由的每个请求,如果您正在尝试加载 UI/etc,它将向您显示请求来自浏览器,或者如果您访问特定端点,则调用将在 nginx-controller 日志中可见。您可以得出结论,如果传入的请求实际上是使用它路由到正确的服务,然后开始调试该服务(例如:检查您是否可以从集群中的任何 pod 卷曲端点等)

注意到您正在使用图像(k8s.gcr.io/ingress-nginx/controller:v1.2.0),如果您使用helm 安装,必须有一个kubernetes-ingress configmap with ingress controller ,默认情况下“disable-access-log”为 true,将其更改为 false,您应该开始在 ingress-controller 上看到更多日志,如果看不到详细日志,您可能想要跳出入口控制器 pods .

Kubectl 编辑 cm -n 命名空间 kubernetes-ingress

apiVersion: v1
data:
  disable-access-log: "false" #turn this to false
  map-hash-bucket-size: "128"
  ssl-protocols: SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3
kind: ConfigMap

好的,我设法弄清楚了,在 K3S 的默认设置中,它使用 traefik 作为默认入口,所以我的 nginx 入口日志没有显示任何来自 502 Bad GateWay

我决定拆除我的集群并重新设置它,现在根据这个问题 https://github.com/k3s-io/k3s/issues/1160#issuecomment-1058846505 的建议创建没有 traefik 的集群:

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable=traefik" sh -

现在,当我调用 kubectl get pods --all-namespaces 时,我不再看到 traefik pod 运行ning,之前它有 traefik pods 运行ining。

一旦我完成所有这些,运行 再次申请入口 -> 出现 404 错误,我检查了 nginx 入口 pod 日志,现在它显示了缺少入口的新错误 class,我将以下内容添加到 metadata 下的入口配置文件中:

metadata:
  name: user-ms-ingress
  annotitations:
    kubernetes.io/ingress.class: "nginx"

现在我再次转到工作节点的 ip -> 404 错误消失但出现 502 错误网关错误,我检查了日志获取连接被拒绝错误:

我发现我正在为我的所有微服务设置 network policy,我删除了 network policy 并从我所有的部署文件中删除了它的设置。

终于再次检查,我可以看到我可以正常访问我的 api 和 swagger 页面。

TLDR:

  1. If you are using nginx ingress on K3S, remember to disable traefik first when created the cluster
  2. don't forget to set ingress class inside your ingress configuration
  3. don't setup network policy because nginx pod won't be able to call the other pods in that network