瞭解如何遷移 VMware 上的 Knative 服務,改用 Fleet,以便升級至 Anthos 1.8 版。
Knative serving 現在已從代管 Cloud Run 產品獨立出來,並以叢集中的機群元件形式提供。在 VMware 功能上安裝 Knative serving 做為機群元件,可讓您獨立管理及升級安裝項目,不受其他機群元件影響。
如要將 Knative serving on VMware 安裝項目遷移至車隊,您必須:
- 設定 VMware 安裝的 Knative serving,以符合機群需求。
- 在機群中啟用 Knative serving 功能元件。
請注意,Kubernetes API 伺服器不會在遷移期間受到影響。
如要瞭解如何在 VMware 上全新安裝 Knative serving,請參閱「在 VMware 上安裝 Knative serving」。
事前準備
你必須符合下列條件:
- 如要完成這些步驟,您必須向機群註冊 VMware 叢集上的 Knative 服務,並在 Google Cloud 控制台中查看: 
- 您在 VMware 中安裝的 Knative Serving 位於執行 Anthos 1.7 版或更早版本的叢集。 
- Anthos 1.8 不再支援 Istio。您必須先在機群中安裝 Cloud Service Mesh 1.18 版,並設定 Knative serving 安裝作業,才能將叢集升級至 1.8 版。 - 如要瞭解如何在 Google Distributed Cloud 上安裝,請參閱 Cloud Service Mesh 操作說明。 - 請注意,Cloud Service Mesh 規定叢集必須使用至少有四個 vCPU 的機器類型,例如 - e2-standard-4。如要變更叢集的機器類型,請參閱「將工作負載遷移至不同的機器類型」。
- 您可以透過下列兩種方式,將 Knative Serving 遷移至 Cloud Service Mesh: - 取得新的外部 IP 位址,並設定負載平衡器。 
- 重複使用現有的負載平衡器 IP 位址。 
 
遷移至機群
如要將 Anthos 升級至 1.8 版,請先執行下列步驟,確保現有的 VMware 安裝項目上的 Knative serving 已遷移至使用機群元件。
存取管理員叢集
取得管理員叢集 kubeconfig 檔案的路徑和檔案名稱,然後建立 ADMIN_KUBECONFIG 環境變數:
export ADMIN_KUBECONFIG=[ADMIN_CLUSTER_KUBECONFIG]
請將 [ADMIN_CLUSTER_KUBECONFIG] 替換為管理員叢集的 kubeconfig 檔案路徑和檔案名稱。
設定每個使用者叢集
- 為使用者叢集建立下列本機環境變數: - 使用使用者叢集 kubeconfig 檔案的路徑建立 - USER_KUBECONFIG環境變數:- export USER_KUBECONFIG=[USER_CLUSTER_KUBECONFIG]- 將 [USER_CLUSTER_KUBECONFIG] 替換為使用者叢集 kubeconfig 檔案的路徑和檔案名稱。 
- 為下列設定建立環境變數: - Google Cloud 專案的 ID。
- Google Cloud 資源的位置。
- 使用者叢集名稱。
 - export PROJECT_ID=$(kubectl get configmaps --namespace knative-serving config-observability --output jsonpath="{.data['metrics\.stackdriver-project-id']}") export CLUSTER_LOCATION=$(kubectl get configmaps --namespace knative-serving config-observability --output jsonpath="{.data['metrics\.stackdriver-gcp-location']}") export CLUSTER_NAME=$(kubectl get configmaps --namespace knative-serving config-observability --output jsonpath="{.data['metrics\.stackdriver-cluster-name']}")
 
