本頁面說明如何解決 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 閘道,但無法連線至叢集,請嘗試下列步驟:
取得叢集的授權使用者。
gcloud container aws clusters describe CLUSTER_NAME \ --format 'value(authorization.admin_users)'
將
CLUSTER_NAME
替換為叢集的名稱。輸出結果包含具有叢集管理員存取權的使用者名稱。 例如:
{'username': 'administrator@example.com'}
取得目前透過 Google Cloud CLI 驗證的使用者名稱。
gcloud config get-value account
輸出內容會包含透過 Google Cloud CLI 驗證的帳戶。如果
gcloud containers aws clusters describe
和gcloud 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.com
cannot find active connections for cluster
如果是 Kubernetes 1.25 以上版本的叢集,gke-connect-agent
會執行於控制層,不需要節點集區。如果 kubectl
指令沒有回應,請使用 Cloud Logging 檢查控制層元件記錄。
kubectl exec、attach 和 port-forward 指令失敗
使用 Connect 閘道時,kubectl exec
、kubectl attach
和 kubectl 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 架構建構,就會發生下列問題。
如要找出問題,請完成下列事項:
取得 Pod 的狀態:
kubectl get pods
取得當機 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 角色」一文中的步驟操作。使用相同名稱和權限重新建立角色後,即可重試指令。
後續步驟
- 如需其他協助,請與 Cloud Customer Care 團隊聯絡。