使用共享 VPC 设置集群

本页面介绍如何在单独的项目中创建两个使用共享虚拟私有云 (VPC) 的 Google Kubernetes Engine 集群。如需了解 GKE 网络的一般信息,请访问网络概览

概览

使用共享的 VPC 时,您可以将一个项目指定为宿主项目,并且可以将其他项目(称为服务项目)关联到宿主项目。您可以在宿主项目中创建网络、子网、次要地址范围、防火墙规则以及其他网络资源。然后,您可以与服务项目共享所选子网,包括次要范围。在某个服务项目中运行的组件可以使用共享的 VPC 与在其他服务项目中运行的组件通信。

您可以将共享的 VPC 与地区级和区域级集群结合使用。使用共享 VPC 的集群不能使用旧版网络,并且必须启用别名 IP

您可以在创建新集群时配置共享的 VPC。Google Kubernetes Engine 不支持将现有集群转换为共享的 VPC 模型。

使用共享的 VPC 时,遵循某些配额和限制。例如,项目中的网络数量有一个配额,并且可以关联到每个宿主项目的服务项目数量有限制。如需了解详情,请参阅配额和限制

本主题中的示例为双层网页应用设置基础架构,如共享的 VPC 概览中所述。

本页面上的示例使用特定名称和地址范围来说明一般流程。如果您愿意,则可以根据需要更改名称和地址范围。此外,练习还使用 us-central1 区域和 us-central1-a 地区。如果您愿意,则可以根据需要更改区域和地区。

准备工作

要执行此任务,您需要拥有一个 Cloud Platform 组织,并在该组织中拥有三个 Cloud Platform 项目

在您的组织中,您必须获授予 Compute Shared VPC Admin 角色

在开始本主题中的练习之前,请选择一个项目作为宿主项目,并选择另外两个项目作为服务项目。每个项目都有一个名称、一个 ID 和一个编号。在某些情况下,名称和 ID 是相同的。本主题使用以下易于记忆的名称来引用您的项目:

  • 您的宿主项目
  • 您的第一个服务项目
  • 您的第二个服务项目

本主题使用以下占位符来引用您的项目 ID 和编号。

  • [HOST_PROJECT_ID] 是您的宿主项目的项目 ID。
  • [HOST_PROJECT_NUM] 是您的宿主项目的项目编号。
  • [SERVICE_PROJECT_1_ID] 是您的第一个服务项目的项目 ID。
  • [SERVICE_PROJECT_1_NUM] 是您的第一个服务项目的项目编号。
  • [SERVICE_PROJECT_2_ID] 是您的第二个服务项目的项目 ID。
  • [SERVICE_PROJECT_2_NUM] 是您的第二个服务项目的项目编号。

查找您的项目 ID 和编号

gcloud

列出您的项目:

gcloud projects list

输出会显示项目名称、ID 和编号。记下 ID 和编号以备不时之需:

PROJECT_ID        NAME        PROJECT_NUMBER
host-123          host        1027xxxxxxxx
srv-1-456         srv-1       4964xxxxxxxx
srv-2-789         srv-2       4559xxxxxxxx

Console

  1. 访问 Google Cloud Platform Console 中的“首页”。
    访问“首页”
  2. 在项目选择器中,选择您已选取用作宿主项目的项目。
  3. 项目信息下,您可以看到项目名称、项目 ID 和项目编号。记下 ID 和编号以备后续使用。
  4. 对您已选取用作服务项目的每个项目执行相同的操作。

在项目中启用 Google Kubernetes Engine API

在继续本主题中的练习之前,请确保在所有三个项目中都启用了 Google Kubernetes Engine API。如果在项目中启用 API,则会为项目创建 GKE 服务帐号。为执行本主题中的其余步骤,您的每个项目都必须具有 GKE 服务帐号。

gcloud

为您的三个项目启用 Google Kubernetes Engine API。每项操作可能需要一些时间才能完成:

gcloud services enable container.googleapis.com --project [HOST_PROJECT_ID]
gcloud services enable container.googleapis.com --project [SERVICE_PROJECT_1_ID]
gcloud services enable container.googleapis.com --project [SERVICE_PROJECT_2_ID]

