本文介绍如何对 Azure Kubernetes 服务(AKS)的 Istio 服务网格加载项上的出口网关问题进行故障排除。
概述
Istio 附加组件出口网关是基于 Envoy 的代理,可用于将网格中应用程序的出站流量进行路由。 Istio 出口网关是一种 ClusterIP 类型服务。 因此,它不会在外部公开。
Istio 加载项出口网关严格依赖于 静态出口网关功能。 必须先在群集上启用静态出口网关功能,然后才能启用 Istio 加载项出口网关。
可以在不同的命名空间中使用Deployment或Servicename,为每个群集创建多个 Istio 加载项出口网关,每个群集最多可有500个出口网关。
故障排除前
在继续之前,请执行以下操作。
- 安装 Azure CLI
aks-preview版本14.0.0b2或更高版本以启用 Istio 插件 Egress 网关。 - 在群集上启用 静态出口网关功能 ,创建模式
gateway代理池,并配置StaticGatewayConfiguration自定义资源。
网络和防火墙错误故障排除
步骤 1:确保防火墙或出站流量规则不会阻止出口流量
如果使用 Azure 防火墙、网络安全组(NSG)规则或其他出站流量限制,请确保将 Istio 加载项出口网关egressIpPrefix的 StaticGatewayConfigurations IP 范围添加到出口通信允许列表。
步骤 2:验证群集容器网络接口 (CNI) 插件
由于 Azure CNI Pod 子网 群集当前不支持静态出口网关,因此 Istio 加载项出口网关不能用于 Azure CNI Pod 子网群集。
出口网关预配问题疑难解答
步骤 1:验证 Istio 出口网关部署和服务是否已预配
每个 Istio 出口网关都应预配相应的部署和服务。 运行以下命令,验证 Istio 出口网关部署和服务是否已预配:
kubectl get deployment $ISTIO_EGRESS_DEPLOYMENT_NAME -n $ISTIO_EGRESS_NAMESPACE
kubectl get service $ISTIO_EGRESS_NAME -n $ISTIO_EGRESS_NAMESPACE
部署的名称采用以下格式: <istio-egress-gateway-name>-<asm-revision>。 例如,如果出口网关的名称为 aks-istio-egressgateway,Istio 加载项修订为 asm-1-24,则部署的名称为 aks-istio-egressgateway-asm-1-24。
你应该看到 Istio 出口网关的服务类型ClusterIP,并且应该分配一个服务 VIP。 服务的名称与 Istio 出口网关的名称相同,无需追加任何 revision 附加。 例如,aks-istio-egressgateway。
步骤 2:确保准入控制器不会阻止 Istio 出口配置
确保自主管理的变更和验证 Webhook 不会阻止配置 Istio 出口网关资源。 由于 Istio 出口网关可以部署在用户管理的命名空间中, AKS 许可强制程序 无法阻止自定义允许控制器影响 Istio 出口网关资源。
步骤 3:验证 Istio 插件出口网关名称是否有效
Istio 出口网关名称必须:
- 长度为 63 个字符或更少。
- 仅包含小写字母数字字符、句点(.)和连字符(-)。
- 以小写字母数字字符开头和结尾。
- 有效的域名系统(DNS)名称。
Istio 出口名称验证的正则表达式为 ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$.
步骤 4:如果 Istio 出口部署未准备就绪,请检查静态出口网关组件
如果静态出口网关组件(如 kube-egress-gateway-cni-manager 停止响应)或其他问题会影响静态出口 IP 分配,Istio 出口网关预配可能会失败。 在这种情况下,排查静态出口网关错误或配置不当情况。
静态出口网关错误或配置问题排查
步骤 1:检查 Istio 出口网关的静态网关配置 (StaticGatewayConfiguration)
请确保 StaticGatewayConfiguration Istio 附加组件出口网关的资源配置有效,并未被删除:
请检查
gatewayConfigurationName以查找 Istio 插件出口网关的StaticGatewayConfiguration名称:az aks show -g $RESOURCE_GROUP -n $CLUSTER_NAME -o json | jq '.serviceMeshProfile.istio.components.egressGateways' | grep $ISTIO_EGRESS_NAME -B1验证 Istio 附加组件出口网关的 Pod
spec是否有kubernetes.azure.com/static-gateway-configuration注释设置为该 Istio 附加组件出口网关的gatewayConfigurationName。kubectl get pod $ISTIO_EGRESS_POD_NAME -n $ISTIO_EGRESS_NAMESPACE -o jsonpath={.metadata.annotations."kubernetes\.azure\.com\/static-gateway-configuration"}
步骤 2:确保为 StaticGatewayConfiguration 配置 egressIpPrefix
如果 Istio 出口网关 Pod 陷入ContainerCreating状态,kube-egress-gateway-cni-manager Pod 可能会阻止创建istio-proxy容器,因为StaticGatewayConfiguration资源尚未分配egressIpPrefix。 若要验证是否已将某个 egressIpPrefix 分配给资源,请检查 StaticGatewayConfiguration 的 status 值,以查看该 Istio 出口网关的状态。 要确定是否有任何错误影响 egressIpPrefix 预配,请在 StaticGatewayConfiguration 上运行 kubectl describe 命令。
注释
要将 egressIpPrefix 分配给静态出口网关 StaticGatewayConfiguration 的过程可能需要最多五分钟。
kubectl get staticgatewayconfiguration $ISTIO_SGC_NAME -n $ISTIO_EGRESS_NAMESPACE -o jsonpath='{.status.egressIpPrefix}'
kubectl describe staticgatewayconfiguration $ISTIO_SGC_NAME -n $ISTIO_EGRESS_NAMESPACE
你还可以查看运行在失败的 Istio 出口 Pod 节点上的 kube-egress-gateway-cni-manager Pod 的日志。 如果任何问题影响 egressIpPrefix 预配,或者大约五分钟后仍未分配 IP 前缀,则可能需要进一步 调试静态出口网关。
步骤 3:确保 StaticGatewayConfiguration 引用有效的网关代理池
验证每个 Istio 出口网关的 spec.gatewayNodepoolName 是否在群集上引用模式类型为 Gateway 的有效代理池 StaticGatewayConfiguration。 如果任何 Istio 增强功能出口网关 StaticGatewayConfiguration 通过 spec.gatewayNodepoolName 引用了某个代理池,则不应删除 Gateway 代理池。
步骤 4:尝试从 Istio 出口网关发送外部请求
验证来自 Istio 出口网关的请求是否通过静态出口网关节点池正确路由。 若要执行此作,请使用 kubectl debug 命令创建 Kubernetes 临时容器,并验证来自 Istio 出口 Pod 的请求的源 IP。 请确保暂时将outboundTrafficPolicy.mode设置为ALLOW_ANY,以便出口网关可以访问ifconfig.me。 安全最佳实践是建议您在完成调试后将 outboundTrafficPolicy.mode 还原为 REGISTRY_ONLY。
kubectl debug -it --image curlimages/curl $ISTIO_EGRESS_POD_NAME -n $ISTIO_EGRESS_NAMESPACE -- curl ifconfig.me
返回的源 IP 地址应与与该 Istio 出口网关关联的值egressIpPrefix匹配StaticGatewayConfiguration。 如果请求失败或返回的源 IP 地址不匹配egressIpPrefix,请尝试使用静态出口网关重启 Istio 出口网关部署或调试潜在问题。
步骤 5:尝试将请求从未注入的 Pod 发送到外部服务
识别问题是否由 Istio 插件出口网关或静态出口网关引起的另一种方法是直接从未注入的 Pod(即 Istio 网格外部的 Pod)发送请求。 可以使用 curl 示例应用程序。 在spec.template.metadata.annotations下,将kubernetes.azure.com/static-gateway-configuration批注设置为Istio附加组件出口网关的相同的gatewayConfigurationName。
如果来自未连接 Pod 的请求失败,请尝试调试影响 静态出口网关的潜在问题。 如果来自未登录 Pod 的请求成功,请验证 Istio 出口网关配置。
步骤 6:尝试重启 Istio 出口网关部署
为了使某些 StaticGatewayConfiguration 字段(例如 defaultRoute 和 excludeCidrs)的更改生效,必须重启 Istio 附加组件出口网关 Pod。
可以通过触发出口网关部署重启来弹跳 Pod:
kubectl rollout restart deployment $ISTIO_EGRESS_DEPLOYMENT_NAME -n $ISTIO_EGRESS_NAMESPACE
步骤 7:尝试为 Istio 插件出口网关创建新的 StaticGatewayConfiguration
StaticGatewayConfiguration如果 Istio 加载项出口网关出错,请尝试在同一命名空间中创建新的StaticGatewayConfiguration自定义资源。 然后运行以下命令az aks mesh enable-egress-gateway以更新gatewayConfigurationName。 建议您等待,直到新创建的StaticGatewayConfiguration被分配egressIpPrefix。
az aks mesh enable-egress-gateway --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --istio-egressgateway-name $ISTIO_EGRESS_NAME --istio-egressgateway-namespace $ISTIO_EGRESS_NAMESPACE --gateway-configuration-name $NEW_ISTIO_SGC_NAME
更新出口网关以使用新的StaticGatewayConfiguration后,如果没有其他 Istio 扩展模块的出口网关在使用StaticGatewayConfiguration,则您应该可以删除旧的StaticGatewayConfiguration。
步骤 8:调试静态出口网关
如果在验证 正确配置 Istio 出口路由后,影响通过 Istio 加载项出口网关的出口路由的错误仍然存在,则影响静态出口网关的基础网络或基础结构问题可能仍然存在。 有关详细信息,请参阅 在 Azure Kubernetes 服务(AKS)中配置静态出口网关。
Istio 出口配置和自定义资源故障排除
有关 Istio 出口配置的详细信息,请参阅 出口网关。
注释
网关 API 目前不支持 Istio 加载项的出口网关。 必须使用 Istio 自定义资源配置网关,才能从 Azure 接收对与 Istio 出口网关相关的问题的支持。
步骤 1:启用 Envoy 访问日志记录
可以通过 Istio MeshConfig 或 遥测 API 启用 Envoy 访问日志记录,以检查流经出口网关的流量。
步骤 2:检查 Istio 出口网关和 istiod 日志
若要检查 Istio 外挂程序的出口网关容器 istio-proxy 中的日志,请运行以下命令:
kubectl logs $ISTIO_EGRESS_POD_NAME -n $ISTIO_EGRESS_NAMESPACE
日志中出现的 info Envoy proxy is ready 消息表明 Istio 出口网关节点 Pod 可以与 istiod 建立通信,并已准备好处理流量。
我们还建议您检查控制平面日志中是否存在与更新 Istio 出站网关配置相关的任何 Envoy 错误。
步骤 3:验证 Istio 网关配置
请确保Gateway自定义资源中的selector正确设置。 例如,如果用于 Istio 出口网关的Gateway对象使用istio:选择器,那么它必须匹配该出口网关的 Kubernetes 服务spec中的istio标签的值。
例如,对于具有以下 Kubernetes 服务的出口网关spec:
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: asm-egx-asm-egress-test
meta.helm.sh/release-namespace: istio-egress-ns
creationTimestamp: "2025-04-19T21:50:08Z"
labels:
app: asm-egress-test
azureservicemesh/istio.component: egress-gateway
istio: asm-egress-test
自定义资源应按如下所示进行配置:
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: asm-egress-test
步骤 4:确保创建了 ServiceEntry 自定义资源并启用了 DNS 解析
请确保为出口网关转发请求的特定外部服务创建自定义 ServiceEntry 资源。 即使outboundTrafficPolicy.mode被设置为ALLOW_ANY,仍可能需要创建ServiceEntry自定义资源。 此条件存在,因为 Gateway, VirtualService和 DestinationRule 自定义资源可能通过 ServiceEntry 名称引用外部主机。 此外,当为 Istio 出口网关配置 ServiceEntry 自定义资源时,必须将 spec.resolution 设置为 DNS。
默认情况下, ServiceEntries 导出到所有命名空间。 若要将某个ServiceEntry命名空间的范围限制为特定命名空间,请使用exportTo规范中的字段。
步骤 5:验证出口网关 mTLS 源的 Kubernetes 机密命名空间
如果尝试将 Istio 出口网关配置为执行相互 TLS (mTLS) 发起,请确保 Kubernetes 机密对象位于部署出口网关的同一命名空间中。
步骤 6:确保应用程序为出口网关 TLS 发起和授权策略发送纯文本 HTTP 请求
若要在出口网关上发起 TLS 并应用授权策略,网格中的工作负荷必须发送 HTTP 请求。 然后,当 sidecar 代理将请求转发到出口网关时,可以使用 mTLS。 出口网关终止 mTLS 连接,并发起与目标主机的 TLS/HTTPS 连接。
第三方信息免责声明
本文讨论的第三方产品由独立于微软的公司制造。 Microsoft对这些产品的性能或可靠性不作任何明示或暗示的保证。
第三方联系人免责声明
为了帮助您获取有关此主题的更多信息,Microsoft 提供了第三方的联系信息。 该联系信息可能会在不通知的情况下更改。 微软不保证第三方联系信息的准确性。
联系我们以获得帮助
如果有疑问,可以询问 Azure 社区支持。 您还可以向Azure反馈社区提交产品反馈。