配置适用于 Azure Kubernetes 服务的基于 Istio 的服务网格加载项
开源 Istio 使用 MeshConfig 为 Istio 服务网格定义网格范围的设置。 适用于 AKS 的基于 Istio 的服务网格加载项基于 MeshConfig 生成,并将不同的属性分类为支持、允许和阻止。
本文介绍如何为 Azure Kubernetes 服务配置基于 Istio 的服务网格加载项以及适用于此类配置的支持策略。
先决条件
本指南假定你已按照文档的说明在 AKS 群集上启用 Istio 加载项。
在群集上设置配置
查看群集上部署的 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" }
使用
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
中的字段分类为 allowed
、supported
或 blocked
。 若要了解有关这些类别的详细信息,请参阅 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 的问题。