Codelab:使用 NCC 进行动态路由交换

1. 简介

概览

在本实验中,用户将探索如何通过支持 VPC spoke 和动态路由交换,使用 Network Connectivity Center (NCC) 大规模建立本地连接。将 VPC 定义为 VPC spoke 后,用户就可以通过 NCC hub 将其连接到多个 VPC 网络。若要与用户的本地网络建立网络连接,用户可以将路由器设备虚拟 NIC、高可用性 VPN 隧道或互连 VLAN 连接附加到与 NCC VPC spoke 相同的 NCC hub。

hub 资源提供集中式连接管理模型,可用于 spoke 之间的连接。

构建内容

在此 Codelab 中,您将使用 NCC hub 构建一个逻辑中心辐射型拓扑,以在本地网络与工作负载 VPC 之间实现混合连接。

c06021c6aaa47682.png

学习内容

  • 区分工作负载 VPC 和路由 VPC
  • VPC spoke 和混合 spoke 的 NCC 集成

所需条件

  • 了解 GCP VPC 网络
  • 了解 Cloud Router 和 BGP 路由
  • Google Cloud 项目
  • 检查您的配额:网络,并在需要时申请添加其他网络,如下面的屏幕截图所示:

6bc606cb34bce7e8.png

目标

  • 设置 GCP 环境
  • 配置 Network Connectivity Center,并将 VPC 配置为 spoke
  • 配置 Network Connectivity Center,并将高可用性 VPN 隧道配置为混合 spoke
  • 验证数据路径
  • 探索 NCC 可维护性功能
  • 清理已使用的资源

准备工作

Google Cloud 控制台和 Cloud Shell

在本实验中,我们将使用 Google Cloud 控制台和 Cloud Shell 与 GCP 进行交互。

NCC Hub 项目 Google Cloud 控制台

您可以通过 https://console.cloud.google.com 访问 Cloud 控制台。

在 Google Cloud 中设置以下各项,以便更轻松地配置 Network Connectivity Center:

在 Google Cloud Console 的“项目选择器”页面上,选择或创建一个 Google Cloud 项目。

启动 Cloud Shell。此 Codelab 使用了 $variables 来帮助在 Cloud Shell 中实现 gcloud 配置。

gcloud auth list
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectname=[YOUR-PROJECT-NAME]
echo $projectname
region="us-central1"
zone="us-central1-a"

IAM 角色

NCC 需要 IAM 角色才能访问特定 API。请务必根据需要为用户配置 NCC IAM 角色。

角色/说明

权限

networkconnectivity.networkAdmin - 允许网络管理员管理 hub 和 spoke。

networkconnectivity.hubs.networkconnectivity.spokes.

networkconnectivity.networkSpokeManager - 允许在 hub 中添加和管理 spoke。在共享 VPC 中使用,其中宿主项目拥有 Hub,但其他项目中的其他管理员可以添加 spoke 以连接到 Hub。

networkconnectivity.spokes.**

networkconnectivity.networkUsernetworkconnectivity.networkViewer - 允许网络用户查看 hub 和 spoke 的不同属性。

networkconnectivity.hubs.getnetworkconnectivity.hubs.listnetworkconnectivity.spokes.getnetworkconnectivity.spokes.listnetworkconnectivity.spokes.aggregatedList

2. 设置网络环境

概览

在本部分中,我们将在单个项目中部署三个 VPC 网络和防火墙规则。此逻辑图展示了在此步骤中设置的网络环境。在本 Codelab 中,我们将使用 VPC 来模拟本地网络。

6c8baa1bf0676379.png

主要概念 1

Google Cloud 全球 VPC 可在 44 个以上的 GCP 区域之间提供数据路径连接。Cloud Router 是一项区域服务,它会动态通告子网,并在配置该路由器的区域或整个 VPC 网络中传播已知路由。Cloud Router 路由器是以区域方式还是全局方式传播路由取决于用户定义的动态路由模式:区域或全局。

在本部分中,我们将首先为每个 VPC 配置区域路由模式。在此 Codelab 的剩余部分中:

  • “路由 VPC”是指未配置为 NCC VPC spoke 的 VPC。
  • “工作负载 VPC”是指已配置为 NCC spoke 的 VPC。

创建工作负载 VPC 和子网

VPC 网络包含您将安装 GCE 虚拟机的子网,用于数据路径验证

vpc_spoke_network_name="workload-vpc"
vpc_spoke_subnet_name="workload-subnet"
vpc_spoke_subnet_ip_range="10.0.1.0/24"
vpc_spoke_name="workload-vpc-spoke"
region="us-central1"
zone="us-central1-a"