Console

  1. 访问 GCP Console 中的 API 和服务信息中心。
    访问 API 信息中心
  2. 在项目选择器中,选择您已选取用作宿主项目的项目。
  3. 如果 Kubernetes Engine API 位于 API 列表中,则它已启用,您无需执行任何操作。如果它不在列表中,请点击启用 API 和服务。搜索 Kubernetes Engine API。点击 Kubernetes Engine API 卡片,然后点击启用
  4. 对您已选取用作服务项目的每个项目重复这些步骤。

创建一个网络和两个子网

在您的宿主项目中,创建一个名为 shared-net 的网络。然后,创建两个子网:一个名为 tier-1,另一个名为 tier-2。对于每个子网,创建两个次要地址范围:一个用于服务,另一个用于 Pod。

gcloud

在您的宿主项目中,创建一个名为 shared-net 的网络:

gcloud compute networks create shared-net \
    --subnet-mode custom \
    --project [HOST_PROJECT_ID]

在新网络中,创建一个名为 tier-1 的子网:

gcloud compute networks subnets create tier-1 \
    --project [HOST_PROJECT_ID] \
    --network shared-net \
    --range 10.0.4.0/22 \
    --region us-central1 \
    --secondary-range tier-1-services=10.0.32.0/20,tier-1-pods=10.4.0.0/14

创建另一个名为 tier-2 的子网:

gcloud compute networks subnets create tier-2 \
    --project [HOST_PROJECT_ID] \
    --network shared-net \
    --range 172.16.4.0/22 \
    --region us-central1 \
    --secondary-range tier-2-services=172.16.16.0/20,tier-2-pods=172.20.0.0/14

Console

  1. 访问 GCP Console 中的“VPC 网络”页面。
    访问“VPC 网络”页面
  2. 在项目选择器中,选择您的宿主项目。
  3. 点击创建 VPC 网络
  4. 名称部分,输入 shared-net
  5. 子网创建模式下,选择自定义
  6. 新子网框的名称部分中,输入 tier-1
  7. 对于区域,选择 us-central1
  8. IP 地址范围部分,输入 10.0.4.0/22
  9. 点击创建次要 IP 范围。在子网范围名称部分,输入 tier-1-services;在次要 IP 范围部分,输入 10.0.32.0/20
  10. 点击添加 IP 范围。在子网范围名称部分,输入 tier-1-pods;在次要 IP 范围部分,输入 10.4.0.0/14
  11. 点击 + 添加子网
  12. 名称部分,输入 tier-2
  13. 对于区域,选择 us-central1
  14. IP 地址范围部分,输入 172.16.4.0/22
  15. 点击创建次要 IP 范围。在子网范围名称部分,输入 tier-2-services;在次要 IP 范围部分,输入 172.16.16.0/20
  16. 点击添加 IP 范围。在子网范围名称部分,输入 tier-2-pods;在次要 IP 范围部分,输入 172.20.0.0/14
  17. 点击创建

确定服务项目中服务帐号的名称

您有两个服务项目,每个服务项目都有多个服务帐号。本部分涉及您的 GKE 服务帐号和您的 Google API 服务帐号。在下一个部分中,您需要用到这些服务帐号的名称。

以下是两个服务项目中 GKE 服务帐号的名称:

  • service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com
  • service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com

以下是两个服务项目中 Google API 服务帐号的名称:

  • [SERVICE_PROJECT_1_NUM]@cloudservices.gserviceaccount.com
  • [SERVICE_PROJECT_2_NUM]@cloudservices.gserviceaccount.com

启用共享的 VPC 并授予角色

在您的宿主项目中,启用共享的 VPC,并将两个服务项目关联到宿主项目。然后,将适当的角色授予属于您的服务项目的服务帐号。

gcloud

在您的宿主项目中启用共享的 VPC:

gcloud compute shared-vpc enable [HOST_PROJECT_ID]

将您的第一个服务项目关联到宿主项目:

gcloud compute shared-vpc associated-projects add \
    [SERVICE_PROJECT_1_ID] \
    --host-project [HOST_PROJECT_ID]

将您的第二个服务项目关联到宿主项目:

gcloud compute shared-vpc associated-projects add \
    [SERVICE_PROJECT_2_ID] \
    --host-project [HOST_PROJECT_ID]

