設定私人叢集

本頁面說明如何在 Google Kubernetes Engine 中建立私人叢集。

總覽

在私人叢集中,節點僅擁有內部 RFC 1918 IP 位址,這是為了確保其工作負載能與公開網際網路環境隔離。

每個叢集皆有個稱為「主要執行個體」(master) 的 Kubernetes API 伺服器。主要執行個體在 Google 所屬專案中的 VM 上執行。在私人叢集中,您可以控管主要執行個體的存取權

即使叢集節點沒有公開 IP 位址,私人叢集仍可以使用 HTTP(S) 負載平衡器或是網路負載平衡器來接收傳入流量。私人叢集也可以使用內部負載平衡器,接收來自虛擬私人雲端網路 (VPC) 的流量。

功能

私人叢集使用以下 GCP 功能:

虛擬私人雲端網路對等互連
私人叢集需要使用虛擬私人雲端網路對等互連。您的虛擬私人雲端網路包含多個叢集節點,獨立存在於 Google 專案中的虛擬私人雲端網路則包含主要執行個體,兩個虛擬私人雲端網路透過虛擬私人雲端網路對等互連方式連接,節點與主要執行個體間的傳輸全部交由內部 IP 位址來做導向。
私人 Google 存取權
私人節點沒有外部 IP 位址,因此不具連出網際網路的權限。私人 Google 存取權為私人節點及其工作負載提供有限的連出權限,可透過 Google 的私人網路存取 Google Cloud Platform API 與服務。舉例來說,私人 Google 存取權能讓私人節點從 Google Container Registry 提取容器映像檔,以及將記錄傳送至 Stackdriver

必要條件

私人叢集必須符合下列條件:

虛擬私人雲端原生

私人叢集必須是已啟用別名 IP 範圍虛擬私人雲端原生叢集

。根據預設,系統會為新叢集啟用虛擬私人雲端原生類型。 虛擬私人雲端原生叢集與舊版網路不相容。

Kubernetes 1.8.14-gke.0 以上版本

私人叢集中的節點必須執行 Kubernetes 1.8.14-gke.0 以上版本

限制

私人叢集受限於下列條件:

  • 您不能將現有的非私人叢集轉換為私人叢集。
  • 您使用的叢集主要執行個體、節點、PodService IP 範圍,不得與 172.17.0.0/16 重複。
  • 刪除以下項目會導致私人叢集停止運作:叢集主要執行個體與叢集節點之間的虛擬私人雲端對等互連、允許從叢集主要執行個體輸入流量到通訊埠 10250 上的節點的防火牆規則,以及預設網際網路閘道的預設路徑。

限制

私人叢集具有下列限制:

  • 您所建立的每個私人叢集都使用唯一的虛擬私人雲端網路對等互連,每個虛擬私人雲端網路最多可與 25 個其他虛擬私人雲端網路對等互連。
  • 叢集主要執行個體的 RFC 1918 模塊大小必須為 /28。
  • 雖然 GKE 可以偵測到叢集主要執行個體位址區塊的重複,但無法偵測到共用虛擬私人雲端網路中的重複。
  • 私人叢集中的節點無法連出至公開網際網路,而僅具備 Google API 和服務的有限存取權。

地區叢集的限制

  • 目前,您無法使用 Proxy,透過私人 IP 位址連至叢集主要執行個體。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

主要執行個體的存取權

在私人叢集中,主要執行個體有兩個端點

  • 私人端點:即為主要執行個體的內部 IP 位址,位於主要執行個體的虛擬私人雲端網路中、內部負載平衡器之後。節點與主要執行個體之間透過私人端點連繫。位於虛擬私人雲端網路且與私人叢集位於相同區域的任何 VM,皆可使用私人端點。

  • 公開端點:即為主要執行個體的外部 IP 位址。您可以設定公開端點的存取權。在限制最嚴格的情況下,公開端點不開放存取。您可以對某些位址範圍授權存取公開端點,以放寬限制;也可以移除所有限制,允許所有人存取公開端點。

判斷叢集端點

若要判斷叢集端點,請使用下列指令描述叢集:

gcloud container clusters describe [CLUSTER-NAME] \
    --zone=[ZONE] | --region=[REGION] \
    --format="get(privateClusterConfig.privateEndpoint)"
gcloud container clusters describe [CLUSTER-NAME] \
    --zone=[ZONE] | --region=[REGION] \
    --format="get(privateClusterConfig.publicEndpoint)"

其中:

  • [CLUSTER-NAME] 是叢集名稱。
  • [ZONE] 是區域叢集的區域,[REGION] 是地區叢集的地區。

