全部產品
Search
文件中心

Alibaba Cloud Service Mesh:從Istio原地灰階遷移至ASM

更新時間:Mar 13, 2025

Service Mesh (ASM)支援將使用Istio社區版的叢集隨即轉移到ASM中。本文介紹如何將使用Istio社區版的叢集遷移到ASM。

遷移流程

將使用Istio的叢集遷移到ASM,需要進行以下四個階段的操作。

Migrating階段,叢集中的注入行為仍然保持您為Istio設定的注入規則,並預設注入Istio Sidecar。在啟用了Sidecar注入的命名空間中,您可以通過修改Pod Label,顯式為該工作負載聲明注入ASM網格代理。

遷移條件

  • 待遷移的K8s叢集需要滿足以下條件:

    • 叢集版本為1.21及以上版本。若您的叢集低於該版本,且該叢集是阿里雲Container ServiceK8s叢集,請參見手動升級叢集

    • 叢集中安裝的Istio版本為1.10及以上。

  • 您需要為遷移建立新的ASM執行個體,版本為1.24及以上。具體操作,請參見建立ASM執行個體

操作步驟

步驟一:將待遷移的叢集加入ASM

您可以參考文檔添加叢集到ASM執行個體,並在添加叢集時勾選“忽略istio-system命名空間檢查”選項,將已安裝Istio的阿里雲Container ServiceK8s叢集或登入到阿里雲Container Service的自建叢集添加到ASM。若待遷移的叢集為尚未註冊至阿里雲Container Service,您可以通過ACK One的註冊叢集功能將其註冊到Container Service,然後通過ASM控制台將叢集添加到ASM。

待遷移的叢集加入ASM後,ASM執行個體中將自動建立ASMMigrateFromIstio資源,整個遷移過程將由此資源控制。您可以執行以下命令,查看此資源內容。

kubectl --kubeconfig=${ASM_KUBECONFIG} get asmmigratefromistio

預期輸出:

apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
  name: default
spec:
  desiredState: Init
  retryCounter: 0
  advancedOptions:
    stopIstioSystemInjectionDisabling: false
status:
  message: ""
  retryCounter: 0
  state: Init

以下是此資源的部分配置項說明。

欄位名

類型

介紹

取值

spec.desiredState

string

目標遷移狀態,使用者可以修改該值以進入指定的遷移狀態。

重要

該值只能以固定流轉順序變化:

Init -> SetupIstioForMigrate -> Migrating -> Finished。

  • Init(目前狀態)

  • SetupIstioForMigrate

  • Migrating

  • Finished

spec.retryCounter

int32

由於切換狀態時ASM控制面會進行一些必要的檢查,以確保滿足離開目前狀態進入新狀態的標準。該檢查在修改desiredState後將自動觸發,若檢查未通過,您需要根據提示資訊調整狀態後修改該值以觸發重新檢查。

0~2147483647

spec.advancedOptions

object

進階選項。

spec.advancedOptions.stopIstioSystemInjectionDisabling

bool

是否禁用ASM對istio-system命名空間的label同步,在目的地組群中存在東西向網關時,應當將該值設定為true

  • true:禁用ASM對istio-system命名空間標籤istio-injection: disable的同步。

  • false:預設值,啟用ASM對istio-system命名空間標籤istio-injection: disable的同步。

status.retryCounter

int32

反映retryCounter是否正確調諧,如果最後一次修改調諧成功,則該值等於spec.retryCounter。

唯讀

status.state

string

當前實際狀態。在切換狀態後,如果狀態成功切換至spec.desiredState指定的狀態,則status.state的值將等於spec.desiredState的值。

唯讀

status.message

string

如果狀態切換失敗,該欄位將表示失敗原因,如果該欄位不為空白,則使用者應當按照該欄位給出的提示資訊進行處理,並在處理完畢後修改spec.retryCounter觸發重試。

唯讀

ASMMigrateFromIstio狀態切換

