arrow_back

透過 Cloud Shell 部署 GKE Autopilot 叢集

登录 加入
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

透過 Cloud Shell 部署 GKE Autopilot 叢集

Lab 1 小时 universal_currency_alt 1 积分 show_chart 入门级
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

總覽

在本研究室中,您將透過指令列建構 GKE 叢集、檢查 kubeconfig 檔案,並使用 kubectl 控制叢集。

目標

在這個研究室中,您會瞭解如何執行下列工作:

  • 使用 kubectl 建構及控制 GKE 叢集
  • 透過 kubectl 和設定檔部署 Pod
  • 使用 Container Registry 儲存及部署容器

設定研究室

存取 Qwiklabs

在每個研究室中,您都能在固定時間內免付費建立新的 Google Cloud 專案,並使用一組資源。

  1. 請透過無痕式視窗登入 Qwiklabs。

  2. 請記下研究室的存取時間 (例如 1:15:00),並確保自己能在時間限制內完成作業。
    研究室不提供暫停功能。如有需要,您可以重新開始,但原先的進度恕無法保留。

  3. 準備就緒後,請按一下「Start lab」

  4. 請記下研究室憑證 (使用者名稱密碼),這組資訊將用於登入 Google Cloud 控制台。

  5. 按一下「Open Google Console」

  6. 按一下「Use another account」,然後複製這個研究室的憑證,並貼入提示訊息。
    如果使用其他憑證,系統會顯示錯誤或向您收取費用

  7. 接受條款,然後略過資源復原頁面。

完成初始登入步驟後,就會看到專案資訊主頁。

專案資訊主頁分頁式頁面

開啟 Cloud Shell

您將在 Cloud Shell 中進行大部分的工作。Cloud Shell 是在 Google Cloud 中運作的指令列環境,這種以 Debian 為基礎的虛擬機器,搭載各種您需要的管理工具 (例如 dockergcloud、gsutilkubectl),而且主目錄配備 5 GB 的永久磁碟儲存空間。

  1. 在 Google Cloud 控制台的標題列中,點選「啟用 Cloud Shell」圖示 「啟用 Cloud Shell」圖示
  2. 點選「繼續」

系統會花費一些時間佈建,然後顯示下列 Cloud Shell 提示:

Cloud Shell 提示顯示下列訊息:Welcome to Cloud Shell! Type "help" to get started.

工作 1:部署 GKE 叢集

您將在這項工作中,使用 Cloud Shell 部署 GKE 叢集。

  1. 在 Cloud Shell 輸入下列指令,設定可用區和叢集名稱的環境變數:
export my_region={{{project_0.default_region|Region}}} export my_cluster=autopilot-cluster-1
  1. 在 Cloud Shell 輸入下列指令,建立 Kubernetes 叢集:
gcloud container clusters create-auto $my_cluster --region $my_region

這種形式的指令會將大部分的選項設為預設值。如要查看完整的可用選項組合,請參閱 gcloud container clusters create 參考資料

系統會顯示多則警告,說明 GKE 已採行數項預設 GKE 叢集設定變更,而這些變更是以新版 Kubernetes 的形式導入。

注意:叢集部署作業會在數分鐘內完成。

部署完畢後,Google Cloud 控制台的「Kubernetes Engine」>「叢集」頁面應該會如下列螢幕截圖所示:

Kubernetes「叢集」頁面顯示 autopilot-cluster-1 的詳細資料,如位置、叢集大小、核心總數和記憶體總量

點選「Check my progress」,確認目標已達成。 部署 GKE 叢集

工作 2:連線至 GKE 叢集

在這項工作中,您會透過 Cloud Shell 向 GKE 叢集進行驗證,然後檢查 kubectl 設定檔。

以下兩種情況皆適用 Kubernetes 驗證機制:透過在主要節點上運作的 kube-APIserver 從外部用戶端與叢集進行通訊,以及叢集容器在叢集內或外部進行通訊。

在 Kubernetes 中,可透過數種形式進行驗證。就 GKE 而言,驗證通常是透過 OAuth2 權杖處理,而且在整個專案中皆可以整體形式透過 Cloud Identity and Access Management 進行管理。您也可以選擇套用角色式存取權控管機制 (可在各個叢集內定義及設定),以此做為驗證措施。

