本文档适用于运行 GKE on Bare Metal 的应用所有者和平台管理员。本文档介绍如何创建和使用虚拟网络,以便为使用 GDC 上的虚拟机运行时的虚拟机工作负载提供支持。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- GKE on Bare Metal 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本集群的访问权限。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用适用于 Bare Metal 的 GDCV 或参阅集群创建概览。 - 作为
kubectl
的插件安装的virtctl
客户端工具。如果需要,请安装 virtctl 客户端工具。
虚拟网络概览
网络是使用自定义资源创建的。您可以在创建集群后随时创建网络。如果主机接口和 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 服务器的网络,请完成以下步骤:
在您选择的编辑器中创建
Network
清单,例如use-dhcp-network.yaml
:nano use-dhcp-network.yaml
复制并粘贴以下 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 配置。
在编辑器中保存并关闭
Network
清单。使用
kubectl
创建网络:kubectl apply -f use-dhcp-network.yaml
手动定义网络设置
GDC 上的虚拟机运行时不提供 DHCP 服务器。您必须手动指定虚拟机的 IP 地址或配置使用外部 DHCP 服务器。如果您手动指定 IP 地址,则必须定义 DNS、路由和默认网关的网络设置。
如需为虚拟机创建具有手动指定的网络设置的网络,请完成以下步骤:
在您选择的编辑器中创建
Network
清单,例如manual-network.yaml
:nano manual-network.yaml
复制并粘贴以下 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 地址。
在编辑器中保存并关闭
Network
清单。使用
kubectl
创建网络:kubectl apply -f manual-network.yaml
使用 VLAN ID
创建虚拟网络时,您可以定义标记的 VLAN。这些 VLAN 分配可帮助您根据工作负载要求和隔离需求隔离网络流量。在 AnthosManaged
网络中,集群有权在每个节点上创建和删除 VLAN 接口。
如需创建定义 VLAN 分配的网络,请完成以下步骤:
在您选择的编辑器中创建
Network
清单,例如vlan-network.yaml
:nano vlan-network.yaml
复制并粘贴以下 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
,如下一部分所示。
- 在此模式下,集群有权在每个节点上创建和删除 VLAN 接口,例如
- 网络启用了外部 DHCP。外部 DHCP 服务器负责连接到此网络的工作负载的 IPv4 地址分配、路由、网关和 DNS 配置。
在编辑器中保存并关闭
Network
清单。使用
kubectl
创建网络:kubectl apply -f vlan-network.yaml
创建用户管理的网络
与上述示例中 Anthos 管理的网络不同,在以下示例虚拟网络中,网络由用户管理。在用户管理的网络中,您负责创建或删除主机上的 VLAN 接口。
如需在用户管理模式下创建网络并手动定义 VLAN 接口配置,请完成以下步骤:
在您选择的编辑器中创建
Network
清单,例如user-managed-network.yaml
:nano user-managed-network.yaml
复制并粘贴以下 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
。您必须在创建网络之前或删除网络之后,在每个节点上创建或删除 VLANVLAN_ID
接口。 - 网络启用了外部 DHCP。外部 DHCP 服务器负责连接到此网络的工作负载的 IPv4 地址分配、路由、网关和 DNS 配置。
在编辑器中保存并关闭
Network
清单。使用
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
参数和值。
- 如果该网络配置为允许使用外部 DHCP 服务器,则虚拟机会自动获取 IP 地址分配。如果您需要定义静态 IP 地址,请添加可选的
清单
要使用 YAML 清单创建虚拟机,请完成以下步骤:
在您选择的编辑器中创建
VirtualMachine
清单,例如my-vm.yaml
:nano my-vm.yaml
复制并粘贴以下 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
清单中移除此字段。
- 如果您的网络配置为允许使用外部 DHCP 服务器,请从
名为
VM_NAME-boot-dv
的启动磁盘必须已存在。如需了解详情,请参阅创建虚拟机启动磁盘。在编辑器中保存并关闭
VirtualMachine
清单。使用
kubectl
创建虚拟机:kubectl apply -f my-vm.yaml