获取 tier-1 子网的 IAM 政策:

gcloud beta compute networks subnets get-iam-policy tier-1 \
   --project [HOST_PROJECT_ID] \
   --region us-central1

输出包含 etag 字段。记下 etag 值。

创建一个名为 tier-1-policy.yaml 的文件,其中包含以下内容:

bindings:
- members:
  - serviceAccount:[SERVICE_PROJECT_1_NUM]@cloudservices.gserviceaccount.com
  - serviceAccount:service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com
  role: roles/compute.networkUser
etag: [ETAG_STRING]

其中,[ETAG_STRING] 是您之前记下的 etag 值。

为 tier-1 子网设置 IAM 政策:

gcloud beta compute networks subnets set-iam-policy tier-1 \
    tier-1-policy.yaml \
    --project [HOST_PROJECT_ID] \
    --region us-central1

接下来,获取 tier-2 子网的 IAM 政策:

gcloud beta compute networks subnets get-iam-policy tier-2 \
   --project [HOST_PROJECT_ID] \
   --region us-central1

输出包含 etag 字段。记下 etag 值。

创建一个名为 tier-2-policy.yaml 且包含以下内容的文件:

bindings:
- members:
  - serviceAccount:[SERVICE_PROJECT_2_NUM]@cloudservices.gserviceaccount.com
  - serviceAccount:service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com
  role: roles/compute.networkUser
etag: [ETAG_STRING]

其中:[ETAG_STRING] 是您之前记下的 etag 值。

为 tier-2 子网设置 IAM 政策:

gcloud beta compute networks subnets set-iam-policy tier-2 \
    tier-2-policy.yaml \
    --project [HOST_PROJECT_ID] \
    --region us-central1

Console

按照以下步骤启用共享的 VPC、关联服务项目以及授予角色:

  1. 访问 GCP Console 中的“共享的 VPC”页面。
    访问“共享的 VPC”页面
  2. 在项目选择器中,选择您的宿主项目。
  3. 点击设置共享的 VPC
    系统即会显示启用宿主项目屏幕。
  4. 点击保存并继续
    系统即会显示选择子网页面。
  5. 共享模式下,选择个别子网
  6. 要共享的子网下,选中 tier-1tier-2。清除所有其他复选框。
  7. 点击继续
    系统即会显示授予权限页面。
  8. 关联服务项目下,选中您的第一个服务项目和第二个服务项目。清除关联服务项目下的所有其他复选框。
  9. Kubernetes Engine 访问权限下,选中已启用
  10. 点击保存
    系统即会显示一个新页面。
  11. 个别子网权限下,选中 tier-1
  12. 在右侧窗格中,删除属于第二个服务项目的任何服务帐号。也就是说,删除包含 [SERVICE_PROJECT_2_NUM] 的任何服务帐号。
  13. 在右侧窗格中,查找属于第一个服务项目的 Kubernetes Engine 和 Google API 服务帐号的名称。您希望在列表中看到这两个服务帐号名称。如果其中任何一个不在列表中,请在添加成员下方输入服务帐号名称,然后点击添加
  14. 在中央窗格中的个别子网权限下,选中 tier-2,并取消选中 tier-1
  15. 在右侧窗格中,删除属于第一个服务项目的任何服务帐号。也就是说,删除包含 [SERVICE_PROJECT_1_NUM] 的任何服务帐号。
  16. 在右侧窗格中,查找属于第二个服务项目的 Kubernetes Engine 和 Google API 服务帐号的名称。您希望在列表中看到这两个服务帐号名称。如果其中任何一个不在列表中,请在添加成员下方输入服务帐号名称,然后点击添加

上述步骤的目的是将适当的 Cloud IAM 角色授予四个服务帐号。第一个服务项目中的两个服务帐号获授予宿主项目 tier-1 子网上的“计算网络用户”角色。第二个服务项目中的两个服务帐号获授予宿主项目 tier-2 子网上的“计算网络用户”角色。

