K8s - 无法从集群外部访问应用程序

问题描述

我正在学习在私有集群上部署应用程序。应用程序在 pod 中启动并运行,并且可以从节点本身访问。我也创建了一个入口控制器服务,但我不确定出了什么问题。 nginx-ingress 服务的外部 IP 总是返回 404。有什么解决办法吗?

正在运行的服务:

enter image description here

应用服务:

enter image description here

Nginx 服务:

enter image description here

应用程序入口:

enter image description here

入口 yaml :

enter image description here

解决方法

您的 Nginx Ingress 控制器目前似乎没有为 Ingress 提供服务。如果入口由控制器提供服务,它的 status.loadBalancer 下应该至少有一个 IP 地址(这应该是为其提供服务的入口控制器使用的外部 IP),而在您的情况下,它看起来是空的这个:

status:
  loadBalancer: {}

这方面最常见的问题是 Ingress 没有定义 Ingress Class 或者集群中没有默认的 Ingress Class。

首先,执行 k get IngressClass 并查看是否定义了任何 Ingress Class。在您的集群中。 根据 Kubernetes 版本和 Ingress Controller 版本,它可以使用 IngressClass 对象或简单地使用注释(或两者)。

我会尝试简单地在 Ingress kubernetes.io/ingress.class: nginx 下添加注释 metadata,因为 nginx 类通常是由 Nginx Ingress Controller 定义的类。或者,如果您的 Ingress Controller 使用不同的 Ingress Class,我会尝试在注释中指定它,然后您的设置应该工作。


如果您对 Ingress Class 的目的感到好奇,它主要用于将 Ingress 资源定义与 Ingress 控制器相关联。在 Kubernetes 集群上,可能有多个 Ingress Controller,每个控制器都有自己的 Ingress class,Ingress 资源通过匹配请求的 Ingress class 与其中之一相关联。

如果没有指定 ingress class,则 Ingress 使用默认的 class,这意味着 IngressClass 被注释为集群的默认 class。

有关更多信息,请查看此处的文档 ( https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class )