Istio 服务网格加载项的常规故障排除

本文介绍一般策略 (,这些策略使用 kubectlistioctl和其他工具) 来排查与 Microsoft Azure Kubernetes 服务 (AKS) 的 Istio 服务网格加载项相关的问题。 本文还提供了可能的错误消息列表、错误发生的原因以及解决这些错误的建议。

先决条件

故障排除清单:使用 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

步骤 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”字段设置为 holdApplicationUntilProxyStartsdefaultConfigtrue有助于防止这些争用情况。

错误消息

下表包含 (可能的错误消息列表,这些错误消息 (用于部署加载项、启用入口网关和执行升级) 、发生错误的原因以及解决错误的建议。

错误 Reason 建议
Azure service mesh is not supported in this region 此功能在预览版期间在区域中不可用, (它在公有云中提供,但在主权云) 不可用。 请参阅有关受支持区域上的功能的公共文档。
Missing service mesh mode: {} 未在托管群集请求的服务网格配置文件中设置 mode 属性。 在 API 请求的 managedClusterServiceMeshProfile 字段中,将 mode 属性设置为 Istio
Invalid istio ingress mode: {} 在服务网格配置文件中添加入口时,为入口模式设置无效值。 将 API 请求中的入口模式设置为 ExternalInternal
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 在完成或回滚当前升级操作之前,你尝试访问修订和兼容性信息。 在检索修订和兼容性信息之前,请完成或回滚当前升级操作

参考

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。