叢集端點的存取權

私人叢集以三種設定組合控制叢集端點的存取權。以下表格說明這三種設定。

停用公開端點存取權 啟用公開端點存取權
和主要執行個體授權網路
啟用公開端點存取權,
停用主要執行個體授權網路
安全性 最嚴格的主要執行個體存取權限制。用戶端無法存取主要執行個體的公開端點。主要執行個體僅接受來自內部 IP 位址的存取。 限制特定內部及外部 IP 位址對主要執行個體的存取。 任何 IP 位址皆可存取主要執行個體。
GCP Console 設定選項

選取 [Enable VPC-native] (啟用虛擬私人雲端原生)。
選取 [Private cluster] (私人叢集)。
清除 [Access master using its external IP address] (透過外部 IP 位址存取主要執行個體)。

系統會自動啟用 [Enable master authorized networks] (啟用主要執行個體授權網路)。

選取 [Enable VPC-native] (啟用虛擬私人雲端原生)。
選取 [Private cluster] (私人叢集)。
選取 [Access master using its external IP address] (透過外部 IP 位址存取主要執行個體)。
選取 [Enable master authorized networks] (啟用主要執行個體授權網路)。
選取 [Enable VPC-native] (啟用虛擬私人雲端原生)。
選取 [Private cluster] (私人叢集)。
選取 [Access master using its external IP address] (透過外部 IP 位址存取主要執行個體)。
清除 [Enable master authorized networks] (啟用主要執行個體授權網路)。
gcloud 叢集建立標記 --enable-ip-alias
--enable-private-nodes
--enable-private-endpoint
--enable-master-authorized-networks
--enable-ip-alias
--enable-private-nodes
--enable-master-authorized-networks
--enable-ip-alias
--enable-private-nodes
--no-enable-master-authorized-networks
節點和主要執行個體之間的通訊

節點一律透過私人端點與主要執行個體聯繫。

主要執行個體授權網路

從節點和 Pod 以外的內部 IP 位址存取主要執行個體時,此為必要項目。

您無須明確授權節點和 Pod 的內部 IP 位址範圍。這些內部位址一律有權與私人端點通訊。

使用 --master-authorized-networks 指定可存取主要執行個體的其他內部 IP 位址。您無法將外部 IP 位址加入主要執行個體授權網路清單,因為公開端點已停止開放存取。

從外部 IP 位址及節點和 Pod 以外的內部 IP 位址存取主要執行個體時,此為必要項目。

使用 --master-authorized-networks 指定可存取主要執行個體的外部和內部 IP 位址 (節點和 Pod 除外)。

未使用。

如果在不啟用主要執行個體授權網路的情況下,開放主要執行個體公開端點的存取權,則對主要執行個體公開端點的存取不會受到限制。

透過 kubectl 存取

來自節點:一律使用私人端點。 您必須將 kubectl 設為使用私人端點

來自叢集虛擬私人雲端網路中的其他 VM:其他 VM 可使用 kubectl 與私人端點通訊,前提是該 VM 位於叢集所在地區,且內部 IP 位址列於主要執行個體授權網路清單中。

來自公開 IP 位址:永不允許。

來自節點:一律使用私人端點。 您必須將 kubectl 設為使用私人端點

來自叢集虛擬私人雲端網路中的其他 VM:其他 VM 可使用 kubectl 與私人端點通訊,前提是該 VM 位於叢集所在地區,且內部 IP 位址列於主要執行個體授權網路清單中。

來自公開 IP 位址:具有公開 IP 位址的機器可使用 kubectl 與公開端點通訊,前提是其公開 IP 位址列於主要執行個體授權網路清單中。GCP 外部的機器及具有外部 IP 位址的 GCP VM 均包含在內。

來自節點:一律使用私人端點。 您必須將 kubectl 設為使用私人端點

來自叢集虛擬私人雲端網路中的其他 VM:其他 VM 可使用 kubectl 與私人端點通訊,前提是該 VM 位於叢集所在地區。

來自公開 IP 位址:具有公開 IP 位址的任何機器,皆可使用 kubectl 與公開端點通訊。GCP 外部的機器及具有外部 IP 位址的 GCP VM 均包含在內。

建立私人叢集並授予有限的公開端點存取權

在建立私人叢集時,您必須指定叢集主要執行個體使用的 /28 RFC 1918 位址範圍,且此範圍不得與虛擬私人雲端網路中的任何子網路重複。叢集建立後,您便無法再更改叢集主要執行個體的位址範圍。

使用自動產生的子網路

