在 GDC 上为虚拟机运行时创建和使用虚拟网络

本文档适用于运行 GKE on Bare Metal 的应用所有者和平台管理员。本文档介绍如何创建和使用虚拟网络,以便为使用 GDC 上的虚拟机运行时的虚拟机工作负载提供支持。

准备工作

要完成本文档,您需要拥有以下资源的访问权限:

虚拟网络概览

网络是使用自定义资源创建的。您可以在创建集群后随时创建网络。如果主机接口和 VLAN ID 分配的网络设置已定义,创建网络后便无法更改。

网络删除受到某些条件的约束。例如,网络控制器会拒绝删除正在被任何资源(例如虚拟机或网络接口)使用的网络。

网络定义可以包括网关、路由和 DNS 信息。您还可以启用外部 DHCP 服务器的使用。这些网络设置可以是静态或动态分配的,具体取决于某些网络配置选项的定义方式。

默认 Pod 网络

系统默认为每个集群创建一个 pod-network。此网络无法更改。系统会自动填充 Pod CIDR 和服务 CIDR 的路由和 DNS 配置。DNS 配置使用与集群相同的值。

pod-network 可以供需要接口来访问集群的 Pod 网络并且不需要任何特定配置选项的工作负载使用。即使默认网关不在 pod-network 接口上,pod-network 的路由也始终配置为确保工作负载可以访问集群和服务。

使用此默认的 pod-network 时,您无需执行额外步骤即可在 GDC 上测试虚拟机运行时。我们的许多文档都使用此默认 pod-network 来降低示例的复杂性。虚拟机工作负载的需求决定了此默认 pod-network 是否足够,或者您是否需要创建和使用自己的虚拟网络。

以下 YAML 清单显示了 pod-network 的示例配置。路由、DNS 和接口名称的值已由集群填充:

  ​​apiVersion: networking.gke.io/v1
  kind: Network
  metadata:
    name: pod-network
  spec:
    routes:
    - to: 192.168.0.0/16
    - to: 10.96.0.0/12
    dnsConfig:
      nameservers:
      - 10.96.0.10

创建和使用虚拟网络

为支持生产工作负载,请创建支持所需功能的网络,例如使用外部 DHCP 服务器或 VLAN ID。这些网络可为虚拟机提供第 2 层 (L2) 连接。

使用外部 DHCP 服务器

GDC 上的虚拟机运行时不提供 DHCP 服务器。您必须手动指定虚拟机的 IP 地址或配置使用外部 DHCP 服务器。启用外部 DHCP 服务器的使用时,如果 DNS 和网关设置由 DHCP 提供,则您可以跳过它们的设置。

如需创建使用外部 DHCP 服务器的网络,请完成以下步骤:

  1. 在您选择的编辑器中创建 Network 清单,例如 use-dhcp-network.yaml

    nano use-dhcp-network.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: NETWORK_NAME
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: INTERFACE_NAME
      externalDHCP4: true
    

    替换以下值:

    • NETWORK_NAME:您的网络的名称。
    • INTERFACE_NAME:要将网络连接到的 GKE on Bare Metal 节点上的接口名称。指定节点上要使用的物理接口的名称。集群中的所有节点都应具有相同的接口名称。

    在此 Network 清单中,设置了以下值:

    • type 设置为 L2。使用此设置时,工作负载只具有此网络的第 2 层连接。这是您可以在 GDC 上的虚拟机运行时内创建的唯一网络 type
    • externalDHCP4 设置为 true。此设置会为网络启用外部 DHCP。外部 DHCP 服务器负责连接到此网络的工作负载的 IPv4 地址分配、路由、网关和 DNS 配置。
  3. 在编辑器中保存并关闭 Network 清单。

  4. 使用 kubectl 创建网络:

    kubectl apply -f use-dhcp-network.yaml
    

手动定义网络设置

GDC 上的虚拟机运行时不提供 DHCP 服务器。您必须手动指定虚拟机的 IP 地址或配置使用外部 DHCP 服务器。如果您手动指定 IP 地址,则必须定义 DNS、路由和默认网关的网络设置。

如需为虚拟机创建具有手动指定的网络设置的网络,请完成以下步骤:

  1. 在您选择的编辑器中创建 Network 清单,例如 manual-network.yaml

    nano manual-network.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: NETWORK_NAME
    spec:
      type: L2
      nodeInterfaceMatcher:
        interfaceName: INTERFACE_NAME
      routes:
      - to: "ROUTE_ADDRESS"
      gateway4: GATEWAY_ADDRESS
      dnsConfig:
        nameservers:
        - NAMESERVER_ADDRESS
    

    替换以下值:

    • NETWORK_NAME:您的网络的名称。
    • INTERFACE_NAME:要将网络连接到的 GKE on Bare Metal 节点上的接口名称。指定节点上要使用的物理接口的名称。集群中的所有节点都应具有相同的接口名称。
    • ROUTE_ADDRESS:要在连接到此网络的每个虚拟机上配置的可选路由(CIDR 表示法)。
    • GATEWAY_ADDRESS:虚拟机要使用的网关 IP 地址。
    • NAMESERVER_ADDRESS:供虚拟机使用的一个或多个 DNS 域名服务器 IP 地址。
  3. 在编辑器中保存并关闭 Network 清单。

  4. 使用 kubectl 创建网络:

    kubectl apply -f manual-network.yaml
    

使用 VLAN ID

创建虚拟网络时,您可以定义标记的 VLAN。这些 VLAN 分配可帮助您根据工作负载要求和隔离需求隔离网络流量。在 AnthosManaged 网络中,集群有权在每个节点上创建和删除 VLAN 接口。