gcloud compute networks create "${vpc_spoke_network_name}" \
--subnet-mode=custom 

gcloud compute networks subnets create "${vpc_spoke_subnet_name}" \
--network="${vpc_spoke_network_name}" \
--range="${vpc_spoke_subnet_ip_range}" \
--region="${region}"

创建路由 VPC 和子网

NCC 支持所有有效的 IPv4 子网范围,但以非公开方式使用的公共 IP 地址除外。

routing_vpc_network_name="routing-vpc"
routing_vpc_subnet_name="routing-vpc-subnet"
routing_vpc_subnet_range="10.0.2.0/24"

gcloud compute networks create "${routing_vpc_network_name}" \
--subnet-mode=custom

gcloud compute networks subnets create "${routing_vpc_subnet_name}" \
--region="${region}" \
--network="${routing_vpc_network_name}" \
--range="${routing_vpc_subnet_range}"

创建本地 VPC 和子网

NCC 支持所有有效的 IPv4 子网范围,但以非公开方式使用的公共 IP 地址除外。

on_prem_network_name="on-prem-net-vpc"
on_prem_subnet_name="on-prem-subnet"
on_prem_subnet_range="10.0.3.0/24"

gcloud compute networks create "${on_prem_network_name}" \
--subnet-mode=custom

gcloud compute networks subnets create "${on_prem_subnet_name}" \
--region="${region}" \
--network="${on_prem_network_name}" \
--range="${on_prem_subnet_range}"

配置工作负载 VPC 防火墙规则

workload_vpc_firewall_name="workload-protocol-fw-vpc"
workload_port_firewall_name="workload-port-firewall-vpc"

gcloud compute firewall-rules create "${workload_vpc_firewall_name}" \
--network=${vpc_spoke_network_name} \
--allow="tcp,udp,icmp"

gcloud compute firewall-rules create "${workload_port_firewall_name}" \
--network=${vpc_spoke_network_name} \
--allow="tcp:22,tcp:3389,tcp:11180,icmp"

配置路由 VPC 和 VPC 防火墙规则

routing_vpc_fw_name="routing-vpc-protocol-fw"
routing_vpc_port_fw_name="routing-vpc--port-fw"

gcloud compute firewall-rules create "${routing_vpc_fw_name}" \
--network=${routing_vpc_network_name} \
--allow="tcp,udp,icmp"

gcloud compute firewall-rules create "${routing_vpc_port_fw_name}" \
--network=${routing_vpc_network_name} \
--allow="tcp:22,tcp:3389,tcp:11180,icmp"

配置本地 VPC 和 VPC 防火墙规则

prem_protocol_fw_name="onprem-vpc-protocol-firewall"
prem_port_firewall_name="onprem-vpc-port-firewall-prem"

gcloud compute firewall-rules create "${prem_protocol_fw_name}" \
--network=${on_prem_network_name} \
--allow="tcp,udp,icmp"

gcloud compute firewall-rules create "${prem_port_firewall_name}" \
--network=${on_prem_network_name} \
--allow="tcp:22,tcp:3389,tcp:11180,icmp"

在每个 VPC 中配置 GCE 虚拟机

您需要临时互联网访问权限才能在“vm1-vpc1-ncc”上安装软件包。

创建三个虚拟机,每个虚拟机都将分配给之前创建的某个 VPC

gcloud compute instances create vm1-vpc-workload \
--zone us-central1-a \
--subnet="${vpc_spoke_subnet_name}" \
--metadata=startup-script='#!/bin/bash
  apt-get update
  apt-get install apache2 -y
  apt-get install tcpdump -y
  service apache2 restart
  echo "
<h3>Web Server: www-vm1</h3>" | tee /var/www/html/index.html'


gcloud compute instances create vm2-vpc-routing \
--zone us-central1-a \
--subnet="${routing_vpc_subnet_name}" \
--no-address 

gcloud compute instances create vm3-onprem \
--zone us-central1-a \
--subnet="${on_prem_subnet_name}" \
--no-address 

3. 设置混合连接

在本部分中,我们将配置高可用性 VPN 隧道,在本地和路由 VPC 网络之间建立连接。

ad64a1dee6dc74c9.png

在路由 VPC 中配置具有 BGP 的 Cloud Router 路由器

routing_vpc_router_name="routing-vpc-cr"
routing_vpc_router_asn=64525

gcloud compute routers create "${routing_vpc_router_name}" \
--region="${region}" \
--network="${routing_vpc_network_name}" \
--asn="${routing_vpc_router_asn}"

