Service Mesh (ASM)支援將使用Istio社區版的叢集隨即轉移到ASM中。本文介紹如何將使用Istio社區版的叢集遷移到ASM。
遷移流程
將使用Istio的叢集遷移到ASM,需要進行以下四個階段的操作。
在Migrating階段,叢集中的注入行為仍然保持您為Istio設定的注入規則,並預設注入Istio Sidecar。在啟用了Sidecar注入的命名空間中,您可以通過修改Pod Label,顯式為該工作負載聲明注入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。 |
|
spec.retryCounter | int32 | 由於切換狀態時ASM控制面會進行一些必要的檢查,以確保滿足離開目前狀態進入新狀態的標準。該檢查在修改desiredState後將自動觸發,若檢查未通過,您需要根據提示資訊調整狀態後修改該值以觸發重新檢查。 | 0~2147483647 |
spec.advancedOptions | object | 進階選項。 | |
spec.advancedOptions.stopIstioSystemInjectionDisabling | bool | 是否禁用ASM對istio-system命名空間的label同步,在目的地組群中存在東西向網關時,應當將該值設定為 |
|
status.retryCounter | int32 | 反映retryCounter是否正確調諧,如果最後一次修改調諧成功,則該值等於spec.retryCounter。 | 唯讀 |
status.state | string | 當前實際狀態。在切換狀態後,如果狀態成功切換至spec.desiredState指定的狀態,則status.state的值將等於spec.desiredState的值。 | 唯讀 |
status.message | string | 如果狀態切換失敗,該欄位將表示失敗原因,如果該欄位不為空白,則使用者應當按照該欄位給出的提示資訊進行處理,並在處理完畢後修改spec.retryCounter觸發重試。 | 唯讀 |
ASMMigrateFromIstio狀態切換
當遷移的準備工作已經可以進入下一個階段時,您需要手動切換ASMMigrateFromIstio資源的狀態。例如,當前階段為Init階段,切換狀態到SetupIstioForMigrate則表明進入了下一個階段。
以下為切換到各階段的命令樣本。
SetupIstioForMigratekubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"SetupIstioForMigrate"}}'Migratingkubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Migrating"}}'Finishedkubectl --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: SetupIstioForMigratestatus.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上的標籤:
編輯istio-system命名空間配置。
kubectl --kubeconfig=${ACK執行個體kubeconfig檔案路徑} edit ns istio-system手動移除標籤
istio-injection: disable,並儲存退出。
步驟二:配置Istio做好遷移準備
切換狀態到SetupIstioForMigrate。
重要執行此命令後,由於ASM需要為Istiod進行相應的配置,因此Istiod將會滾動重啟以滿足遷移需要。
為了使遷移過程中,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網格代理。
切換狀態到Migrating。在成功進入Migrating狀態後,您應當先將Istio API全部應用至ASM,然後按照以下的步驟分別將Istio Sidecar、入口網關、出口網關和東西向網關遷移至ASM對應組件。
(可選)部署ASM跨叢集網關。
在ASM中,注入了網格代理的工作負載在設計跨叢集通訊時會自動選用ASM跨叢集網關進行通訊,對應Istio的東西向網關。因此,如果您啟用了東西向網關,為了確保將Istio Sidecar替換為ASM網格代理後能夠正常進行跨叢集通訊,在您為任何工作負載注入ASM網格代理之前,您需要首先部署ASM跨叢集網關。
您應當根據當前Istio的叢集網路設定,在ASM控制台為叢集配置其對應的網路名稱,為已經部署Istio東西向網關的叢集勾選啟用跨叢集網關。具體操作,請參見為叢集指定網路設定,並啟用跨叢集網格代理。
說明這裡的配置需要與Istio的配置一致。例如,Istio為叢集a配置了network-1,叢集b配置了network-2,則ASM中必須保持一致。
將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是否正確配置了優雅下線,以及應用的行為是否符合優雅下線的要求(所有請求一定能夠在優雅下線的等待時間內返回)。請儘可能選擇業務低峰期進行。
將Istio入口網關遷移至ASM入口網關。
將Istio入口網關平滑遷移至ASM入口網關。具體操作,請參見自建Istio IngressGateway如何遷移至ASM網關。
將Istio出口網關遷移至ASM出口網關。若待遷移叢集已經啟用了出口網關,請按照以下操作進行遷移。
在ASM中建立出口網關。具體操作,請參見建立出口網關。並按需建立其他資源(例如,用於註冊外部服務的ServiceEntry,用於為出口網關啟用轉送連接埠的網關規則,以及用於將流量定向到出口網關的虛擬服務。具體操作,請參見在ASM上訪問外部服務的流量管理)。
修改需要遷移的外部服務對應的虛擬服務,使其指向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狀態。至此,遷移全部結束。