當遷移的準備工作已經可以進入下一個階段時,您需要手動切換ASMMigrateFromIstio資源的狀態。例如,當前階段為Init階段,切換狀態到SetupIstioForMigrate則表明進入了下一個階段。

以下為切換到各階段的命令樣本。

  • SetupIstioForMigrate

    kubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"SetupIstioForMigrate"}}'
  • Migrating

    kubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Migrating"}}'
  • Finished

    kubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Finished"}}'

SetupIstioForMigrate狀態為例,您可以通過以下方式查看狀態是否切換成功。

kubectl get asmigratefromistio default -o yaml

預期輸出:

apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
  name: default
spec:
  desiredState: SetupIstioForMigrate
  retryCounter: 0
status:
  message: ""
  retryCounter: 0
  state: SetupIstioForMigrate

status.state的值為SetupIstioForMigrate,則說明狀態已經成功切換。

說明

status.state值未按照預期切換,請按照status.message的提示資訊進行處理,並在處理完成後將spec.retryCounter的值+1進行重試。

啟用Istio東西向網關的叢集需要進行的額外設定

ASM預設禁用了istio-system命名空間的自動注入,然而由於Istio東西向網關Pod建立後,需要依賴MutatingWebhook手動替換其鏡像,該特性依賴istio-system命名空間不能被顯式禁止注入。因此,若您的叢集中啟用了東西向網關,則您應執行以下命令,使ASM控制面不強制禁止istio-system命名空間的注入。

kubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"advancedOptions":{"disableIstioSystemLabelReconciliation": true}}}' 

然後手動清理掉ASM已經同步至istio-system上的標籤:

  1. 編輯istio-system命名空間配置。

    kubectl --kubeconfig=${ACK執行個體kubeconfig檔案路徑} edit ns istio-system
  2. 手動移除標籤istio-injection: disable,並儲存退出。

步驟二:配置Istio做好遷移準備

  1. 切換狀態到SetupIstioForMigrate

    重要

    執行此命令後,由於ASM需要為Istiod進行相應的配置,因此Istiod將會滾動重啟以滿足遷移需要。

  2. 為了使遷移過程中,Istio Sidecar能夠與ASM Sidecar進行正確的mTLS通訊,進入此階段後,ASM將為Istio配置中新增以下配置:

    defaultConfig:
      proxyMetadata:
        PROXY_CONFIG_XDS_AGENT:"true"

    同時,您需要手動重啟所有已注入Istio Sidecar的工作負載,以使該項配置在所有工作負載上生效。您可以通過執行以下命令,確認指定Pod是否已經滿足條件:

    kubectl get pod ${POD名稱} -o yaml|grep PROXY_CONFIG_XDS_AGENT

    若輸出不為空白,則表明該工作負載已經滿足條件。當叢集中所有注入Istio Sidecar的工作負載滿足該條件後,可以進入Migrating狀態。

步驟三:開始遷移