在子网上授予的角色摘要

  • service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com 服务帐号获授予 tier-1 子网上的“计算网络用户”角色。

  • [SERVICE_PROJECT_1_NUM]@cloudservices.gserviceaccount.com 服务帐号获授予 tier-1 子网上的“计算网络用户”角色。

  • service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com 服务帐号获授予 tier-2 子网上的“计算网络用户”角色。

  • [SERVICE_PROJECT_2_NUM]@cloudservices.gserviceaccount.com 服务帐号获授予 tier-2 子网上的“计算网络用户”角色。

授予 Host Service Agent User 角色

在每个服务项目中,您必须将 Host Service Agent User 角色授予 GKE 服务帐号。这允许该服务项目的 GKE 服务帐号使用宿主项目的 GKE 服务帐号来配置共享网络资源。

Host Service Agent User 角色仅授予服务项目的服务帐号,不能授予用户。

gcloud

将 Host Service Agent User 角色授予第一个服务项目的 GKE 服务帐号。在您的宿主项目上授予此角色:

gcloud projects add-iam-policy-binding [HOST_PROJECT_ID] \
    --member serviceAccount:service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com \
    --role roles/container.hostServiceAgentUser

将 Host Service Agent User 角色授予第二个服务项目的 GKE 服务帐号。在您的宿主项目上授予此角色:

gcloud projects add-iam-policy-binding [HOST_PROJECT_ID] \
    --member  serviceAccount:service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com \
    --role    roles/container.hostServiceAgentUser

Console

如果您一直使用的是 GCP Console,则不必明确授予 Host Service Agent User 角色。当您使用 GCP Console 将服务项目关联到宿主项目时,系统会自动授予此角色。

验证可用的子网和次要 IP 范围

创建集群时,您必须指定要用于集群 Pod 和服务的子网和次要 IP 范围。由于多种原因,IP 范围可能无法使用。无论是使用 GCP Console 还是 gcloud 命令行工具创建集群,都应指定可用的 IP 范围。

您还可以从命令行列出项目的可用子网和次要 IP 范围:

gcloud

gcloud container subnets list-usable \
    --project [SERVICE_PROJECT_ID] \
    --network-project [HOST_PROJECT_ID]

如果省略 --project--network-project 选项,则 gcloud 命令会使用活跃配置中的默认项目。由于宿主项目和网络项目不同,因此您必须指定 --project 和/或 --network-project

该命令的输出如下所示:

PROJECT   REGION       NETWORK      SUBNET          RANGE
xpn-host  us-central1  empty-vpc    empty-subnet    10.0.0.0/21
xpn-host  us-east1     some-vpc     some-subnet     10.0.0.0/19
    ┌──────────────────────┬───────────────┬─────────────────────────────┐
    │ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE │            STATUS           │
    ├──────────────────────┼───────────────┼─────────────────────────────┤
    │ pods-range           │ 10.2.0.0/21   │ usable for pods or services │
    │ svc-range            │ 10.1.0.0/21   │ usable for pods or services │
    └──────────────────────┴───────────────┴─────────────────────────────┘
xpn-host  us-central1  shared-net   tier-2          172.16.4.0/22
    ┌──────────────────────┬────────────────┬─────────────────────────────┐
    │ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE  │            STATUS           │
    ├──────────────────────┼────────────────┼─────────────────────────────┤
    │ tier-2-services      │ 172.16.16.0/20 │ usable for pods or services │
    │ tier-2-pods          │ 172.20.0.0/14  │ usable for pods or services │
    └──────────────────────┴────────────────┴─────────────────────────────┘
xpn-host  us-central1  shared-net   tier-1          10.0.4.0/22
    ┌──────────────────────┬───────────────┬─────────────────────────────┐
    │ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE │            STATUS           │
    ├──────────────────────┼───────────────┼─────────────────────────────┤
    │ tier-1-services      │ 10.0.32.0/20  │ unusable                    │
    │ tier-1-pods          │ 10.4.0.0/14   │ usable for pods             │
    │ tier-1-extra         │ 10.8.0.0/14   │ usable for pods or services │
    └──────────────────────┴───────────────┴─────────────────────────────┘

如果某个 IP 范围尚未使用,则该范围可用于新集群的服务。您为新集群的 Pod 指定的 IP 范围可以是未使用的范围,也可以是与其他集群中的 Pod 共用的范围。您的集群无法使用由 GKE 创建和管理的 IP 范围。

