创建和管理单栈 IPv6 集群

本文档介绍了如何在 Google Kubernetes Engine (GKE) 中创建、配置和管理单栈 IPv6 集群。

您可以在仅支持 IPv6 的网络环境中运行容器化工作负载,以避免耗尽专用 IPv4 地址空间 (RFC 1918)。部署单栈 IPv6 集群时,您只需为 Pod、节点和 Service 分配 IPv6 地址,同时保持与内部和外部资源的入站和出站连接。

概览

随着工作负载扩缩和集群密度增加,专用 IPv4 地址空间可能会很快耗尽。在仅限 IPv4 的集群和双栈集群中,每个 Pod 都需要一个 IPv4 地址,这可能会使在 VPC 网络中分配 CIDR 块成为主要的伸缩瓶颈。

在 GKE 单栈 IPv6 集群中,您可以在整个集群数据平面中专门分配 IPv6 地址,从而完全消除 IPv4 地址限制。工作器节点在单栈 IPv6 Compute Engine 虚拟机实例上运行,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)。通信范围仅限于您的 VPC 网络、对等互连网络和混合连接。节点和 Pod 无法直接访问公共 IPv6 互联网资源,也无法直接接收互联网入站流量。
  • 外部 (GUA):具有 EXTERNAL 访问权限类型的子网使用全球单播地址 (GUA)。节点和 Pod 会分配有全球唯一的 IPv6 地址,并且可以跨入站流量和出站流量与公共 IPv6 互联网资源进行通信,但须遵守 VPC 防火墙规则和路由表。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 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 虚拟机实例作为工作器节点,不支持混合或双栈节点池。
  • 您必须使用 Cloud DNS 作为集群 DNS 提供商 (--cluster-dns=clouddns)。单栈 IPv6 集群不支持 kube-dns。
  • 单栈 IPv6 集群中的控制平面访问使用两条不同的路径:
    • 外部客户端:集群外部的客户端(例如,使用 kubectl 的客户端)通过 GKE 前端 (GKFE) 上的基于网域的端点访问控制平面。
    • 内部工作负载:节点和 Pod 通过 Private Service Connect 安全地连接到控制平面。如需支持此通信,您必须提供或创建具有 INTERNAL IPv6 访问权限类型 (--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 集群标志。而是直接在 VPC 子网上配置专用 Google 访问通道和 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:现有自定义模式 VPC 网络的名称。
  • SUBNET_NAME:要创建的新节点子网的名称。
  • ACCESS_TYPE:子网的互联网可路由性。为专用 ULA 寻址指定 INTERNAL,或为公共 GUA 寻址指定 EXTERNAL。如果省略,则默认为 EXTERNAL。
  • COMPUTE_LOCATION:集群的计算区域或可用区。

在自定义子网上创建 Standard 集群

如需使用预先存在的子网或自定义子网,请在创建集群之前创建 VPC 网络、PSC 控制平面子网和节点子网。

  1. 创建启用了 ULA 内部 IPv6 地址的自定义模式 VPC 网络:

    gcloud compute networks create NETWORK_NAME \
        --subnet-mode=CUSTOM \
        --enable-ula-internal-ipv6
    
  2. 创建专用内部 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。

  3. 创建节点子网。选择内部访问权限 (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
    
  4. 创建引用这两个子网的单栈 IPv6 标准集群:

    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 集群。

  1. 确保您已按照上一部分所述创建自定义 VPC 网络、内部 PSC 子网和仅限 IPv6 的节点子网。

  2. 创建 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
    

创建具有代管式节点的 Standard 集群

您还可以创建一个单栈 IPv6 Standard 集群,该集群使用在工作负载级层配置的代管式节点。如需详细了解如何在 Standard 集群中配置代管式 ComputeClass,请参阅 Standard 集群中的 Autopilot 类。

为节点和 Pod 使用自备 IPv6 地址

您可以创建一个单栈 IPv6 集群,其节点和 Pod 使用自备 IPv6 地址 (BYOIPv6),而不是 Google 提供的地址。为此,请使用来自公开委派前缀 (PDP) 的区域级 IPv6 子前缀的外部 IPv6 地址范围创建节点子网。然后,节点和 Pod 会从该前缀接收 IPv6 地址,并使用这些地址与互联网以及彼此进行通信。

  1. 在 EXTERNAL_IPV6_SUBNETWORK_CREATION 模式下创建公开委派前缀的区域级 IPv6 子前缀。如需了解详情,请参阅创建 IPv6 子前缀。

  2. 创建具有 EXTERNAL IPv6 访问类型的节点子网,并使用 --ip-collection 标志引用子前缀。Compute Engine 会从子前缀中分配子网的 /64 IPv6 地址范围:

    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 标志。

  3. 按照在自定义子网上创建 Standard 集群或在自定义子网上创建 Autopilot 集群中的步骤,在此节点子网上创建集群。PSC 控制平面子网不需要 BYOIPv6 地址范围。

  4. GKE 创建集群后,请验证节点和 Pod 是否具有来自前缀的 IPv6 地址:

    kubectl get nodes -o wide
    kubectl get pods --all-namespaces -o wide
    

请注意以下几点:

  • 此过程使用具有 EXTERNAL IPv6 访问类型的节点子网,因此节点和 Pod 会从您的前缀中获取全局可路由地址。您还可以通过引用 INTERNAL_IPV6_SUBNETWORK_CREATION 模式下的子前缀,使用具有 INTERNAL IPv6 访问类型的节点子网;在这种情况下,节点和 Pod 会获得内部 BYOIPv6 地址,并且内部 IPv6 访问类型的连接限制适用。如需了解详情,请参阅连接到外部和私有资源。
  • 如需通过 LoadBalancer Service 在 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)时,请注意以下子网要求:

    • 仅代理子网:在单栈 IPv6 集群上,区域级仅代理子网 (--purpose=REGIONAL_MANAGED_PROXY) 必须是双栈 (--stack-type=IPV4_IPV6)。在仅 IPv4 和双栈集群上,子网可以是仅 IPv4 或双栈。
    • 网关 VIP 子网:与 IPv4 区域级外部网关(不从子网分配 VIP)不同,IPv6 区域级外部网关 (gke-l7-regional-external-managed) 需要具有 EXTERNAL IPv6 访问权限的子网,而区域级内部网关 (gke-l7-rilb) 需要具有 INTERNAL IPv6 访问权限的子网(或内部 IPv4 VIP 的 IPv4 范围)。如需从自定义子网(而非集群的节点子网)分配临时区域级网关 VIP,请在附加到网关的 GCPGatewayPolicy 的 spec.default.subnetwork 字段中指定子网名称。

    如需了解配置说明,请参阅部署网关。

  • 第 4 层直通式负载均衡(Service API):您可以使用配置了 type: LoadBalancer 的 Kubernetes Service 向 IPv6 客户端公开工作负载。根据您的集群节点是在 INTERNAL (ULA) 还是 EXTERNAL (GUA) 子网上运行,您可能需要预配专用负载均衡器子网,并使用 networking.gke.io/load-balancer-subnet 注解引用该子网:

连接到外部和私有资源

单栈 IPv6 集群中的工作负载通常需要通过互联网与外部服务通信,或与 Google Cloud中的专用服务通信。

连接到公共 IPv6 互联网资源

如果您的集群节点在配置了 EXTERNAL IPv6 访问权限类型 (--ipv6-access-type=EXTERNAL) 的子网上运行,则默认情况下会启用与公共互联网 IPv6 端点的出站和入站连接。验证您的 VPC 防火墙规则是否允许所需的 IPv6 流量。如需了解详情,请参阅使用 VPC 防火墙规则。

连接到公共 IPv4 互联网资源(DNS64 和 NAT64)

由于单栈 IPv6 集群中的 Pod 只有 IPv6 地址,因此连接到仅限 IPv4 的公共互联网端点需要进行网络转换。您可以在 VPC 网络中配置 Cloud DNS 和 Cloud NAT,以提供自动 DNS64 和 NAT64 转换:

  1. 创建 DNS64 服务器政策:

    gcloud dns policies create POLICY_NAME \
        --description="DNS64 policy for single-stack IPv6 cluster" \
        --networks=NETWORK_NAME \
        --enable-dns64-all-queries
    
  2. 在部署集群的区域中创建 Cloud Router 路由器:

    gcloud compute routers create ROUTER_NAME \
        --network=NETWORK_NAME \
        --region=COMPUTE_REGION
    
  3. 创建为 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
    

    如需为 NAT64 配置特定子网或手动外部 IP 地址,请使用 --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 实例)或第三方提供方服务:

  1. 从集群的 PSC 子网中预留静态内部 IPv6 地址:

    gcloud compute addresses create ADDRESS_NAME \
        --ip-version=IPV6 \
        --subnet=PSC_SUBNET_NAME \
        --region=COMPUTE_REGION
    
  2. 创建针对服务连接的 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
    
  3. 检索分配的 IPv6 地址:

    gcloud compute forwarding-rules describe FORWARDING_RULE_NAME \
        --region=COMPUTE_REGION \
        --format='value(IPAddress)'
    
  4. 在应用连接字符串中使用检索到的 IPv6 地址。 PSC 会转换流量,以便您的 IPv6 Pod 可以安全地访问 IPv4 或双栈提供方服务。