在本地 VPC 中配置具有 BGP 的 Cloud Router 路由器

on_prem_router_name="on-prem-router"
on_prem_router_asn=64526

gcloud compute routers create "${on_prem_router_name}" \
--region="${region}" \
--network="${on_prem_network_name}" \
--asn="${on_prem_router_asn}"

在路由 VPC 中配置 VPN 网关

routing_vpn_gateway_name="routing-vpc-vpn-gateway"

gcloud compute vpn-gateways create "${routing_vpn_gateway_name}" \
--region="${region}" \
--network="${routing_vpc_network_name}"

在本地 VPC 中配置 VPN 网关

on_prem_gateway_name="on-prem-vpn-gateway"

gcloud compute vpn-gateways create "${on_prem_gateway_name}" \
--region="${region}" \
--network="${on_prem_network_name}"

在路由 VPC 和本地 VPC 中配置 VPN 隧道

secret_key=$(openssl rand -base64 24)
routing_vpc_tunnel_name="routing-vpc-tunnel"
on_prem_tunnel_name="on-prem-tunnel"

gcloud compute vpn-tunnels create "${routing_vpc_tunnel_name}" \
--vpn-gateway="${routing_vpn_gateway_name}" \
--peer-gcp-gateway="${on_prem_gateway_name}" \
--router="${routing_vpc_router_name}" \
--region="${region}" \
--interface=0 \
--shared-secret="${secret_key}"

gcloud compute vpn-tunnels create "${on_prem_tunnel_name}" \
--vpn-gateway="${on_prem_gateway_name}" \
--peer-gcp-gateway="${routing_vpn_gateway_name}" \
--router="${on_prem_router_name}" \
--region="${region}" \
--interface=0 \
--shared-secret="${secret_key}"

创建 BGP 会话,在路由 VPC 和本地 Cloud Router 路由器之间建立 BGP 对等互连

interface_hub_name="if-hub-to-prem"
hub_router_ip="169.254.1.1"

gcloud compute routers add-interface "${routing_vpc_router_name}" \
--interface-name="${interface_hub_name}" \
--ip-address="${hub_router_ip}" \
--mask-length=30 \
--vpn-tunnel="${routing_vpc_tunnel_name}" \
--region="${region}"

bgp_hub_name="bgp-hub-to-prem"
prem_router_ip="169.254.1.2"
gcloud compute routers add-bgp-peer "${routing_vpc_router_name}" \
--peer-name="${bgp_hub_name}" \
--peer-ip-address="${prem_router_ip}" \
--interface="${interface_hub_name}" \
--peer-asn="${on_prem_router_asn}" \
--region="${region}"

interface_prem_name="if-prem-to-hub"
gcloud compute routers add-interface "${on_prem_router_name}" \
--interface-name="${interface_prem_name}" \
--ip-address="${prem_router_ip}" \
--mask-length=30 \
--vpn-tunnel="${on_prem_tunnel_name}" \
--region="${region}"

bgp_prem_name="bgp-prem-to-hub"
gcloud compute routers add-bgp-peer "${on_prem_router_name}" \
--peer-name="${bgp_prem_name}" \
--peer-ip-address="${hub_router_ip}" \
--interface="${interface_prem_name}" \
--peer-asn="${routing_vpc_router_asn}" \
--region="${region}"

默认情况下,不会向混合 spoke 通告 NCC hub 子网。在下一步中,将 Cloud Router 路由器配置为向本地网络通告 NCC 子网路由。

gcloud compute routers update "${routing_vpc_router_name}" \
--advertisement-mode custom \
--set-advertisement-groups=all_subnets \
--set-advertisement-ranges="${vpc_spoke_subnet_ip_range}" \
--region="${region}"
gcloud compute routers update "${on_prem_router_name}" \
--advertisement-mode custom \
--set-advertisement-groups=all_subnets \
--region="${region}"

更新本地 Cloud Router 路由器的 BGP 对等互连配置,使其以 MED 值“111”来通告前缀。在后面的部分中,我们将了解 NCC 如何处理 BGP MED 值。

on_prem_router_name="on-prem-router"
bgp_prem_name="bgp-prem-to-hub"

gcloud compute routers update-bgp-peer "${on_prem_router_name}" \
--peer-name="${bgp_prem_name}" \
--advertised-route-priority="111" \
--region="${region}"

检查路由 VPC 隧道的状态

gcloud compute vpn-tunnels describe routing-vpc-tunnel \
--region=us-central1 \
--format='flattened(status,detailedStatus)'

检查路由 VPC Cloud Router 路由器的状态