在第一个服务项目中创建集群

gcloud

在您的第一个服务项目中创建一个集群:

gcloud container clusters create tier-1-cluster \
    --project [SERVICE_PROJECT_1_ID] \
    --zone=us-central1-a \
    --enable-ip-alias \
    --network projects/[HOST_PROJECT_ID]/global/networks/shared-net \
    --subnetwork projects/[HOST_PROJECT_ID]/regions/us-central1/subnetworks/tier-1 \
    --cluster-secondary-range-name tier-1-pods \
    --services-secondary-range-name tier-1-services

创建完成后,请验证您的集群节点是否位于 tier-1 子网的主要范围 (10.0.4.0/22) 内。

gcloud compute instances list --project [SERVICE_PROJECT_1_ID]

输出会显示节点的内部 IP 地址:

NAME                    ZONE           ... INTERNAL_IP
gke-tier-1-cluster-...  us-central1-a  ... 10.0.4.2
gke-tier-1-cluster-...  us-central1-a  ... 10.0.4.3
gke-tier-1-cluster-...  us-central1-a  ... 10.0.4.4

Console

  1. 访问 GCP Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 在项目选择器中,选择您的第一个服务项目。

  3. 点击创建集群

  4. 集群名称部分,输入 tier-1-cluster

  5. 对于位置类型,选择地区级

  6. 对于地区,选择 us-central1-a

  7. 点击页面底部的高级选项

  8. VPC 原生部分,选中启用“VPC 原生”功能(使用别名 IP)

  9. 取消选择自动创建次要范围

  10. 选择(通过宿主项目…)与我共享的网络

  11. 对于节点子网,选择 tier-1

  12. 对于 Pod 次要 CIDR 范围,选择 tier-1-pods

  13. 对于 Service 次要 CIDR 范围,选择 tier-1-services

  14. 点击创建

  15. 创建完成后,在集群列表中点击 tier-1-cluster

  16. 节点池下,点击实例组的名称。例如 gke-tier-1-cluster-default-pool-5c5add1f-grp。

  17. 在实例列表中,验证节点的内部 IP 地址是否位于 tier-1 子网的主要范围 (10.0.4.0/22) 内。

在第二个服务项目中创建集群

gcloud

在您的第二个服务项目中创建一个集群:

gcloud container clusters create tier-2-cluster \
    --project [SERVICE_PROJECT_2_ID] \
    --zone=us-central1-a \
    --enable-ip-alias \
    --network projects/[HOST_PROJECT_ID]/global/networks/shared-net \
    --subnetwork projects/[HOST_PROJECT_ID]/regions/us-central1/subnetworks/tier-2 \
    --cluster-secondary-range-name tier-2-pods \
    --services-secondary-range-name tier-2-services

创建完成后,请验证您的集群节点是否位于 tier-2 子网的主要范围 (172.16.4.0/22) 内。

gcloud compute instances list --project [SERVICE_PROJECT_2_ID]

输出会显示节点的内部 IP 地址:

NAME                    ZONE           ... INTERNAL_IP
gke-tier-2-cluster-...  us-central1-a  ... 172.16.4.2
gke-tier-2-cluster-...  us-central1-a  ... 172.16.4.3
gke-tier-2-cluster-...  us-central1-a  ... 172.16.4.4

Console

  1. 访问 GCP Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 在项目选择器中,选择您的第二个服务项目。

  3. 点击创建集群

  4. 集群名称部分,输入 tier-2-cluster

  5. 对于位置类型,选择地区级

  6. 对于地区,选择 us-central1-a

  7. 点击页面底部的高级选项

  8. VPC 原生部分,选中启用“VPC 原生”功能(使用别名 IP)

  9. 取消选择自动创建次要范围

  10. 选择(通过宿主项目…)与我共享的网络

  11. 对于节点子网,选择 tier-2

  12. 对于 Pod 次要 CIDR 范围,选择 tier-2-pods

  13. 对于 Service 次要 CIDR 范围,选择 tier-2-services

  14. 点击创建

  15. 创建完成后,在集群列表中点击 tier-2-cluster

  16. 节点池下,点击实例组的名称。例如 gke-tier-2-cluster-default-pool-5c5add1f-grp。

  17. 在实例列表中,验证节点的内部 IP 地址是否位于 tier-2 子网的主要范围 (172.16.4.0/22) 内。

