Istio 服务网格加载项的常规故障排除
本文讨论一般策略(使用kubectl
)istioctl
和其他工具,以解决与 istio 服务网格加载项相关的问题,Microsoft Azure Kubernetes 服务 (AKS)。 本文还提供了可能出现的错误消息、错误发生原因和建议的列表,以及解决这些错误的建议。
先决条件
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 由部署管理。 直接删除后,会自动重新创建和重新部署它。 因此,删除 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
备注
可以使用下列变体之一,而不是使用 all
命令的 istioctl proxy-config
变体:
步骤 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 字段defaultConfig
true
设置为有助于防止这些争用条件。
步骤 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 请求中的入口模式设置为或 External Internal 。 |
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 |
在完成或回滚当前升级操作之前,你尝试访问修订和兼容性信息。 | 在检索修订和兼容性信息之前,请完成或回滚当前升级操作 。 |
参考
有关 Istio 调试的常规提示,请参阅 Istio 诊断工具
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。