在 GKE 中,叢集容器可透過服務帳戶向外部資源進行驗證並存取該資源。

注意:1.12 以下版本的 Kubernetes 預設不會停用用戶端憑證和基本驗證功能。這些是安全性較低的驗證方法,應設為停用以提升叢集安全性 (如果是 1.12 以上的版本,這兩種方法都會預設為停用)。
  1. 如要以目前使用者的憑證建立 kubeconfig 檔案 (目的為允許驗證),並提供特定叢集的端點詳細資料 (以允許透過 kubectl 指令列工具與該叢集通訊),請執行下列指令:
gcloud container clusters get-credentials $my_cluster --region $my_region

如果相關設定尚未存在的話,這個指令會在主目錄中建立 .kube 目錄,然後在 .kube 目錄中建立一個用來儲存驗證和設定資訊的檔案,名稱為 config。這個設定檔通常稱為 kubeconfig 檔案。

  1. 使用 nano 文字編輯器開啟 kubeconfig 檔案:
nano ~/.kube/config

您現在可以檢查檔案中儲存的所有驗證和端點設定資料。畫面上應該會顯示叢集的資訊,這項資訊是在叢集建立時填入。

  1. 按下 CTRL+X 鍵,退出 nano 編輯器。
注意:kubeconfig 檔案可能會包含多個叢集的資訊。current-context 屬性會指出現行環境 (即 kubectl 指令所控制的叢集)。

由於這個叢集建立時,系統便已填入相關叢集的詳細資料,因此您不必再執行 gcloud container clusters get-credentials 指令,為同一個環境 (同一個使用者在同一個環境) 中建立的叢集填入 kubeconfig 檔案。

不過,如要連線至在其他環境中或由其他使用者建立的叢集,就必須執行這個指令。這個指令還可讓您輕鬆將現行環境切換成其他叢集。

工作 3:透過 kubectl 檢查 GKE 叢集

您將在這項工作中,使用 Cloud Shell 和 kubectl 檢查 GKE 叢集。

填入 kubeconfig 檔案並將現行環境設為特定叢集後,便可使用 kubectl 指令列工具對該叢集執行指令。這類指令大多最終都會對主要 API 伺服器觸發 REST API 呼叫,進而觸發相關的操作。

  1. 在 Cloud Shell 中執行下列指令,系統就會顯示 kubeconfig 檔案的內容:
kubectl config view

系統會將機密的憑證資料更換為「DATA+OMITTED」。

  1. 在 Cloud Shell 中執行下列指令,系統就會顯示現行環境的叢集資訊:
kubectl cluster-info

輸出內容會描述現行環境叢集。

輸出內容:

Kubernetes control plane is running at https://34.133.211.75 GLBCDefaultBackend is running at https://34.133.211.75/api/v1/namespaces/kube-system/services/default-http-backend:http/proxy KubeDNS is running at https://34.133.211.75/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy KubeDNSUpstream is running at https://34.133.211.75/api/v1/namespaces/kube-system/services/kube-dns-upstream:dns/proxy Metrics-server is running at https://34.133.211.75/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  1. 在 Cloud Shell 中執行下列指令,系統就會顯示現行環境:
kubectl config current-context

畫面上會顯示一行輸出內容,指出現行環境叢集。

輸出內容:

gke_{{{project_0.project_id|Project_ID}}}_{{{project_0.default_region|Region}}}_autopilot-cluster-1

PROJECT_ID 是您的專案 ID。這項資訊和 kubeconfig 檔案中 current-context 屬性提供的資訊一樣。

  1. 在 Cloud Shell 中執行下列指令,系統就會顯示 kubeconfig 檔案中所有叢集環境的某些詳細資料:
kubectl config get-contexts

畫面上會顯示數行輸出內容,提供您建立的叢集詳細資料,並指出哪一個是現行環境叢集。一般來說,這個指令會將使用者在 kubeconfig 檔案中建立的任何其他叢集,以及手動加入該 kubeconfig 檔案之所有叢集的部分詳細資料列出。

  1. 在 Cloud Shell 執行下列指令,變更現行環境:
