12. 网络引导

预计完成时间:240 分钟

可操作组件的所有者:PNET

技能配置文件:部署工程师

本页列出了引导网络和配置交换机的步骤。

网络系统包含以下组件:

  • 管理网络:带外管理网络,包括以下两种类型的交换机:

    • 管理交换机
    • 管理聚合开关
  • 数据平面网络:用于传输用户流量的网络,包括以下三种类型的交换机:

    • 架顶式 (TOR) 交换机
    • 汇总开关
    • 边界叶交换机

如果交换机上的当前固件不是预期版本,网络引导加载程序会尝试将交换机升级到 Google Distributed Cloud (GDC) 隔离版本的预期交换机操作系统版本。

12.1. 准备工作

交换机可能随附出厂默认设置。在开始之前,请重置所有开关以移除任何现有配置。为此,请使用串行控制台进行连接,然后运行以下命令:

write erase

移除现有开关配置后,重新加载开关:

reload in 5

12.2. 网络安装

请按以下步骤完成网络安装:

  1. 开启所有交换机。
  2. 在引导机器上使用 sudo root 访问权限启动网络引导加载程序:

    gdcloud system network install --config PATH_TO_CELLCFG --upgrade-switch-os
    

    PATH_TO_CELLCFG 替换为 cellcfg 文件的路径。

    1. 如果此命令失败,并显示以下错误消息:

      root@bootstrapper:~/hams/gdc/output/cellcfg# gdcloud system network install --config /root/hams/gdc/output/cellcfg --upgrade-switch-os
      Error: failed to initialize KIND: could not determine harbor address (no match between local and docker hostnames): could not find a match
      
    2. 再次运行 init 命令以解决此错误:

      gdcloud system network init --config PATH_TO_CELLCFG
      
  3. 保持开关处于开启状态。交换机通过 PowerOn Auto Provisioning (POAP) 启动序列从引导机器远程自动安装自身。

  4. 监控引导加载程序日志,确保交换机按以下顺序启动:

    1. 管理开关 1
    2. 其他管理交换机和管理聚合交换机。
    3. 数据网络开关。
  5. 继续监控引导日志。完成上述步骤后,开关会连接。引导加载程序通过 API 在管理交换机和数据交换机上安装其他配置。

  6. 等待引导日志显示消息 Successfully bootstrapped all switches.

12.3. 引导详情

使用 POAP 启动序列来引导网络中的所有交换机,如下所示:

  1. 将引导机器连接到管理交换机。
  2. 将管理聚合交换机连接到管理交换机。
  3. 连接同一机架中的其余交换机。
  4. 将管理聚合交换机连接到另一个机架。
  5. 连接所有其他交换机。

引导机器使用 ./cellcfg 路径中的交换机 YAML 文件生成交换机配置。所有交换机都使用 PowerOn Auto Provisioning (POAP) 启动序列来接收其配置。在硬件 3.0 中,网络交换机接收包含其最终配置的 POAP 文件。交换机完成 POAP 后,会自动重新启动。

重启后,开关必须与 ./cellcfg 路径中开关的 YAML 文件保持一致。引导机器会向所有交换机发送请求,以确保交换机连接和配置成功。

12.4. 引导后路由配置

在网络引导过程之后,配置引导加载程序的路由,以便为即将到来的引导任务做好准备。

12.4.1. 查找数据平面网关

数据平面网关是数据平面网络的网关 IP 地址。设置网关 IP 地址,以便与数据层面网络中的其他服务进行通信。