创建防火墙规则

为宿主项目中的 shared-net 网络创建防火墙规则。允许流量进入 TCP 端口 22。这允许您使用 SSH 连接到集群节点。

gcloud

为您的共享网络创建防火墙规则:

gcloud compute firewall-rules create my-shared-net-rule \
    --project [HOST_PROJECT_ID] \
    --network shared-net \
    --direction INGRESS \
    --allow tcp:22

Console

  1. 访问 GCP Console 中的“防火墙”页面。

    访问“防火墙规则”页面

  2. 在项目选择器中,选择您的宿主项目。

  3. VPC 网络菜单中,点击创建防火墙规则

  4. 名称部分,输入 my-shared-net-rule

  5. 对于网络,选择 shared-net

  6. 对于流量方向,选择入站

  7. 对于对匹配项执行的操作,选择允许

  8. 对于目标,选择网络中的所有实例

  9. 对于来源过滤条件,选择 IP 范围

  10. 来源 IP 地址范围部分,输入 0.0.0.0/0

  11. 对于协议和端口,选择指定的协议和端口。在框中输入 tcp:22

  12. 点击创建

使用 SSH 连接到节点

gcloud

列出第一个服务项目中的节点:

gcloud compute instances list --project [SERVICE_PROJECT_1_ID]

输出包含集群中节点的名称:

NAME                                           ...
gke-tier-1-cluster-default-pool-faf87d48-3mf8  ...
gke-tier-1-cluster-default-pool-faf87d48-q17k  ...
gke-tier-1-cluster-default-pool-faf87d48-x9rk  ...

通过 SSH 连接到您的其中一个节点:

gcloud compute ssh [NODE_NAME] \
    --project [SERVICE_PROJECT_1_ID] \
    --zone us-central1-a \

其中 [NODE_NAME] 是您的其中一个节点的名称。

Console

  1. 访问 GCP Console 中的 Google Kubernetes Engine 菜单。

    访问“防火墙规则”页面

  2. 在项目选择器中,选择您的第一个服务项目。

  3. 点击 tier-1-cluster

  4. 节点池下,点击实例组的名称。例如 gke-tier-1-cluster-default-pool-faf87d48-grp。

  5. 在节点列表中,记下节点的内部 IP 地址。这些地址位于 10.0.4.0/22 范围内。

  6. 对于其中一个节点,点击 SSH。连接会成功,因为 SSH 使用 TCP 端口 22,防火墙规则允许流量进入该端口。

在节点之间执行 ping 操作

在 SSH 命令行窗口中,启动 CoreOS 工具箱

/usr/bin/toolbox

在工具箱 shell 中,ping 同一集群中的其他节点之一。例如:

ping 10.0.4.4

ping 命令会成功,因为您的节点和另一个节点都位于 10.0.4.0/22 范围内。

现在尝试 ping 其他服务项目的集群的其中一个节点。例如:

ping 172.16.4.3

这次 ping 命令会失败,因为您的防火墙规则不允许互联网控制消息协议 (ICMP) 流量。

在普通命令提示符下(而不是在您的工具箱 shell 中),更新您的防火墙规则以允许 ICMP:

gcloud compute firewall-rules update my-shared-net-rule \
    --project [HOST_PROJECT_ID] \
    --allow tcp:22,icmp

在工具箱 shell 中,再次 ping 该节点。例如:

ping 172.16.4.3

这次 ping 命令会成功。

创建其他防火墙规则

您可以创建其他防火墙规则,以允许在集群中的节点、Pod 和 Service 之间进行通信。例如,此规则允许来自 tier-1-cluster 中任何节点、Pod 或服务的流量进入任何 TCP 或 UDP 端口。

gcloud compute firewall-rules create my-shared-net-rule-2 \
    --project [HOST_PROJECT_ID] \
    --network shared-net \
    --allow tcp,udp \
    --direction INGRESS \
    --source-ranges 10.0.4.0/22,10.4.0.0/14,10.0.32.0/20

此规则允许来自 tier-2-cluster 中任何节点、Pod 或服务的流量进入任何 TCP 或 UDP 端口。