kubectl config use-context gke_${DEVSHELL_PROJECT_ID}_{{{project_0.default_region|Region}}}_autopilot-cluster-1

就本例而言,您只有一個叢集,所以這個指令並未造成任何變更。

不過,之後在同一個專案中,您可能會有不只一個叢集。屆時如果 kubeconfig 檔案已填入數個叢集的憑證和設定,您便可利用這個方法切換現行環境。如要使用這個方法,則需提供叢集的全名,當中包括 gke 前置字串、專案 ID、位置和顯示名稱,並以底線相互串連。

  1. 在 Cloud Shell 執行下列指令,為 kubectl 啟用 Bash 自動完成功能:
source <(kubectl completion bash)

這個指令不會產生任何輸出內容。

  1. 在 Cloud Shell 中輸入 kubectl,後面加上一個空格,然後按 Tab 鍵兩次。

殼層就會輸出所有可用的指令:

Cloud Shell 顯示所有可用的輸出指令

  1. 在 Cloud Shell 中輸入 kubectl co,然後按 Tab 鍵兩次。

殼層就會輸出所有開頭為「co」(或您輸入的任何其他文字) 的指令。

Cloud Shell 顯示所有開頭為 co 的輸出指令,如 completion、convert、config 和 cordon

工作 4:將 Pod 部署至 GKE 叢集

您將在這項工作中,使用 Cloud Shell 將 Pod 部署至 GKE 叢集。

使用 kubectl 將 Pod 部署至 GKE

Kubernetes 導入 Pod 這個抽象層,將一或多個相關容器歸類為單一實體,在同一個節點上以一個單位的形式來排程及部署。您可以部署代表單一容器 (來源為某個容器映像檔) 的 Pod。一個 Pod 也可以包含來源為多個容器映像檔的多個容器。

  1. 在 Cloud Shell 中執行下列指令,以名為 nginx-1 的 Pod 形式部署 nginx:
kubectl create deployment --image nginx nginx-1

這個指令會建立一個名為 nginx 的 Pod,內含一個執行 nginx 映像檔的容器。如未指定存放區,系統的預設行為,就是試著在本機或 Docker 公開登錄檔尋找該映像檔。就本例而言,該映像檔是從 Docker 公開登錄檔提取而來。

  1. 在 Cloud Shell 中執行下列指令,查看現行環境叢集中所有部署的 Pod:
kubectl get pods

輸出內容應如下所示,但 Pod 名稱可能稍有不同。

注意:如果系統顯示訊息,指出伺服器目前無法處理要求,請等待部署完畢且準備就緒。

輸出內容:

NAME READY STATUS RESTARTS AGE nginx-1-74c7bbdb84-nvwsc 1/1 Running 0 2m52s
  1. 在 Cloud Shell 執行下列指令,查看叢集所有節點的資源使用情形:
kubectl top nodes

輸出內容應如下列範例所示。

輸出內容:

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% gk3-autopilot-cluster-1-pool-2-7246ae0e-4q7s 1971m 102% 1803Mi 30%

如果執行另一個 top 指令 (kubectl top pods),系統也會為叢集中所有部署的 Pod 顯示類似資訊。

  1. 在變數中輸入 Pod 名稱,本研究室活動全程都會使用該變數。使用這類變數可幫助您大幅減少輸入長名稱時可能出現的人為錯誤。[your_pod_name] 這個部分需改為 Pod 的專屬名稱:
export my_nginx_pod=[your_pod_name]

範例:

export my_nginx_pod=nginx-1-74c7bbdb84-nvwsc
  1. 使用 echo 指令讓殼層向您回報值,確認環境變數已設定成功:
echo $my_nginx_pod

輸出內容:

nginx-1-74c7bbdb84-nvwsc
  1. 在 Cloud Shell 中執行下列指令,查看您剛建立的 Pod 的完整詳細資料:
kubectl describe pod $my_nginx_pod

輸出內容應如下列範例所示。系統會顯示 Pod 的詳細資料、狀態與狀況,以及生命週期中的事件。