在本節中,您將建立名為 private-cluster-0 的私人叢集。 GKE 會自動為您的叢集節點產生子網路。 子網路會啟用私人 Google 存取權。在子網路中,GKE 將自動建立兩個次要範圍:一個為 Pod 專用,另一個為 Service 專用。

gcloud

請執行下列指令:

gcloud container clusters create private-cluster-0 \
    --create-subnetwork name=my-subnet-0 \
    --enable-master-authorized-networks \
    --enable-private-nodes \
    --master-ipv4-cidr 172.16.0.0/28 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

其中:

  • --enable-master-authorized-networks 表示僅有您授權的 IP 位址範圍可以存取公開端點。
  • --create-subnetwork name=my-subnet-0 會使 GKE 自動建立一個名為 my-subnet-0 的子網路。
  • --enable-ip-alias 會將叢集類型設為虛擬私人雲端原生。
  • --enable-private-nodes 代表叢集節點沒有外部 IP 位址。
  • --master-ipv4-cidr 172.16.0.0/28 會指定主要執行個體的 RFC 1918 範圍。指定之後,就無法在這個叢集中變更這項設定。

Console

請執行下列步驟:

  1. 造訪 Google Cloud Platform Console 的 GKE 選單。

    造訪 GKE 選單

  2. 按一下 [Create cluster] (建立叢集)。

  3. 選擇 [Standard cluster] (標準叢集) 範本,或者為您的工作負載選擇適當的範本

  4. 在「Name」(名稱) 中輸入 my-subnet-0

  5. 按一下選單底部的 [Advanced options] (進階選項)。

  6. 在「VPC-native」(虛擬私人雲端原生) 中,保留 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生 (使用別名 IP)) 核取方塊的勾選狀態。保留「Network」(網路) 下拉式選單的 default 設定,並保留「Node subnet」(節點子網路) 下拉式選單的 default 設定,這會讓 GKE 為您的叢集產生子網路。

  7. 針對「Network security」(網路安全性),勾選 [Private cluster] (私人叢集) 核取方塊。

  8. 如要建立可從授權的外部 IP 範圍存取的主要執行個體,請保留 [Access master using its external IP address] (透過外部 IP 位址存取主要執行個體) 核取方塊的勾選狀態。

  9. 將「Master IP range」(主要執行個體 IP 範圍) 設為 172.16.0.0/28

  10. 保留 [Enable master authorized networks] (啟用主要執行個體授權網路) 核取方塊的勾選狀態。

  11. 取消勾選 [Enable Kubernetes Dashboard] (啟用 Kubernetes 資訊主頁) 核取方塊。

  12. 清除 [Issue a client certificate] (核發用戶端憑證) 核取方塊。

  13. 按一下 [Create] (建立)。

API

Cluster API 資源中指定 privateClusterConfig 欄位:

{
  "name": "private-cluster-0",
  ...
  "ipAllocationPolicy": {
    "createSubnetwork": true,
  },
  ...
    "privateClusterConfig" {
      "enablePrivateNodes": boolean # Creates nodes with internal IP addresses only
      "enablePrivateEndpoint": boolean # false creates a cluster master with a publicly-reachable endpoint
      "masterIpv4CidrBlock": string # CIDR block for the cluster master
      "privateEndpoint": string # Output only
      "publicEndpoint": string # Output only
  }
}

此時,只有這些 IP 位址可存取叢集主要執行個體:

  • my-subnet-0 的主要範圍。
  • Pod 所用的次要範圍。

假設您有一組機器在虛擬私人雲端網路之外,其位址範圍是 203.0.113.0/29。您可以輸入以下指令來授權這些機器存取公開端點:

gcloud container clusters update private-cluster-0 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

目前只有這些 IP 位址可存取叢集主要執行個體:

  • my-subnet-0 的主要範圍。
  • Pod 所用的次要範圍。
  • 您已授權的位址範圍,例如 203.0.113.0/29。

使用自訂子網路

在本節中,您將建立名為 private-cluster-1 的私人叢集。您會建立名為 my-net-1 的網路。並為您的叢集節點建立一個名為 my-subnet-1 的子網路,主要範圍為 192.168.0.0/20。您的子網路有兩個次要位址範圍:my-pods-1Pod IP 位址專用,my-services-1 則為 Service IP 位址專用。

gcloud

建立網路

首先,為您的叢集建立一個網路。以下指令會建立名為 my-net-1 的網路:

gcloud compute networks create my-net-1 \
    --subnet-mode custom

建立子網路和次要範圍

接下來,在 my-net-1 網路中建立名為 my-subnet-1 的子網路,並分別為 Pod 及 Service 設定次要範圍 my-pods-1my-services-1