- 從使用者叢集的 - OnPremUserCluster自訂資源中移除- cloudrun設定:- 確認 - cloudRun已在- OnPremUserCluster中設定:- $ kubectl get onpremusercluster \ "${CLUSTER_NAME}" \ --namespace "${CLUSTER_NAME}-gke-onprem-mgmt" \ --kubeconfig="${ADMIN_KUBECONFIG}" \ --output=jsonpath="{.spec.cloudRun}"- 結果: - {"enabled":true}
- 從 - OnPremUserCluster移除- cloudRun:- kubectl patch onpremusercluster \ "${CLUSTER_NAME}" \ --namespace "${CLUSTER_NAME}-gke-onprem-mgmt" \ --kubeconfig="${ADMIN_KUBECONFIG}" \ --type="merge" \ --patch '{"spec": {"cloudRun": null}}'
- 執行相同的 - get指令,並確認未傳回任何設定,藉此驗證- cloudRun是否已從- OnPremUserCluster中成功移除:- kubectl get onpremusercluster \ "${CLUSTER_NAME}" \ --namespace "${CLUSTER_NAME}-gke-onprem-mgmt" \ --kubeconfig="${ADMIN_KUBECONFIG}" \ --output=jsonpath="{.spec.cloudRun}"- 終端機不應有任何輸出內容。 
 
- 更新使用者叢集的 create-config 密碼: - 建立 create-config 檔案的本機 YAML 副本: - kubectl get secret create-config \ --kubeconfig="${ADMIN_KUBECONFIG}" \ --namespace "${CLUSTER_NAME}" \ --output=jsonpath={.data.cfg} \ | base64 -d > "${CLUSTER_NAME}_create_secret.yaml"
- 在編輯器中開啟剛建立的 - ${CLUSTER_NAME}_create_secret.yaml檔案,然後從- spec下方移除- cloudrun欄位。
- 將 - ${CLUSTER_NAME}_cluster_create_secret.yaml檔案 Base64 編碼為- .b64檔案:- cat "${CLUSTER_NAME}_create_secret.yaml" | base64 -w0 > "${CLUSTER_NAME}_create_secret.b64"
- 在編輯器中開啟您剛建立的本機 - .b64檔案,然後複製- data.cfg屬性下方的字串,以用於下一個步驟。- 請務必只複製 - cfg屬性的內容。 舉例來說,請勿加入任何換行符號 (- \n)。
- 執行下列指令,在使用者叢集上編輯密鑰: - kubectl edit secret create-config --kubeconfig="${ADMIN_KUBECONFIG}" \ --namespace "${CLUSTER_NAME}"
- 在開啟的編輯器中,將 - data[cfg]欄位替換為從本機- .b64檔案複製的字串,然後儲存變更。
- 確認變更已部署至使用者叢集,且 - cloudrun屬性已從- create-config密鑰中成功移除:- kubectl get secret create-config \ --kubeconfig="${ADMIN_KUBECONFIG}" \ --namespace ${CLUSTER_NAME} \ --output=jsonpath={.data.cfg} \ | base64 -d
 
- 在使用者叢集中設定 - knative-serving命名空間:- 從 - knative-serving命名空間刪除- cloudrun-operator運算子:- kubectl delete deployments.apps --kubeconfig=${USER_KUBECONFIG} --namespace knative-serving cloudrun-operator
- 修補 - knative-serving命名空間中的- config-networkconfigmap:- kubectl patch configmap --kubeconfig=${USER_KUBECONFIG} --namespace knative-serving config-network --patch '{"metadata": {"annotations":{"knative.dev/example-checksum": null}}}'
 