使用 gcloud 命令列出路由 VPC Cloud Router 的 BGP 已知路由。

gcloud compute routers get-status routing-vpc-cr \
--region=us-central1

4. Network Connectivity Center Hub

概览

在本部分中,我们将使用 gcloud 命令配置 NCC hub。NCC hub 将充当控制平面,负责在各个 VPC spoke 之间构建路由配置。

715e7803d5c09569.png

启用 API 服务

启用 Network Connectivity API(如果尚未启用):

gcloud services enable networkconnectivity.googleapis.com

创建 NCC Hub

使用 gCloud 命令创建 NCC hub

hub_name="mesh-hub"
gcloud network-connectivity hubs create "${hub_name}"

输出示例

Create request issued for: [mesh-hub]
Waiting for operation [projects/ncc/locations/global/operations/operation-1719930559145-61c448a0426e4-2d18c8dd-7107edbe] to complete...done.               
Created hub [mesh-hub].

描述新创建的 NCC hub,并记下名称和关联的路径。

gcloud network-connectivity hubs describe mesh-hub
createTime: '2024-07-02T14:29:19.260054897Z'
exportPsc: false
name: projects/ncc/locations/global/hubs/mesh-hub
policyMode: PRESET
presetTopology: MESH
routeTables:
- projects/ncc/locations/global/hubs/mesh-hub/routeTables/default
state: ACTIVE
uniqueId: 08f9ae88-f76f-432b-92b2-357a85fc83aa
updateTime: '2024-07-02T14:29:32.583206925Z'

NCC hub 引入了一个路由表,可定义用于创建数据连接的控制平面。查找 NCC hub 的路由表名称

 gcloud network-connectivity hubs route-tables list --hub=mesh-hub
NAME     HUB       DESCRIPTION
default  mesh-hub

查找 NCC 默认路由表的 URI。

gcloud network-connectivity hubs route-tables describe default --hub=mesh-hub
createTime: '2024-07-02T14:29:22.340190411Z'
name: projects/ncc/locations/global/hubs/mesh-hub/routeTables/default
state: ACTIVE
uid: fa2af78b-d416-41aa-b442-b8ebdf84f799

列出 NCC hub 默认路由表的内容。注意* 在定义 NCC 混合 spoke 或 VPC spoke 之前,NCC hub 的路由表将为空。

gcloud network-connectivity hubs route-tables routes list --hub=mesh-hub --route_table=default

NCC hub 的路由表应为空。

5. 具有混合 spoke 和 VPC spoke 的 NCC

概览

在本部分中,您将使用 gCloud 命令配置两个 NCC spoke。一个是 VPC spoke,另一个是混合 (VPN) spoke。

647c835a25a9ceb4.png

将工作负载 VPC 配置为 NCC spoke

将工作负载 VPC 配置为 NCC spoke,并将其分配给之前创建的 NCC hub。NCC Spoke API 调用需要指定位置。使用“–global”标志后,用户在配置新的 NCC spoke 时无需指定完整的 URI 路径。

vpc_spoke_name="workload-vpc-spoke"
vpc_spoke_network_name="workload-vpc"

gcloud network-connectivity spokes linked-vpc-network create "${vpc_spoke_name}" \
--hub="${hub_name}" \
--vpc-network="${vpc_spoke_network_name}" \
--global
Create request issued for: [workload-vpc-spoke]
Waiting for operation [projects/ncc/locations/global/operations/operation-1719931097138-61c44aa15463f-90de22c7-40c10e6b] to complete...done.               
Created spoke [workload-vpc-spoke].
createTime: '2024-07-02T14:38:17.315200822Z'
group: projects/ncc/locations/global/hubs/mesh-hub/groups/default
hub: projects/ncc/locations/global/hubs/mesh-hub
linkedVpcNetwork:
  uri: https://www.googleapis.com/compute/v1/projects/ncc/global/networks/workload-vpc
name: projects/ncc/locations/global/spokes/workload-vpc-spoke
spokeType: VPC_NETWORK
state: ACTIVE
uniqueId: 33e50612-9b62-4ec7-be6c-962077fd47dc
updateTime: '2024-07-02T14:38:44.196850231Z'

将路由 VPC 中的 VPN 隧道配置为混合 spoke

使用以下 gcloud 命令,将 VPN 隧道配置为混合 spoke,以加入 mesh-hub。

vpn_spoke_name="hybrid-spoke"
routing_vpc_tunnel_name="routing-vpc-tunnel"
region="us-central1"
hub_name="mesh-hub"

