配置适用于 Azure Kubernetes 服务的基于 Istio 的服务网格加载项

开源 Istio 使用 MeshConfig 为 Istio 服务网格定义网格范围的设置。 适用于 AKS 的基于 Istio 的服务网格加载项基于 MeshConfig 生成,并将不同的属性分类为支持、允许和阻止。

本文介绍如何为 Azure Kubernetes 服务配置基于 Istio 的服务网格加载项以及适用于此类配置的支持策略。

先决条件

本指南假定你已按照文档的说明在 AKS 群集上启用 Istio 加载项。

在群集上设置配置

  1. 查看群集上部署的 Istio 版本:

    az aks show --name $CLUSTER --resource-group $RESOURCE_GROUP --query 'serviceMeshProfile'
    

    输出:

    {
      "istio": {
          "certificateAuthority": null,
          "components": {
          "egressGateways": null,
          "ingressGateways": null
          },
          "revisions": [
          "asm-1-18"
          ]
      },
      "mode": "Istio"
    }
    
  2. 使用 aks-istio-system 命名空间中的名称 istio-shared-configmap-<asm-revision> 创建 ConfigMap。 例如,如果群集运行的是网格的 asm-1-18 版本,则需要将 ConfigMap 命名为 istio-shared-configmap-asm-1-18。 必须在网格下的数据部分提供网格配置。

    示例:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: istio-shared-configmap-asm-1-18
      namespace: aks-istio-system
    data:
      mesh: |-
        accessLogFile: /dev/stdout
        defaultConfig:
          holdApplicationUntilProxyStarts: true
    

    defaultConfig 下的值是应用于 Envoy 挎斗代理的网格范围设置。

注意

启用 Istio 加载项时,将在群集上的 aks-istio-system 命名空间中创建默认的 ConfigMap(例如,对于版本 asm-1-18,为 istio-asm-1-18)。 但是,此默认的 ConfigMap 由托管 Istio 加载项协调,因此用户不应直接编辑此 ConfigMap。 用户应在 aks-istio-system 命名空间中创建一个特定于版本的 Istio 共享 ConfigMap(例如,对于版本 asm-1-18,为 istio-shared-configmap-asm-1-18),然后 Istio 控制平面会将其与默认 ConfigMap 合并,默认设置优先。

网格配置和升级

为 Istio 执行 Canary 升级时,需要在启动 Canary 升级前在 aks-istio-system 命名空间中为新版本创建一个单独的 ConfigMap。 这样,在群集上部署新版本的控制平面时,此配置适用。 例如,如果要将网格从 asm-1-18 升级到 asm-1-19,则需要从 istio-shared-configmap-asm-1-18 复制更改,以在 aks-istio-system 命名空间中创建名为 istio-shared-configmap-asm-1-19 的新 ConfigMap。

升级完成后或回滚后,可以删除已从群集中删除的版本的 ConfigMap。

允许、支持和阻止的 MeshConfig 值

MeshConfig 中的字段分类为 allowedsupportedblocked。 若要了解有关这些类别的详细信息,请参阅 Istio 加载项功能和配置选项的支持策略

网格配置和允许/支持的字段列表特定于版本,以考虑跨版本添加/删除的字段。 下表提供了允许字段以及允许列表中支持/不支持的字段的完整列表。 当新的网格版本可用时,对允许和支持的字段分类的任何更改都会记录在此表中。

MeshConfig

开源 MeshConfig 参考文档中存在但不在下表中的字段将被阻止。 例如,configSources 会被阻止。