輸出內容:

Image: nginx Image: nginx Image: nginx Image ID: docker.io/library/nginx@sha256:480868e8c8c797794257e2abd88d0f9a8809b2fe956cbfbc05dcc0bca1f7cd43 Port: Host Port: State: Running Started: Wed, 17 May 2023 10:47:04 +0000 Ready: True Restart Count: 0 Limits: cpu: 500m ephemeral-storage: 1Gi memory: 2Gi Requests: cpu: 500m ephemeral-storage: 1Gi memory: 2Gi Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-ksxxr (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-ksxxr: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: DownwardAPI: true QoS Class: Guaranteed Node-Selectors: Tolerations: kubernetes.io/arch=amd64:NoSchedule node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 5m42s gke.io/optimize-utilization-scheduler 0/2 nodes are available: 2 Insufficient cpu, 2 Insufficient memory. preemption: 0/2 nodes are available: 2 No preemption victims found for incoming pod. Normal Scheduled 4m15s gke.io/optimize-utilization-scheduler Successfully assigned default/nginx-1-6b7bff9fc7-t7fzk to gk3-autopilot-cluster-1-pool-1-242a3a6a-j9rh Normal TriggeredScaleUp 5m34s cluster-autoscaler pod triggered scale-up: [{https://www.googleapis.com/compute/v1/projects/qwiklabs-gcp-02-92c260add90a/zones/{{{project_0.default_zone|Zone}}}/instanceGroups/gk3-autopilot-cluster-1-pool-1-242a3a6a-grp 0->1 (max: 1000)}] Normal Pulling 3m30s kubelet Pulling image "nginx" Normal Pulled 3m16s kubelet Successfully pulled image "nginx" in 13.843394735s (13.843643782s including waiting) Normal Created 3m16s kubelet Created container nginx Normal Started 3m15s kubelet Started container nginx

將檔案推送至容器

您需要建立檔案並將該檔案放到容器中,才能透過 nginx 網路伺服器提供靜態內容。

  1. 在 Cloud Shell 中輸入下列指令,以在 nano 文字編輯器中開啟名為 test.html 的檔案:
nano ~/test.html
  1. 將下列文字 (殼層指令碼) 新增至空白的 test.html 檔案:
This is title Hello world
  1. 依序按下 CTRL+X 鍵、Y 鍵和 Enter 鍵,即可儲存檔案並退出 nano 編輯器。

  2. 在 Cloud Shell 中執行下列指令,將檔案放到 nginx Pod 中 nginx 容器內的適當位置,以透過靜態方式提供該內容:

kubectl cp ~/test.html $my_nginx_pod:/usr/share/nginx/html/test.html

這個指令會將本機主目錄中的 test.html 檔案複製到 nginx Pod 中第一個容器的 /usr/share/nginx/html 目錄。您可以使用 -c 選項,後面加上容器名稱,藉此指定多容器 Pod 中的其他容器。

公開 Pod 來進行測試

如要向叢集外的用戶端公開 Pod,必須要有 Service。本課程的其他段落會探討 Service,其他研究室也會廣泛使用 Service。您可以使用簡單的指令,建立 Service 來公開 Pod。

  1. 在 Cloud Shell 中執行下列指令,建立 Service 以對外公開 nginx Pod:
kubectl expose pod $my_nginx_pod --port 80 --type LoadBalancer

這個指令會建立 LoadBalancer Service,這樣就能將 nginx Pod 的存取權開放給叢集外的網際網路位址。

  1. 在 Cloud Shell 中執行下列指令,查看叢集中的 Service 相關詳細資料:
kubectl get services

輸出內容應如下列範例所示。下一步會用到外部 IP 位址。

注意:您可能需要重複執行這個指令幾次,新的 Service 才會填入外部 IP。

輸出內容:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.11.240.1 443/TCP 1h nginx-1-7...wsc LoadBalancer 10.11.240.87 80:31695/TCP 3s

這個 Kubernetes Service 是叢集建立或使用的其中一項預設 Service。輸出結果中也會顯示您建立的 nginx Service。

您可能需要重新執行這個指令數次,系統才會顯示外部 IP 位址。

輸出內容:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.11.240.1 443/TCP 1h nginx-1-7...wsc LoadBalancer 10.11.240.87 104.154.177.46 80:31695/TCP 1m

點選「Check my progress」確認目標已達成。 將 Pod 部署至 GKE 叢集

  1. 在 Cloud Shell 中執行下列指令,確認 nginx 容器是否提供您複製的靜態 HTML 檔案。

請將 [EXTERNAL_IP] 改為您在上一步輸出內容中取得的 Service 外部 IP 位址。

curl http://[EXTERNAL_IP]/test.html

輸出結果中會顯示檔案內容。您可以透過瀏覽器前往同一個位址,查看以 HTML 形式呈現的檔案。

範例:

curl http://104.154.177.46/test.html This is title Hello world
  1. 在 Cloud Shell 中執行下列指令,查看 nginx Pod 正在使用的資源:
kubectl top pods

輸出內容:

NAME CPU(cores) MEMORY(bytes) nginx-1-74c7bbdb84-nvwsc 0m 2Mi

工作 5:執行 GKE Pod 自我檢查

在這項工作中,您將連線至 Pod,然後調整設定、編輯檔案,以及對該 Pod 進行其他即時變更。

注意:這項程序僅適用於疑難排解或實驗。由於您所做的變更並不會套用至 Pod 的來源映像檔,因此所有備用資源中也不會出現這些變更。

準備環境

如要將 Pod 及其他資源部署至 Kubernetes,建議您透過設定檔 (有時又稱為「資訊清單檔案」)。設定檔通常是以 YAML 語法編寫,註明資源的詳細資料。如要指定複雜的選項,使用設定檔會比編寫一行冗長的指令列引數來得簡單方便。

YAML 語法和 JSON 語法很類似,但前者較為精簡,且支援同一種物件和屬性階層結構。本研究室的來源存放區中有我們為您準備的範例 YAML 檔案。

  1. 在 Cloud Shell 中輸入下列指令,將存放區複製到研究室 Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
  1. 建立一個軟連結,做為工作目錄的捷徑:
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
  1. 切換到包含研究室範例檔案的目錄:
cd ~/ak8s/GKE_Shell/

我們已為您提供一個 Pod 適用的範例資訊清單 YAML 檔案,名為 new-nginx-pod.yaml

apiVersion: v1 kind: Pod metadata: name: new-nginx labels: name: new-nginx spec: containers: - name: new-nginx image: nginx ports: - containerPort: 80
  1. 如要部署資訊清單,請執行下列指令:
kubectl apply -f ./new-nginx-pod.yaml

點選「Check my progress」,確認目標已達成。 透過 Yaml 檔案部署新 Pod

  1. 如要查看 Pod 清單,請執行下列指令:
kubectl get pods

輸出內容應如範例所示。

輸出內容:

NAME READY STATUS RESTARTS AGE new-nginx 1/1 Running 0 9s nginx-1-74c7bbdb84-nvwsc 1/1 Running 0 55m

您可以看到新的 nginx Pod,以及先前在研究室中建立的 Pod。

使用殼層重新導向功能連線至 Pod

某些容器映像檔包含可啟動的殼層環境。相較於透過 kubectl 執行個別指令,使用這個殼層環境可能會比較方便。舉例來說,nginx 映像檔包含 Bash 殼層。在這項工作中,您將使用殼層重新導向功能連線至新 nginx Pod 中的 Bash 殼層,以執行一連串的操作。

  1. 在 Cloud Shell 中執行下列指令,啟動 nginx 容器中的互動式 Bash 殼層:
kubectl exec -it new-nginx -- /bin/bash

畫面上會出現新的殼層提示。

輸出內容:

root@new-nginx:/#

您已啟動 new-nginx Pod 容器中的互動式 Bash 殼層。如果該 Pod 有數個容器,可透過 -c 選項使用名稱來指定容器。

根據預設,nginx 容器映像檔沒有文字編輯工具,因此您需要自行安裝。

  1. 使用 Cloud Shell 在 nginx Bash 殼層中執行下列指令,安裝 nano 文字編輯器:
apt-get update apt-get install nano

收到「Do you want to continue (Y/n)」這個提示時,按下 Y 鍵即可確認操作。

您需要在 nginx 容器上靜態提供的目錄中建立 test.html 檔案。

  1. 使用 Cloud Shell 在 nginx Bash 殼層中執行下列指令,切換至靜態檔案目錄並建立 test.html 檔案:
cd /usr/share/nginx/html nano test.html
  1. 在 Cloud Shell 的 nginx Bash 殼層 nano 工作階段,輸入下列文字:
This is title Hello world
  1. 依序按下 CTRL+X 鍵、Y 鍵和 Enter 鍵,即可儲存檔案並退出 nano 編輯器。
  2. 使用 Cloud Shell 在 nginx Bash 殼層中執行下列指令,退出 nginx Bash 殼層:
exit

如要連線至修改後的 nginx 容器 (含有新的靜態 HTML 檔案) 並進行測試,可建立 Service。另一個更簡單的方法,就是直接從 Cloud Shell 透過通訊埠轉送功能連線至 Pod。

  1. 在 Cloud Shell 中執行下列指令,設定從 Cloud Shell 到 nginx Pod (從 Cloud Shell VM 的通訊埠 10081 到 nginx 容器的通訊埠 80) 的通訊埠轉送作業:
kubectl port-forward new-nginx 10081:80

輸出內容應如範例所示。

輸出內容:

Forwarding from 127.0.0.1:10081 -> 80 Forwarding from [::1]:10081 -> 80

由於這是前景程序,如要進行測試,請另開一個 Cloud Shell 介面。

  1. 在 Cloud Shell 選單列中,點選加號 (+) 圖示,即可啟動新的 Cloud Shell 工作階段。

Cloud Shell 選單列中以醒目方式顯示的 (+) 圖示

Cloud Shell 視窗中會出現第二個 Cloud Shell 工作階段。只要按一下選單列中的標題,即可切換工作階段。

  1. 在第二個 Cloud Shell 工作階段執行下列指令,透過通訊埠轉送測試修改後的 nginx 容器:
curl http://127.0.0.1:10081/test.html

畫面上會顯示您先前新增到 test.html 檔案的 HTML 文字。

This is title Hello world

查看 Pod 的記錄檔

  1. 在 Cloud Shell 選單列中,點選加號 (+) 圖示,即可啟動另一個新的 Cloud Shell 工作階段。

Cloud Shell 視窗中會出現第三個 Cloud Shell 工作階段。和之前一樣,只要在選單列中點選對應的項目,即可切換工作階段。

  1. 在第三個 Cloud Shell 視窗中執行下列指令,以顯示 new-nginx Pod 的設定檔,並在新記錄檔送達時串流內容 (並加上時間戳記):
kubectl logs new-nginx -f --timestamps
  1. 這個新視窗中會顯示相關記錄檔。
  2. 回到第二個 Cloud Shell 視窗,重新執行 curl 指令,在 Pod 上產生一些流量。
  3. 在第三個 Cloud Shell 視窗中出現額外的記錄訊息時,查看訊息內容。

第三個 Cloud Shell 視窗顯示額外的記錄訊息

  1. 關閉第三個 Cloud Shell 視窗,停止顯示記錄訊息。
  2. 關閉原本的 Cloud Shell 視窗,停止通訊埠轉送程序。

關閉研究室

如果您已完成研究室,請按一下「End Lab」(關閉研究室)。Google Cloud Skills Boost 會移除您使用的資源,並清除所用帳戶。

您可以針對研究室的使用體驗評分。請選取合適的星級評等並提供意見,然後按一下「Submit」(提交)

星級評等代表您的滿意程度:

  • 1 星 = 非常不滿意
  • 2 星 = 不滿意
  • 3 星 = 普通
  • 4 星 = 滿意
  • 5 星 = 非常滿意

如果不想提供意見回饋,您可以直接關閉對話方塊。

如有任何想法、建議或指教,請透過「Support」(支援) 分頁提交。

Copyright 2022 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。