Google Kubernetes Engine (GKE) 中不正確的網路隔離設定,可能會導致叢集建立逾時、節點無法註冊、無法連線至控制層,或是無法提取映像檔等問題。
請參閱本文,瞭解如何排解控制層存取、CIDR 範圍重疊、從公開存放區提取映像檔時發生錯誤,以及與虛擬私有雲網路對等互連或 Private Service Connect 相關的問題。
如果您是平台管理員、營運人員或網路管理員,負責設定及管理網路隔離的 GKE 叢集,以符合安全性與法規遵循規定,請務必瞭解這項資訊。如要進一步瞭解Cloud de Confiance by S3NS 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。
GKE 叢集未執行
刪除以下項目會導致叢集停止運作:允許從叢集控制層輸入流量到通訊埠 10250 上的節點的防火牆規則,以及預設網際網路閘道的預設路徑。如果刪除預設路徑,請務必確保流量會轉送至必要的Cloud de Confiance 服務。詳情請參閱自訂路徑。
建立叢集時逾時
- 問題
- 在 1.28 版或更早版本中建立的叢集,如果使用私人節點,則需要虛擬私有雲之間的對等互連路由。不過,一次只能執行一項對等互連作業。如果嘗試同時建立多個具有上述特徵的叢集,叢集建立作業可能會逾時。
- 解析度
請使用下列其中一種解決方案:
依序建立 1.28 以下版本的叢集,這樣後續每個沒有外部端點的叢集,都會有虛擬私有雲對等互連路由。如果虛擬私有雲正在執行作業,嘗試建立單一叢集也可能會逾時。
建立 1.29 以上版本的叢集。
不慎刪除 VPC 網路對等互連連線
- 問題
如果不小心刪除虛擬私有雲網路對等互連連線,叢集會進入修復狀態,所有節點都會顯示
UNKNOWN狀態。由於與控制層的連線已中斷,您將無法對叢集執行任何作業。檢查控制層時,記錄會顯示類似下列的錯誤:error checking if node NODE_NAME is shutdown: unimplemented- 可能原因
您不小心刪除了 VPC 網路對等互連連線。
解決方法
- 建立新的 GKE 叢集,版本須早於 PSC 切換時間,並使用特定設定。這項操作會強制重新建立虛擬私有雲對等互連連線,讓舊版叢集恢復正常運作。
- 請為新叢集使用下列特定設定:
- 發布管道:延長版
- 叢集版本:1.29 之前的版本,例如 1.28.15-gke.2403000
- 主要 IPv4 CIDR:特定 IP 位址範圍,例如
--master-ipv4-cidr=172.16.0.192/28
- 請為新叢集使用下列特定設定:
- 監控原始叢集狀態。
- 建立新叢集 (並重新建立 VPC 對等互連) 後,原始叢集應會從修復狀態復原,節點也會恢復
Ready狀態。
- 建立新叢集 (並重新建立 VPC 對等互連) 後,原始叢集應會從修復狀態復原,節點也會恢復
- 刪除暫時建立的 GKE 叢集。
- 原始叢集完全還原並正常運作後,即可刪除暫時建立的 GKE 叢集。
不慎刪除 Private Service Connect 端點和轉送規則
- 問題
如果不小心刪除 Private Service Connect 端點或轉送規則,叢集會進入修復狀態,所有節點都會顯示
UNKNOWN狀態。由於控制層的存取權已中斷,您將無法對叢集執行任何作業。檢查控制層時,記錄會顯示類似下列的錯誤:error checking if node NODE_NAME is shutdown: unimplemented- 可能原因
您不小心刪除了 Private Service Connect 端點或轉送規則。這兩個資源都命名為
gke-[cluster-name]-[cluster-hash:8]-[uuid:8]-pe,並允許控制層和節點私下連線。- 解析度
叢集與使用中的對等互連重複
- 問題
如果嘗試建立沒有外部端點的叢集,會傳回類似下列的錯誤:
Google Compute Engine: An IP range in the peer network overlaps with an IP range in an active peer of the local network.- 可能原因
您選擇了重複的控制層 CIDR。
- 解析度
請使用下列其中一種解決方案:
- 刪除叢集,並使用另一個控制層 CIDR 重新建立叢集。
- 在 1.29 版中重新建立叢集,並加入
--enable-private-nodes旗標。
無法連線至沒有外部端點的叢集控制層
實作任何叢集端點存取設定,提高叢集控制層可連線的機率。詳情請參閱「叢集端點存取權」。
- 問題
建立沒有外部端點的叢集後,嘗試對叢集執行
kubectl指令時會傳回類似下列其中一個的錯誤:Unable to connect to the server: dial tcp [IP_ADDRESS]: connect: connection timed out.Unable to connect to the server: dial tcp [IP_ADDRESS]: i/o timeout.- 可能原因
kubectl無法與叢集控制層通訊。- 解析度
請使用下列其中一種解決方案:
啟用 DNS 存取權,簡化叢集的安全存取方式。詳情請參閱「以 DNS 為基礎的端點」。
確認已為 kubeconfig 產生叢集的憑證,或已啟用正確的環境。如要進一步瞭解如何設定叢集憑證,請參閱產生 kubeconfig 項目。
確認允許使用以 IP 為基礎的外部端點存取控制層。停用叢集控制層的外部存取權,可將叢集與網際網路隔離。完成這項設定後,只有授權的內部網路 CIDR 範圍或保留網路,才能存取控制層。
確認來源 IP 位址已獲授權可連線至控制層:
gcloud container clusters describe CLUSTER_NAME \ --format="value(controlPlaneEndpointsConfig.ipEndpointsConfig.authorizedNetworksConfig)"\ --location=COMPUTE_LOCATION更改下列內容:
CLUSTER_NAME:叢集名稱。COMPUTE_LOCATION:叢集的 Compute Engine 位置。
如果來源 IP 位址未獲授權,輸出內容可能會傳回空白結果 (只有大括號),或不含來源 IP 位址的 CIDR 範圍
cidrBlocks: cidrBlock: 10.XXX.X.XX/32 displayName: jumphost cidrBlock: 35.XXX.XXX.XX/32 displayName: cloud shell enabled: true新增授權網路,存取控管控制層。
如果您從地端部署環境或與叢集所在位置不同的區域執行
kubectl指令,請務必啟用控制層私人端點全域存取權。詳情請參閱「從任意區域透過控制層的內部 IP 位址存取」。描述叢集,查看控制存取權設定的回應:
gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --flatten "controlPlaneEndpointsConfig.ipEndpointsConfig.globalAccess"更改下列內容:
CLUSTER_NAME:叢集名稱。COMPUTE_LOCATION:叢集的 Compute Engine 位置。
成功輸出結果會與下列內容相似:
enabled: true如果傳回
null,請從任何區域透過控制層的內部 IP 位址啟用存取權。
由於 IPv4 CIDR 區塊重複而無法建立叢集
- 問題
gcloud container clusters create會傳回類似以下的錯誤:The given master_ipv4_cidr 10.128.0.0/28 overlaps with an existing network 10.128.0.0/20.- 可能原因
您指定的控制層 CIDR 區塊與虛擬私有雲中現有的子網路重複。
- 解析度
為
--master-ipv4-cidr指定一個未與現有子網路重複的 CIDR 區塊。
由於服務範圍已由其他叢集使用,因此無法建立叢集
- 問題
嘗試建立叢集時,會傳回類似以下的錯誤:
Services range [ALIAS_IP_RANGE] in network [VPC_NETWORK], subnetwork [SUBNET_NAME] is already used by another cluster.- 可能原因
下列設定可能會導致這項錯誤:
- 您選擇的服務範圍仍由其他叢集使用,或叢集未刪除。
- 有一個叢集使用該服務範圍,但已遭刪除,且次要範圍中繼資料未正確清除。GKE 叢集的次要範圍會儲存在 Compute Engine 中繼資料中,叢集刪除後應一併移除。即使叢集已成功刪除,中繼資料可能也不會移除。
- 解析度
步驟如下:
- 檢查現有叢集是否正在使用服務範圍。您可以使用
gcloud container clusters list指令搭配filter旗標搜尋叢集。如果現有叢集使用服務範圍,您必須刪除該叢集或建立新的服務範圍。 - 如果現有叢集未使用服務範圍,請手動移除與要使用的服務範圍相符的中繼資料項目。
- 檢查現有叢集是否正在使用服務範圍。您可以使用
無法建立子網路
- 問題
嘗試使用自動子網路建立叢集,或建立自訂子網路時,可能會遇到下列任一錯誤:
An IP range in the peer network overlaps with an IP range in one of the active peers of the local network.Error: Error waiting for creating GKE cluster: Invalid value for field PrivateClusterConfig.MasterIpv4CidrBlock: x.x.x.x/28 conflicts with an existing subnet in one of the peered VPCs.- 可能原因
您指定的控制層 CIDR 範圍與叢集中的另一個 IP 範圍重複。如果您嘗試重複使用最近刪除的叢集所用的
master-ipv4-cidrCIDR,也可能會發生這個子網路建立錯誤。- 解析度
請嘗試使用不同的 CIDR 範圍。
無法從公開 Docker Hub 中提取映像檔
- 問題
在叢集中執行的 Pod 在
kubectl describe中顯示警告:Failed to pull image: rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)- 可能原因
只有私人 IP 位址的節點需要額外設定,才能符合網際網路存取需求。不過,如果您啟用 Private Google Access 並符合網路需求,節點就能存取 Cloud de Confiance API 和服務,包括 Artifact Registry。
- 解析度
請使用下列其中一種解決方案:
將叢集中的映像檔從 Docker Hub 複製到 Artifact Registry。詳情請參閱「遷移第三方登錄檔中的容器」。
GKE 會自動檢查
mirror.gcr.io經常存取的 Docker Hub 映像檔是否有快取副本。如必須從 Docker Hub 或其他公開存放區提取映像檔,請使用 Cloud NAT,或是靜態
0.0.0.0/0路徑目標的執行個體 Proxy。
無法建立新的外部 Webhook
嘗試建立使用 clientConfig.url 欄位與叢集外部 Webhook 伺服器通訊的 ValidatingWebhookConfigurations 或 MutatingWebhookConfigurations 時,會發生下列錯誤:
ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress
traffic from the API server through the control plane is disabled. As a result,
direct API server calls to external webhook servers are blocked. To connect to
external webhooks, update any webhook configurations that use clientConfig.url
to use clientConfig.service instead.
如果叢集設定禁止 Kubernetes API 伺服器直接傳送輸出流量,也就是停用控制層 VM 執行個體的外部 IP 位址,就會發生這個錯誤。GKE 會使用 ValidatingAdmissionPolicy,防止建立或更新使用 clientConfig.url 欄位的 Webhook 設定。
如要確認這項錯誤的原因,請描述叢集設定:
gcloud container clusters describe CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--format='value(controlPlaneEgress)'
更改下列內容:
CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集所在的區域或可用區,例如us-central1或us-central1-a。
如果 API 伺服器的輸出流量已停用,輸出內容會是 NONE。
如要解決這個錯誤,請更新網路鉤子設定,改用 clientConfig.service 欄位。這個欄位可讓 API 伺服器將准入要求傳送至叢集中的 Service,而不是傳送至 IP 位址或網址。如要進一步瞭解如何設定 Webhook 和服務,請參閱「外部 Webhook 設定」。
如果刪除 ValidatingAdmissionPolicy,建立或更新 Webhook 的要求就會成功,但傳送至 Webhook 伺服器的准入要求會失敗。
外部許可 Webhook 要求失敗
嘗試部署 Kubernetes 資源時,如果觸發叢集虛擬私有雲網路外部的許可控制器 Webhook 伺服器,就會發生下列錯誤:
Error from server (InternalError): error when creating "STDIN": Internal error occurred: failed calling webhook WEBHOOK_NAME": failed to call webhook: Post "WEBHOOK_URL": proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost on 169.254.169.254:53: no such host
如果符合下列所有條件,就會發生這個錯誤:
- Webhook 設定會使用 IP 位址或網址,與外部 webhook 伺服器聯絡。
- 叢集設定會停用控制層 VM 執行個體的外部 IP 位址,防止 Kubernetes API 伺服器直接傳送輸出流量。
如要確認這項錯誤的原因,請描述叢集設定:
gcloud container clusters describe CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--format='value(controlPlaneEgress)'
更改下列內容:
CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集所在的區域或可用區,例如us-central1或us-central1-a。
如果 API 伺服器的輸出流量已停用,輸出內容會是 NONE。
如要解決這項錯誤,請按照下列步驟操作:
- 找出叢集中使用
clientConfig.url欄位的 ValidatingWebhookConfigurations 或 MutatingWebhookConfigurations。 - 更新 Webhook 設定,使用
clientConfig.service欄位。 這個欄位可讓 API 伺服器將准入要求傳送至叢集中的服務,而不是傳送至 IP 位址或網址。如要進一步瞭解如何設定 Webhook 和服務,請參閱「外部 Webhook 設定」。
觸發准入 Webhook 超時的 API 要求
- 問題
如果 API 要求觸發的許可控制 Webhook 設定為使用
targetPort不是 443 的服務,要求就會逾時,導致失敗:Error from server (Timeout): request did not complete within requested timeout 30s- 可能原因
根據預設,防火牆不允許 TCP 連線到節點,但通訊埠 443 (HTTPS) 和 10250 (kubelet) 除外。如果沒有允許流量的自訂防火牆規則,嘗試透過通訊埠 443 以外的通訊埠與 Pod 通訊的許可控制器 Webhook 就會失敗。
- 解析度
新增防火牆規則,以符合特定用途。
健康狀態檢查失敗,因此無法建立叢集
- 問題
使用私人節點集區建立標準叢集後,叢集會停留在健康狀態檢查步驟,並回報類似下列其中一項的錯誤:
All cluster resources were brought up, but only 0 of 2 have registered.All cluster resources were brought up, but: 3 nodes out of 4 are unhealthy- 可能原因
下列設定可能會導致這項錯誤:
- 叢集節點無法從 Cloud Storage API (
storage.googleapis.com) 下載必要二進位檔。 - 限制輸出流量的防火牆規則。
- Shared VPC IAM 權限不正確。
- Private Google 存取權需要為
*.gcr.io設定 DNS。
- 叢集節點無法從 Cloud Storage API (
- 解析度
請使用下列其中一種解決方案:
在子網路上啟用私人 Google 存取權,讓節點網路存取
storage.googleapis.com,或啟用 Cloud NAT,允許節點與storage.googleapis.com端點通訊。如要讓節點讀取
storage.googleapis.com,請確認指派給叢集節點的服務帳戶具有儲存空間讀取權限。請確認您已設定Cloud de Confiance 防火牆規則,允許所有輸出流量,或設定防火牆規則,允許節點輸出流量至叢集控制層和
*.googleapis.com。為
*.gcr.io建立 DNS 設定。如果您設定了非預設的防火牆或路由,請設定Private Google Access。
如果您使用 VPC Service Controls,請為 GKE 叢集設定 Container Registry 或 Artifact Registry。
確認您未刪除或修改 Ingress 的自動建立防火牆規則。
如要使用 Shared VPC,請確認已設定必要的 IAM 權限。
kubelet Failed to create pod sandbox
- 問題
使用私人節點建立叢集後,系統會回報類似下列其中一個的錯誤:
Warning FailedCreatePodSandBox 12s (x9 over 4m) kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = Error response from daemon: Get https://registry.k8s.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized- 可能原因
calico-node或netdPod 無法連上*.gcr.io。- 解析度
已建立私人節點,但未加入叢集
如果叢集使用的節點只有私人 IP 位址,通常是在虛擬私有雲上使用自訂路由和第三方網路設備時,預設路由 (0.0.0.0/0) 會重新導向至設備,而不是預設網際網路閘道。除了控制層連線能力,您還需要確保可連線至下列目的地:
- *.googleapis.com
- *.gcr.io
- gcr.io
為這三個網域設定Private Google Access。這項最佳做法可讓新節點啟動並加入叢集,同時限制網際網路繫結流量。
GKE 叢集上的工作負載無法存取網際網路
在具有私人 IP 位址的節點中執行的 Pod 無法存取網際網路。舉例來說,在 Pod exec shell 中執行 apt update 指令後,系統會回報類似下列內容的錯誤:
0% [Connecting to deb.debian.org (199.232.98.132)] [Connecting to security.debian.org (151.101.130.132)]
如果叢集 Pod 使用的子網路次要 IP 位址範圍未在 Cloud NAT 閘道上設定,Pod 就無法連線至網際網路,因為 Cloud NAT 閘道未設定外部 IP 位址。
請務必設定 Cloud NAT 閘道,為叢集使用的子網路套用至少下列子網路 IP 位址範圍:
- 子網路主要 IP 位址範圍 (節點使用)
- 叢集中 Pod 所用的子網路次要 IP 位址範圍
- 叢集中服務使用的子網路次要 IP 位址範圍
詳情請參閱如何新增 Pod 使用的次要子網路 IP 範圍。
公開叢集無法停用直接 IP 存取權
- 問題
停用 IP 位址端點後,您會看到類似以下的錯誤訊息:
Direct IP access can't be disabled for public clusters- 可能原因
叢集使用舊版網路。
- 解析度
將叢集遷移至 Private Service Connect。如要進一步瞭解遷移狀態,請 與支援團隊聯絡。
如果叢集正在進行 PSC 遷移,就無法停用直接 IP 存取權
- 問題
停用 IP 位址端點後,您會看到類似以下的錯誤訊息:
Direct IP access can't be disabled for public clusters- 可能原因
叢集使用舊版網路。
- 解析度
請使用下列其中一種解決方案:
- 手動以不同版本重新建立所有節點集區。
- 等待 GKE 在維護事件期間自動升級節點集區。
無法啟用控制層內部端點
- 問題
嘗試啟用叢集控制層的內部端點時,您會看到類似下列內容的錯誤訊息:
private_endpoint_enforcement_enabled can't be enabled when envoy is disabledprivate_endpoint_enforcement_enabled is unsupported. Please upgrade to the minimum support version- 可能原因
叢集需要執行 IP 位址輪替或版本更新。
- 解析度
請使用下列其中一種解決方案:
- 輪替控制層 IP 位址,啟用 Envoy。
- 將叢集升級至 1.28.10-gke.1058000 以上版本。
定義組織政策時,叢集建立作業會失敗
- 問題
嘗試建立叢集時,您會看到類似下列內容的錯誤訊息:
compute.disablePrivateServiceConnectCreationForConsumers violated for projects- 可能原因
叢集端點或後端遭到消費者組織政策封鎖。
- 解析度
如要允許執行個體透過
compute.restrictPrivateServiceConnectProducer限制建立端點,請完成「消費者端機構政策」中的步驟。
刪除叢集時,Private Service Connect 端點可能會洩漏
- 問題
建立叢集後,您可能會看到下列其中一種徵兆:
您無法在以 Private Service Connect 為基礎的叢集中,查看 Private Service Connect 下的已連線端點。
如果叢集使用 Private Service Connect,您就無法刪除為內部端點分配的子網路或虛擬私有雲網路。系統會顯示類似下列內容的錯誤訊息:
projects/<PROJECT_ID>/regions/<REGION>/subnetworks/<SUBNET_NAME> is already being used by projects/<PROJECT_ID>/regions/<REGION>/addresses/gk3-<ID>
- 可能原因
在採用 Private Service Connect 的 GKE 叢集上,GKE 會使用轉送規則部署 Private Service Connect 端點,在控制層網路中分配內部 IP 位址,以存取叢集的控制層。為保護控制平面與節點之間的通訊,GKE 會使用 Private Service Connect 隱藏端點,因此您無法在Cloud de Confiance 控制台或 gcloud CLI 中看到端點。
- 解析度
為防止在叢集刪除前洩漏 Private Service Connect 端點,請完成下列步驟:
- 將
Kubernetes Engine Service Agent role指派給 GKE 服務帳戶。 - 請確認 GKE 服務帳戶未明確拒絕
compute.forwardingRules.*和compute.addresses.*權限。
如果發現 Private Service Connect 端點外洩,請 與支援團隊聯絡。
- 將
無法剖析叢集的授權網路
- 問題
您無法在 1.29 以上版本中建立叢集。系統會顯示類似下列內容的錯誤訊息:
Unable to parse cluster.master_ipv4_cidr "" into a valid IP address and mask- 可能原因
Cloud de Confiance 專案使用以私人 IP 為基礎的 Webhook。因此,您無法使用 Private Service Connect 建立叢集。叢集會改用 VPC 網路對等互連,剖析
master-ipv4-cidr旗標。- 解析度
請使用下列其中一種解決方案:
繼續建立 VPC 網路對等互連叢集,並加入
master-ipv4-cidr定義有效的 CIDR。這項解決方案有下列限制:- Cloud de Confiance 控制台已淘汰
master-ipv4-cidr標記。如要更新這個旗標,只能使用 Google Cloud CLI 或 Terraform。 - GKE 1.29 以上版本已淘汰虛擬私有雲網路對等互連。
- Cloud de Confiance 控制台已淘汰
如要遷移以私人 IP 為基礎的 Webhook,請完成「Private Service Connect 限制」一文中的步驟。然後與支援團隊聯絡,選擇使用 Private Service Connect 叢集。
無法在具有公開節點的叢集中定義內部 IP 位址範圍
- 問題
您無法使用
--master-ipv4-cidr旗標定義內部 IP 位址範圍。系統會顯示類似以下的錯誤訊息:ERROR: (gcloud.container.clusters.create) Cannot specify --master-ipv4-cidr without --enable-private-nodes- 可能原因
您在未啟用
enable-private-nodes旗標的叢集中,使用master-ipv4-cidr旗標定義控制層的內部 IP 位址範圍。如要建立含有master-ipv4-cidr的叢集,您必須使用enable-private-nodes旗標,將叢集設定為透過內部 IP 位址 (私人節點) 佈建節點。- 解析度
請使用下列其中一種解決方案:
使用下列指令建立叢集:
gcloud container clusters create-auto CLUSTER_NAME \ --enable-private-nodes \ --master-ipv4-cidr CP_IP_RANGE更改下列內容:
CLUSTER_NAME:叢集名稱。CLUSTER_NAME:控制層的內部 IP 位址範圍。
更新叢集,只透過 IP 位址佈建節點。詳情請參閱「設定叢集」。
無法在 Autopilot 叢集上排定公開工作負載
- 問題
- 在 Autopilot 叢集中,如果叢集只使用私人節點,您就無法使用
cloud.google.com/private-node=falsenodeSelector 在公開 Pod 中排定工作負載。 - 可能原因
- 只有 1.30.3 以上版本的叢集,才能將 Pod 的 nodeSelector 中設定的
private-node旗標設為false。 - 解析度
- 將叢集升級至 1.30 以上版本。
無法存取以 DNS 為基礎的端點
- 問題
嘗試對叢集執行 kubectl 指令時,會傳回類似下列內容的錯誤:
couldn't get current server API group list: control_plane_endpoints_config.dns_endpoint_config.allow_external_traffic is disabled- 可能原因
叢集已停用 DNS 型存取權。
- 解析度
啟用控制層的存取權,方法是使用控制層的 DNS 型端點。詳情請參閱「修改控制層存取權」。
節點在擴充期間無法分配 IP 位址
- 問題
嘗試將子網路的主要 IP 位址範圍擴展至授權網路清單時,會傳回類似以下的錯誤:
authorized networks fields cannot be mutated if direct IP access is disabled- 可能原因
您已停用叢集的以 IP 為基礎的端點。
- 解析度
使用
enable-ip-access旗標停用及啟用叢集以 IP 為基礎的端點。
CIDR 區塊過多
嘗試建立或更新的叢集具有超過 50 個 CIDR 區塊時,gcloud 會傳回下列錯誤:
ERROR: (gcloud.container.clusters.update) argument --master-authorized-networks: too many args
如要解決這個問題,請嘗試下列做法:
- 如果叢集未使用 Private Service Connect 或 VPC 網路對等互連,請確保指定的 CIDR 區塊不超過 50 個。
- 如果叢集使用 Private Service Connect 或 VPC 網路對等互連,請指定最多 100 個 CIDR 區塊。
無法連線至伺服器
kubectl 指令因 CIDR 區塊設定錯誤而發生逾時:
Unable to connect to the server: dial tcp MASTER_IP: getsockopt: connection timed out
當您建立或更新叢集時,請確保指定正確的 CIDR 區塊。
節點可存取公開容器映像檔,即使網路已隔離也沒問題
- 問題
您可能會發現,在設定為網路隔離的 GKE 叢集中,提取
redis等常見公開映像檔時,作業會成功,但提取較不常見或私人映像檔時,作業會失敗。這是 GKE 預設設定的預期行為,並不表示 GKE 略過了網路隔離。
- 可能原因
這是因為以下兩項功能會一起運作:
- Private Google Access:這項功能可讓具有內部 IP 位址的節點連線至 Google Cloud API 和服務,無須使用公開 IP 位址。在叢集節點使用的虛擬私有雲中,啟用叢集子網路的私人 Google 存取權。使用
--enable-private-nodes旗標建立或更新叢集或節點集區時,GKE 會自動在這個子網路上啟用 Private Google Access。唯一例外狀況是使用 Shared VPC,這時必須手動啟用 Private Google Access。 - Google 的映像檔鏡像 (
mirror.gcr.io):根據預設,GKE 會將節點設定為先嘗試從mirror.gcr.io(Google 管理的 Artifact Registry,可快取經常要求的公開容器映像檔) 提取映像檔。
當您嘗試提取
redis等映像檔時,節點會使用 Private Google Access 的私人路徑連線至mirror.gcr.io。因為redis是非常常見的圖片,快取中已有該圖片,因此提取作業會成功。不過,如果您要求不在這個公開快取中的圖片,提取作業就會失敗,因為隔離節點無法透過其他方式連線至原始來源。- Private Google Access:這項功能可讓具有內部 IP 位址的節點連線至 Google Cloud API 和服務,無須使用公開 IP 位址。在叢集節點使用的虛擬私有雲中,啟用叢集子網路的私人 Google 存取權。使用
- 解析度
如果
mirror.gcr.io快取中沒有您需要的映像檔,請在自己的私人 Artifact Registry 存放區中代管該映像檔。網路隔離節點可透過 Private Google Access 存取這個存放區。
後續步驟
如果無法在文件中找到問題的解決方案,請參閱「取得支援」一文,瞭解如何取得進一步協助, 包括下列主題的建議:
- 與 Cloud Customer Care聯絡,建立客服案件。
- 在 StackOverflow 上提問,並使用
google-kubernetes-engine標記搜尋類似問題,向社群尋求支援。你也可以加入#kubernetes-engineSlack 頻道,取得更多社群支援。 - 使用公開 Issue Tracker 開啟問題或功能要求。