設定適用於 Azure Kubernetes Service 的 Istio 型服務網格附加元件

開放原始碼 Istio 會使用 MeshConfig 來定義 Istio 服務網格的全網格設定。 適用於 AKS 的 Istio 型服務網格附加元件是根據 MeshConfig 所進行建置,並將不同的屬性分類為已支援、已允許和已封鎖。

本文逐步解說如何設定適用於 Azure Kubernetes Service 的 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 Sidecar Proxy 套用的全網格設定。

警告

啟用 Istio 附加元件時,會在叢集的 aks-istio-system 命名空間中建立預設 ConfigMap (例如,針對修訂版本 asm-1-18,即為 istio-asm-1-18)。 不過,此預設 ConfigMap 是由受控 Istio 附加元件所協調,因此使用者「不」應該直接編輯此 ConfigMap。 相反地,使用者應該在 aks-istio-system 命名空間中建立修訂特定 Istio 共用 ConfigMap (例如 istio-shared-configmap-asm-1-18 適用於修訂 asm-1-18),然後 Istio 控制平面會將此與預設 ConfigMap 合併,而且會優先使用預設設定。

網格設定和升級

針對 Istio 執行 Canary 升級時,必須先為 aks-istio-system 命名空間中的新修訂版本建立個別的 ConfigMap,才能起始 Canary 升級。 因此,在叢集上部署新修訂的控制平面時,可以使用此設定。 例如,如果您要將網格從 asm-1-18 升級為 asm-1-19,則需要從 istio-shared-configmap-asm-1-18 複製變更,以在 aks-istio-system 命名空間中建立稱為 istio-shared-configmap-asm-1-19 的新 ConfigMap。

升級完成或復原之後,您可以刪除已從叢集移除的修訂的 ConfigMap。

已允許、已支援和已封鎖值

MeshConfig 中的欄位分類為三個類別:

  • 封鎖:不允許的欄位會透過附加元件受控許可 Webhook 進行封鎖。 API 伺服器會立即將不允許欄位的錯誤訊息發佈給使用者。
  • 已支援:已支援欄位 (例如,與存取記錄相關的欄位) 接收來自 Azure 支援的支援。
  • 已允許:這些欄位 (例如 proxyListenPort 或 proxyInboundListenPort) 是允許的欄位,但 Azure 支援未涵蓋這些欄位。

網格設定和已允許/已支援欄位清單是跨修訂新增/移除的帳戶特定修訂。 下表提供完整的已允許欄位清單,以及已允許清單內支援/不支援的欄位清單。 有新的網格修訂可供使用時,此表格中會指出欄位已允許和已支援分類的任何變更。

MeshConfig

存在於開放原始碼 MeshConfig 參考文件中,但未包含於下表的欄位將會遭到封鎖。 例如,封鎖 configSources

欄位 支援/允許 注意事項
proxyListenPort 允許 -
proxyInboundListenPort 允許 -
proxyHttpPort 允許 -
connectTimeout 允許 可在 DestinationRule 中設定
tcpKeepAlive 允許 可在 DestinationRule 中設定
defaultConfig 支援 用於設定 ProxyConfig
outboundTrafficPolicy 支援 也可在 Sidecar CR 中設定
extensionProviders 允許 -
defaultProviders 允許 -
accessLogFile 支援 此欄位可處理存取紀錄的產生事宜。 針對收集與查詢紀錄的受控經驗,請參閱 AKS 上的 Azure 監視器容器深入解析
accessLogFormat 支援 此欄位可處理存取紀錄的產生事宜。 針對收集與查詢紀錄的受控經驗,請參閱 AKS 上的 Azure 監視器容器深入解析
accessLogEncoding 支援 此欄位可處理存取紀錄的產生事宜。 針對收集與查詢紀錄的受控經驗,請參閱 AKS 上的 Azure 監視器容器深入解析
enableTracing 允許
enableEnvoyAccessLogService 支援 此欄位可處理存取紀錄的產生事宜。 針對收集與查詢紀錄的受控經驗,請參閱 AKS 上的 Azure 監視器容器深入解析
disableEnvoyListenerLog 支援 此欄位可處理存取紀錄的產生事宜。 針對收集與查詢紀錄的受控經驗,請參閱 AKS 上的 Azure 監視器容器深入解析
trustDomain 允許 -
trustDomainAliases 允許 -
caCertificates 允許 可在 DestinationRule 中設定
defaultServiceExportTo 允許 可在 ServiceEntry 中設定
defaultVirtualServiceExportTo 允許 可在 VirtualService 中設定
defaultDestinationRuleExportTo 允許 可在 DestinationRule 中設定
localityLbSetting 允許 可在 DestinationRule 中設定
dnsRefreshRate 允許 -
h2UpgradePolicy 允許 可在 DestinationRule 中設定
enablePrometheusMerge 允許 -
discoverySelectors 支援 -
pathNormalization 允許 -
defaultHttpRetryPolicy 允許 可在 VirtualService 中設定
serviceSettings 允許 -
meshMTLS 允許 -
tlsDefaults 允許 -

ProxyConfig (meshConfig.defaultConfig)

存在於開放原始碼 MeshConfig 參考文件中,但未包含於下表的欄位將會遭到封鎖。

欄位 支援/允許
tracingServiceName 允許
drainDuration 支援
statsUdpAddress 允許
proxyAdminPort 允許
tracing 允許
concurrency 支援
envoyAccessLogService 允許
envoyMetricsService 允許
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 升級時,請檢查修訂特定 ConfigMap,以確保具有叢集上所部署修訂的設定。
  • accessLogging 這類特定 MeshConfig 選項可能會增加 Envoy 的資源耗用量,而停用其中一些設定可能會降低 Istio 資料平面資源使用率。 也建議您使用 MeshConfig 中的 discoverySelectors 欄位,以協助減輕 Istiod 和 Envoy 的記憶體耗用量。
  • 如果 MeshConfig 中的 concurrency 欄位設定錯誤且設定為零,則會導致 Envoy 用完所有 CPU 核心。 相反地,如果未設定此欄位,則會根據 CPU 要求/限制來自動決定要執行的背景工作執行緒數目。
  • Pod 和 Sidecar 競爭條件,其中應用程式會在可使用 MeshConfig 中的 holdApplicationUntilProxyStarts 欄位來緩解 Envoy 之前啟動。