Istio 服务网格加载项的常规故障排除
本文介绍一般策略 (,这些策略使用 kubectl
、 istioctl
和其他工具) 来排查与 Microsoft Azure Kubernetes 服务 (AKS) 的 Istio 服务网格加载项相关的问题。 本文还提供了可能的错误消息列表、错误发生的原因以及解决这些错误的建议。
先决条件
Kubernetes kubectl 工具或用于连接到群集的类似工具
注意: 若要使用 Azure CLI 安装 kubectl,请运行 az aks install-cli 命令。
Istio istioctl 命令行工具
客户端 URL (cURL) 工具
故障排除清单:使用 kubectl
以下故障排除步骤使用各种 kubectl
命令来帮助你调试 Istio 守护程序 (Istiod) 中停滞的 Pod 或故障。
步骤 1:获取 Istiod Pod 日志
通过运行以下 kubectl logs 命令获取 Istiod Pod 日志:
kubectl logs --selector app=istiod --namespace aks-istio-system
步骤 2:在 pod) 退回 (删除
你可能有充分的理由重启 Pod。 由于 Istiod 是一种部署,因此只需运行 kubectl delete 命令即可安全地删除 Pod:
kubectl delete pods <istio-pod> --namespace aks-istio-system
Istio Pod 由部署管理,因此在直接删除 Istio Pod 后,会自动重新创建并重新部署 Pod。 因此,删除 Pod 是重启 Pod 的替代方法。
注意
或者,可以通过运行以下 kubectl 推出 restart 命令直接重启部署:
kubectl rollout restart deployment <istiod-asm-revision> --namespace aks-istio-system
步骤 3:检查资源状态
如果未计划 Istiod,或者 Pod 未响应,则可能需要检查部署的状态和副本 (replica) 设置。 为此,请运行 kubectl get 命令:
kubectl get <resource-type> [[--selector app=istiod] | [<resource-name>]]
当前资源状态显示在输出末尾附近。 输出可能还显示与其控制器循环关联的事件。
步骤 4:获取自定义资源定义类型
若要查看 Istio 使用的自定义资源定义类型 (CRD) ,请 kubectl get
运行 命令:
kubectl get crd | grep istio
接下来,运行以下命令 kubectl get
,列出基于特定 CRD 的所有资源名称:
kubectl get <crd-type> --all-namespaces
步骤 5:查看 Istiod Pod 列表
运行以下命令 kubectl get
,查看 Istiod Pod 的列表:
kubectl get pod --namespace aks-istio-system --output yaml
步骤 6:获取有关 Envoy 配置的详细信息
如果 Pod 之间存在连接问题,请针对 Envoy 的管理端口运行以下 kubectl exec 命令,获取有关 Envoy 配置的详细信息:
kubectl exec --namespace <pod-namespace> \
"$(kubectl get pods \
--namespace <pod-namespace> \
--selector app=sleep \
--output jsonpath='{.items[0].metadata.name}')" \
--container sleep \
-- curl -s localhost:15000/clusters
步骤 7:获取源和目标挎斗的挎斗日志
在源 Pod 的第一次和目标 pod 的第一次 (第二次) ,通过运行以下命令 kubectl logs
两次来检索源和目标 sidecar 的 sidecar 日志:
kubectl logs <pod-name> --namespace <pod-namespace> --container istio-proxy
故障排除清单:使用 istioctl
以下故障排除步骤介绍如何通过运行各种 istioctl
命令来收集信息并调试网格环境。
警告
某些 istioctl
命令向所有挎斗发送请求。
注意
在开始之前,请注意,大多数 istioctl
命令都要求你了解控制平面修订。 可以从 Istiod 部署或 Pod 的后缀获取此信息,也可以运行以下 istioctl 标记列表 命令:
istioctl tag list
步骤 1:确保正确安装 Istio
若要验证是否已安装正确的 Istio 加载项,请运行以下 istioctl verify-install 命令:
istioctl verify-install --istioNamespace aks-istio-system --revision <tag>
步骤 2:分析命名空间
若要分析所有命名空间或分析特定命名空间,请运行以下 istioctl analyze 命令:
istioctl analyze --istioNamespace aks-istio-system \
--revision <tag> \
[--all-namespaces | --namespace <namespace-name>] \
[--failure-threshold {Info | Warning | Error}]
步骤 3:获取代理状态
若要检索代理状态,请运行以下 istioctl proxy-status 命令:
istioctl proxy-status pod/<pod-name> \
--istioNamespace aks-istio-system \
--revision <tag> \
--namespace <pod-namespace>
步骤 4:下载代理配置
若要下载代理配置,请运行以下 istioctl proxy-config all 命令:
istioctl proxy-config all <pod-name> \
--istioNamespace aks-istio-system \
--namespace <pod-namespace> \
--output json
注意
可以使用以下变体之一,而不是使用 all
命令的 istioctl proxy-config
变体:
步骤 5:检查注入状态
若要检查资源的注入状态,请运行以下 istioctl 实验检查注入命令:
istioctl experimental check-inject --istioNamespace aks-istio-system \
--namespace <pod-namespace> \
--labels <label-selector> | <pod-name> | deployment/<deployment-name>
步骤 6:获取完整的 bug 报告
完整的 bug 报告包含最详细的信息。 但是,在大型群集上,它也可能很耗时,因为它包括所有 Pod。 可以将 bug 报告限制为某些命名空间。 还可以将报表限制为某些部署、Pod 或标签选择器。
若要检索 bug 报告,请运行以下 istioctl bug-report 命令:
istioctl bug-report --istioNamespace aks-istio-system \
[--include <namespace-1>[, <namespace-2>[, ...]]]
故障排除清单:其他问题
步骤 1:修复资源使用问题
如果在 Envoy 中遇到高内存消耗,请 检查双击 Envoy 设置进行统计信息数据收集。 如果要通过 MeshConfig自定义 Istio 指标,请记住,某些指标可能具有较高的基数,因此会产生更高的内存占用量。 MeshConfig 中的其他字段(如并发)会影响 CPU 使用率,应仔细配置。
默认情况下,Istio 会将有关群集中所有服务的信息添加到每个 Envoy 配置。 Sidecar 可以将此添加的范围限制为仅特定命名空间中的工作负荷。 有关详细信息,请参阅 注意此 Istio 代理挎斗内存陷阱。
例如,命名空间中的aks-istio-system
以下Sidecar
定义将跨网格的所有代理的 Envoy 配置限制为aks-istio-system
与该特定应用程序相同的命名空间中的其他工作负荷。
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: sidecar-restrict-egress
namespace: aks-istio-system # Needs to be deployed in the root namespace.
spec:
egress:
- hosts:
- "./*"
- "aks-istio-system/*"
还可以尝试在 MeshConfig 中使用 Istio discoverySelectors 选项。 选项 discoverySelectors
包含 Kubernetes 选择器数组,它可以将 Istiod 的感知限制为特定命名空间 (,而不是群集) 中的所有命名空间。 有关详细信息,请参阅 使用发现选择器为 Istio 服务网格配置命名空间。
步骤 2:修复流量和安全配置错误问题
若要解决 Istio 用户经常遇到的常见流量管理和安全错误配置问题,请参阅 Istio 网站上的流量管理问题和安全问题。
有关其他问题(如挎斗注入、可观测性和升级)的讨论链接,请参阅 Istio 文档站点上的 常见问题 。
步骤 3:避免 CoreDNS 重载
与 CoreDNS 重载相关的问题可能需要更改某些 Istio DNS 设置,例如 dnsRefreshRate
Istio MeshConfig 定义中的 字段。
步骤 4:修复 pod 和 sidecar 争用条件
如果应用程序 Pod 在 Envoy sidecar 启动之前启动,则应用程序可能会无响应,或者可能会重启。 有关如何避免此问题的说明,请参阅 Pod 或容器在 istio-proxy 未就绪时从网络问题开始。 具体来说,将“MeshConfig”字段设置为 holdApplicationUntilProxyStarts
下defaultConfig
true
有助于防止这些争用情况。
错误消息
下表包含 (可能的错误消息列表,这些错误消息 (用于部署加载项、启用入口网关和执行升级) 、发生错误的原因以及解决错误的建议。
错误 | Reason | 建议 |
---|---|---|
Azure service mesh is not supported in this region |
此功能在预览版期间在区域中不可用, (它在公有云中提供,但在主权云) 不可用。 | 请参阅有关受支持区域上的功能的公共文档。 |
Missing service mesh mode: {} |
未在托管群集请求的服务网格配置文件中设置 mode 属性。 | 在 API 请求的 managedCluster ServiceMeshProfile 字段中,将 mode 属性设置为 Istio 。 |
Invalid istio ingress mode: {} |
在服务网格配置文件中添加入口时,为入口模式设置无效值。 | 将 API 请求中的入口模式设置为 External 或 Internal 。 |
Too many ingresses for type: {}. Only {} ingress gateway are allowed |
你尝试在群集上创建过多的入口。 | Create群集上最多一个外部入口和一个内部入口。 |
Istio profile is missing even though Service Mesh mode is Istio |
你启用了 Istio 加载项,但未提供 Istio 配置文件。 | 启用 Istio 加载项时,请指定特定于组件的 (入口网关、插件 CA) Istio 配置文件和特定修订版的信息。 |
Istio based Azure service mesh is incompatible with feature %s |
你尝试使用当前与 Istio 加载项不兼容的另一个扩展、加载项或功能 (例如 Open Service Mesh) 。 | 在启用 Istio 加载项之前,请先禁用其他功能并清理所有相应的资源。 |
ServiceMeshProfile is missing required parameters: %s for plugin certificate authority |
你没有为插件 CA 提供所有必需的参数。 | 有关详细信息, (提供插件证书颁发机构 (CA) 功能所需的所有参数,请参阅 使用插件 CA 证书) 设置基于 Istio 的服务网格加载项 。 |
AzureKeyvaultSecretsProvider addon is required for Azure Service Mesh plugin certificate authority feature |
在使用插件 CA 之前,你未启用 AKS Secrets-Store CSI 驱动程序加载项。 | 在使用插件 CA 功能之前,请设置 Azure 密钥保管库。 |
'KeyVaultId': '%s' is not a valid Azure keyvault resource identifier. Please make sure that the format matches '/subscriptions//resourceGroups//providers/Microsoft.KeyVault/vaults/' |
你使用了无效的 AKS 资源 ID。 | 请参阅错误消息中提到的格式,为插件 CA 功能设置有效的 Azure 密钥保管库 ID。 |
Kubernetes version is missing in orchestrator profile |
请求缺少 Kubernetes 版本。 因此,它无法执行版本兼容性检查。 | 请确保在 Istio 加载项升级操作中提供 Kubernetes 版本。 |
Service mesh revision %s is not compatible with cluster version %s. To find information about mesh-cluster compatibility, use 'az aks mesh get-upgrades' |
你尝试启用与当前 Kubernetes 群集版本不兼容的 Istio 加载项修订版。 | 使用 az aks mesh get-upgrades Azure CLI 命令了解哪些 Istio 加载项修订可用于当前群集。 |
Kubernetes version %s not supported. Please upgrade to a supported cluster version first. To find compatibility information, use 'az aks mesh get-upgrades' |
你使用的是不受支持的 Kubernetes 版本。 | 升级到支持的 Kubernetes 版本。 |
ServiceMeshProfile revision field must not be empty |
您尝试升级 Istio 加载项,但未指定修订。 | (指定修订和所有其他参数,有关详细信息,请参阅 次要修订升级) 。 |
Request exceeds maximum allowed number of revisions (%d) |
你尝试执行升级操作,即使已安装 (%d) 了修订版。 |
在升级到另一个修订版之前,请完成或回滚升级操作。 |
Mesh upgrade is in progress. Please complete or roll back the current upgrade before attempting to retrieve versioning and compatibility information |
在完成或回滚当前升级操作之前,你尝试访问修订和兼容性信息。 | 在检索修订和兼容性信息之前,请完成或回滚当前升级操作。 |
参考
有关 Istio 调试的一般提示,请参阅 Istio 诊断工具
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。