gcloud compute networks subnets create my-subnet-1 \
    --network my-net-1\
    --region us-central1 \
    --range 192.168.0.0/20 \
    --secondary-range my-pods-1=10.4.0.0/14,my-services-1=10.0.32.0/20 \
    --enable-private-ip-google-access

建立私人叢集

現在,使用建好的網路、子網路和次要範圍來建立一個名為 private-cluster-1 的私人叢集。

gcloud container clusters create private-cluster-1 \
    --zone us-central1-c \
    --enable-master-authorized-networks \
    --network my-net-1 \
    --subnetwork my-subnet-1 \
    --cluster-secondary-range-name my-pods-1 \
    --services-secondary-range-name my-services-1 \
    --enable-private-nodes \
    --enable-ip-alias \
    --master-ipv4-cidr 172.16.0.16/28 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

Console

建立網路、子網路和次要範圍

  1. 造訪 GCP Console 的「VPC networks」(VPC 網路) 頁面。

    前往「VPC networks」(VPC 網路) 頁面

  2. 按一下 [Create VPC network] (建立虛擬私人雲端網路)

  3. 在「Name」(名稱) 中輸入 my-net-1

  4. 確認「Subnet creation mode」(子網路建立模式) 已設為「Custom」(自訂)。

  5. 在「New subnet」(新的子網路) 的「Name」(名稱) 中輸入 my-subnet-1

  6. 從「Region」(地區) 下拉式選單中,選取所需地區。

  7. 在 [IP address range] (IP 位址範圍) 中,輸入 192.168.0.0/20

  8. 按一下 [Create secondary IP range] (建立次要 IP 範圍)。針對「Subnet range name」(子網路範圍名稱) 輸入 my-services-1,並針對「Secondary IP range」(次要 IP 範圍) 輸入 10.0.32.0/20

  9. 按一下 [Add IP range] (新增 IP 範圍)。針對「Subnet range name」(子網路範圍名稱) 輸入 my-pods-1,並針對「Secondary IP range」(次要 IP 範圍) 輸入 10.4.0.0/14

  10. 在「Private Google access」(私人 Google 存取) 中,按一下 [On] (啟用)。

  11. 按一下 [Done] (完成)。

  12. 按一下 [Create] (建立)。

建立私人叢集

建立使用子網路的私人叢集:

  1. 造訪 GCP Console 的 GKE 選單。

    造訪 GKE 選單

  2. 按一下 [Create cluster] (建立叢集)。

  3. 選擇 [Standard cluster] (標準叢集) 範本,或者為您的工作負載選擇適當的範本

  4. 在「Name」(名稱) 中輸入 private-cluster-1

  5. 按一下選單底部的 [Advanced options] (進階選項)。

  6. 在「VPC-native」(虛擬私人雲端原生) 中,保留 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生 (使用別名 IP)) 核取方塊的勾選狀態。

  7. 在「Network」(網路) 下拉式選單中,選擇 [my-net-1]。

  8. 在「Node subnet」(節點子網路) 下拉式選單中,選擇 [my-subnet-1]。

  9. 取消勾選「Automatically create secondary ranges」(自動建立次要範圍) 核取方塊。

  10. 從「Pod secondary CIDR range」(Pod 次要 CIDR 範圍) 下拉式選單中,選擇 [my-pods-1]。

  11. 從「Services secondary CIDR range」(服務次要 CIDR 範圍) 下拉式選單中,選擇 [my-services-1]。

  12. 針對「Network security」(網路安全性),勾選 [Private cluster] (私人叢集) 核取方塊。

  13. 將「Master IP range」(主要執行個體 IP 範圍) 設為 172.16.0.16/28

  14. 保留 [Enable master authorized networks] (啟用主要執行個體授權網路) 核取方塊的勾選狀態。

  15. 取消勾選 [Enable Kubernetes Dashboard] (啟用 Kubernetes 資訊主頁) 核取方塊。

  16. 清除 [Issue a client certificate] (核發用戶端憑證) 核取方塊。

  17. 按一下 [Create] (建立)。

此時,只有這些 IP 位址可存取叢集主要執行個體:

  • my-subnet-1 的主要範圍
  • 次要範圍 my-pods-1

假設您有一組機器在 my-net-1 範圍之外,其位址範圍是 203.0.113.0/29。您可以輸入以下指令以授權這些機器存取公開端點:

gcloud container clusters update private-cluster-1 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

此時,只有這些 IP 位址可存取叢集主要執行個體:

  • my-subnet-1 的主要範圍
  • 次要範圍 my-pods-1
  • 您已授權的位址範圍,例如 203.0.113.0/29。