本步驟將進入Migrating階段,在此階段您可以自由選擇為工作負載注入Istio Sidecar或ASM網格代理,直到將所有Istio Sidecar替換為ASM網格代理。

  1. 切換狀態到Migrating。在成功進入Migrating狀態後,您應當先將Istio API全部應用至ASM,然後按照以下的步驟分別將Istio Sidecar、入口網關、出口網關和東西向網關遷移至ASM對應組件。

  2. (可選)部署ASM跨叢集網關。

    在ASM中,注入了網格代理的工作負載在設計跨叢集通訊時會自動選用ASM跨叢集網關進行通訊,對應Istio的東西向網關。因此,如果您啟用了東西向網關,為了確保將Istio Sidecar替換為ASM網格代理後能夠正常進行跨叢集通訊,在您為任何工作負載注入ASM網格代理之前,您需要首先部署ASM跨叢集網關

    您應當根據當前Istio的叢集網路設定,在ASM控制台為叢集配置其對應的網路名稱,為已經部署Istio東西向網關的叢集勾選啟用跨叢集網關。具體操作,請參見為叢集指定網路設定,並啟用跨叢集網格代理

    image

    說明

    這裡的配置需要與Istio的配置一致。例如,Istio為叢集a配置了network-1,叢集b配置了network-2,則ASM中必須保持一致。

  3. 將Istio Sidecar遷移至ASM網格代理。

    $ kubectl --kubeconfig=${K8s叢集kubeconfig檔案路徑} -n ${命名空間} patch ${Deployment名稱} --type='merge' -p '{"spec":{"template":{"metadata":{"labels":{"sidecar.asm.aliyun.com/inject":"true"}}}}}'
    重要

    由於此命令修改了工作負載label,會導致工作負載滾動重啟,該過程中流量是否有損取決於應用協議是否支援優雅下線(HTTP/HTTP2/GRPC)以及Istio Sidecar是否正確配置了優雅下線,以及應用的行為是否符合優雅下線的要求(所有請求一定能夠在優雅下線的等待時間內返回)。請儘可能選擇業務低峰期進行。

  4. 將Istio入口網關遷移至ASM入口網關。

    將Istio入口網關平滑遷移至ASM入口網關。具體操作,請參見自建Istio IngressGateway如何遷移至ASM網關

  5. 將Istio出口網關遷移至ASM出口網關。若待遷移叢集已經啟用了出口網關,請按照以下操作進行遷移。

    1. 在ASM中建立出口網關。具體操作,請參見建立出口網關。並按需建立其他資源(例如,用於註冊外部服務的ServiceEntry,用於為出口網關啟用轉送連接埠的網關規則,以及用於將流量定向到出口網關的虛擬服務。具體操作,請參見在ASM上訪問外部服務的流量管理)。

    2. 修改需要遷移的外部服務對應的虛擬服務,使其指向ASM出口網關,並設定期望的權重。

      以下為此虛擬服務的配置樣本。完整樣本內容,請參見Egress gateway for HTTP traffic

      apiVersion: networking.istio.io/v1
      kind: VirtualService
      metadata:
        name: direct-cnn-through-egress-gateway
      spec:
        hosts:
        - edition.cnn.com
        gateways:
        - istio-egressgateway
        - mesh
        http:
        - match:
          - gateways:
            - mesh
            port: 80
          route:
          - destination:
              host: istio-egressgateway.istio-system.svc.cluster.local
              port:
                number: 80
            weight: 99
          - destination: # 新增一個destination,指向出口網關,並根據需要調整其權重
              host: asm-egressgateway.istio-system.svc.cluster.local # 假設您的ASM出口網關叫asm-egressgateway
              port:
                number: 80
            weight: 1

      在此YAML中,發往edition.cnn.com的流量將按照99 : 1的比例分別路由到Istio Ingressgateway和ASM Egressgateway。您可以根據需要逐步調整此比例,直到全部流量被遷移到ASM出口網關。您可以通過Istio出口網關的訪問日誌來確定是否仍有流量經過Istio的出口網關。

步驟四:完成遷移

請確保以下工作全部完成後,再進入遷移的下一個階段。

  • 所有Istio Sidecar已經完全刪除。

  • 所有Istio 東西向網關、入口網關、出口網關均已無流量經過。

  • 所有Istio API配置已經匯入ASM。

  • 已經注入ASM網格代理的工作負載行為符合預期。

確認無誤後,您可以通過對應版本的istioctl命令完成對叢集中Istio的卸載:

說明

不同版本的istioctl存在差別,請您務必使用已安裝版本對應的istioctl工具進行卸載,以免出現漏刪、誤刪。

$ istioctl --kubeconfig=${K8s叢集kubeconfig檔案路徑} uninstall --purge

卸載完成後,切換狀態到Finished。若切換不成功,請按照status.message的提示資訊清理Istio的殘餘資源,並將spec.retryCounter的值+1進行重試,直到status.state顯示為Finished狀態。至此,遷移全部結束。