如何遷移Istio社區(qū)版本至ASM
您可以將自建Istio版本遷移至阿里云服務(wù)網(wǎng)格ASM,減輕開發(fā)與運維的工作負擔。在遷移過程中支持回滾操作。本文介紹如何遷移Istio社區(qū)版本至ASM。
前提條件
已創(chuàng)建ASM支持的Kubernetes集群,例如ACK、容器服務(wù) Serverless 版集群等。
關(guān)于ASM支持的Kubernetes集群,請參見功能特性。
關(guān)于如何創(chuàng)建Kubernetes集群,請參見創(chuàng)建集群。
已通過kubectl工具連接集群。具體操作,請參見通過kubectl工具連接集群。
配置流程
遷移前檢查
遷移前,您需要參照下表確認Istio社區(qū)版本、證書提供者和證書方式是否符合遷移條件。證書提供者需要您自行確認。下文介紹如何查看Istio社區(qū)版本和證書的安裝方式。
Istio社區(qū)版本(單集群) | 證書提供者(PILOT_CERT_PROVIDER) | 證書方式 | 是否支持遷移 | 建議使用ASM版本 |
<1.5 | istiod | 外部root CA或自簽CA | 不涉及 | |
≥1.5且≤1.14 | istiod | 外部root CA或自簽CA | ASM最新版本,請參見功能發(fā)布記錄。 | |
≥1.15 | istiod | 外部root CA或自簽CA | ASM最新版本,請參見功能發(fā)布記錄。 | |
不涉及 | certManager或其他 | 不涉及 | 不涉及 |
若您需要遷移ASM還未支持的Istio社區(qū)版本,請加入釘群(釘群號:30421250),聯(lián)系產(chǎn)品技術(shù)專家進行咨詢。
查看Istio社區(qū)版本
執(zhí)行以下命令,查看當前社區(qū)版本。
./istioctl version
示例輸出:
client version: 1.14.3
control plane version: 1.14.3
data plane version: 1.14.3 (6 proxies)
查看安裝Istio社區(qū)版本的證書方式
安裝Istio社區(qū)版本時,有以下兩種常見的證書方式:
pluggedCertCA插入的外部root CA。更多信息,請參見Plug in CA Certificates。
selfSignedCA自簽CA(默認安裝方式)。
您可以執(zhí)行kubectl get secret -n istio-system
命令,確認istio-system命名空間下Secret的證書方式。
若輸出結(jié)果存在
cacerts
Secret,表明采用外部root CA的方式。若輸出結(jié)果存在
istio-ca-secret
Secret,表明采用自簽CA的方式。
步驟一:創(chuàng)建ASM企業(yè)版或旗艦版實例
ASM從1.13版本開始支持金絲雀版本升級方式,對應(yīng)部署的Istiod等相關(guān)資源帶有版本后綴,不會和當前Kubernetes集群下已部署的Istio社區(qū)版本沖突。例如,ASM 1.14.3對應(yīng)的Istio的相關(guān)資源都帶有1-14-3后綴。
通過CreateServiceMesh API創(chuàng)建ASM實例。
主要配置項說明如下。關(guān)于配置項的更多說明,請參見創(chuàng)建一個服務(wù)網(wǎng)格實例。
配置項
說明
RegionId
需要和Kubernetes集群處于相同地域。
您可以登錄容器服務(wù)管理控制臺,在集群頁面查看Kubernetes集群所在的地域。
關(guān)于ASM支持的地域及Region ID的更多信息,請參見開服地域。
VpcId
Kubernetes集群所在的專有網(wǎng)絡(luò)ID。
VSwitches
Kubernetes集群所在的交換機ID。
CRAggregationEnabled
默認為關(guān)閉,無需修改。
ClusterSpec
遷移場景下僅支持以下兩種服務(wù)網(wǎng)格實例規(guī)格:
enterprise:企業(yè)版。
ultimate:旗艦版。
ClusterDomain
默認為cluster.local,需要和自建Istio所在的Kubernetes集群的ClusterDomain保持一致。
UseExistingCA
打開UseExistingCA開關(guān),使用已知的CA證書創(chuàng)建ASM實例。
ExistingRootCaCert、
ExistingCaCert、
ExistingCaKey、
CertChain
創(chuàng)建網(wǎng)格時的證書配置:
如果自建Istio為自簽名CA,請按照以下格式填寫相關(guān)參數(shù):
ExistingRootCaCert:對應(yīng)istio-system命名空間下的istio-ca-secret的caCert內(nèi)容(Base64編碼格式)。
ExistingCaCert:對應(yīng)istio-system命名空間下istio-ca-secret的caCert內(nèi)容(Base64編碼格式)。
ExistingCaKey:對應(yīng)istio-system命名空間下istio-ca-secret的caKey內(nèi)容(Base64編碼格式)。
CertChain:將ExistingCaCert和ExistingRootCaCert進行Base64解碼后得到兩個證書,將這兩個證書放在一個文件中,進行Base64編碼后填入即可。
如果自建Istio證書為外部Root CA,直接將對應(yīng)istio-system命名空間下istio-cacerts的secret相應(yīng)內(nèi)容填入即可。
說明創(chuàng)建網(wǎng)格時使用自定義證書之后,需要您自行維護證書的生命周期(參考UpdateMeshFeature API),防止證書過期影響業(yè)務(wù)。
查看ASM實例是否創(chuàng)建成功。
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,查看創(chuàng)建的ASM實例。
當ASM實例的狀態(tài)為運行中,表示創(chuàng)建成功。
步驟二:在新建的ASM實例下添加Kubernetes集群
執(zhí)行以下命令,修改Kubernetes集群下的
mutatingwebhookconfigurations
。修改名稱為
istio-sidecar-injector
或者istio-revision-tag-default
,將istio-injection=enabled
對應(yīng)的Webhook修改為istio-injection=enabled-addon
。重要請確保mutatingwebhookconfiguration Webhook對
istio-injection=enabled
標簽生效且為唯一生效值,避免多個生效值同時存在時,注入的Sidecar結(jié)果隨機,導(dǎo)致Pod啟動失敗。export KUBECONFIG=<Your ACK Cluster's Kube Config File> kubectl get mutatingwebhookconfigurations -A
示例輸出:
NAME WEBHOOKS AGE istio-revision-tag-default 4 5d4h istio-sidecar-injector 4 5d4h
通過AddClusterIntoServiceMesh API添加自建Istio所在的Kubernetes集群。
打開IgnoreNamespaceCheck開關(guān),開啟忽略istio-system檢查邏輯。關(guān)于配置項的更多說明,請參見AddClusterIntoServiceMesh。
重要Kubernetes集群添加到ASM后,請勿在原有Kubernetes集群下變更和新建Istio相關(guān)資源,否則會出現(xiàn)如下示例報錯:
Error from server: error when creating "samples/bookinfo/networking/destination-rule-all.yaml": admission webhook "asm-validation.istio.io" denied the request: 當前Kubernetes集群已經(jīng)添加到服務(wù)網(wǎng)格ASM中,在ASM控制臺中創(chuàng)建Istio相關(guān)自定義資源,或使用ASM提供的kubeconfig進行管理。
Kubernetes集群添加完成后,您可以看到在Kubernetes集群的istio-system命名空間下新增了一些Pod和Configmap,以及相關(guān)mutatingwebhookconfigurations和validatingwebhookconfigurations Webhook。
同步命名空間和注入配置。
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在全局命名空間頁面,單擊從Kubernetes集群同步自動注入,同步Namespace以及Namespace下的自動注入配置。(default命名空間的自動注入在加入網(wǎng)格之后會默認關(guān)閉,需要手動開啟。)
任選以下方式,關(guān)閉ASM實例的mTLS。
ASM實例默認開啟mTLS,如果您自建istio并未開啟mTLS,請關(guān)閉ASM實例的mTLS,防止新老sidecar、網(wǎng)關(guān)之間連接建立失敗。如果您自建istio已經(jīng)開啟mTLS,可以跳過這一步。
方式一:通過控制臺
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇
,然后在右側(cè)頁面單擊設(shè)置全局雙向。在設(shè)置全局雙向TLS模式頁面,配置mTLS模式(命名空間級)為DISABLE - 禁用雙向TLS認證,然后單擊創(chuàng)建。
方式二:通過命令行
使用以下內(nèi)容,創(chuàng)建peer-authentication.yaml。
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default namespace: istio-system spec: mtls: mode: DISABLE
執(zhí)行以下命令,關(guān)閉mTLS。
kubectl apply -f peer-authentication.yaml
步驟三:驗證Sidecar注入是否成功
執(zhí)行以下命令,創(chuàng)建測試命名空間及服務(wù)。
export KUBECONFIG=<Your ACK Cluster's Kube Config File> kubectl create ns foo kubectl label ns foo istio.io/rev=1-14-3 # 請將1-14-3替換為ASM的實際版本。 kubectl create deployment nginx --image=nginx -n foo
執(zhí)行以下命令,查看Pod是否成功注入對應(yīng)ASM版本的Sidecar。
kubectl get pods -n foo -o yaml |grep proxyv2
預(yù)期輸出:
image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:v1.14.3.47-ga38201****-aliyun image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:v1.14.3.47-ga38201****-aliyun image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:v1.14.3.47-ga38201****-aliyun imageID: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2@sha256:a2a4d61a8a6183a890c7beac21e6790fc125a0e45ebbc299e728f96755f3**** image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:v1.14.3.47-ga38201****-aliyun imageID: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2@sha256:a2a4d61a8a6183a890c7beac21e6790fc125a0e45ebbc299e728f96755f3****
預(yù)期輸出表明Pod成功注入對應(yīng)ASM版本的Sidecar。ASM的Sidecar鏡像對應(yīng)在acs/proxyv2 HUB下。
步驟四:遷移Istio配置到ASM
每個ASM實例對應(yīng)一個獨立的Kubernetes集群。ASM控制面涉及的相關(guān)資源配置(VirtualService、DestinationRule等)需要創(chuàng)建在ASM對應(yīng)的集群下。
執(zhí)行以下命令,從已安裝Istio社區(qū)版本的Kubernetes集群中備份導(dǎo)出已有Istio自定義資源。
export KUBECONFIG=<Your ACK Cluster's Kube Config File> kubectl get VirtualService --all-namespaces -o yaml > all-vs.yaml kubectl get DestinationRule --all-namespaces -o yaml > all-dr.yaml kubectl get Gateway --all-namespaces -o yaml > all-gw.yaml kubectl get ServiceEntry --all-namespaces -o yaml > all-se.yaml kubectl get EnvoyFilter --all-namespaces -o yaml > all-ef.yaml kubectl get Sidecar --all-namespaces -o yaml > all-sidecar.yaml kubectl get WorkloadEntry --all-namespaces -o yaml > all-we.yaml kubectl get WorkloadGroup --all-namespaces -o yaml > all-wg.yaml kubectl get PeerAuthentication --all-namespaces -o yaml > all-pa.yaml kubectl get RequestAuthentication --all-namespaces -o yaml > all-ra.yaml kubectl get AuthorizationPolicy --all-namespaces -o yaml > all-ap.yaml
執(zhí)行以下命令,將本小節(jié)步驟1導(dǎo)出的YAML部署到ASM實例。
替換命令中
all-*
為實際的YAML文件名稱。kubectl --kubeconfig={服務(wù)網(wǎng)格ASM對應(yīng)的kubeconfig} apply -f all-*.yaml
步驟五:遷移數(shù)據(jù)面
數(shù)據(jù)面的遷移包括Sidecar和Gateway。Sidecar的遷移和Webhook的注入配置相關(guān),因此在遷移之前需要確認已將本地Istio社區(qū)版本下對應(yīng)的mutatingwebhookconfigurations Webhook下的匹配條件istio-injection=enabled
修改為非enabled
的值。具體操作,請參見步驟二的第一步。
遷移Sidecar
通過滾動更新業(yè)務(wù)服務(wù)Pod來注入ASM的Sidecar版本。
ASM的Sidecar連接到ASM實例對應(yīng)的Istiod控制面后,可享有ASM擴展的服務(wù)網(wǎng)格相關(guān)能力,例如SpringCloud支持、流量泳道、限流、路由級熔斷等。
業(yè)務(wù)Pod滾動更新后,查看對應(yīng)業(yè)務(wù)服務(wù)。
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格狀態(tài)頁面,可以查看當前ASM控制面和Sidecar的配置同步狀態(tài)。
(可選)遷移Gateway
入口流量網(wǎng)關(guān)有多種類型。目前,ASM提供遷移自建的Istio IngressGateway和Nginx Ingress到ASM網(wǎng)關(guān)的指導(dǎo)。具體操作,請參見自建Istio IngressGateway如何遷移至ASM網(wǎng)關(guān)和Nginx Ingress如何遷移至ASM網(wǎng)關(guān)。
若您需要遷移其他類型的入口流量網(wǎng)關(guān),請加入釘群(釘群號:30421250),聯(lián)系產(chǎn)品技術(shù)專家進行咨詢。
步驟六:卸載自建Istio
當Istio社區(qū)版本的Sidecar更新到ASM后,您可以執(zhí)行istioctl ps命令,查看當前Sidecar版本的分布,確認遷移完成后刪除自建Istio。
執(zhí)行以下命令,查看當前Sidecar版本的分布。
export KUBECONFIG=<Your ACK Cluster's Kube Config File> ./istioctl ps
示例輸出:
NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION istio-egressgateway-666cdd84d7-p****.istio-system Kubernetes SYNCED SYNCED SYNCED NOT SENT NOT SENT istiod-5dbcf9****-tnsgt 1.14.3 istio-ingressgateway-58f4c4f77f-n****.istio-system Kubernetes SYNCED SYNCED SYNCED SYNCED NOT SENT istiod-5dbcf9****-tnsgt 1.14.3
輸出結(jié)果為空,表示數(shù)據(jù)面已完整地遷移到ASM版本的Sidecar或Gateway。
執(zhí)行以下命令,卸載本地Istio。
istioctl manifest generate <your original installation options> | kubectl delete --ignore-not-found=true -f -
<your original installation options>
表示初安裝Istio時的選項,例如--set profile=demo
。說明如果您有以前安裝的Istio YAML備份,可以通過以下命令進行卸載。
kubectl delete --ignore-not-found=true -f <your-istiod-install.yaml>
customresourcedefinition.apiextensions.k8s.io "authorizationpolicies.security.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "destinationrules.networking.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "envoyfilters.networking.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "gateways.networking.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "istiooperators.install.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "peerauthentications.security.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "requestauthentications.security.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "serviceentries.networking.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "sidecars.networking.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "telemetries.telemetry.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "virtualservices.networking.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "workloadentries.networking.istio.io" deleted customresourcedefinition.apiextensions.k8s.io "workloadgroups.networking.istio.io" deleted serviceaccount "istio-egressgateway-service-account" deleted serviceaccount "istio-ingressgateway-service-account" deleted serviceaccount "istio-reader-service-account" deleted serviceaccount "istiod" deleted serviceaccount "istiod-service-account" deleted clusterrole.rbac.authorization.k8s.io "istio-reader-clusterrole-istio-system" deleted clusterrole.rbac.authorization.k8s.io "istio-reader-istio-system" deleted clusterrole.rbac.authorization.k8s.io "istiod-clusterrole-istio-system" deleted clusterrole.rbac.authorization.k8s.io "istiod-istio-system" deleted clusterrolebinding.rbac.authorization.k8s.io "istio-reader-clusterrole-istio-system" deleted clusterrolebinding.rbac.authorization.k8s.io "istio-reader-istio-system" deleted clusterrolebinding.rbac.authorization.k8s.io "istiod-clusterrole-istio-system" deleted clusterrolebinding.rbac.authorization.k8s.io "istiod-istio-system" deleted configmap "istio" deleted configmap "istio-sidecar-injector" deleted mutatingwebhookconfiguration.admissionregistration.k8s.io "istio-sidecar-injector" deleted deployment.apps "istio-egressgateway" deleted deployment.apps "istio-ingressgateway" deleted deployment.apps "istiod" deleted Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget poddisruptionbudget.policy "istio-egressgateway" deleted poddisruptionbudget.policy "istio-ingressgateway" deleted poddisruptionbudget.policy "istiod" deleted role.rbac.authorization.k8s.io "istio-egressgateway-sds" deleted role.rbac.authorization.k8s.io "istio-ingressgateway-sds" deleted role.rbac.authorization.k8s.io "istiod" deleted role.rbac.authorization.k8s.io "istiod-istio-system" deleted rolebinding.rbac.authorization.k8s.io "istio-egressgateway-sds" deleted rolebinding.rbac.authorization.k8s.io "istio-ingressgateway-sds" deleted rolebinding.rbac.authorization.k8s.io "istiod" deleted rolebinding.rbac.authorization.k8s.io "istiod-istio-system" deleted service "istio-egressgateway" deleted service "istio-ingressgateway" deleted service "istiod" deleted
執(zhí)行以下命令,刪除istio.io相關(guān)的CRD。
kubectl get crd -oname | grep --color=never 'istio.io' | xargs kubectl delete
說明需使用和安裝同版本或更高版本的Istioctl進行操作,避免新版本新增的相關(guān)資源未卸載。更多信息,請參見Istioctl。
執(zhí)行以下命令,卸載原有社區(qū)版本相關(guān)證書文件。
kubectl delete secret istio-ca-secret -n istio-system kubectl delete secret cacerts -n istio-system
FAQ
如何在遷移過程中進行回滾?
修改mutatingwebhookconfiguration(istio-revision-tag-default或者istio-sidecar-injector),將istio-injection=xxx修改為istio-injection=enabled,保證默認注入采用Istio社區(qū)版本的Sidecar。
通過RemoveClusterFromServiceMesh API移除對應(yīng)的Kubernetes集群。
打開ReserveNamespace開關(guān),保留istio-system特性。關(guān)于配置項的更多信息,請參見RemoveClusterFromServiceMesh。
移除Kubernetes集群后,Kubernetes集群的istio-system Namespace下對應(yīng)ASM相關(guān)組件和配置也會被移除,退回至最初的Istiod社區(qū)版本。
說明若對應(yīng)業(yè)務(wù)Pod的Sidecar已經(jīng)切換為ASM版本的Sidecar,同樣需要進行滾動更新。回滾后,Sidecar會注入社區(qū)版本的Sidecar。
如何通過Aliyun CLI方式,遷移自建Istio社區(qū)版本至ASM?
關(guān)于如何安裝和配置Aliyun CLI,請參見阿里云CLI。
說明請下載最新版本Aliyun CLI。
遷移涉及的API如下:
CreateServiceMesh:創(chuàng)建一個ASM實例。更多信息,請參見創(chuàng)建一個服務(wù)網(wǎng)格實例。
AddClusterIntoServiceMesh:添加一個Kubernetes集群到ASM。更多信息,請參見AddClusterIntoServiceMesh。
RemoveClusterFromServiceMesh:從ASM中刪除一個Kubernetes集群。更多信息,請參見RemoveClusterFromServiceMesh。
命令示例如下,相關(guān)參數(shù)請參見API文檔。
aliyun servicemesh CreateServiceMesh --相關(guān)參數(shù)
如何查看CA證書的有效期以及輪轉(zhuǎn)證書?
查看證書的有效期
執(zhí)行以下命令,查看證書的有效期。請將命令中的root-cert.pem
替換為您的CA Cert文件。
cat root-cert.pem |openssl x509 -text -noout |grep Validity -A 2
示例輸出:
Validity
Not Before: Oct 18 08:27:44 2022 GMT
Not After : Oct 15 08:27:44 2032 GMT
輪轉(zhuǎn)證書
當證書過期時,Sidecar連接Istiod控制面會出現(xiàn)如下報錯示例。請加入釘群(釘群號:30421250),聯(lián)系產(chǎn)品技術(shù)專家進行證書的輪轉(zhuǎn),保證證書的長期有效性。
2022-11-10T06:40:14.851043Z warning envoy config StreamAggregatedResources gRPC config stream closed since 702s ago: 14, connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority"
2022-11-10T06:40:34.703585Z warning envoy config StreamAggregatedResources gRPC config stream closed since 722s ago: 14, connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority"
2022-11-10T06:40:35.511760Z warning envoy config StreamAggregatedResources gRPC config stream closed since 722s ago: 14, connection error: desc = "transport: authentication handshake failed: x509: certificate signed by unknown authority"
2022-11-10T06:40:57.653628Z info xdsproxy connected to upstream XDS server: istiod.istio-system.svc:15012
如何遷移自建的Kiali、Grafana、Jaeger、日志等組件?
ASM控制臺的可觀察管理中心菜單下內(nèi)置了Kiali、Grafana、日志相關(guān)圖表和儀表盤等。當所有Sidecar都遷移到ASM后,您只需開啟可觀察相關(guān)功能,對應(yīng)的Metrics和Trace等相關(guān)數(shù)據(jù)會自動遷移至ASM。