使用 Cloud Shell 存取私人叢集

在前面的練習中所建立的私人叢集 private-cluster-1,具有公開端點且已啟用主要執行個體授權網路。若您想使用 Cloud Shell 來存取叢集,必須將 Cloud Shell 的公開 IP 位址新增到叢集的主要執行個體授權網路清單中。

使用 dig,在 Cloud Shell 指令列視窗中找出 Cloud Shell 的外部 IP 位址。

dig +short myip.opendns.com @resolver1.opendns.com

將 Cloud Shell 的外部位址新增到叢集的主要執行個體授權網路清單中:

gcloud container clusters update private-cluster-1 \
    --zone us-central1-c \
    --enable-master-authorized-networks \
    --master-authorized-networks [EXISTING_AUTH_NETS],[SHELL_IP]/32

其中:

  • [EXISTING_AUTH_NETS] 是您現有的主要執行個體授權網路清單。
  • [SHELL_IP] 是 Cloud Shell 的外部 IP 位址。

取得憑證,以便使用 kubectl 存取叢集:

gcloud container clusters get-credentials private-cluster-1 \
    --zone us-central1-a \
    --project [PROJECT_ID]

其中,[PROJECT_ID] 是您的專案 ID。

現在,您可以在 Cloud Shell 中使用 kubectl 存取私人叢集。例如:

kubectl get nodes

建立無法透過用戶端存取公開端點的私人叢集

在本節中,您將建立具備私人節點但無法存取公開端點的私人叢集。您的叢集主要執行個體只能透過 VPC 網路存取。您無法從虛擬私人雲端網路外部存取主要執行個體。

gcloud

請執行下列指令:

gcloud container clusters create private-cluster-2 \
    --create-subnetwork name=my-subnet-2 \
    --enable-master-authorized-networks \
    --enable-ip-alias \
    --enable-private-nodes \
    --enable-private-endpoint \
    --master-ipv4-cidr 172.16.0.32/28 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

其中:

  • --enable-master-authorized-networks 表示僅有您授權的 IP 位址範圍可以存取公開端點。
  • --create-subnetwork name=my-subnet-2 會使 GKE 自動建立一個名為 my-subnet-2 的子網路。
  • --enable-ip-alias 會將叢集類型設為虛擬私人雲端原生。
  • --enable-private-nodes 代表叢集節點沒有外部 IP 位址。
  • --master-ipv4-cidr 172.16.0.32/28 會指定主要執行個體的 RFC 1918 範圍。指定之後,就無法在這個叢集中變更這項設定。

Console

請執行下列步驟:

  1. 造訪 Google Cloud Platform Console 的 GKE 選單。

    造訪 GKE 選單

  2. 按一下 [Create cluster] (建立叢集)。

  3. 選擇 [Standard cluster] (標準叢集) 範本,或者為您的工作負載選擇適當的範本

  4. 在「Name」(名稱) 中輸入 my-subnet-2

  5. 按一下選單底部的 [Advanced options] (進階選項)。

  6. 針對「VPC-native」(虛擬私人雲端原生),勾選 [Enable VPC-native (using alias IP)] (啟用虛擬私人雲端原生 (使用別名 IP)) 核取方塊。保留「Network」(網路) 下拉式選單的 default 設定,並保留「Node subnet」(節點子網路) 下拉式選單的 default 設定,這會讓 GKE 為您的叢集產生子網路。

  7. 針對「Network security」(網路安全性),勾選 [Private cluster] (私人叢集) 核取方塊。

  8. 取消勾選 [Access master using its external IP address] (透過外部 IP 位址存取主要執行個體) 核取方塊。 請留意 [Enable master authorized networks] (啟用主要執行個體授權網路) 的狀態。

  9. 將「Master IP range」(主要執行個體 IP 範圍) 設為 172.16.0.32/28

  10. 系統會自動勾選 [Enable master authorized networks] (啟用主要執行個體授權網路) 核取方塊。

  11. 取消勾選 [Enable Kubernetes Dashboard] (啟用 Kubernetes 資訊主頁) 核取方塊。

  12. 清除 [Issue a client certificate] (核發用戶端憑證) 核取方塊。

  13. 按一下 [Create] (建立)。

API

如要讓建立的叢集具有可公開存取的主要執行個體,請在 privateClusterConfig 資源中指定 enablePrivateEndpoint: true 欄位。

此時,只有這些 IP 位址可存取叢集主要執行個體:

  • my-subnet-2 的主要範圍。
  • Pod 所用的次要範圍。