gcloud network-connectivity spokes linked-vpn-tunnels create "${vpn_spoke_name}" \
--region="${region}" \
--hub="${hub_name}" \
--vpn-tunnels="${routing_vpc_tunnel_name}"

输出示例

Create request issued for: [hybrid-spoke]
Waiting for operation [projects/ncc/locations/us-central1/operations/operation-1719932916561-61c45168774be-0a06ae03-88192175] to complete...done.          
Created spoke [hybrid-spoke].

验证 mesh-hub 的 spoke 配置

使用 gcloud 命令列出 NCC hub 默认路由表的内容。

gcloud network-connectivity hubs list-spokes mesh-hub 

分析 mesh-hub 的默认路由表

使用 gcloud 命令列出 NCC hub 默认路由表的内容。

gcloud network-connectivity hubs route-tables routes list --hub=mesh-hub \
--route_table=default

与 NCC 混合 spoke 进行动态路由交换时,Cloud Router 路由器已获知的具有 BGP MED 值的前缀会在 NCC spoke 中传播。

使用以下 gcloud 命令,查看“111”的优先级值。

gcloud network-connectivity hubs route-tables routes list \
--hub=mesh-hub \
--route_table=default \
--effective-location=us-central1 \
--filter=10.0.3.0/24

6. 验证数据路径

在此步骤中,我们将验证 NCC 混合 spoke 与 VPC spoke 之间的数据路径。f266a4a762333161.png

使用以下 gcloud 命令的输出登录本地虚拟机。

gcloud compute instances list --filter="name=vm3-onprem"

登录本地网络中的虚拟机实例。

gcloud compute ssh vm3-onprem --zone=us-central1-a

在 vm3-onprem 的终端上,使用 curl 命令与 workload-vpc 中托管的虚拟机建立网络会话。

curl 10.0.1.2 -v
*   Trying 10.0.1.2:80...
* Connected to 10.0.1.2 (10.0.1.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.0.1.2
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Wed, 03 Jul 2024 15:41:34 GMT
< Server: Apache/2.4.59 (Debian)
< Last-Modified: Mon, 01 Jul 2024 20:36:16 GMT
< ETag: "1e-61c358c8272ba"
< Accept-Ranges: bytes
< Content-Length: 30
< Content-Type: text/html
< 

<h3>Web Server: www-vm1</h3>
* Connection #0 to host 10.0.1.2 left intact

7. 清理

登录 Cloud Shell 并删除 GCP 资源。

删除 NCC spoke

gcloud network-connectivity spokes delete workload-vpc-spoke --global \
--quiet

gcloud network-connectivity spokes delete hybrid-spoke \
--quiet \
--region us-central1

删除 NCC Hub

gcloud network-connectivity hubs delete mesh-hub --quiet

删除防火墙规则

gcloud compute firewall-rules delete onprem-vpc-port-firewall-prem onprem-vpc-protocol-firewall routing-vpc--port-fw routing-vpc-protocol-fw workload-port-firewall-vpc workload-protocol-fw-vpc --quiet

删除高可用性 VPN 隧道

gcloud compute vpn-tunnels delete on-prem-tunnel \
--region=us-central1 \
--quiet 

gcloud compute vpn-tunnels delete routing-vpc-tunnel \
--region=us-central1 \
--quiet 

删除 VPN 网关

gcloud compute vpn-gateways delete on-prem-vpn-gateway \
--region=us-central1 --quiet

gcloud compute vpn-gateways delete routing-vpc-vpn-gateway \
--region us-central1 --quiet

删除 Cloud Router

gcloud compute routers delete routing-vpc-cr --region us-central1 --quiet

gcloud compute routers delete on-prem-router --region us-central1 --quiet

删除 GCE 实例

gcloud compute instances delete vm1-vpc-workload \
--zone=us-central1-a \
--quiet


gcloud compute instances delete vm2-vpc-routing \
--zone=us-central1-a \
--quiet

gcloud compute instances delete vm3-onprem \
--zone=us-central1-a \
--quiet

删除 VPC 子网

gcloud compute networks subnets delete workload-subnet --region us-central1 --quiet

gcloud compute networks subnets delete on-prem-subnet --region us-central1 --quiet

gcloud compute networks subnets delete routing-vpc-subnet --region us-central1 --quiet

删除 VPC

gcloud compute networks delete on-prem-net-vpcworkload-vpc routing-vpc 
--quiet 

8. 恭喜!

您已完成“动态路由交换 Network Connectivity Center”实验!

所学内容

  • 使用 Network Connectivity Center 进行动态路由交换

后续步骤

©Google LLC 或其关联公司。保留所有权利。请勿分发。