gcloud compute firewall-rules create my-shared-net-rule-3 \
    --project [HOST_PROJECT_ID] \
    --network shared-net \
    --allow tcp,udp \
    --direction INGRESS \
    --source-ranges 172.16.4.0/22,172.20.0.0/14,172.16.16.0/20

Kubernetes 还将尝试在必要时创建和管理防火墙资源,例如,当您创建负载平衡器服务时。如果 Kubernetes 发现自己因权限问题而无法更改防火墙规则,则会引发 Kubernetes 事件以指导您如何进行更改。

如果要授予 Kubernetes 更改防火墙规则的权限,您可以转到宿主项目并授予 Compute Security Admin 角色。或者,您可以将具有 compute.firewalls.*compute.networks.updatePolicy 权限的自定义角色授予服务项目的 GKE 服务帐号。

对于 Ingress 负载平衡器,如果 Kubernetes 由于权限不足而无法更改防火墙规则,则每隔几分钟就会发出一次 firewallXPNError 事件。在 GLBC 1.4 及更高版本中,您可以通过将 firewallXPNError 注释添加到 Ingress 资源,忽略 networking.gke.io/suppress-firewall-xpn-error: "true" 事件。您可以随时移除此注释以取消静音。

在共享的 VPC 中创建专用集群

您可以将共享的 VPC 与专用集群结合使用。无需特殊设置,但是必须确保主 CIDR 范围不与共享网络中的其他预留范围重叠。

共享的 VPC 中的专用集群数量上限为 25 个。

在本部分中,您将在预定义的共享 VPC 网络中创建一个 VPC 原生集群 private-cluster-vpc

gcloud

以下命令会在预定义的共享 VPC 中创建一个集群 private-cluster-vpc

gcloud container clusters create private-cluster-vpc \
    --project [PROJECT_ID] \
    --enable-ip-alias \
    --network projects/[HOST_PROJECT]/global/networks/shared-net \
    --subnetwork [SHARED_SUBNETWORK] \
    --cluster-secondary-range-name c0-pods \
    --services-secondary-range-name c0-services \
    --enable-private-nodes \
    --master-ipv4-cidr 172.16.0.0/28

Console

  1. 访问 GCP Console 中的 Google Kubernetes Engine 菜单。

    访问 GKE 菜单

  2. 点击创建集群

  3. 集群名称部分,输入 private-cluster-vpc

  4. 点击菜单底部的高级选项

  5. VPC 原生中,选中启用“VPC 原生”功能(使用别名 IP)复选框。

  6. 网络下拉菜单中,选择您之前创建的 VPC 网络。

  7. 节点子网下拉菜单中,选择您之前创建的共享子网。

  8. 网络安全中,选中专用集群复选框。

  9. 确认已选中使用外部 IP 地址访问主节点复选框。

  10. 主实例 IP 地址范围设置为 172.16.0.16/28

  11. 根据需要配置集群。然后,点击创建

保留 IP 地址

您可以为共享 VPC 集群保留内部 IP 地址外部 IP 地址。确保在服务项目中保留 IP 地址。

对于内部 IP 地址,您需要提供 IP 地址所属的子网。要跨项目保留 IP 地址,请使用完整资源网址,以便我们可以识别子网。您可以在 gcloud 命令行工具中使用以下命令来保留内部 IP 地址:

gcloud compute addresses create [RESERVED_IP_NAME] \
    --region=[REGION] \
    --subnet=projects/[HOST_PROJECT_ID]/regions/[REGION]/subnetworks/[SUBNETWORK_NAME] \
    --addresses=[IP_ADDRESS] \
    --project=[SERVICE_PROJECT_ID]

要调用该命令,您必须拥有子网的 compute.subnetworks.use 权限。您可以为调用者授予子网的 compute.networkUser 角色,也可以为调用者授予一个具有 compute.subnetworks.use 权限的项目级层自定义角色

有关次要范围的注意事项

您可以在给定子网中创建 5 个次要范围。对于每个集群,您需要两个次要范围:一个用于 Pod,另一个用于服务。也就是说,您只能创建两个使用给定子网的集群。

已知问题

针对负载平衡器创建的防火墙事件