- 從使用者叢集的設定檔 - user-config.yaml中,移除 Google Distributed Cloud 安裝作業的- cloudrun.enabled設定。- 您必須從 - user-config.yaml檔案中刪除下列屬性:- cloudRun: enabled: true- 將叢集升級至 Anthos 1.8 版時,這項設定變更就會部署完成。 
- 如果您有多個使用者叢集,必須為每個使用者叢集重複執行「設定每個使用者叢集」一節中的所有步驟。 
設定機群元件
- 在機群中啟用 Knative serving 元件: - gcloud container fleet cloudrun enable --project=$PROJECT_ID- 如需詳細資料和其他選項,請參閱 gcloud container fleet cloudrun enable 參考資料。 
- 選用:確認 Knative serving 功能元件已啟用: - 控制台- 在Google Cloud 控制台中查看 Knative serving 元件是否已啟用: - 指令列- 查看 - appdevexperience狀態是否為- ENABLED:- gcloud container fleet features list --project=$PROJECT_ID- 如需詳細資料和其他選項,請參閱 gcloud container fleet features list 參考資料。 - 結果: - NAME STATE appdevexperience ENABLED
- 部署 - CloudRun自訂資源,在每個使用者叢集上安裝 VMware 中的 Knative Serving。根據預設,系統會部署- latest版本的 Knative serving。- 執行下列 - kubectl apply指令,部署- CloudRun自訂資源的預設設定:- cat <<EOF | kubectl apply -f - apiVersion: operator.run.cloud.google.com/v1alpha1 kind: CloudRun metadata: name: cloud-run spec: metricscollector: stackdriver: projectid: $PROJECT_ID gcpzone: $CLUSTER_LOCATION clustername: $CLUSTER_NAME secretname: "stackdriver-service-account-key" secretkey: "key.json" EOF
設定 Cloud Service Mesh
為每個使用者叢集設定 Cloud Service Mesh 負載平衡器。
您可以設定新的外部 IP 位址,或重複使用現有的 IP 位址,藉此設定 Cloud Service Mesh 的 Ingress 閘道:
- 取得新的外部 IP 位址後,請按照 Cloud Service Mesh 說明文件中的步驟設定負載平衡器。 - 請注意,這個選項可確保 Knative 服務重新啟動時不會中斷。 
- 替代做法:按照下列步驟,將 Cloud Service Mesh 負載平衡器設定為現有的 IP 位址。 - 執行下列指令,將服務的閘道設定為 Cloud Service Mesh: - export CURRENT_INGRESS_IP=$(kubectl get service --namespace gke-system istio-ingress --output jsonpath='{.spec.loadBalancerIP}') kubectl patch service --namespace istio-system istio-ingressgateway --patch "{\"spec\":{\"loadBalancerIP\": \"$CURRENT_INGRESS_IP\"}}" kubectl patch service --namespace gke-system istio-ingress --patch "{\"spec\":{\"loadBalancerIP\": null}}"
- 移除目前的 Istio 設定: - kubectl patch configmap --namespace knative-serving config-istio --patch '{"data":{"local-gateway.cluster-local-gateway": null}}' kubectl patch configmap --namespace knative-serving config-istio --patch '{"data":{"gateway.gke-system-gateway": null}}'
 
驗證遷移作業
您可以檢查 appdevexperience-operator 是否正常運作,確認 VMware 上的 Knative 服務已成功遷移至機群。
針對每個使用者叢集,執行下列指令:
 kubectl get deployment -n appdevexperience appdevexperience-operatorappdevexperience-operator
 運算子 
 應顯示 1/1 為就緒狀態,例如:
 NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
 appdevexperience-operator   1/1     1            1           1h
如果運算子無法達到就緒狀態,您可以在 Google Cloud 控制台中查看叢集的工作負載頁面,找出資源問題:
前往 Google Kubernetes Engine 工作負載
升級叢集
您已將 VMware 安裝的 Knative serving 遷移至使用機群元件,現在可以將叢集升級至 Anthos 1.8 版。請按照「升級 GKE On-Prem」中的詳細說明操作。
疑難排解
- 使用者叢集的升級程序無法完成
- gke-system命名空間中的- cluster-local-gatewayPod 可能會導致使用者叢集無法完成升級至 Anthos 1.8 版。現在已不需要- cluster-local-gatewayPod,可以安全移除。- 如要手動輔助升級程序,您可以將 Deployment 副本縮減至 - 0,藉此手動移除- cluster-local-gatewayPod。例如:- 縮減 - cluster-local-gateway:- kubectl scale deployment cluster-local-gateway --replicas 0 --namespace gke-system- 系統會移除 - gke-system命名空間中的- cluster-local-gatewayPod,以及- knative-serving命名空間中的所有工作負載。
- 等待升級程序完成。