如需详细了解如何使用已发布的服务,请参阅创建 Private Service Connect 端点和使用 Private Service Connect 连接到 Cloud SQL。如需使用 ServiceAttachment 资源将集群中运行的内部 LoadBalancer Service 发布到其他 VPC 网络中的使用方,请参阅使用 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 层 VPC 网络)。单栈 IPv6 集群不支持在其他网络接口上使用 IPv6 Pod 网络。
  • networking.gke.io/default-interface Pod 注解仅为 IPv4 流量配置默认接口;未为 IPv6 流量配置默认接口。

如需了解如何配置由 VPC 子网支持的次要 IPv4 Pod 网络,请参阅为单栈 IPv6 集群上的 Pod 设置多网络支持。

迁移到单栈 IPv6 集群

您无法直接将现有 IPv4 集群或双栈集群转换或就地更新为单栈 IPv6 集群。如需转换工作负载,请使用蓝绿迁移:

  1. 审核依赖项:验证应用配置、客户端库和代理是否使用 DNS 名称(例如 metadata.google.internal),而不是硬编码的 IPv4 地址。根据需要配置 GCE_METADATA_HOST。
  2. 预配绿色集群:在同一 VPC 网络或对等互连 VPC 网络中,与现有集群并排部署一个新的单栈 IPv6 集群。验证是否已配置 Cloud DNS、DNS64、Cloud NAT (NAT64) 和 PSC 转发规则。
  3. 部署工作负载:将 Kubernetes 清单应用于绿色集群,并验证 Pod 是否成功启动和通信。
  4. 转移流量:使用负载均衡器(Gateway API 或 Cloud DNS 路由政策),逐步将流量从旧版集群转移到新的 IPv6 集群,同时监控指标和错误率。
  5. 退役旧集群:在所有流量都转移且绿色集群验证稳定后,排空并删除旧集群。

后续步骤