如果 Kubernetes Service 帐号未获授予防火墙管理权限,则 Kubernetes 服务控制器可能不会为所需的防火墙更改创建事件。这是由于 Kubernetes 1.9 及更早版本的 RBAC 权限问题所致。服务控制者缺乏引发事件的能力。

要解决此问题,请应用这些 YAML 文件,其中包含允许创建事件的 RBAC 政策。

基于 Kubernetes 1.10 及更高版本的集群已经应用了这些 RBAC 政策。

清理

完成本页面上的练习后,请按照以下步骤移除资源,以防止您的帐号产生不必要的费用:

删除集群

gcloud

gcloud container clusters delete tier-1-cluster \
    --project [SERVICE_PROJECT_1_ID] \
    --zone us-central1-a

gcloud container clusters delete tier-2-cluster \
    --project [SERVICE_PROJECT_2_ID] \
    --zone us-central1-a

Console

  1. 访问 GCP Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 在项目选择器中,选择您的第一个服务项目。

  3. 选中 tier-1-cluster,然后点击删除

  4. 在项目选择器中,选择您的第二个服务项目。

  5. 选中 tier-2-cluster,然后点击删除

停用共享的 VPC

gcloud

gcloud compute shared-vpc associated-projects remove [SERVICE_PROJECT_1_ID] \
    --host-project [HOST_PROJECT_ID]

gcloud compute shared-vpc associated-projects remove [SERVICE_PROJECT_2_ID] \
    --host-project [HOST_PROJECT_ID]

gcloud compute shared-vpc disable [HOST_PROJECT_ID]

Console

  1. 访问 GCP Console 中的“共享的 VPC”页面。
    访问“共享的 VPC”页面
  2. 在项目选择器中,选择您的宿主项目。
  3. 点击停用共享的 VPC
  4. 在文本框中输入 [HOST_PROJECT_ID],然后点击停用

删除防火墙规则

gcloud

删除您的防火墙规则:

gcloud compute firewall-rules delete \
    my-shared-net-rule \
    my-shared-net-rule-2 \
    my-shared-net-rule-3 \
    --project [HOST_PROJECT_ID]

Console

  1. 访问 GCP Console 中的“防火墙”页面。

    访问“防火墙规则”页面

  2. 在项目选择器中,选择您的宿主项目。

  3. 在规则列表中,选中 my-shared-net-rulemy-shared-net-rule-2my-shared-net-rule-3

  4. 点击删除

删除 shared-net 网络

gcloud

gcloud compute networks subnets delete tier-1 \
    --project [HOST_PROJECT_ID] \
    --region us-central1

gcloud compute networks subnets delete tier-2 \
    --project [HOST_PROJECT_ID] \
    --region us-central1

gcloud compute networks delete shared-net --project [HOST_PROJECT_ID]

Console

  1. 访问 GCP Console 中的“VPC 网络”页面。
    访问“VPC 网络”页面
  2. 在项目选择器中,选择您的宿主项目。
  3. 在网络列表中,点击 shared-net
  4. 点击删除 VPC 网络

删除 Host Service Agent User 角色

gcloud

从第一个服务项目的 GKE 服务帐号中移除 Host Service Agent User 角色:

gcloud projects remove-iam-policy-binding [HOST_PROJECT_ID] \
    --member serviceAccount:service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com \
    --role roles/container.hostServiceAgentUser

从第二个服务项目的 GKE 服务帐号中移除 Host Service Agent User 角色:

gcloud projects remove-iam-policy-binding [HOST_PROJECT_ID] \
    --member serviceAccount:service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com \
    --role roles/container.hostServiceAgentUser

Console

  1. 访问 GCP Console 中的 IAM 页面。
    访问 IAM 页面
  2. 在项目选择器中,选择您的宿主项目。
  3. 在成员列表中,选中显示 service-[SERVICE_PROJECT_1_NUM]@container-engine-robot.iam.gserviceaccount.com 获授予 Kubernetes Engine Host Service Agent User 角色的行。
  4. 同时还选中显示 service-[SERVICE_PROJECT_2_NUM]@container-engine-robot.iam.gserviceaccount.com 获授予 Kubernetes Engine Host Service Agent User 角色的行。
  5. 点击移除

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 文档