如何排查 Kubernetes 中 Ingress 控制器的“未找到匹配服务”错误

KubernetesBeginner
立即练习

简介

Kubernetes Ingress 是一项强大的功能,可简化对在 Kubernetes 集群中运行的服务的外部访问管理。本教程将指导你了解 Kubernetes Ingress 的基本原理、配置 Ingress 资源和规则,以及排查常见的与 Ingress 相关的问题。

理解 Kubernetes Ingress 基础

Kubernetes Ingress 是一项强大的功能,可简化对在 Kubernetes 集群中运行的服务的外部访问管理。它充当反向代理,处理诸如路由、负载均衡和 SSL/TLS 终止等任务,使其成为将应用程序暴露到互联网的关键组件。

在 Kubernetes 集群中,服务通常通过集群 IP 地址进行访问,该地址仅在集群内部可达。另一方面,Ingress 通过定义一组规则来确定如何将传入流量路由到相应的服务,从而提供了一种将服务暴露给外部世界的方式。

graph LR A[客户端] --> B[Ingress 控制器] B --> C[服务 1] B --> D[服务 2] B --> E[服务 3]

Ingress 控制器负责实现 Ingress 规则并管理底层的负载均衡基础设施。有几种可用的 Ingress 控制器选项,例如 NGINX、Traefik 和 Istio,每个都有其自己的一组功能和配置。

要使用 Ingress,你需要定义一个 Ingress 资源,它是一个 Kubernetes 对象,用于指定将流量路由到服务的规则。这些规则可以基于传入的 URL 路径、主机名或其他标准。以下是一个 Ingress 资源示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

在此示例中,Ingress 资源定义了两条规则:

  1. example.com/api 的请求被路由到端口 80 上的 api-service 服务。
  2. example.com/web 的请求被路由到端口 80 上的 web-service 服务。

Ingress 控制器负责实现这些规则并管理底层的负载均衡基础设施。

通过理解 Kubernetes Ingress 的基础,你可以有效地管理对服务的外部访问,简化应用程序部署,并提高基于 Kubernetes 的基础设施的整体可靠性和可扩展性。

配置 Ingress 资源和规则

配置 Ingress 资源和规则是管理对 Kubernetes 服务的外部访问的关键步骤。Ingress 资源允许你定义一组规则,以确定如何将传入流量路由到相应的服务。

让我们来探讨一下 Ingress 资源配置的关键组件:

主机和路径

Ingress 资源的 spec.rules 部分定义了 Ingress 控制器应监听的主机名和路径。你可以指定多个主机和路径组合,将流量路由到不同的服务。

spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /web
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

在此示例中,Ingress 控制器将监听对 example.com/apiexample.com/web 的请求,并分别将它们路由到 api-serviceweb-service

TLS 配置

你还可以为 Ingress 资源配置 TLS/SSL 终止。这涉及创建一个包含 TLS 证书和密钥的 Kubernetes Secret,然后在 Ingress 资源中引用它。

spec:
  tls:
    - hosts:
        - example.com
      secretName: tls-secret

tls-secret Secret 应包含 TLS 证书和密钥,Ingress 控制器将使用它们来终止 SSL/TLS 连接。

Ingress 资源清单

Ingress 资源通常使用 YAML 清单进行定义,可以使用 kubectl apply -f ingress.yaml 将其应用到 Kubernetes 集群。这使你能够将 Ingress 配置作为代码进行管理,并与其他 Kubernetes 资源一起进行版本控制。

通过了解如何配置 Ingress 资源和规则,你可以有效地管理对 Kubernetes 服务的外部访问,提高应用程序的可扩展性和可靠性,并简化基础设施的部署和管理。

排查 Ingress 问题

虽然 Kubernetes Ingress 简化了对服务的外部访问管理,但你偶尔可能会遇到需要排查的问题。在本节中,我们将探讨常见的与 Ingress 相关的问题以及如何解决它们。

没有匹配的服务

最常见的 Ingress 问题之一是 Ingress 控制器无法为指定路径找到匹配的服务。如果服务不存在、服务名称拼写错误或服务的端口号与 Ingress 配置不匹配,就可能发生这种情况。

要排查此问题,你可以使用以下命令:

## 列出命名空间中的所有服务
kubectl get services -n <命名空间>

## 描述 Ingress 资源以查看服务详细信息
kubectl describe ingress <ingress 名称> -n <命名空间>

确保 Ingress 配置中的服务名称和端口号与 Kubernetes 集群中的实际服务匹配。

Ingress 控制器错误

如果 Ingress 控制器运行不正常,你可能会在控制器的日志中遇到错误。你可以使用以下命令查看日志:

kubectl logs -n <Ingress 控制器命名空间> <Ingress 控制器 Pod 名称>

在日志中查找任何有助于你确定问题根源的错误消息或警告。常见问题包括配置错误、网络问题或资源限制。

调试 Ingress 资源

在排查与 Ingress 相关的问题时,检查 Ingress 资源本身也很有帮助。你可以使用以下命令获取更多信息:

## 列出命名空间中的所有 Ingress 资源
kubectl get ingress -n <命名空间>

## 描述特定的 Ingress 资源
kubectl describe ingress <ingress 名称> -n <命名空间>

describe 命令将提供有关 Ingress 资源的详细信息,包括配置的规则、后端服务以及任何错误消息或事件。

通过了解如何排查常见的 Ingress 问题,你可以快速识别并解决问题,确保基于 Kubernetes 的应用程序可访问并按预期运行。

总结

在本教程中,你已经了解了 Kubernetes Ingress 如何作为反向代理工作,处理诸如路由、负载均衡和 SSL/TLS 终止等任务,以便将你的应用程序暴露到互联网。你还了解了如何定义 Ingress 资源和规则,以控制传入流量到你的服务的路由。最后,你深入了解了排查 Ingress 问题,这是管理和维护基于 Kubernetes 的应用程序的一项关键技能。