舉例來說,假設您在 my-subnet-2 的主要範圍內建立了一個 VM,那麼您可以在這個 VM 上設定 kubectl,以使用主要執行個體的內部 IP 位址。

如果要從 my-subnet-2 外部存取叢集主要執行個體,您必須至少授權一個位址範圍才能存取私人端點。

假設您的 VM 位於預設網路中,與叢集位於同一地區,但不在 my-subnet-2 中。

例如:

  • my-subnet-2:10.0.0.0/22
  • Pod 次要範圍:10.52.0.0/14
  • VM 位址:10.128.0.3

您可以使用以下指令,授權 VM 存取主要執行個體:

gcloud container clusters update private-cluster-2 \
    --enable-master-authorized-networks \
    --master-authorized-networks 10.128.0.3/32

在共用的虛擬私人雲端網路中建立私人叢集

如要瞭解如何在共用的虛擬私人雲端網路中建立私人叢集,請參閱共用虛擬私人雲端說明文件。

使用 VPC Service Controls 對私人叢集進行防護

為了進一步提升您 GKE 私人叢集的安全性,您可以使用 VPC Service Control 對其進行防護。

VPC Service Controls 為您的 GKE 私人叢集提供額外的安全性,以降低資料遭到竊取的風險。您可以透過 VPC Service Controls 將專案加入服務範圍內,如此一來,源自服務範圍外的要求就無法存取相關資源及服務。

如要進一步瞭解服務範圍,請參閱 VPC Service Controls 說明文件的服務範圍設定頁面。

如果將 Container Registry 與 GKE 私人叢集搭配使用,則需要執行額外步驟才能對該私人叢集使用 VPC Service Controls。詳情請參閱為 GKE 私人叢集設定 Container Registry 頁面。

關於主要執行個體授權網路的說明

授權網路具有下列限制:

  • 您可以在一個專案中新增最多 50 個授權網路 (加入許可清單的 CIDR 區塊)。

詳情請參閱將授權網路新增至現有叢集

確認節點是否不含外部 IP

建立私人叢集後,須確認叢集的節點是否不具有外部 IP 位址。

gcloud

如要確認叢集的節點沒有外部 IP 位址,請執行下列指令:

kubectl get nodes --output wide

輸出的 EXTERNAL-IP 資料欄為空白:

STATUS ... VERSION   EXTERNAL-IP  OS-IMAGE ...
Ready      v.8.7-gke.1                 Container-Optimized OS from Google
Ready      v1.8.7-gke.1                Container-Optimized OS from Google
Ready      v1.8.7-gke.1                Container-Optimized OS from Google

Console

如要確認叢集的節點沒有外部 IP 位址,請執行下列步驟:

  1. 造訪 GCP Console 的 GKE 選單。

    造訪 GKE 選單

  2. 在叢集清單中,按一下需要的叢集。

  3. 在「Node pools」(節點集區) 底下,按一下執行個體群組的名稱,例如 gke-private-cluster-0-default-pool-5c5add1f-grp。

  4. 在執行個體清單中,確認執行個體沒有外部 IP 位址。

查看叢集的子網路和次要位址範圍

建立私人叢集之後,您可以查看您或 GKE 為叢集佈建的子網路和次要位址範圍。

gcloud

列出所有子網路

如要列出叢集網路中的子網路,請執行以下指令:

gcloud compute networks subnets list --network [NETWORK]

其中 [NETWORK] 是私人叢集的網路。如果您是透過自動建立的子網路建立叢集,請使用 default

在指令輸出內容中,尋找叢集的子網路名稱。

查看叢集的子網路

取得自動建立的子網路的相關資訊:

gcloud compute networks subnets describe [SUBNET_NAME]

其中 [SUBNET_NAME] 是子網路的名稱。

輸出內容會顯示節點的主要位址範圍 (第一個 ipCidrRange 欄位),以及 Pod 和 Service 的次要範圍 (在 secondaryIpRanges 下方):

...
ipCidrRange: 10.0.0.0/22
kind: compute#subnetwork
name: gke-private-cluster-1-subnet-163e3c97
...
privateIpGoogleAccess: true
...
secondaryIpRanges:
- ipCidrRange: 10.40.0.0/14
  rangeName: gke-private-cluster-1-pods-163e3c97
- ipCidrRange: 10.0.16.0/20
  rangeName: gke-private-cluster-1-services-163e3c97
...

Console

  1. 造訪 GCP Console 的「VPC networks」(VPC 網路) 頁面。

    前往「VPC networks」(VPC 網路) 頁面

  2. 按一下子網路的名稱,例如 gke-private-cluster-0-subnet-163e3c97

  3. 在「IP address range」(IP 位址範圍) 底下,您可看到子網路的主要位址範圍。這是用於節點的範圍。

  4. 在「Secondary IP ranges」(次要 IP 範圍) 底下,您可看到 Pod 的 IP 位址範圍及 Service 的範圍。