字段 支持/允许 说明
proxyListenPort 允许 -
proxyInboundListenPort 允许 -
proxyHttpPort 允许 -
connectTimeout 允许 可在 DestinationRule 中配置
tcpKeepAlive 允许 可在 DestinationRule 中配置
defaultConfig 支持 用于配置 ProxyConfig
outboundTrafficPolicy 支持 也可在挎斗 CR 中配置
extensionProviders 允许 -
defaultProviders 允许 -
accessLogFile 支持 此字段解决了访问日志的生成。 有关收集日志和查询日志的托管体验,请参阅 AKS 上的 Azure Monitor 容器见解。 建议通过遥测 API 配置访问日志记录。
accessLogFormat 支持 此字段解决了访问日志的生成。 有关收集日志和查询日志的托管体验,请参阅 AKS 上的 Azure Monitor 容器见解
accessLogEncoding 支持 此字段解决了访问日志的生成。 有关收集日志和查询日志的托管体验,请参阅 AKS 上的 Azure Monitor 容器见解
enableTracing 允许 建议通过遥测 API 配置跟踪。
enableEnvoyAccessLogService 支持 此字段解决了访问日志的生成。 有关收集日志和查询日志的托管体验,请参阅 AKS 上的 Azure Monitor 容器见解
disableEnvoyListenerLog 支持 此字段解决了访问日志的生成。 有关收集日志和查询日志的托管体验,请参阅 AKS 上的 Azure Monitor 容器见解
trustDomain 允许 -
trustDomainAliases 允许 -
caCertificates 允许 可在 DestinationRule 中配置
defaultServiceExportTo 允许 可在 ServiceEntry 中配置
defaultVirtualServiceExportTo 允许 可在 VirtualService 中配置
defaultDestinationRuleExportTo 允许 可在 DestinationRule 中配置
localityLbSetting 允许 可在 DestinationRule 中配置
dnsRefreshRate 允许 -
h2UpgradePolicy 允许 可在 DestinationRule 中配置
enablePrometheusMerge 允许 -
discoverySelectors 支持 -
pathNormalization 允许 -
defaultHttpRetryPolicy 允许 可在 VirtualService 中配置
serviceSettings 允许 -
meshMTLS 允许 -
tlsDefaults 允许 -
ingressService 允许 用于 istio 入口控制器的 Kubernetes 服务的名称。
ingressSelector 允许 定义要用作入口控制器的网关部署。 此字段对应于 Gateway.selector 字段,并将设置为 istio: INGRESS_SELECTOR。

ProxyConfig (meshConfig.defaultConfig)

开源 MeshConfig 参考文档中存在但不在下表中的字段将被阻止。

字段 支持/允许 说明
tracingServiceName 允许 建议通过遥测 API 配置跟踪。
drainDuration 支持 -
statsUdpAddress 允许 -
proxyAdminPort 允许 -
tracing 允许 建议通过遥测 API 配置跟踪。
concurrency 支持 -
envoyAccessLogService 允许 建议通过遥测 API 配置跟踪。
envoyMetricsService 允许 建议通过遥测 API 配置指标收集。
proxyMetadata 允许 -
statusPort 允许 -
extraStatTags 允许 -
proxyStatsMatcher 允许 -
terminationDrainDuration 支持 -
meshId 允许 -
holdApplicationUntilProxyStarts 支持 -
caCertificatesPem 允许 -
privateKeyProvider 允许 -

注意

支持配置范围:网格配置允许使用 Istio 加载项配置扩展提供程序,例如 Zipkin 或 Apache Skywalking 的自托管实例。 但是,这些扩展提供程序不在 Istio 加载项的支持范围内。 与扩展工具相关的任何问题都不在 Istio 加载项的支持范围内。

常见错误和故障排除提示

  • 确保 MeshConfig 使用空格而不是制表符缩进。
  • 确保仅编辑特定于版本的共享 ConfigMap(例如 istio-shared-configmap-asm-1-18),而不尝试编辑默认的 ConfigMap(例如 istio-asm-1-18)。
  • ConfigMap 必须按 istio-shared-configmap-<asm-revision> 命名,并且位于 aks-istio-system 命名空间中。
  • 确保所有 MeshConfig 字段拼写正确。 如果字段无法识别或者不属于允许列表,则许可控制会拒绝此类配置。
  • 执行 Canary 升级时,请检查特定于版本的 ConfigMaps,以确保群集上部署的版本存在配置。
  • 某些 MeshConfig 选项(例如 accessLogging)可能会增加 Envoy 的资源消耗,禁用其中一些设置可能会降低 Istio 数据平面资源利用率。 此外,还建议使用 MeshConfig 中的 discoverySelectors 字段来帮助减少 Istiod 和 Envoy 的内存消耗。
  • 如果 MeshConfig 中的 concurrency 字段配置错误且设置为零,则会导致 Envoy 占用所有 CPU 核心。 相反,如果未设置此字段,则会根据 CPU 请求/限制自动确定要运行的工作线程数。
  • Pod 和挎斗争用条件下,可以在应用程序启动前使用 MeshConfig 中的 holdApplicationUntilProxyStarts 字段来缓解 Envoy 的问题。