如需查找数据平面网关 IP 地址,请按以下步骤操作:

  1. cellcfg 文件夹中,找到 kub-ipam.yaml 文件。
  2. 查找名为 control-plane-subnetSubnetClaim 资源:

    yq eval -r '
    select(.kind == "SubnetClaim" and .metadata.name == "control-plane-subnet") |
    .spec.ipv4Spec.staticReservedIpRanges[] |
    select(.type == "GatewayReservation") |
    .ipRange.startIPAddress
    ' PATH_TO_KUB_IPAM_FILE
    

    PATH_TO_KUB_IPAM_FILE 替换为 cellcfg/kub-ipam.yaml 文件的路径。

  3. spec.ipv4Spec 部分中找到列为 type: GatewayReservation 的网关 IP 地址。例如,数据平面接口的网关 IP 地址为 172.19.0.1

    # Source: kub-ipam-assets/templates/subnet_claims.yaml
    apiVersion: system.private.gdc.goog/v1alpha1
    kind: SubnetClaim
    metadata:
      name: control-plane-subnet
      namespace: root
      labels:
        subnetclaims.system.private.gdc.goog/usage: "server"
      annotations:
        lcm.private.gdc.goog/claim-by-force: "true"
        helm.sh/resource-policy: keep
    spec:
      category: ExternalOverlayNetwork
      overlayNetwork: External
      cidrClaimName: control-plane-cidr
      ipv4Spec:
        staticReservedIpRanges:
          - ipRange:
              size: 1
              startIPAddress: 172.19.0.1
            type: GatewayReservation
    

12.4.2. 在引导加载程序上为路由创建脚本

创建脚本以创建路线:

bash << 'EOF'
#!/bin/bash

SCRIPT_PATH="/usr/local/sbin/add-routes.sh"
SERVICE_PATH="/usr/lib/systemd/system/add-routes.service"
MGMT_GATEWAY=MGMT_GATEWAY
MGMT_CIDR=MGMT_CIDR
MGMT_INTERFACE=MGMT_INTERFACE
BOND_GATEWAY=DATA_GATEWAY

rm -rf "$SCRIPT_PATH" 2>/dev/null
touch "$SCRIPT_PATH"
rm -rf "$SERVICE_PATH" 2>/dev/null
touch "$SERVICE_PATH"

echo -e '#!/bin/bash\n' > "$SCRIPT_PATH"
echo "ip route del $MGMT_CIDR via $MGMT_GATEWAY dev $MGMT_INTERFACE proto static" >> "$SCRIPT_PATH"
echo "ip route add $MGMT_CIDR via $MGMT_GATEWAY dev $MGMT_INTERFACE proto static" >> "$SCRIPT_PATH"
echo "ip route del default via $BOND_GATEWAY dev bond0 proto static" >> "$SCRIPT_PATH"
echo "ip route add default via $BOND_GATEWAY dev bond0 proto static" >> "$SCRIPT_PATH"

chmod +x "$SCRIPT_PATH"

echo -e "[Unit]\nDescription=Add Routes Service\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=/usr/local/sbin/add-routes.sh\n\n[Install]\nWantedBy=default.target" > "$SERVICE_PATH"

systemctl daemon-reload
systemctl enable add-routes.service
systemctl restart add-routes.service

echo -e "\n ### add-routes.sh script file path ###"
ls -l $SCRIPT_PATH
echo -e "\n ### add-routes.service file path ###"
ls -l $SERVICE_PATH
echo -e "\n ### add-routes.service status ###"
systemctl status add-routes.service
echo -e "\n ### Show if add-routes.service is enabled at boot ###"
systemctl is-enabled add-routes.service
echo -e "\n ### Show the just added route to ens15f0 ###"
ip route show | grep ens15f0
echo -e "\n ### Show the just added default route  ###"
ip route show | grep default
EOF

替换以下内容:

此代码段会创建 systemd 服务和脚本,如下所示:

SCRIPT_PATH="/usr/local/sbin/add-routes.sh
SERVICE_PATH="/usr/lib/systemd/system/add-routes.service

systemd 服务需要在重启系统后保持路由不变。添加的路线包括:

  • 通过 bond0 接口连接到数据网络的默认路由。
  • 通过管理接口到达管理网络的路由。

12.5. 建立多地区连接

如果 GDC 实例要加入现有的多可用区宇宙,请按照配置多可用区互连中的步骤,为每个可用区建立现有可用区与当前部署可用区之间的网络连接。

12.6. 问题排查

如需排查网络引导问题,请参阅网络引导问题排查

12.7. 潜在问题

预加载版本低于 9.3.10 的网络交换机可能无法启动。

如需了解详情,请参阅已知问题