查看私人叢集的端點

您可以透過 gcloud 指令列工具或 GCP Console 查看私人叢集端點。

gcloud

請執行下列指令:

gcloud container clusters describe [CLUSTER_NAME]

輸出內容將顯示私人及公開端點:

...
privateClusterConfig:
enablePrivateEndpoint: true
enablePrivateNodes: true
masterIpv4CidrBlock: 172.16.0.32/28
privateEndpoint: 172.16.0.34
publicEndpoint: 35.239.154.67

Console

請執行下列步驟:

  1. 造訪 GCP Console 的 GKE 選單。

    造訪 GKE 選單

  2. 在清單中,按一下需要的叢集。

  3. 在「Details」(詳細資料) 分頁的「Cluster」(叢集) 底下,查看「Endpoint」(端點) 欄位。

從映像檔註冊資料庫中提取容器映像檔

在私人叢集中,容器執行階段能從 Container Registry 提取容器映像檔,但無法從網際網路上的其他容器映像檔註冊資料庫提取映像檔。這是因為私人叢集中的節點沒有外部 IP 位址,因此根據預設,這些節點無法與 Google 網路外的服務進行通訊。

如果私人叢集中的節點位於啟用了私人 Google 存取權的子網路上,這些節點就能與 Container Registry 等 Google 服務進行通訊。

下列指令會建立一個部署,從 Google 擁有的 Container Registry 存放區提取範例映像檔。

kubectl run hello-deployment --image gcr.io/google-samples/hello-app:2.0

其他私人叢集設定

除了上述設定以外,您也可以使用下列設定執行私人叢集。

將連出網際網路的權限授予私人節點

私人節點沒有連出網際網路的權限,因為這些節點沒有外部 IP 位址。如要為您的私人節點提供連出網際網路的權限,您可以使用 Cloud NAT,或者管理自己的 NAT 閘道

透過網路 Proxy 執行私人叢集以存取主要執行個體

您可以使用網路 Proxy 建立私人叢集,讓叢集主要執行個體無法從網路外部存取。您建立及託管的 Proxy 位於私人 IP 空間中。詳情請參閱這份指南

新增特定用途的防火牆規則

根據預設,防火牆規則會限制叢集主要執行個體,使其只能發起 TCP 連線到通訊埠 443 (HTTPS) 和 10250 (kubelet) 上的節點。針對某些 Kubernetes 功能,您可能需要新增防火牆規則,以允許其他通訊埠進行存取。舉例來說,在 Kubernetes 1.9 及更早版本中,kubectl top 會存取 heapster,這需要透過防火牆規則允許通訊埠 8080 上的 TCP 連線。如要授予這類存取權,您可以新增防火牆規則。

下列各節說明如何將防火牆規則新增至私人叢集。

查看叢集主要執行個體的 CIDR 區塊

您需要叢集主要執行個體的 CIDR 區塊才能新增防火牆規則。

gcloud

請執行下列指令:

gcloud container clusters describe [CLUSTER_NAME]

請記下指令輸出中,masterIpv4CidrBlock 欄位中的值。

Console

  1. 造訪 GCP Console 的 GKE 選單。

    造訪 GKE 選單

  2. 選取所需叢集。

在「Details」(詳細資料) 分頁的「Cluster」(叢集) 底下,記下「Master address range」(主要執行個體位址範圍) 欄位的值。

查看現有的防火牆規則

您必須指定叢集的現有防火牆規則使用的目標 (這裡指的是目的地節點)。

gcloud

請執行下列指令:

gcloud compute firewall-rules list \
    --filter 'name~^gke-[CLUSTER_NAME]' \
    --format 'table(
        name,
        network,
        direction,
        sourceRanges.list():label=SRC_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        targetTags.list():label=TARGET_TAGS
    )'

請記下指令輸出中,「Targets」(目標) 欄位中的值。

Console

請執行下列步驟:

  1. 造訪 GCP Console 的「Firewall rules」(防火牆規則) 選單。

    造訪「Firewall rules」(防火牆規則) 選單

  2. 在「Filter resources」(篩選資源) 方塊中,填入 gke-[CLUSTER_NAME]

請記下結果中,「Targets」(目標) 欄位中的值。

新增防火牆規則

gcloud

請執行下列指令:

