如何解决 Kubernetes Ingress 后端服务端点问题

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你了解 Kubernetes Ingress 的基本概念,以及如何在创建 Ingress 资源时排查和解决 “Failed to get backend service endpoints” 错误。你将了解 Ingress 控制器(Ingress 的核心),以及如何配置 Ingress 资源来管理对 Kubernetes 应用程序的外部访问。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/CoreConceptsGroup(["Core Concepts"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/CoreConceptsGroup -.-> kubernetes/architecture("Architecture") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/proxy("Proxy") subgraph Lab Skills kubernetes/get -.-> lab-415698{{"如何解决 Kubernetes Ingress 后端服务端点问题"}} kubernetes/architecture -.-> lab-415698{{"如何解决 Kubernetes Ingress 后端服务端点问题"}} kubernetes/describe -.-> lab-415698{{"如何解决 Kubernetes Ingress 后端服务端点问题"}} kubernetes/logs -.-> lab-415698{{"如何解决 Kubernetes Ingress 后端服务端点问题"}} kubernetes/proxy -.-> lab-415698{{"如何解决 Kubernetes Ingress 后端服务端点问题"}} end

理解 Kubernetes Ingress 基础

Kubernetes Ingress 是一项强大的功能,它简化了对在 Kubernetes 集群中运行的服务的外部访问管理。它充当反向代理,处理诸如负载均衡、SSL/TLS 终止和基于名称的虚拟主机等任务。在本节中,我们将探讨 Kubernetes Ingress 的基本概念,以及如何利用它来增强应用程序的可访问性和安全性。

Ingress 控制器:Ingress 的核心

Ingress 控制器是一个 Kubernetes 组件,负责实现 Ingress 资源。它是一个专门的负载均衡器,会监控 Kubernetes API 以获取新的 Ingress 资源,并配置适当的网络基础设施,将流量路由到指定的服务。

有几种 Ingress 控制器可供选择,每种都有其自身的一系列特性和功能。一些流行的选择包括 NGINX Ingress 控制器、Traefik 和 Istio Ingress 网关。选择 Ingress 控制器取决于你的特定需求,例如对高级路由规则、SSL/TLS 管理或与其他 Kubernetes 服务集成的需求。

graph LR Client --> Ingress Ingress --> Service Service --> Pod

Ingress 资源配置

Ingress 资源是使用 YAML 配置文件定义的。此文件指定了将传入流量路由到 Kubernetes 集群内适当服务的规则。Ingress 资源支持各种功能,包括:

  • 基于主机的路由:允许你根据传入的主机名路由流量。
  • 基于路径的路由:使你能够根据 URL 路径路由流量。
  • SSL/TLS 终止:在 Ingress 级别处理 SSL/TLS 连接的终止。
  • 基于名称的虚拟主机:允许你在单个 IP 地址上托管多个网站或服务。

以下是一个 Ingress 资源配置示例:

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

在此示例中,Ingress 资源被配置为处理 example.com 域的流量。它将对 /api 路径的请求路由到 api-service,对根路径 (/) 的请求路由到 web-service。此外,它使用 tls-secret 机密来终止 SSL/TLS 连接。

通过理解 Kubernetes Ingress 的基础知识,你可以有效地管理对应用程序的外部访问,确保服务的安全和可扩展交付。

排查 “Failed to Get Backend Service Endpoints” 错误

Kubernetes 用户在使用 Ingress 时可能遇到的一个常见问题是 “Failed to get backend service endpoints” 错误。当 Ingress 控制器无法发现与 Ingress 规则相关联的后端服务时,通常会出现此错误。了解根本原因和排查步骤可以帮助你解决此问题,并确保 Kubernetes 应用程序的顺利运行。

识别问题

“Failed to get backend service endpoints” 错误表明 Ingress 控制器无法找到 Ingress 配置中指定的后端服务的端点(IP 地址和端口)。这可能由于各种原因发生,例如:

  1. 服务发现问题:由于不正确的服务定义或网络配置问题,Ingress 控制器可能无法正确发现后端服务。
  2. 服务端点可用性:后端服务可能没有任何可用的端点(即没有运行的 Pod),导致 Ingress 控制器无法找到端点。
  3. 命名空间不匹配:Ingress 资源和后端服务可能位于不同的 Kubernetes 命名空间中,从而阻止 Ingress 控制器访问服务端点。

排查步骤

要排查 “Failed to get backend service endpoints” 问题,请执行以下步骤:

  1. 验证服务定义:确保 Ingress 配置中指定的后端服务在 Kubernetes 集群内正确定义且可访问。检查服务的 selectorports 字段,以确保它们与相应的 Pod 标签和容器端口匹配。

  2. 检查服务端点:使用 kubectl get endpoints 命令检查后端服务的可用端点。验证是否存在预期数量的端点,并且 IP 地址和端口与运行的 Pod 匹配。

  3. 检查命名空间对齐:确保 Ingress 资源和后端服务在同一个 Kubernetes 命名空间中定义。如果它们在不同的命名空间中,请更新 Ingress 配置以引用后端服务的正确命名空间。

  4. 验证网络配置:确保 Kubernetes 集群内的网络策略、防火墙规则和其他与网络相关的配置不会阻止 Ingress 控制器访问后端服务端点。

  5. 检查 Ingress 控制器日志:查看 Ingress 控制器 Pod 的日志,以收集有关特定错误和任何相关问题的更多信息。

通过遵循这些排查步骤,你可以识别 “Failed to get backend service endpoints” 错误的根本原因,并采取必要的措施来解决问题,确保你的 Ingress 配置能够正确地将流量路由到后端服务。

解决 “Failed to Get Backend Service Endpoints” 问题

在确定 “Failed to get backend service endpoints” 问题的根本原因后,你可以采取以下步骤来解决该问题,并确保你的 Ingress 配置能够正确地将流量路由到后端服务。

验证服务定义

  1. 检查服务 YAML:查看后端服务的 YAML 配置,确保 selectorports 字段定义正确,并且与相应的 Pod 标签和容器端口匹配。
  2. 确认服务存在:使用 kubectl get service 命令确认后端服务在 Kubernetes 集群中存在且正在运行。
  3. 检查服务端点:运行 kubectl get endpoints 以验证后端服务端点(IP 地址和端口)是否正确填充,并且与运行的 Pod 匹配。

解决命名空间不匹配问题

  1. 确认命名空间对齐:确保 Ingress 资源和后端服务在同一个 Kubernetes 命名空间中定义。如果它们在不同的命名空间中,请更新 Ingress 配置以引用后端服务的正确命名空间。
  2. 使用完全限定服务名称:在 Ingress 配置中引用后端服务时,使用完全限定服务名称,包括命名空间,以确保 Ingress 控制器能够正确发现服务端点。

验证网络配置

  1. 检查网络策略:查看 Kubernetes 集群中的网络策略,确保它们不会阻止 Ingress 控制器访问后端服务端点。
  2. 检查防火墙规则:确保任何防火墙规则或网络安全组不会阻止 Ingress 控制器与后端服务之间的通信。
  3. 测试连通性:执行连通性测试,例如通过 kubectl exec 进入 Pod 并使用 curltelnet 等工具,以验证 Ingress 控制器是否能够到达后端服务端点。

分析 Ingress 控制器日志

  1. 获取 Ingress 控制器日志:使用 kubectl logs 命令获取 Ingress 控制器 Pod 的日志,这些日志可能提供有关特定错误和任何相关问题的有价值信息。
  2. 识别错误消息:仔细检查日志中是否有任何错误消息或警告信号,以帮助你查明 “Failed to get backend service endpoints” 问题的根本原因。
  3. 将日志与配置进行关联:将 Ingress 控制器日志与 Ingress 和服务配置进行交叉引用,以识别可能导致问题的任何差异或不匹配。

通过遵循这些步骤,你可以有效地解决 “Failed to get backend service endpoints” 问题,并确保你的 Ingress 配置能够正确地将流量路由到 Kubernetes 集群中的后端服务。

总结

在本教程中,你已经学习了 Kubernetes Ingress 的基本概念,包括 Ingress 控制器的作用和 Ingress 资源的配置。你还了解了如何排查和解决在创建 Ingress 资源时可能出现的 “Failed to get backend service endpoints” 错误。通过理解这些 Ingress 基础知识和故障排除技术,你可以有效地管理对 Kubernetes 应用程序的外部访问,并确保它们的顺利运行。