本文說明如何在 Google Kubernetes Engine (GKE) 建立、設定及管理單一堆疊 IPv6 叢集。
您可以在僅限 IPv6 的網路環境中執行容器化工作負載,避免私人 IPv4 位址空間 (RFC 1918) 用盡。部署單一堆疊 IPv6 叢集時,您只會將 IPv6 位址指派給 Pod、節點和 Service,同時維持與內部和外部資源的輸入和輸出連線能力。
總覽
隨著工作負載擴充和叢集密度增加,私人 IPv4 位址空間可能會迅速用盡。在僅限 IPv4 和雙重堆疊叢集中,每個 Pod 都需要 IPv4 位址,因此在虛擬私有雲網路中分配 CIDR 區塊,可能會成為擴充的主要瓶頸。
在 GKE 單一堆疊 IPv6 叢集中,您只能在叢集資料層指派 IPv6 位址,完全移除 IPv4 位址限制。worker 節點會在單一堆疊 IPv6 Compute Engine VM 執行個體上運作,Pod 和 Service 則透過 IPv6 連線通訊。
IP 位址分配 (IPAM)
單一堆疊 IPv6 叢集會使用下列前置字元大小,在子網路、節點、Pod 和 Service 中分配 IPv6 位址:
| 資源 | CIDR 區塊前置字串 | 說明 |
|---|---|---|
| 子網路 | /64 |
指定為僅限 IPv6 的子網路 CIDR 區塊。 |
| 節點 | /96 |
由 GKE 從子網路 CIDR 區塊自動指派,每個節點約提供 42.9 億個不重複的 IPv6 位址。 |
| Pod | /112 |
從節點 /96 子範圍的子集指派。 |
| 服務 | /64 |
由 GKE 自動從 2600:2D00:0:4::0:0/64 IPv6 位址範圍指派給 ClusterIP Service。 |
外部和內部 IPv6 存取權類型
設定叢集子網路時,您可以選擇兩種 IPv6 存取權類型,控管網際網路路由能力:
- 內部 (ULA):存取權類型為
INTERNAL的子網路,會使用fd20::/20範圍內的專屬本機單點傳播位址 (ULA)。通訊範圍僅限於虛擬私有雲網路、對等互連網路和混合式連線。節點和 Pod 無法直接連上公開 IPv6 網際網路資源,也無法直接接收網際網路輸入。 - 外部 (GUA):存取類型為
EXTERNAL的子網路會使用全域單點傳播位址 (GUA)。節點和 Pod 會獲派全域不重複的 IPv6 位址,並可依據虛擬私有雲防火牆規則和轉送表,透過輸入和輸出與公開 IPv6 網際網路資源通訊。
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
需求條件和限制
如要使用單一堆疊 IPv6 叢集,請確認您符合下列規定和限制:
- 叢集必須執行 GKE 1.37.1-gke.3020000 以上版本。
- 叢集必須是使用 GKE Dataplane V2 的 VPC 原生叢集。單一堆疊 IPv6 叢集不支援使用路由的叢集。
- 單一堆疊 IPv6 叢集僅支援單一堆疊 IPv6 VM 執行個體做為 worker 節點,不支援混合或雙重堆疊節點集區。
- 您必須使用 Cloud DNS 做為叢集 DNS 供應商 (
--cluster-dns=clouddns)。單一堆疊 IPv6 叢集不支援kube-dns。 - 單一堆疊 IPv6 叢集的控制層存取權會使用兩種不同的路徑:
- 外部用戶端:叢集外部的用戶端 (例如使用
kubectl) 透過 GKE Frontend (GKFE) 上的網域端點存取控制層。 - 內部工作負載:節點和 Pod 透過 Private Service Connect 安全地連線至控制層。如要支援這類通訊,您必須提供或建立 IPv6 存取權類型為
INTERNAL(--private-endpoint-subnetwork) 的子網路。
- 外部用戶端:叢集外部的用戶端 (例如使用
- 在內部 (
INTERNAL) IPv6 子網路上,節點和 Pod 可以透過 IPv6 連線至 Google API 和 Artifact Registry,不需使用 Cloud NAT 閘道。不過,請考量下列事項:- 如要連線至僅限 IPv4 的外部端點 (例如僅限 IPv4 的外部容器登錄),您必須設定 DNS64 和 Cloud NAT (NAT64)。
INTERNAL子網路上的節點和 Pod 無法連線至 Google 外部的公開 IPv6 端點,因為唯一本機位址 (ULA) 無法在公開 IPv6 網際網路上轉送,且 Cloud NAT 不支援 IPv6 到 IPv6 (NAT66) 轉譯。
- 單一堆疊 IPv6 叢集不支援
--private-ipv6-google-access-type和--enable-private-nodes叢集旗標。請改為直接在虛擬私有雲子網路上設定 Private Google Access 和 IPv6 存取權類型 (INTERNAL或EXTERNAL)。 - 單一堆疊 IPv6 叢集不支援多子網路設定。
- 單一堆疊 IPv6 叢集不支援 GKE Ingress。如要設定第 7 層應用程式負載平衡器,請使用 Gateway API。
- GKE 多網路 API 不支援 IPv6 Pod 網路,次要 Pod 網路必須僅限 IPv4。詳情請參閱「Pod 的多網路支援功能」。
- 僅限 IPv6 的叢集不支援 Cloud Service Mesh。
- 您可以將自備 IPv6 位址 (BYOIPv6) 與單一堆疊 IPv6 叢集搭配使用。如要瞭解 BYOIPv6 前置字元的相關規定,請參閱「建立及使用 IPv6 子前置字元」。
工作負載中繼資料伺服器設定
在僅限 IPv6 的 Pod 中執行的工作負載無法連上標準 IPv4 中繼資料伺服器位址 (169.254.169.254),因此請套用下列調整:
- 設定應用程式和用戶端程式庫,使用網域名稱
metadata.google.internal(建議) 或常值 ULA IPv6 位址[fd20:ce::254]存取中繼資料伺服器。 如果您使用的用戶端程式庫或應用程式,含有硬式編碼的 IPv4 中繼資料伺服器端點 (例如舊版 Google API 用戶端程式庫),請在容器映像檔或 Pod 規格中設定
GCE_METADATA_HOST環境變數:env: - name: GCE_METADATA_HOST value: "metadata.google.internal"
建立單一堆疊 IPv6 叢集
您可以使用 Google Cloud CLI 建立單一堆疊 IPv6 叢集。
同時建立叢集和子網路
如果沒有預先存在的自訂子網路,您可以建立標準單一堆疊 IPv6 叢集,並讓 GKE 透過單一指令自動佈建必要的節點子網路和 --private-endpoint-subnetwork。
執行下列指令:
gcloud beta container clusters create CLUSTER_NAME \
--cluster-version=VERSION \
--enable-dataplane-v2 \
--cluster-dns=clouddns \
--stack-type=ipv6 \
--network=NETWORK_NAME \
--create-subnetwork name=SUBNET_NAME \
--ipv6-access-type=ACCESS_TYPE \
--location=COMPUTE_LOCATION
更改下列內容:
CLUSTER_NAME:新叢集的名稱。VERSION:GKE 1.37.1-gke.3020000 以上版本。NETWORK_NAME:現有自訂模式虛擬私有雲網路的名稱。SUBNET_NAME:要建立的新節點子網路名稱。ACCESS_TYPE:子網路的網際網路可路由性。指定INTERNAL即可使用私人 ULA 定址,指定EXTERNAL則可使用公開 GUA 定址。如省略,則預設為EXTERNAL。COMPUTE_LOCATION:叢集的運算區域或可用區。
在自訂子網路上建立 Standard 叢集
如要使用現有或自訂子網路,請先建立虛擬私有雲網路、PSC 控制層子網路和節點子網路,再建立叢集。
建立自訂模式虛擬私有雲網路,並啟用 ULA 內部 IPv6 位址:
gcloud compute networks create NETWORK_NAME \ --subnet-mode=CUSTOM \ --enable-ula-internal-ipv6建立專屬的內部 PSC 控制層子網路:
gcloud compute networks subnets create PSC_SUBNET_NAME \ --stack-type=ipv6_only \ --ipv6-access-type=INTERNAL \ --network=NETWORK_NAME \ --region=COMPUTE_REGION將
COMPUTE_REGION替換為部署叢集的區域 (例如us-central1)。您也可以為 PSC 控制層子網路指定--stack-type=ipv4_ipv6。建立節點子網路。選擇內部存取權 (
INTERNAL) 或外部存取權 (EXTERNAL):gcloud compute networks subnets create NODE_SUBNET_NAME \ --stack-type=ipv6_only \ --ipv6-access-type=ACCESS_TYPE \ --network=NETWORK_NAME \ --region=COMPUTE_REGION建立參照兩個子網路的單一堆疊 IPv6 Standard 叢集:
gcloud container clusters create CLUSTER_NAME \ --cluster-version=VERSION \ --enable-dataplane-v2 \ --cluster-dns=clouddns \ --stack-type=ipv6 \ --network=NETWORK_NAME \ --subnetwork=NODE_SUBNET_NAME \ --private-endpoint-subnetwork=PSC_SUBNET_NAME \ --location=COMPUTE_LOCATION
在自訂子網路上建立 Autopilot 叢集
Autopilot 叢集會自動從您指定的節點子網路沿用堆疊類型。選取僅限 IPv6 的子網路時,GKE 會建立單一堆疊 IPv6 Autopilot 叢集。
請務必按照上一節所述,建立自訂虛擬私有雲網路、內部 PSC 子網路,以及僅限 IPv6 的節點子網路。
建立 Autopilot 叢集:
gcloud container clusters create-auto CLUSTER_NAME \ --cluster-version=VERSION \ --network=NETWORK_NAME \ --subnetwork=NODE_SUBNET_NAME \ --private-endpoint-subnetwork=PSC_SUBNET_NAME \ --location=COMPUTE_LOCATION
建立含有代管節點的標準叢集
您也可以建立單一堆疊 IPv6 標準叢集,並使用在工作負載層級設定的代管節點。如要進一步瞭解如何在 Standard 叢集中設定代管 ComputeClass,請參閱「Standard 叢集中的 Autopilot 類別」。
使用自備 IPv6 位址,用於節點和 Pod
您可以建立單一堆疊 IPv6 叢集,讓節點和 Pod 使用自備 IPv6 位址 (BYOIPv6),而非 Google 提供的位址。如要這麼做,請使用外部 IPv6 位址範圍建立節點子網路,該範圍來自公開委派前置碼 (PDP) 的區域 IPv6 子前置碼。節點和 Pod 接著會從該前置碼接收 IPv6 位址,並使用這些位址與網際網路通訊,以及彼此通訊。
在
EXTERNAL_IPV6_SUBNETWORK_CREATION模式中,為公開委派前置字串建立區域性 IPv6 子前置字串。詳情請參閱「建立 IPv6 子前置字串」。建立 IPv6 存取權類型為
EXTERNAL的節點子網路,並使用--ip-collection旗標參照子前置字串。Compute Engine 會從子前置字元分配子網路的/64IPv6 位址範圍:gcloud compute networks subnets create NODE_SUBNET_NAME \ --stack-type=ipv6_only \ --ipv6-access-type=EXTERNAL \ --ip-collection=SUB_PREFIX_NAME \ --network=NETWORK_NAME \ --region=COMPUTE_REGION將
SUB_PREFIX_NAME替換為您在上一個步驟中建立的子前置碼名稱。子前置字串必須與子網路位於相同區域。如要從子前置字元選擇特定/64範圍,而非讓 Compute Engine 分配,請新增--external-ipv6-prefix旗標。請按照「在自訂子網路上建立 Standard 叢集」或「在自訂子網路上建立 Autopilot 叢集」中的步驟,在這個節點子網路上建立叢集。PSC 控制層子網路不需要 BYOIPv6 位址範圍。
GKE 建立叢集後,請確認節點和 Pod 具有前置字元的 IPv6 位址:
kubectl get nodes -o wide kubectl get pods --all-namespaces -o wide
請注意以下幾點:
- 這項程序會使用 IPv6 存取權類型為
EXTERNAL的節點子網路,因此節點和 Pod 會從前置字元取得可全域轉送的位址。您也可以在INTERNAL_IPV6_SUBNETWORK_CREATION模式中參照子前置字串,使用 IPv6 存取權類型為INTERNAL的節點子網路。在這種情況下,節點和 Pod 會取得內部 BYOIPv6 位址,且適用內部 IPv6 存取權類型的連線限制。詳情請參閱「連線至外部和私人資源」。 - 如要透過 LoadBalancer 服務,在 BYOIPv6 位址上公開工作負載,請參閱「自備 IPv6 位址 (BYOIPv6)」,這項操作不需要 BYOIPv6 節點子網路。
- 如要瞭解 BYOIPv6 前置字元的相關規定,請參閱「建立及使用 IPv6 子前置字元」。
驗證叢集堆疊類型
叢集建立完成後,請列出叢集,確認叢集是以單一堆疊 IPv6 模式運作:
gcloud beta container clusters list
輸出內容會確認 STACK_TYPE 欄已設為 IPV6:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STACK_TYPE STATUS
v6-only-cluster-1 us-central1-c 1.37.0-gke.1000000 gke-3a3234-123456.us-central1-c.gke.goog e2-medium 1.37.0-gke.1000000 1 IPV6 RUNNING
單一堆疊 IPv6 叢集的負載平衡
您可以使用第 7 層和第 4 層負載平衡器,公開在單一堆疊 IPv6 叢集內執行的應用程式:
第 7 層應用程式負載平衡 (Gateway API):使用 Kubernetes Gateway API 部署第 7 層應用程式負載平衡器 (
gke-l7-rilb、gke-l7-regional-external-managed或gke-l7-global-external-managed)。這些閘道可為內部和外部 IPv4 和 IPv6 用戶端提供服務,同時將流量透明地轉送至內部僅限 IPv6 的 Pod 端點。請注意,單一堆疊 IPv6 叢集不支援 GKE Ingress。在單一堆疊 IPv6 叢集部署區域性閘道 (gke-l7-rilb和gke-l7-regional-external-managed) 時,請留意下列子網路規定:- 僅限 Proxy 子網路:在單一堆疊 IPv6 叢集上,區域僅限 Proxy 子網路 (
--purpose=REGIONAL_MANAGED_PROXY) 必須是雙重堆疊 (--stack-type=IPV4_IPV6)。在僅限 IPv4 和雙重堆疊叢集上,子網路可以是僅限 IPv4 或雙重堆疊。 - 閘道 VIP 子網路:IPv4 區域性外部閘道不會從子網路分配 VIP,但 IPv6 區域性外部閘道 (
gke-l7-regional-external-managed) 需要具備EXTERNALIPv6 存取權的子網路,區域性內部閘道 (gke-l7-rilb) 則需要具備INTERNALIPv6 存取權的子網路 (或內部 IPv4 VIP 的 IPv4 範圍)。如要從自訂子網路 (而非叢集的節點子網路) 分配臨時區域閘道 VIP,請在附加至閘道的GCPGatewayPolicyspec.default.subnetwork欄位中指定子網路名稱。
如需設定操作說明,請參閱「部署閘道」。
- 僅限 Proxy 子網路:在單一堆疊 IPv6 叢集上,區域僅限 Proxy 子網路 (
第 4 層直通式負載平衡 (Service API):您可以使用設定
type: LoadBalancer的 Kubernetes Service,向 IPv6 用戶端公開工作負載。視叢集節點是在INTERNAL(ULA) 還是EXTERNAL(GUA) 子網路上執行而定,您可能需要佈建專屬的負載平衡器子網路,並使用networking.gke.io/load-balancer-subnet註解參照該子網路:- 如要瞭解內部負載平衡器,請參閱「在單一堆疊 IPv6 叢集上建立內部 LoadBalancer 服務」。
- 如要瞭解外部負載平衡器,請參閱「在單一堆疊 IPv6 叢集上建立外部 LoadBalancer 服務」。
- 如要將 BYOIPv6 位址指派給負載平衡器,請參閱「自備 IPv6 位址 (BYOIPv6)」。無論節點子網路的存取類型為何,外部 LoadBalancer 服務都能直接從 BYOIPv6 公開委派前置碼分配位址。
連線至外部和私人資源
單一堆疊 IPv6 叢集中的工作負載通常需要與網際網路上的外部服務,或 Google Cloud中的私人服務通訊。
連線至公開 IPv6 網際網路資源
如果叢集節點在設有 EXTERNAL IPv6 存取權類型 (--ipv6-access-type=EXTERNAL) 的子網路上執行,系統預設會啟用與公開網際網路 IPv6 端點的輸出和輸入連線。確認虛擬私有雲防火牆規則允許必要的 IPv6 流量。詳情請參閱「使用虛擬私有雲防火牆規則」。
連線至公開 IPv4 網際網路資源 (DNS64 和 NAT64)
單一堆疊 IPv6 叢集中的 Pod 只有 IPv6 位址,因此連線至僅限 IPv4 的公開網際網路端點時,需要進行網路轉譯。您可以在虛擬私有雲網路中設定 Cloud DNS 和 Cloud NAT,自動提供 DNS64 和 NAT64 轉譯:
建立 DNS64 伺服器政策:
gcloud dns policies create POLICY_NAME \ --description="DNS64 policy for single-stack IPv6 cluster" \ --networks=NETWORK_NAME \ --enable-dns64-all-queries在部署叢集的區域建立 Cloud Router:
gcloud compute routers create ROUTER_NAME \ --network=NETWORK_NAME \ --region=COMPUTE_REGION建立設定為 NAT64 轉譯的 Cloud NAT 閘道:
gcloud compute routers nats create NAT_NAME \ --router=ROUTER_NAME \ --region=COMPUTE_REGION \ --auto-allocate-nat-external-ips \ --nat64-all-v6-subnet-ip-ranges如要使用特定子網路或手動外部 IP 位址設定 NAT64,請使用
--nat64-custom-v6-subnet-ip-ranges和--nat-external-ip-pool。
如要進一步瞭解位址轉譯,請參閱「設定 DNS64 和 NAT64」和「適用於 6to4 連線的 DNS64 和 NAT64」。
使用 Private Service Connect 連線至私人服務
Private Service Connect (PSC) 支援端點和轉送規則之間的 IPv6 到 IPv4 位址轉譯。您可以將單一堆疊 IPv6 叢集中的工作負載,連線至 Google Cloud 代管服務 (例如 Cloud SQL 執行個體) 或第三方供應商服務:
從叢集的 PSC 子網路預留靜態內部 IPv6 位址:
gcloud compute addresses create ADDRESS_NAME \ --ip-version=IPV6 \ --subnet=PSC_SUBNET_NAME \ --region=COMPUTE_REGION建立 PSC 端點轉送規則,並將服務連結設為目標:
gcloud compute forwarding-rules create FORWARDING_RULE_NAME \ --address=ADDRESS_NAME \ --region=COMPUTE_REGION \ --network=NETWORK_NAME \ --target-service-attachment=SERVICE_ATTACHMENT_URL \ --allow-psc-global-access擷取指派的 IPv6 位址:
gcloud compute forwarding-rules describe FORWARDING_RULE_NAME \ --region=COMPUTE_REGION \ --format='value(IPAddress)'在應用程式連線字串中使用擷取的 IPv6 位址。PSC 會轉譯流量,確保 IPv6 Pod 能安全連上 IPv4 或雙堆疊供應商服務。
如要進一步瞭解如何使用已發布的服務,請參閱「建立 Private Service Connect 端點」和「使用 Private Service Connect 連線至 Cloud SQL」。如要使用 ServiceAttachment 資源,將叢集中執行的內部 LoadBalancer Service 發布給其他虛擬私有雲網路中的消費者,請參閱「使用 Private Service Connect 建立內部負載平衡器」。
進階網路和加速器
您可以為加速器節點集區和多網路 Pod,設定具有次要網路介面的單一堆疊 IPv6 叢集。
多 NIC 加速器網路
在標準單一堆疊 IPv6 叢集中,您可以使用自動網路 (--accelerator-network-profile=auto) 或手動多網路設定 (--additional-node-network),將次要資料網路 (RDMA 或 DIORITE) 附加至加速器節點集區 (GPU 和 TPU)。次要介面可在 IPv4 子網路、雙重堆疊子網路或僅限 IPv6 的子網路上執行。
如需逐步說明,請參閱「在單一堆疊 IPv6 叢集上設定多 NIC 節點網路」。
Pod 的多網路支援功能
單一堆疊 IPv6 叢集支援 Pod 的多網路功能,並具備下列特性:
- 主要 Pod 網路介面 (
eth0) 使用單一堆疊 IPv6 網路。 - 額外的 Pod 網路介面必須僅限 IPv4 (第 3 層虛擬私有雲網路)。單一堆疊 IPv6 叢集不支援在其他網路介面上使用 IPv6 Pod 網路。
networking.gke.io/default-interfacePod 註解只會為 IPv4 流量設定預設介面,不會為 IPv6 流量設定預設介面。
如要瞭解如何設定由虛擬私有雲子網路支援的次要 IPv4 Pod 網路,請參閱「為單一堆疊 IPv6 叢集上的 Pod 設定多網路支援」。
遷移至單一堆疊 IPv6 叢集
您無法直接轉換現有的 IPv4 叢集或雙重堆疊叢集,也無法就地更新為單一堆疊 IPv6 叢集。如要轉換工作負載,請使用藍綠遷移:
- 稽核依附元件:確認應用程式設定、用戶端程式庫和代理程式使用 DNS 名稱 (例如
metadata.google.internal),而非硬式編碼 IPv4 位址。視需要設定GCE_METADATA_HOST。 - 佈建綠色叢集:在相同或對接的虛擬私有雲網路中,與現有叢集並行部署新的單一堆疊 IPv6 叢集。確認 Cloud DNS、DNS64、Cloud NAT (NAT64) 和 PSC 轉送規則已設定。
- 部署工作負載:將 Kubernetes 資訊清單套用至綠色叢集,並確認 Pod 已啟動且能順利通訊。
- 轉移流量:使用負載平衡器 (Gateway API 或 Cloud DNS 路由政策),逐步將流量從舊版叢集轉移至新的 IPv6 叢集,同時監控指標和錯誤率。
- 停用舊版叢集:所有流量都轉移完畢,且綠色叢集確認穩定後,請清空並刪除舊叢集。
後續步驟
- 如要進一步瞭解 GKE 網路,請參閱「GKE 網路總覽」。
- 如要瞭解 GKE 如何指派 IP 位址,請參閱「瞭解 GKE 中的 IP 定址」。
- 如要設定第 7 層負載平衡,請參閱「部署閘道」。
- 如要設定次要 Pod 網路,請參閱「設定 Pod 的多網路支援」。