gcloud compute firewall-rules create [FIREWALL_RULE_NAME] \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges [MASTER_CIDR_BLOCK] \
    --rules [PROTOCOL]:[PORT] \
    --target-tags [TARGET]

其中:

  • [FIREWALL_RULE_NAME] 是您選擇的防火牆規則名稱。
  • [MASTER_CIDR_BLOCK] 是您之前收集的叢集主要執行個體 CIDR 區塊。
  • [PROTOCOL]:[PORT] 是要使用的通訊埠及其通訊協定 (tcpudp)。
  • [TARGET] 是您之前收集的目標值。

Console

請執行下列步驟:

  1. 造訪 GCP Console 的「Firewall rules」(防火牆規則) 選單。

    造訪「Firewall rules」(防火牆規則) 選單

  2. 按一下 [Create firewall rule] (建立防火牆規則)。

  3. 在「Name」(名稱) 方塊中,填入防火牆規則名稱。

  4. 從「Network」(網路) 下拉式選單中,選取相關的網路。

  5. 針對「Direction of traffic」(流量方向),按一下 [Ingress] (輸入)。

  6. 針對「Action on match」(相符時執行的動作),按一下 [Allow] (允許)。

  7. 從「Targets」(目標) 下拉式選單中,選取 [Specified target tags] (指定的目標標記)。

  8. 在「Target tags」(目標標記) 方塊中,填寫您之前收集的目標值。

  9. 從「Source filter」(來源篩選器) 下拉式選單中,選取 [IP ranges] (IP 範圍)。

  10. 在「Source IP ranges」(來源 IP 範圍) 方塊中,填入您之前收集的叢集主要執行個體的 CIDR 區塊。

  11. 針對「Protocols and ports」(通訊協定和通訊埠),按一下 [Specified protocols and ports] (指定的通訊協定和通訊埠),勾選相關通訊協定 (TCP 或 UDP) 的方塊,然後在方塊中填入所需通訊埠。

  12. 按一下 [Create] (建立)。

清除所用資源

完成本頁面的工作之後,為避免您的帳戶中產生不必要的費用,請按照下列步驟移除資源:

刪除叢集

gcloud

gcloud container clusters delete -q private-cluster-0 private-cluster-1

Console

  1. 造訪 GCP Console 的 GKE 選單。

    造訪 GKE 選單

  2. 選取每個叢集。

  3. 按一下 [Delete] (刪除)。

刪除網路

gcloud

gcloud compute networks delete net-0

Console

  1. 前往 GCP Console 的「VPC networks」(VPC 網路) 頁面。

    前往「VPC networks」(VPC 網路) 頁面

  2. 在網路清單中,從「net-0」按一下「垃圾桶」圖示。

  3. 在每個子網路旁邊,按一下「垃圾桶」圖示。

疑難排解

下列各節說明如何解決與私人叢集相關的常見問題。

叢集與使用中的對等互連重複

問題
嘗試建立私人叢集會傳回錯誤,例如 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 重新建立叢集。

無法連至主要執行個體

問題
在建立私人叢集後,嘗試對叢集執行 kubectl 指令時會傳回錯誤,例如 Unable to connect to the server: dial tcp [IP_ADDRESS]: connect: connection timed outUnable to connect to the server: dial tcp [IP_ADDRESS]: i/o timeout
可能原因
kubectl 無法與叢集主要執行個體通訊。
解決方法
您必須為叢集新增授權網路,以將網路的 IP 位址加入許可清單。

由於省略標記而無法建立叢集

問題
gcloud container clusters create 會傳回錯誤,例如 Cannot specify --enable-private-endpoint without --enable-private-nodes.
可能原因
您未指定必要的標記。
解決方法
確認您已指定必要的標記。您無法在未啟用私人節點的狀態下,為叢集主要執行個體啟用私人端點。

由於主要執行個體 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 區塊。

無法建立子網路

問題
當您嘗試建立自訂子網路,或使用自動子網路建立私人叢集時,您可能會遇到下列錯誤:An IP range in the peer network overlaps with an IP range in one of the active peers of the local network.
可能原因
您指定的主要執行個體 CIDR 範圍與叢集中的另一個 IP 範圍重複。如果您最近刪除了一個私人叢集,並嘗試使用同一個主要執行個體 CIDR 來建立新的私人叢集,就可能會發生這種情況。
解決方法
請嘗試使用不同的 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)
可能原因
私人叢集中的節點無法連出至公開網際網路,而僅具備 Google API 和服務 (包括 Container Registry) 的有限存取權。
解決方法
您無法直接從 Docker Hub 擷取映像檔。不過,您可以使用 Docker Hub 的 Container Registry 鏡像

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件