排解常見問題

本頁面說明如何解決 GKE on AWS 的常見問題。

如需其他協助,請與 Cloud Customer Care 團隊聯絡。

常見錯誤訊息

下列各節說明一些常見錯誤訊息的原因和解決方法。

伺服器沒有資源

如果叢集沒有正在執行的節點集區,或 Connect 閘道無法連線至節點集區,就會發生 error: the server doesn't have a resource type "services" 等錯誤。如要檢查節點集區的狀態,請執行下列指令:

gcloud container aws node-pools list \
    --cluster-name CLUSTER_NAME \
    --location LOCATION

更改下列內容:

  • CLUSTER_NAME:叢集名稱
  • LOCATION:管理叢集的 Google Cloud 位置

輸出結果包含叢集節點集區的狀態。如果沒有列出節點集區,請建立節點集區

禁止使用的使用者

如果使用者名稱沒有叢集的管理員存取權,就會發生下列錯誤:

Error from server (Forbidden): users "administrator@example.com" is forbidden:
User "system:serviceaccount:gke-connect:connect-agent-sa" cannot impersonate
resource "users" in API group "" at the cluster scope

建立叢集時,您可以傳遞 --admin-users 旗標,設定其他使用者。

如果您使用 Connect 閘道,但無法連線至叢集,請嘗試下列步驟:

  1. 取得叢集的授權使用者。

    gcloud container aws clusters describe CLUSTER_NAME \
        --format 'value(authorization.admin_users)'
    

    CLUSTER_NAME 替換為叢集的名稱。

    輸出結果包含具有叢集管理員存取權的使用者名稱。 例如:

    {'username': 'administrator@example.com'}
    
  2. 取得目前透過 Google Cloud CLI 驗證的使用者名稱。

    gcloud config get-value account
    

    輸出內容會包含透過 Google Cloud CLI 驗證的帳戶。如果 gcloud containers aws clusters describegcloud config get-value account 的輸出內容不相符,請執行 gcloud auth login,並以具有叢集管理存取權的使用者名稱進行驗證。

kubectl 指令相關問題

下列各節提供指引,說明如何解決 kubectl 指令沒有回應或失敗的問題。

kubectl 指令停止回應

如果叢集執行的 Kubernetes 版本低於 1.25,且 kubectl 指令沒有回應或逾時,最常見的原因是您尚未建立節點集區。根據預設,GKE on AWS 會產生使用 Connect 閘道做為可透過網際網路連線端點的 kubeconfig 檔案。如要這麼做,gke-connect-agent Deployment 必須在叢集的節點集區中執行。

如需更多診斷資訊,請執行下列指令:

kubectl cluster-info -v=9

如果沒有正在執行的節點集區,要求會失敗並顯示 404 錯誤。connectgateway.googleapis.comcannot find active connections for cluster

如果是 Kubernetes 1.25 以上版本的叢集,gke-connect-agent會執行於控制層,不需要節點集區。如果 kubectl 指令沒有回應,請使用 Cloud Logging 檢查控制層元件記錄。

kubectl exec、attach 和 port-forward 指令失敗

使用 Connect 閘道時,kubectl execkubectl attachkubectl port-forward 指令可能會失敗,並顯示 error: unable to upgrade connection 訊息。使用 Connect 閘道做為 Kubernetes API 伺服器端點時,會受到這項限制。

如要解決這個問題,請使用 kubeconfig 指定叢集的私有端點。如要瞭解如何透過叢集的私有端點存取叢集,請參閱「設定 kubectl 的叢集存取權」。

kubectl logs 失敗,並顯示遠端錯誤:tls: internal error

如果控制平面 API 角色缺少權限,就可能發生這個問題。舉例來說,如果 AWS 角色缺少ec2:DescribeDhcpOptions權限,就可能發生這種情況。在這種情況下,系統無法核准節點的憑證簽署要求,且工作節點缺少有效憑證。

如要判斷是否為這個問題,請使用下列指令,檢查是否有尚未核准的待處理憑證簽署要求:

kubectl get csr

如要解決這個問題,請確認 AWS 角色符合規定

一般 kubectl 疑難排解

如果使用 Connect Gateway:

  • 確認您已在 Google Cloud 專案中啟用 Connect 閘道:

    gcloud services enable connectgateway.googleapis.com
    
  • 如果叢集的 Kubernetes 版本低於 1.25,請確保您至少有一個 Linux 節點集區正在執行,且 gke-connect-agent 正在執行。詳情請參閱「排解叢集連線問題」。

  • 如果是 Kubernetes 1.25 以上版本的叢集,請使用 Cloud Logging 查看記錄檔gke-connect-agent

Kubernetes Service (LoadBalancer) 或 Kubernetes Ingress 無法運作

如果已建立 AWS Elastic Load Balancer (ELB/NLB/ALB),但運作不如預期,可能是子網路標記有問題。詳情請參閱負載平衡器子網路

Arm 節點上的 Pod 發生當機

在 Arm 節點上部署 Pod 時,如果容器映像檔不是為 Arm 架構建構,就會發生下列問題。

如要找出問題,請完成下列事項:

  1. 取得 Pod 的狀態:

    kubectl get pods
    
  2. 取得當機 Pod 的記錄:

    kubectl logs POD_NAME
    

    POD_NAME 替換為當機 Pod 的名稱。

    Pod 記錄中的錯誤訊息類似於下列內容:

    exec ./hello-app: exec format error
    

如要解決這個問題,請確認容器映像檔支援 Arm 架構。按照最佳做法,請建構多個架構映像檔。

無法刪除叢集

如果您嘗試刪除叢集時收到類似以下的錯誤訊息,可能是因為 GKE Multi-Cloud API 角色不存在:

ERROR: (gcloud.container.aws.clusters.delete) FAILED_PRECONDITION: Could not
assume role
"arn:aws:iam::ACCOUNT_NUMBER:role/gke123456-anthos-api-role"
through service account
"service-123456789@gcp-sa-gkemulticloud.iam.gserviceaccount.com".
Please make sure the role has a trust policy allowing the GCP service agent to
assume it: WebIdentityErr failed to retrieve credentials

如要修正問題,請按照「建立 GKE Multi-Cloud API 角色」一文中的步驟操作。使用相同名稱和權限重新建立角色後,即可重試指令。

後續步驟