解决 Cloud Service Mesh 中的边车代理/webhook 问题
本部分介绍常见的 Cloud Service Mesh 问题以及如何解决 。如果您需要其他帮助,请参阅获取支持。
Cloud Service Mesh 包含两个 webhook:
- 验证网络钩子可确保应用的 Istio 配置有效。
- 更改网络钩子会在新 pod 上设置自动 Sidecar 注入。
这些 Webhook 中的配置问题可能会导致新 Pod 启动失败,或 kubectl apply
生成错误消息。
Sidecar 注入问题
如果您已预配代管式 Cloud Service Mesh,请与支持团队联系。
如果您看到以下任何情况,则说明 Sidecar 注入不正常:
- 正在调度的 Pod 没有 Sidecar
- 使用
kubectl get pods
,但从存储分区 “kubectl get replicaset
”已存在。
请按照以下步骤排查 Sidecar 注入问题。
验证您的命名空间或 Pod 是否具有正确的注入标签。
如果您运行的是单个修订版本的 Istio(默认情况),请验证您的命名空间或 Pod 规范是否具有 istio-inject=enabled 标签。
如果您运行的是多个修订版本的 Istio(为了实现零停机迁移, 多个控制平面等),请验证您的命名空间或 Pod 规范是否 相应的
istio.io/rev=REVISION
标签,其中 REVISION 是istiod
上的 Cloud Service Mesh 修订版本号 。如需详细了解修订版本标签,请参阅注入边车代理。验证您的 Istio Sidecar 注入 Webhook 是否存在以及是否具有 CA 软件包。
Sidecar 注入器 Webhook(用于自动执行 Sidecar 注入)需要使用 CA 软件包,以便与 API 服务器和
istiod
建立安全连接。此 CA 软件包由istiod
修补到配置中,但有时可能会被覆盖(例如,如果您重新应用 Webhook 配置)。您可以使用以下命令验证 CA 软件包是否存在。通过 命令包含
istio-sidecar-injector-asm-1226-2
, 此版本 Cloud Service Mesh 特有的功能。如果实际修订版本不同,请确保使用它。kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io istio-sidecar-injector-asm-1226-2 -o=jsonpath='{.webhooks[0].clientConfig.caBundle}'
如果输出不为空,则说明 CA 软件包已配置。如果缺少 CA 软件包,请重启
istiod
以使其重新扫描 Webhook 并重新安装 CA 软件包。检查是否存在 Sidecar 注入故障。
如果您已启用注入,但未看到 Pod 调度,请检查下一个更高级别的抽象的状态。例如,如果您正在运行部署,但没有 pod 被调度,请使用以下命令检查相应副本集的状态:
kubectl -n my-namespace describe replicaset your-deployment-name
如果存在副本集,请检查说明底部的事件日志中是否存在错误。如果错误与 Sidecar 注入相关,请检查
istiod
日志,了解导致错误的原因。如果问题仍然存在,则问题可能是以下任何一种:
- 系统向注入器传递了错误的配置
- 防火墙配置有问题
- Istio 代码本身有问题
如需查看额外的诊断步骤,请参阅排查 Istio 问题。
Envoy 代理不会收到来自 istiod
的配置
有多种问题会导致代理无法收到来自 istiod
的配置。
istiod
在出现问题(例如阻止它读取其配置资源的 RBAC 问题)时不会将配置推送到 Envoy 代理。探索地址不正确(“没有运行状况良好的上游”错误)
提供给 Sidecar 注入器的探索地址不正确。如果您看到提及
gRPC config stream closed, no healthy upstream
的日志,请检查网格ProxyConfig
中的发现地址是否正确并指向您的istiod
服务。正在推送到代理的配置无效。在这种情况下,配置会成功推送到代理,但配置无效。您将看到类似于以下内容的重复消息:
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
是集群发现服务(报告 1 从istiod
推送了更新),lds
是监听器发现服务 (报告了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 提供连接。如需了解详情,请参阅在专用集群上打开端口。 |