如需创建定义 VLAN 分配的网络,请完成以下步骤:

  1. 在您选择的编辑器中创建 Network 清单,例如 vlan-network.yaml

    nano vlan-network.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: NETWORK_NAME
    spec:
      type: L2
      networkLifecycle: AnthosManaged
      l2NetworkConfig:
        vlanID: VLAN_ID
      nodeInterfaceMatcher:
        interfaceName: INTERFACE_NAME
      externalDHCP4: true
    

    替换以下值:

    • NETWORK_NAME:您的网络的名称。
    • INTERFACE_NAME:要将网络连接到的 GKE on Bare Metal 节点上的接口名称。指定节点上要使用的物理接口的名称。集群中的所有节点都应具有相同的接口名称。
    • VLAN_ID:要为其标记流量的 VLAN ID。

    在此 Network 清单中,设置了以下值:

    • 工作负载只能具有此网络的 L2 连接。
    • 网络为 AnthosManaged。如果未指定,则此设置是默认生命周期。
      • 在此模式下,集群有权在每个节点上创建和删除 VLAN 接口,例如 INTERFACE_NAME.VLAN_ID
      • 如果您要或已经在节点上创建 VLAN 接口,请将 networkLifecycle 值设置为 UserManaged,如下一部分所示。
    • 网络启用了外部 DHCP。外部 DHCP 服务器负责连接到此网络的工作负载的 IPv4 地址分配、路由、网关和 DNS 配置。
  3. 在编辑器中保存并关闭 Network 清单。

  4. 使用 kubectl 创建网络:

    kubectl apply -f vlan-network.yaml
    

创建用户管理的网络

与上述示例中 Anthos 管理的网络不同,在以下示例虚拟网络中,网络由用户管理。在用户管理的网络中,您负责创建或删除主机上的 VLAN 接口。

如需在用户管理模式下创建网络并手动定义 VLAN 接口配置,请完成以下步骤:

  1. 在您选择的编辑器中创建 Network 清单,例如 user-managed-network.yaml

    nano user-managed-network.yaml
    
  2. 复制并粘贴以下 YAML 定义:

    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: NETWORK_NAME
    spec:
      type: L2
      networkLifecycle: UserManaged
      l2NetworkConfig:
        vlanID: VLAN_ID
      nodeInterfaceMatcher:
        interfaceName: INTERFACE_NAME
      externalDHCP4: true
    

    替换以下值:

    • NETWORK_NAME:您的网络的名称。
    • INTERFACE_NAME:要将网络连接到的主机接口。
    • VLAN_ID:要为其标记流量的 VLAN ID。

    在此 Network 清单中,设置了以下值:

    • 工作负载只能具有此网络的 L2 连接。
    • 网络为 UserManaged。您必须在创建网络之前或删除网络之后,在每个节点上创建或删除 VLAN VLAN_ID 接口。
    • 网络启用了外部 DHCP。外部 DHCP 服务器负责连接到此网络的工作负载的 IPv4 地址分配、路由、网关和 DNS 配置。
  3. 在编辑器中保存并关闭 Network 清单。

  4. 使用 kubectl 创建网络:

    kubectl apply -f user-managed-network.yaml
    

将虚拟机连接到网络

虚拟机的网络设置(例如 DNS 和 DHCP)可以是静态或动态分配的,具体取决于某些网络配置选项的定义方式:

  • 如果您在虚拟机上配置静态 IP 地址,则任何查询都不会发送到 DHCP 服务器。有关配置网关和路由的其他信息必须来自网络资源。
  • 如果您未在虚拟机上配置静态 IP 地址,则查询将发送到 DHCP 服务器。虚拟机会从 DHCP 服务器获取所有信息,并忽略您在网络资源中定义的任何配置。
  • 如果网络资源中外部 DHCP 未设置为 true,您必须为虚拟机配置静态 IP 地址。所有其他信息均来自您在网络资源中定义的配置。

要创建连接到网络的虚拟机,请完成以下步骤:

CLI

  • 要使用 kubectl 创建虚拟机,请完成以下步骤:

    kubectl virt create vm VM_NAME \
      --image ubuntu20.04 \
      --network NETWORK_NAME
    

    替换以下值:

    • VM_NAME:您的虚拟机的名称。
    • NETWORK_NAME:要连接到的网络的名称。
      • 如果该网络配置为允许使用外部 DHCP 服务器,则虚拟机会自动获取 IP 地址分配。如果您需要定义静态 IP 地址,请添加可选的 --ip IP_ADDRESS 参数和值。

清单

要使用 YAML 清单创建虚拟机,请完成以下步骤:

  1. 在您选择的编辑器中创建 VirtualMachine 清单,例如 my-vm.yaml

    nano my-vm.yaml
    
  2. 复制并粘贴以下 YAML 清单:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: NETWORK_NAME
          ipAddresses:
            - IP_ADDRESS
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
    

    在此 YAML 清单中,定义以下设置:

    • VM_NAME:您的虚拟机的名称。
    • NETWORK_NAME:要连接到的网络的名称。
    • IP_ADDRESS:要分配给虚拟机的 IP 地址(CIDR 表示法),例如 192.0.2.10/24
      • 如果您的网络配置为允许使用外部 DHCP 服务器,请从 VirtualMachine 清单中移除此字段。

    名为 VM_NAME-boot-dv 的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘

  3. 在编辑器中保存并关闭 VirtualMachine 清单。

  4. 使用 kubectl 创建虚拟机:

    kubectl apply -f my-vm.yaml
    

后续步骤