解决 Cloud Service Mesh 中的边车代理/Webhook 问题

本部分介绍常见的 Cloud Service Mesh 问题以及如何解决这些问题。如果您需要其他帮助,请参阅获取支持

Cloud Service Mesh 包含两个webhooks

  • 验证网络钩子可确保应用的 Istio 配置有效。
  • 更改网络钩子会在新 pod 上设置自动 Sidecar 注入。

这些 Webhook 中的配置问题可能会导致新 Pod 启动失败,或 kubectl apply 生成错误消息。

Sidecar 注入问题

如果您看到以下任何情况,则说明 Sidecar 注入不正常:

  • 正在调度的 Pod 没有 Sidecar
  • 使用 kubectl get pods 时,应该注入 Sidecar 的 pod 未显示,但 kubectl get replicaset 中的相应副本集却存在。

请按照以下步骤排查 Sidecar 注入问题。

  1. 验证您的命名空间或 Pod 是否具有正确的注入标签。

    如果您运行的是单个修订版本的 Istio(默认情况),请验证您的命名空间或 Pod 规范是否具有 istio-inject=enabled 标签。

    如果您运行的是多个修订版本 Istio(用于零停机时间迁移、多个控制层面等),请验证命名空间或 pod 规范是否具有正确的 istio.io/rev=REVISION 标签,其中 REVISIONistiod 上的 Cloud Service Mesh 修订版本号,对应于您选择的 Cloud Service Mesh 版本。如需详细了解修订版本标签,请参阅注入边车代理

  2. 验证您的 Istio Sidecar 注入 Webhook 是否存在以及是否具有 CA 软件包。

    Sidecar 注入器 Webhook(用于自动执行 Sidecar 注入)需要使用 CA 软件包,以便与 API 服务器和 istiod 建立安全连接。此 CA 软件包由 istiod 修补到配置中,但有时可能会被覆盖(例如,如果您重新应用 Webhook 配置)。

    您可以使用以下命令验证 CA 软件包是否存在。该命令包含 istio-sidecar-injector-asm-1233-2,它特定于此版本的 Cloud Service Mesh。如果实际修订版本不同,请确保使用它。

    kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io istio-sidecar-injector-asm-1233-2 -o=jsonpath='{.webhooks[0].clientConfig.caBundle}'

    如果输出不为空,则说明 CA 软件包已配置。如果缺少 CA 软件包,请重启 istiod 以使其重新扫描 Webhook 并重新安装 CA 软件包。

  3. 检查是否存在 Sidecar 注入故障。

    如果您已启用注入,但未看到 Pod 调度,请检查下一个更高级别的抽象的状态。例如,如果您正在运行部署,但没有 pod 被调度,请使用以下命令检查相应副本集的状态:

    kubectl -n my-namespace describe replicaset your-deployment-name

    如果存在副本集,请检查说明底部的事件日志中是否存在错误。如果错误与 Sidecar 注入相关,请检查 istiod 日志,了解导致错误的原因。

  4. 如果问题仍然存在,则问题可能是以下任何一种:

    • 系统向注入器传递了错误的配置
    • 防火墙配置有问题
    • Istio 代码本身有问题

    如需查看额外的诊断步骤,请参阅排查 Istio 问题

Envoy 代理不会收到来自 istiod 的配置

有多种问题会导致代理无法收到来自 istiod 的配置。

  1. istiod 在出现问题(例如阻止它读取其配置资源的 RBAC 问题)时不会将配置推送到 Envoy 代理。

  2. 探索地址不正确(“没有运行状况良好的上游”错误)

  3. 提供给 Sidecar 注入器的探索地址不正确。如果您看到提及 gRPC config stream closed, no healthy upstream 的日志,请检查网格 ProxyConfig 中的发现地址是否正确并指向您的 istiod 服务。

  4. 正在推送到代理的配置无效。在这种情况下,配置会成功推送到代理,但配置无效。您将看到类似于以下内容的重复消息:

    Envoy proxy is NOT ready: config not received from Pilot (is Pilot running?): cds updates: 1 successful, 0 rejected; lds updates: 0 successful, 1 rejected

    在此示例中,cds 是 Cluster Discovery Service(用于报告从 istiod 推送的 1 项更新),lds 是 Listener Discovery Service(用于报告 istiod 拒绝的 1 项更新)。通常,您会看到较早的错误消息,其中说明了拒绝的原因,该消息通常以有关 Envoy 配置或类似配置的警告开头。

    如需解决该问题,请调查配置被拒绝的原因。一个常见的原因是 EnvoyFilter 资源有问题。如果没有找出原因,请提交包含代理配置转储文件的 Bug 报告。

Pod 创建失败

如果您发现未成功创建 pod,请使用以下命令查找可能提示根本原因的错误消息:

kubectl describe replicaset YOUR_REPLICA_SET

常见的 Webhook 错误消息

kubectl apply 命令输出的错误消息可提供有关其根本原因的提示。如需查看常见错误消息、错误原因以及可能的解决方法,请参阅下表。

错误消息 原因 解决方法
net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这可能是网络连接问题。 请确保您的防火墙规则通过端口 15017 为“istiod”提供连接。
no endpoints available for service 'istiod' 如果“istiod”pod 不可用或尚未准备就绪,就可能会发生这种情况。 检查“istiod”pod,确保它们正常运行且准备就绪。
Service "istiod" not found 如果“istiod”服务不存在,就可能发生这种情况。 验证您的 Istio 是否成功正确安装。
x509: certificate signed by unknown authority 这可能是网络钩子证书问题。 检查网络钩子上是否已正确设置 caBundle
Failed to update validatingwebhookconfiguration istio-validator-asm-[version-n]-istio-system (failurePolicy=Fail, resourceVersion=[version]): Operation cannot be fulfilled on validatingwebhookconfigurations.admissionregistration.k8s.io "istio-validator-asm-[version-n]-istio-system": the object has been modified; please apply your changes to the latest version and try again. 来自已卸载的旧版 Istio 或 Cloud Service Mesh 的验证网络钩子可能会干扰升级或安装。 检查以确认所有网络钩子仍在集群中,并移除所有引用不再安装的版本的网络钩子。
Error from server (InternalError): Internal error occurred: failed calling webhook "rev.namespace.sidecar-injector.istio.io": Post "https://istiod-asm-1122-0.istio-system.svc:443/inject?timeout=10s": context deadline exceeded 对于专用集群,端口 15017 必须处于打开状态。此错误消息表示端口 15017 可能无法打开。 请确保您的防火墙规则通过端口 15017 为 Istio 提供连接。如需了解详情,请参阅在专用集群上打开端口