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

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

先决条件

故障排除清单:使用 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 由部署管理。 直接删除后,会自动重新创建和重新部署它。 因此,删除 Pod 是重启 Pod 的替代方法。

备注

或者,可以通过运行以下 kubectl 推出重启 命令直接重启部署:

kubectl rollout restart deployment <istiod-asm-revision> --namespace aks-istio-system

步骤 3:检查资源的状态

如果未计划 Istiod,或者 Pod 未响应,则可能需要检查部署和副本集的状态。 为此,请 运行 kubectl get 命令:

kubectl get <resource-type> [[--selector app=istiod] | [<resource-name>]]

当前资源状态显示在输出末尾附近。 输出还可能显示与其控制器循环关联的事件。

步骤 4:获取自定义资源定义类型

若要查看 Istio 使用的自定义资源定义(CRDs)类型,请 kubectl get 运行以下命令:

kubectl get crd | grep istio

若要列出基于特定 CRD 的所有资源名称, kubectl get 请运行以下命令:

kubectl get <crd-type> --all-namespaces

步骤 5:查看 Istiod Pod 列表

若要查看 Istiod Pod 列表,请 kubectl get 运行以下命令:

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:获取源和目标 sidecar 的 sidecar 日志

通过运行以下命令 kubectl logs 两次(源 Pod 第一次,第二次为目标 Pod)检索源和目标 sidecar 的 sidecar 日志:

kubectl logs <pod-name> --namespace <pod-namespace> --container istio-proxy

故障排除清单:使用 istioctl

以下故障排除步骤介绍如何通过运行各种 istioctl 命令来收集信息和调试网格环境。

所有 istioctl 命令都必须与标志一起运行, --istioNamespace aks-istio-system 以指向 Istio 的 AKS 加载项安装。

警告

某些 istioctl 命令将请求发送到所有 sidecars。

备注

在开始之前,请注意,大多数 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 试验性 check-inject 命令:

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 代理 sidecar 内存陷阱

例如,命名空间中的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 网站上的流量管理问题和安全问题

有关有关其他问题(如 sidecar 注入、可观测性和升级)的讨论链接,请参阅 Istio 文档网站上的常见问题

步骤 3:避免 CoreDNS 重载

与 CoreDNS 重载相关的问题可能需要更改某些 Istio DNS 设置,例如 dnsRefreshRate Istio MeshConfig 定义中的字段。

步骤 4:修复 Pod 和侧车比赛条件

如果应用程序 Pod 在 Envoy sidecar 启动之前启动,则应用程序可能会无响应,或者可能会重启。 有关如何避免此问题的说明,请参阅 Pod 或容器以网络问题开头(如果 istio-proxy 尚未准备就绪)。 具体而言,将 holdApplicationUntilProxyStarts MeshConfig 字段defaultConfigtrue设置为有助于防止这些争用条件。

步骤 5:为出站流量使用 HTTP 代理时配置服务条目

如果群集使用 HTTP 代理进行出站 Internet 访问,则必须配置服务条目。 有关详细信息,请参阅 Azure Kubernetes 服务中的 HTTP 代理支持

错误消息

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

错误 原因 建议
Azure service mesh is not supported in this region 此功能在预览版期间在区域中不可用(它在公有云中可用,但不适用于主权云)。 请参阅有关受支持区域功能的公共文档。
Missing service mesh mode: {} 未在托管群集请求的服务网格配置文件中设置模式属性。 API 请求的 managedCluster ServiceMeshProfile 字段中,将mode属性设置为 Istio
Invalid istio ingress mode: {} 在服务网格配置文件中添加入口时,为入口模式设置无效值。 将 API 请求中的入口模式设置为或 ExternalInternal
Too many ingresses for type: {}. Only {} ingress gateway are allowed 你尝试在群集上创建过多的入口。 最多创建一个外部入口和群集上的一个内部入口。
Istio profile is missing even though Service Mesh mode is Istio 未提供 Istio 配置文件,即可启用 Istio 加载项。 启用 Istio 加载项时,请为 Istio 配置文件和特定修订指定特定于组件的(入口网关、插件 CA)信息。
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 机密存储 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 反馈社区