10.18. 虚拟机网络
10.18.1. 为默认 pod 网络配置虚拟机
您可以通过将其网络接口配置为使用 masquerade
绑定模式,将虚拟机连接到默认的内部 pod 网络。
附加到默认 pod 网络的虚拟网络接口卡 (vNIC) 上的流量在实时迁移过程中中断。
10.18.1.1. 从命令行配置伪装模式
您可以使用伪装模式将虚拟机的外发流量隐藏在 pod IP 地址后。伪装模式使用网络地址转换 (NAT) 来通过 Linux 网桥将虚拟机连接至 pod 网络后端。
启用伪装模式,并通过编辑虚拟机配置文件让流量进入虚拟机。
先决条件
- 虚拟机必须配置为使用 DHCP 来获取 IPv4 地址。以下示例配置为使用 DHCP。
流程
编辑虚拟机配置文件的
interfaces
规格:kind: VirtualMachine spec: domain: devices: interfaces: - name: default masquerade: {} 1 ports: 2 - port: 80 networks: - name: default pod: {}
注意端口 49152 和 49153 保留供 libvirt 平台使用,这些端口的所有其他传入流量将被丢弃。
创建虚拟机:
$ oc create -f <vm-name>.yaml
10.18.1.2. 使用双栈(IPv4 和 IPv6)配置伪装模式
您可以使用 cloud-init 将新虚拟机配置为在默认 pod 网络上同时使用 IPv6 和 IPv4。
虚拟机实例配置中的 Network.pod.vmIPv6NetworkCIDR
字段决定虚拟机的静态 IPv6 地址和网关 IP 地址。virt-launcher Pod 使用它们将 IPv6 流量路由到虚拟机,而不在外部使用。Network.pod.vmIPv6NetworkCIDR
字段在无类别域间路由(CIDR)标记中指定一个 IPv6 地址块。默认值为 fd10:0:2::2/120
。您可以根据网络要求编辑这个值。
当虚拟机运行时,虚拟机的传入和传出流量将路由到 IPv4 地址和 virt-launcher Pod 的唯一 IPv6 地址。virt-launcher pod 随后将 IPv4 流量路由到虚拟机的 DHCP 地址,并将 IPv6 流量路由到虚拟机的静态设置 IPv6 地址。
先决条件
- OpenShift Container Platform 集群必须使用为双栈配置的 OVN-Kubernetes Container Network Interface (CNI) 网络插件。
流程
在新的虚拟机配置中,包含具有
masquerade
的接口,并使用 cloud-init 配置 IPv6 地址和默认网关。apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: example-vm-ipv6 # ... interfaces: - name: default masquerade: {} 1 ports: - port: 80 2 networks: - name: default pod: {} volumes: - cloudInitNoCloud: networkData: | version: 2 ethernets: eth0: dhcp4: true addresses: [ fd10:0:2::2/120 ] 3 gateway6: fd10:0:2::1 4
在命名空间中创建虚拟机:
$ oc create -f example-vm-ipv6.yaml
验证
- 要验证 IPv6 是否已配置,启动虚拟机并查看虚拟机实例的接口状态,以确保它具有 IPv6 地址:
$ oc get vmi <vmi-name> -o jsonpath="{.status.interfaces[*].ipAddresses}"
10.18.1.3. 关于巨型帧支持
使用 OVN-Kubernetes CNI 插件时,您可以在默认 pod 网络上连接的两个虚拟机 (VM) 之间发送未分片的巨型帧数据包。巨型帧有一个大于 1500 字节的最大传输单元 (MTU) 值。
虚拟机自动获得集群网络的 MTU 值,由集群管理员设置,如下所示:
-
libvirt
:如果客户机操作系统具有 VirtIO 驱动程序的最新版本,该驱动程序可通过模拟设备中的 Peripheral Component Interconnect (PCI) 配置寄存器来解释传入的数据。 - DHCP :如果客户机 DHCP 客户端可以从 DHCP 服务器响应中读取 MTU 值。
对于没有 VirtIO 驱动程序的 Windows 虚拟机,您必须使用 netsh
或类似的工具手动设置 MTU。这是因为 Windows DHCP 客户端没有读取 MTU 值。
其他资源
10.18.2. 创建服务以公开虚拟机
您可以使用 Service
对象在集群内或集群外部公开虚拟机。
10.18.2.1. 关于服务
一个 Kubernetes 服务 向在一组 pod 上运行的应用程序公开客户端访问。服务提供了抽象、负载均衡功能,在 NodePort 和 LoadBalancer 的情况下用于向外部公开。
服务可以在 web 控制台的 VirtualMachine details Service
对象中指定 spec.type
:
- ClusterIP
-
在内部 IP 地址上公开服务,并将 DNS 名称公开给集群中的其他应用程序。单个服务可映射到多个虚拟机。当客户端尝试连接到服务时,客户端请求会在可用后端之间平衡负载。
ClusterIP
是默认服务类型
。 - NodePort
-
在集群中每个所选节点的同一端口上公开该服务。
NodePort
使服务可从集群外部访问。 - LoadBalancer
- 在当前云中创建外部负载均衡器(如果支持),并为该服务分配固定的外部 IP 地址。
对于内部集群,您可以通过部署 MetalLB Operator 来配置负载均衡服务。
10.18.2.1.1. 双栈支持
如果为集群启用了 IPv4 和 IPv6 双栈网络,您可以通过定义 Service
对象中的 spec.ipFamilyPolicy
和 spec.ipFamilies
字段来创建使用 IPv4、IPv6 或两者的服务。
spec.ipFamilyPolicy
字段可以设置为以下值之一:
- SingleStack
- control plane 根据配置的第一个服务集群 IP 范围为该服务分配集群 IP 地址。
- PreferDualStack
- control plane 为配置了双栈的集群中的服务分配 IPv4 和 IPv6 集群 IP 地址。
- RequireDualStack
-
对于没有启用双栈网络的集群,这个选项会失败。对于配置了双栈的集群,其行为与将值设置为
PreferDualStack
时相同。control plane 从 IPv4 和 IPv6 地址范围分配集群 IP 地址。
您可以通过将 spec.ipFamilies
字段设置为以下数组值之一来定义用于单堆栈的 IP 系列,或者定义双栈 IP 系列的顺序:
-
[IPv4]
-
[IPv6]
-
[IPv4, IPv6]
-
[IPv6, IPv4]
10.18.2.2. 将虚拟机作为服务公开
创建 ClusterIP
、NodePort
或 LoadBalancer
服务,以便从集群内部或外部连接到正在运行的虚拟机 (VM)。
流程
编辑
VirtualMachine
清单,为创建服务添加标签:apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: vm-ephemeral namespace: example-namespace spec: running: false template: metadata: labels: special: key 1 # ...
- 1
- 在
spec.template.metadata.labels
部分添加标签special: key
。
注意虚拟机上的标签会传递到 pod。
special: key
标签必须与Service
清单的spec.selector
属性中的标签匹配。-
保存
VirtualMachine
清单文件以应用更改。 创建
Service
清单以公开虚拟机:apiVersion: v1 kind: Service metadata: name: vmservice 1 namespace: example-namespace 2 spec: externalTrafficPolicy: Cluster 3 ports: - nodePort: 30000 4 port: 27017 protocol: TCP targetPort: 22 5 selector: special: key 6 type: NodePort 7
- 1
Service
对象的名称。- 2
Service
对象所在的命名空间。这必须与VirtualMachine
清单的metadata.namespace
字段匹配。- 3
- 可选:指定节点如何分发在外部 IP 地址上接收的服务流量。这只适用于
NodePort
和LoadBalancer
服务类型。默认值为Cluster
,它将流量平均路由到所有集群端点。 - 4
- 可选:设置后,
nodePort
值必须在所有服务间是唯一的。如果没有指定,则会动态分配以上30000
范围中的值。 - 5
- 可选:由服务公开的虚拟机端口。如果虚拟机清单中定义了端口列表,则必须引用打开端口。如果没有指定
targetPort
,它将采用与port
相同的值。 - 6
- 对您在
VirtualMachine
清单的spec.template.metadata.labels
小节中添加的标签的引用。 - 7
- 服务的类型。可能的值有
ClusterIP
、NodePort
和LoadBalancer
。
-
保存
Service
清单文件。 运行以下命令来创建服务:
$ oc create -f <service_name>.yaml
- 启动虚拟机。如果虚拟机已在运行,重启它。
验证
查询
Service
对象以验证它是否可用:$ oc get service -n example-namespace
ClusterIP
服务的输出示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vmservice ClusterIP 172.30.3.149 <none> 27017/TCP 2m
NodePort
服务的输出示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vmservice NodePort 172.30.232.73 <none> 27017:30000/TCP 5m
LoadBalancer
服务的输出示例NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vmservice LoadBalancer 172.30.27.5 172.29.10.235,172.29.10.235 27017:31829/TCP 5s
选择连接到虚拟机的适当方法:
对于
ClusterIP
服务,使用服务 IP 地址和服务端口从集群内部连接到虚拟机。例如:$ ssh fedora@172.30.3.149 -p 27017
对于
NodePort
服务,通过指定节点 IP 地址和集群网络之外的节点端口来连接到虚拟机。例如:$ ssh fedora@$NODE_IP -p 30000
-
对于
LoadBalancer
服务,使用vinagre
客户端使用公共 IP 地址和端口连接到虚拟机。外部端口是动态分配的。
10.18.2.3. 其他资源
10.18.3. 将虚拟机连接到 Linux 网桥网络
默认情况下,OpenShift Virtualization 安装了一个内部 pod 网络。
您必须创建一个 Linux 网桥网络附加定义(NAD)以连接到额外网络。
将虚拟机附加到额外网络:
- 创建 Linux 网桥节点网络配置策略。
- 创建 Linux 网桥网络附加定义。
- 配置虚拟机,使虚拟机能够识别网络附加定义。
有关调度、接口类型和其他节点网络活动的更多信息,请参阅节点网络部分。
10.18.3.1. 通过网络附加定义连接到网络
10.18.3.1.1. 创建 Linux 网桥节点网络配置策略
使用 NodeNetworkConfigurationPolicy
清单 YAML 文件来创建 Linux 网桥。
先决条件
- 已安装 Kubernetes NMState Operator。
流程
创建
NodeNetworkConfigurationPolicy
清单。本例包含示例值,您必须替换为您自己的信息。apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: br1-eth1-policy 1 spec: desiredState: interfaces: - name: br1 2 description: Linux bridge with eth1 as a port 3 type: linux-bridge 4 state: up 5 ipv4: enabled: false 6 bridge: options: stp: enabled: false 7 port: - name: eth1 8
10.18.3.2. 创建 Linux 网桥网络附加定义
不支持在虚拟机的网络附加定义中配置 IP 地址管理(IPAM)。
10.18.3.2.1. 在 web 控制台中创建 Linux 网桥网络附加定义
您可以创建网络附加定义,为 pod 和虚拟机提供第 2 层网络。
Linux 网桥网络附加定义是将虚拟机连接至 VLAN 的最有效方法。
流程
-
在 Web 控制台中,点 Networking
NetworkAttachmentDefinitions。 点 Create Network Attachment Definition。
注意网络附加定义必须与 pod 或虚拟机位于同一个命名空间中。
- 输入唯一 Name 和可选 Description。
- 从 Network Type 列表中选择 CNV Linux 网桥。
- 在 Bridge Name 字段输入网桥名称。
- 可选:如果资源配置了 VLAN ID,请在 VLAN Tag Number 字段中输入 ID 号。
- 可选: 选择 MAC Spoof Check 来启用 MAC spoof 过滤。此功能只允许单个 MAC 地址退出 pod,从而可以防止使用 MAC 欺骗进行的安全攻击。
- 点 Create。
10.18.3.2.2. 在 CLI 中创建 Linux 网桥网络附加定义
作为网络管理员,您可以配置 cnv-bridge
类型的网络附加定义,为 Pod 和虚拟机提供第 2 层网络。
先决条件
-
节点必须支持 nftables,必须部署
nft
二进制文件才能启用 MAC 欺骗检查。
流程
- 在与虚拟机相同的命名空间中创建网络附加定义。
在网络附加定义中添加虚拟机,如下例所示:
apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: <bridge-network> 1 annotations: k8s.v1.cni.cncf.io/resourceName: bridge.network.kubevirt.io/<bridge-interface> 2 spec: config: '{ "cniVersion": "0.3.1", "name": "<bridge-network>", 3 "type": "cnv-bridge", 4 "bridge": "<bridge-interface>", 5 "macspoofchk": true, 6 "vlan": 100, 7 "preserveDefaultVlan": false 8 }'
- 1
NetworkAttachmentDefinition
对象的名称。- 2
- 可选:为节点选择注解键值对,其中
bridge-interface
必须与某些节点上配置的桥接名称匹配。如果在网络附加定义中添加此注解,您的虚拟机实例将仅在连接bridge-interface
网桥的节点中运行。 - 3
- 配置的名称。建议您将配置名称与网络附加定义的
name
值匹配。 - 4
- 为这个网络附加定义的 Container Network Interface(CNI)插件的实际名称。不要更改此字段,除非要使用不同的 CNI。
- 5
- 节点上配置的 Linux 网桥名称。
- 6
- 可选:启用 MAC 欺骗检查。当设置为
true
时,您无法更改 pod 或客户机接口的 MAC 地址。此属性仅允许单个 MAC 地址退出容器集,从而防止 MAC 欺骗攻击。 - 7
- 可选: VLAN 标签。节点网络配置策略不需要额外的 VLAN 配置。
- 8
- 可选:指示虚拟机是否通过默认 VLAN 连接到网桥。默认值为
true
。
注意Linux 网桥网络附加定义是将虚拟机连接至 VLAN 的最有效方法。
创建网络附加定义:
$ oc create -f <network-attachment-definition.yaml> 1
- 1
- 其中
<network-attachment-definition.yaml>
是网络附加定义清单的文件名。
验证
运行以下命令验证网络附加定义是否已创建:
$ oc get network-attachment-definition <bridge-network>
10.18.3.3. 为 Linux 网桥网络配置虚拟机
10.18.3.3.1. 在 web 控制台中为虚拟机创建 NIC
从 web 控制台创建并附加额外 NIC。
先决条件
- 网络附加定义必须可用。
流程
-
在 OpenShift Container Platform 控制台的正确项目中,从侧边菜单中点 Virtualization
VirtualMachines。 - 选择虚拟机以打开 VirtualMachine 详情页面。
- 点 Configuration → Network Interface 查看已附加到虚拟机的 NIC。
- 点 Add Network Interface 在列表中创建新插槽。
- 从 Network 列表中选择额外网络的网络附加定义。
- 填写新 NIC 的 Name、Model、Type 和 MAC Address。
- 点 Save 保存并附加 NIC 到虚拟机。
10.18.3.3.2. 网络字段
名称 | 描述 |
---|---|
Name | 网络接口控制器的名称。 |
model | 指明网络接口控制器的型号。支持的值有 e1000e 和 virtio。 |
网络 | 可用网络附加定义的列表。 |
类型 | 可用绑定方法列表。选择适合网络接口的绑定方法:
|
MAC 地址 | 网络接口控制器的 MAC 地址。如果没有指定 MAC 地址,则会自动分配一个。 |
10.18.3.3.3. 在 CLI 中将虚拟机附加到额外网络
通过添加桥接接口并在虚拟机配置中指定网络附加定义,将虚拟机附加到额外网络。
此流程使用 YAML 文件来演示编辑配置,并将更新的文件应用到集群。您还可以使用 oc edit <object> <name>
命令编辑现有虚拟机。
先决条件
- 在编辑配置前关闭虚拟机。如果编辑正在运行的虚拟机,您必须重启虚拟机才能使更改生效。
流程
- 创建或编辑您要连接到桥接网络的虚拟机的配置。
将网桥接口添加到
spec.template.spec.domain.devices.interfaces
列表中,把网络附加定义添加到spec.template.spec.networks
列表中。这个示例添加了名为bridge-net
的桥接接口,它连接到a-bridge-network
网络附加定义:apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: <example-vm> spec: template: spec: domain: devices: interfaces: - masquerade: {} name: <default> - bridge: {} name: <bridge-net> 1 # ... networks: - name: <default> pod: {} - name: <bridge-net> 2 multus: networkName: <network-namespace>/<a-bridge-network> 3 # ...
应用配置:
$ oc apply -f <example-vm.yaml>
- 可选:如果编辑了正在运行的虚拟机,您必须重启它才能使更改生效。
10.18.3.4. 后续步骤
10.18.4. 将虚拟机连接到 SR-IOV 网络
您可以通过执行以下步骤将虚拟机 (VM) 连接到单根 I/O 虚拟化 (SR-IOV) 网络:
- 配置 SR-IOV 网络设备。
- 配置 SR-IOV 网络。
- 将虚拟机连接到 SR-IOV 网络。
10.18.4.1. 先决条件
10.18.4.2. 配置 SR-IOV 网络设备
SR-IOV Network Operator 把 SriovNetworkNodePolicy.sriovnetwork.openshift.io
CRD 添加到 OpenShift Container Platform。您可以通过创建一个 SriovNetworkNodePolicy 自定义资源 (CR) 来配置 SR-IOV 网络设备。
在应用由 SriovNetworkNodePolicy
对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。
它可能需要几分钟时间来应用配置更改。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 SR-IOV Network Operator。
- 集群中有足够的可用节点,用于处理从排空节点中驱除的工作负载。
- 您还没有为 SR-IOV 网络设备配置选择任何 control plane 节点。
流程
创建一个
SriovNetworkNodePolicy
对象,然后在<name>-sriov-node-network.yaml
文件中保存 YAML。使用配置的实际名称替换<name>
。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: <name> 1 namespace: openshift-sriov-network-operator 2 spec: resourceName: <sriov_resource_name> 3 nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" 4 priority: <priority> 5 mtu: <mtu> 6 numVfs: <num> 7 nicSelector: 8 vendor: "<vendor_code>" 9 deviceID: "<device_id>" 10 pfNames: ["<pf_name>", ...] 11 rootDevices: ["<pci_bus_id>", "..."] 12 deviceType: vfio-pci 13 isRdma: false 14
- 1
- 为 CR 对象指定一个名称。
- 2
- 指定 SR-IOV Operator 安装到的命名空间。
- 3
- 指定 SR-IOV 设备插件的资源名称。您可以为一个资源名称创建多个
SriovNetworkNodePolicy
对象。 - 4
- 指定节点选择器来选择要配置哪些节点。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV Container Network Interface(CNI)插件和设备插件仅在所选节点上部署。
- 5
- 可选:指定一个
0
到99
之间的整数。较小的数值具有较高的优先权,优先级10
高于优先级99
。默认值为99
。 - 6
- 可选:为虚拟功能(VF)的最大传输单位 (MTU) 指定一个值。最大 MTU 值可能因不同的 NIC 型号而有所不同。
- 7
- 为 SR-IOV 物理网络设备指定要创建的虚拟功能 (VF) 的数量。对于 Intel 网络接口控制器(NIC),VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过
127
。 - 8
nicSelector
映射为 Operator 选择要配置的以太网设备。您不需要为所有参数指定值。建议您以足够的准确度来识别以太网适配器,以便尽量减小意外选择其他以太网设备的可能性。如果指定了rootDevices
,则必须同时为vendor
、deviceID
或pfNames
指定一个值。如果同时指定了pfNames
和rootDevices
,请确保它们指向同一个设备。- 9
- 可选:指定 SR-IOV 网络设备的厂商十六进制代码。允许的值只能是
8086
或15b3
。 - 10
- 可选:指定 SR-IOV 网络设备的设备十六进制代码。允许的值只能是
158b
、1015
、1017
。 - 11
- 可选:参数接受包括以太网设备的一个或多个物理功能 (PF) 的数组。
- 12
- 参数接受一个包括一个或多个 PCI 总线地址,用于以太网设备的物理功能的数组。使用以下格式提供地址:
0000:02:00.1
。 - 13
- OpenShift Virtualization 中的虚拟功能需要
vfio-pci
驱动程序类型。 - 14
- 可选:指定是否启用远程直接访问(RDMA)模式。对于 Mellanox 卡,请将
isRdma
设置为false
。默认值为false
。
注意如果将
RDMA
标记设定为true
,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。-
可选:将 SR-IOV 功能的集群节点标记为
SriovNetworkNodePolicy.Spec.NodeSelector
(如果它们还没有标记)。有关标记节点的更多信息,请参阅"了解如何更新节点上的标签"。 创建
SriovNetworkNodePolicy
对象:$ oc create -f <name>-sriov-node-network.yaml
其中
<name>
指定这个配置的名称。在应用配置更新后,
sriov-network-operator
命名空间中的所有 Pod 都会变为Running
状态。要验证是否已配置了 SR-IOV 网络设备,请输入以下命令。将
<node_name>
替换为带有您刚才配置的 SR-IOV 网络设备的节点名称。$ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'
10.18.4.3. 配置 SR-IOV 额外网络
您可以通过创建一个 SriovNetwork
对象来配置使用 SR-IOV 硬件的额外网络。
创建 SriovNetwork
对象时,SR-IOV Network Operator 会自动创建一个 NetworkAttachmentDefinition
对象。
如果一个 SriovNetwork
对象已被附加到状态为 running
的 Pod 或虚拟机上,则不能修改或删除它。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
-
创建以下
SriovNetwork
对象,然后在<name>-sriov-network.yaml
文件中保存 YAML。用这个额外网络的名称替换<name>
。
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: <name> 1 namespace: openshift-sriov-network-operator 2 spec: resourceName: <sriov_resource_name> 3 networkNamespace: <target_namespace> 4 vlan: <vlan> 5 spoofChk: "<spoof_check>" 6 linkState: <link_state> 7 maxTxRate: <max_tx_rate> 8 minTxRate: <min_rx_rate> 9 vlanQoS: <vlan_qos> 10 trust: "<trust_vf>" 11 capabilities: <capabilities> 12
- 1
- 将
<name>
替换为对象的名称。SR-IOV Network Operator 创建一个名称相同的NetworkAttachmentDefinition
对象。 - 2
- 指定 SR-IOV Network Operator 安装到的命名空间。
- 3
- 将
<sriov_resource_name>
替换为来自为这个额外网络定义 SR-IOV 硬件的SriovNetworkNodePolicy
对象的.spec.resourceName
参数的值。 - 4
- 将
<target_namespace>
替换为 SriovNetwork 的目标命名空间。只有目标命名空间中的 pod 或虚拟机可以附加到 SriovNetwork。 - 5
- 可选:使用额外网络的虚拟 LAN (VLAN) ID 替换
<vlan>
。它需要是一个从0
到4095
范围内的一个整数值。默认值为0
。 - 6
- 可选:将
<spoof_check>
替换为 VF 的 spoof 检查模式。允许的值是字符串"on"
和"off"
。重要指定的值必须由引号包括,否则 SR-IOV Network Operator 将拒绝 CR。
- 7
- 可选:将
<link_state>
替换为 Virtual Function (VF) 的链接状态。允许的值是enable
、disable
和auto
。 - 8
- 可选:将
<max_tx_rate>
替换为 VF 的最大传输率(以 Mbps 为单位)。 - 9
- 可选:将
<min_tx_rate>
替换为 VF 的最小传输率(以 Mbps 为单位)。这个值应该总是小于或等于最大传输率。注意Intel NIC 不支持
minTxRate
参数。如需更多信息,请参阅 BZ#1772847。 - 10
- 可选:将
<vlan_qos>
替换为 VF 的 IEEE 802.1p 优先级级别。默认值为0
。 - 11
- 可选:将
<trust_vf>
替换为 VF 的信任模式。允许的值是字符串"on"
和"off"
。重要指定的值必须由引号包括,否则 SR-IOV Network Operator 将拒绝 CR。
- 12
- 可选:将
<capabilities>
替换为为这个网络配置的功能。
运行以下命令来创建对象。用这个额外网络的名称替换
<name>
。$ oc create -f <name>-sriov-network.yaml
可选: 要确认与您在上一步中创建的
SriovNetwork
对象关联的NetworkAttachmentDefinition
对象是否存在,请输入以下命令。将<namespace>
替换为您在SriovNetwork
对象中指定的命名空间。$ oc get net-attach-def -n <namespace>
10.18.4.4. 将虚拟机连接到 SR-IOV 网络
您可以通过在虚拟机配置中包含网络详情将虚拟机 (VM) 连接到 SR-IOV 网络。
流程
在虚拟机配置的
spec.domain.devices.interfaces
和spec.networks
中包含 SR-IOV 网络详情:kind: VirtualMachine # ... spec: domain: devices: interfaces: - name: <default> 1 masquerade: {} 2 - name: <nic1> 3 sriov: {} networks: - name: <default> 4 pod: {} - name: <nic1> 5 multus: networkName: <sriov-network> 6 # ...
应用虚拟机配置:
$ oc apply -f <vm-sriov.yaml> 1
- 1
- 虚拟机 YAML 文件的名称。
10.18.4.5. 为 DPDK 工作负载配置集群
您可以使用以下步骤配置 OpenShift Container Platform 集群来运行 Data Plane Development Kit (DPDK) 工作负载。
为 DPDK 工作负载配置集群只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
先决条件
-
您可以使用具有
cluster-admin
权限的用户访问集群。 -
已安装 OpenShift CLI(
oc
)。 - 已安装 SR-IOV Network Operator。
- 已安装 Node Tuning Operator。
流程
- 映射计算节点拓扑,以确定为 DPDK 应用程序隔离哪些非统一内存访问 (NUMA) CPU,以及为操作系统 (OS) 保留哪些非一致性内存访问 (NUMA) CPU。
使用自定义角色标记计算节点的子集,例如
worker-dpdk
:$ oc label node <node_name> node-role.kubernetes.io/worker-dpdk=""
创建一个新的
MachineConfigPool
清单,其中包含spec.machineConfigSelector
对象中的worker-dpdk
标签:MachineConfigPool
清单示例apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-dpdk labels: machineconfiguration.openshift.io/role: worker-dpdk spec: machineConfigSelector: matchExpressions: - key: machineconfiguration.openshift.io/role operator: In values: - worker - worker-dpdk nodeSelector: matchLabels: node-role.kubernetes.io/worker-dpdk: ""
创建一个
PerformanceProfile
清单,它应用到标记的节点以及您在上一步中创建的机器配置池。性能配置集指定为 DPDK 应用程序隔离的 CPU,以及用于保留保留而保留的 CPU。PerformanceProfile
清单示例apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: profile-1 spec: cpu: isolated: 4-39,44-79 reserved: 0-3,40-43 hugepages: defaultHugepagesSize: 1G pages: - count: 32 node: 0 size: 1G net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/worker-dpdk: "" numa: topologyPolicy: single-numa-node
注意应用
MachineConfigPool
和PerformanceProfile
清单后,计算节点会自动重启。从
PerformanceProfile
对象的status.runtimeClass
字段检索生成的RuntimeClass
资源的名称:$ oc get performanceprofiles.performance.openshift.io profile-1 -o=jsonpath='{.status.runtimeClass}{"\n"}'
通过在
HyperConverged
自定义资源 (CR)中添加以下注解,将之前获取的RuntimeClass
名称设置为virt-launcher
pod 的默认容器运行时类:$ oc annotate --overwrite -n openshift-cnv hco kubevirt-hyperconverged \ kubevirt.kubevirt.io/jsonpatch='[{"op": "add", "path": "/spec/configuration/defaultRuntimeClass", "value": <runtimeclass_name>}]'
注意将注解添加到
HyperConverged
CR 会更改一个全局设置,该设置会影响应用注解后创建的所有虚拟机。设置此注解会破坏 OpenShift Virtualization 实例的支持,且必须仅在测试集群中使用。为获得最佳性能,适用于支持例外。创建一个
SriovNetworkNodePolicy
对象,并将spec.deviceType
字段设置为vfio-pci
:SriovNetworkNodePolicy
清单示例apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: policy-1 namespace: openshift-sriov-network-operator spec: resourceName: intel_nics_dpdk deviceType: vfio-pci mtu: 9000 numVfs: 4 priority: 99 nicSelector: vendor: "8086" deviceID: "1572" pfNames: - eno3 rootDevices: - "0000:19:00.2" nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true"
10.18.4.6. 为 DPDK 工作负载配置项目
您可以将项目配置为在 SR-IOV 硬件中运行 DPDK 工作负载。
先决条件
- 集群被配置为运行 DPDK 工作负载。
流程
为您的 DPDK 应用程序创建一个命名空间:
$ oc create ns dpdk-checkup-ns
创建一个
SriovNetwork
对象来引用SriovNetworkNodePolicy
对象。创建SriovNetwork
对象时,SR-IOV Network Operator 会自动创建一个NetworkAttachmentDefinition
对象。SriovNetwork
清单示例apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: dpdk-sriovnetwork namespace: openshift-sriov-network-operator spec: ipam: | { "type": "host-local", "subnet": "10.56.217.0/24", "rangeStart": "10.56.217.171", "rangeEnd": "10.56.217.181", "routes": [{ "dst": "0.0.0.0/0" }], "gateway": "10.56.217.1" } networkNamespace: dpdk-checkup-ns 1 resourceName: intel_nics_dpdk 2 spoofChk: "off" trust: "on" vlan: 1019
- 可选:运行虚拟机延迟检查以验证网络是否已正确配置。
- 可选:运行 DPDK 检查,以验证命名空间是否已准备好 DPDK 工作负载。
10.18.4.7. 为 DPDK 工作负载配置虚拟机
您可以在虚拟机 (VM) 上运行 Data Packet Development Kit (DPDK) 工作负载,以实现较低延迟和更高的吞吐量,以便在用户空间中更快地处理数据包。DPDK 使用 SR-IOV 网络进行基于硬件的 I/O 共享。
先决条件
- 集群被配置为运行 DPDK 工作负载。
- 您已创建并配置了运行虚拟机的项目。
流程
编辑
VirtualMachine
清单,使其包含 SR-IOV 网络接口、CPU 拓扑、CRI-O 注解和巨页的信息:VirtualMachine
清单示例apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: rhel-dpdk-vm spec: running: true template: metadata: annotations: cpu-load-balancing.crio.io: disable 1 cpu-quota.crio.io: disable 2 irq-load-balancing.crio.io: disable 3 spec: domain: cpu: sockets: 1 4 cores: 5 5 threads: 2 dedicatedCpuPlacement: true isolateEmulatorThread: true interfaces: - masquerade: {} name: default - model: virtio name: nic-east pciAddress: '0000:07:00.0' sriov: {} networkInterfaceMultiqueue: true rng: {} memory: hugepages: pageSize: 1Gi 6 guest: 8Gi networks: - name: default pod: {} - multus: networkName: dpdk-net 7 name: nic-east # ...
- 1
- 此注解指定为容器使用的 CPU 禁用负载均衡。
- 2
- 此注解指定容器使用的 CPU 配额被禁用。
- 3
- 此注解指定,容器使用的 CPU 禁用中断请求 (IRQ) 负载均衡。
- 4
- 虚拟机中的插槽数。此字段必须设置为
1
,才能从相同的 Non-Uniform Memory Access (NUMA) 节点调度 CPU。 - 5
- 虚拟机中的内核数。这必须大于或等于
1
。在本例中,虚拟机被调度有 5 个超线程或 10 个 CPU。 - 6
- 巨页的大小。x86-64 构架的可能值为 1Gi 和 2Mi。在这个示例中,请求大小为 1Gi 的 8 个巨页。
- 7
- SR-IOV
NetworkAttachmentDefinition
对象的名称。
- 保存并退出编辑器。
应用
VirtualMachine
清单:$ oc apply -f <file_name>.yaml
配置客户机操作系统。以下示例显示了 RHEL 8 OS 的配置步骤:
使用 GRUB 引导装载程序命令行界面配置巨页。在以下示例中,指定了 8 个 1G 巨页。
$ grubby --update-kernel=ALL --args="default_hugepagesz=1GB hugepagesz=1G hugepages=8"
要使用 TuneD 应用程序中的
cpu-partitioning
配置集来实现低延迟性能优化,请运行以下命令:$ dnf install -y tuned-profiles-cpu-partitioning
$ echo isolated_cores=2-9 > /etc/tuned/cpu-partitioning-variables.conf
前两个 CPU (0 和 1) 被设置,用于保存任务,其余则隔离 DPDK 应用程序。
$ tuned-adm profile cpu-partitioning
使用
driverctl
设备驱动程序控制工具覆盖 SR-IOV NIC 驱动程序:$ dnf install -y driverctl
$ driverctl set-override 0000:07:00.0 vfio-pci
- 重启虚拟机以应用更改。
10.18.4.8. 后续步骤
10.18.5. 将虚拟机连接到服务网格
OpenShift Virtualization 现在与 OpenShift Service Mesh 集成。您可以使用 IPv4 监控、视觉化和控制在默认 pod 网络上运行虚拟机工作负载的 pod 之间的流量。
10.18.5.1. 先决条件
- 您必须已安装了 Service Mesh Operator 并部署了服务网格 control plane。
- 您必须已将创建虚拟机的命名空间添加到 服务网格 member roll 中。
-
您必须将
masquerade
绑定方法用于默认 pod 网络。
10.18.5.2. 为服务网格配置虚拟机
要将虚拟机 (VM) 工作负载添加到服务网格中,请在虚拟机配置文件中启用自动 sidecar 注入,方法是将 sidecar.istio.io/inject
注解设置为 true
。然后,将虚拟机公开为服务,以便在网格中查看应用程序。
先决条件
- 为了避免端口冲突,请不要使用 Istio sidecar 代理使用的端口。它们包括 15000、15001、15006、15008、15020、15021 和 15090。
流程
编辑虚拟机配置文件以添加
sidecar.istio.io/inject: "true"
注解。配置文件示例
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: labels: kubevirt.io/vm: vm-istio name: vm-istio spec: runStrategy: Always template: metadata: labels: kubevirt.io/vm: vm-istio app: vm-istio 1 annotations: sidecar.istio.io/inject: "true" 2 spec: domain: devices: interfaces: - name: default masquerade: {} 3 disks: - disk: bus: virtio name: containerdisk - disk: bus: virtio name: cloudinitdisk resources: requests: memory: 1024M networks: - name: default pod: {} terminationGracePeriodSeconds: 180 volumes: - containerDisk: image: registry:5000/kubevirt/fedora-cloud-container-disk-demo:devel name: containerdisk
应用 VM 配置:
$ oc apply -f <vm_name>.yaml 1
- 1
- 虚拟机 YAML 文件的名称。
创建一个
Service
对象,将虚拟机公开给服务网格。apiVersion: v1 kind: Service metadata: name: vm-istio spec: selector: app: vm-istio 1 ports: - port: 8080 name: http protocol: TCP
- 1
- 服务选择器,决定服务的目标 pod 集合。此属性对应于虚拟机配置文件中的
spec.metadata.labels
字段。在上例中,名为vm-istio
的Service
对象在任何带有标签app=vm-istio
的 pod 上都以 TCP 端口 8080 为目标。
创建服务:
$ oc create -f <service_name>.yaml 1
- 1
- 服务 YAML 文件的名称。
10.18.6. 为虚拟机配置 IP 地址
您可以为虚拟机配置静态和动态 IP 地址。
10.18.6.1. 使用 cloud-init 为新虚拟机配置 IP 地址
在创建虚拟机时,您可以使用 cloud-init 配置二级 NIC 的 IP 地址。IP 地址可以动态部署,也可以静态置备。
如果虚拟机连接到 pod 网络,pod 网络接口是默认路由,除非您更新它。
先决条件
- 虚拟机连接到第二个网络。
- 在二级网络上有一个 DHCP 服务器,用于为虚拟机配置动态 IP。
流程
编辑虚拟机配置的
spec.template.spec.volumes.cloudInitNoCloud.networkData
小节:要配置动态 IP 地址,请指定接口名称并启用 DHCP:
kind: VirtualMachine spec: # ... template: # ... spec: volumes: - cloudInitNoCloud: networkData: | version: 2 ethernets: eth1: 1 dhcp4: true
- 1
- 指定接口名称。
要配置静态 IP,请指定接口名称和 IP 地址:
kind: VirtualMachine spec: # ... template: # ... spec: volumes: - cloudInitNoCloud: networkData: | version: 2 ethernets: eth1: 1 addresses: - 10.10.10.14/24 2
10.18.7. 在虚拟机上查看 NIC 的 IP 地址
您可以使用 Web 控制台或 oc
客户端查看网络接口控制器 (NIC) 的 IP 地址。QEMU 客户机代理显示有关虚拟机辅助网络的附加信息。
10.18.7.1. 先决条件
- 在虚拟机上安装 QEMU 客户机代理。
10.18.7.2. 在 CLI 中查看虚拟机接口的 IP 地址
oc describe vmi <vmi_name>
命令中包含网络接口配置。
您还可通过在虚拟机上运行 ip addr
或通过运行 oc get vmi <vmi_name> -o yaml
来查看 IP 地址信息。
流程
使用
oc describe
命令来显示虚拟机接口配置:$ oc describe vmi <vmi_name>
输出示例
# ... Interfaces: Interface Name: eth0 Ip Address: 10.244.0.37/24 Ip Addresses: 10.244.0.37/24 fe80::858:aff:fef4:25/64 Mac: 0a:58:0a:f4:00:25 Name: default Interface Name: v2 Ip Address: 1.1.1.7/24 Ip Addresses: 1.1.1.7/24 fe80::f4d9:70ff:fe13:9089/64 Mac: f6:d9:70:13:90:89 Interface Name: v1 Ip Address: 1.1.1.1/24 Ip Addresses: 1.1.1.1/24 1.1.1.2/24 1.1.1.4/24 2001:de7:0:f101::1/64 2001:db8:0:f101::1/64 fe80::1420:84ff:fe10:17aa/64 Mac: 16:20:84:10:17:aa
10.18.7.3. 在 web 控制台中查看虚拟机接口的 IP 地址
IP 信息显示在虚拟机的 VirtualMachine Details 页面中。
流程
-
在 OpenShift Container Platform 控制台中,从侧边菜单中点 Virtualization
VirtualMachines。 - 选择虚拟机名称以打开 VirtualMachine 详情页。
每个附加 NIC 的信息会显示在 Details 标签页中的 IP Address 下。
10.18.8. 使用集群域名访问二级网络上的虚拟机
您可以使用集群的完全限定域名 (FQDN) 从集群外部访问附加到二级网络接口的虚拟机 (VM)。
使用集群 FQDN 访问虚拟机只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
10.18.8.1. 为二级网络配置 DNS 服务器
当您在 HyperConverged
自定义资源 (CR)中启用 KubeSecondaryDNS
功能门时,Cluster Network Addons Operator (CNAO) 部署域名服务器 (DNS) 服务器和监控组件。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用
cluster-admin
权限访问 OpenShift Container Platform 集群。
流程
使用 MetalLB 或其他负载均衡器创建
LoadBalancer
服务,以在集群外公开 DNS 服务器。该服务侦听端口 53,目标端口 5353。例如:$ oc expose -n openshift-cnv deployment/secondary-dns --name=dns-lb --type=LoadBalancer --port=53 --target-port=5353 --protocol='UDP'
通过查询
Service
对象来检索服务的公共 IP 地址:$ oc get service -n openshift-cnv
输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dns-lb LoadBalancer 172.30.27.5 10.46.41.94 53:31829/TCP 5s
通过编辑
HyperConverged
CR 部署 DNS 服务器和监控组件:apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: featureGates: deployKubeSecondaryDNS: true 1 kubeSecondaryDNSNameServerIP: "10.46.41.94" 2 # ...
使用以下命令,检索 OpenShift Container Platform 集群的 FQDN:
$ oc get dnses.config.openshift.io cluster -o json | jq .spec.baseDomain
输出示例
openshift.example.com
使用以下方法之一指向 DNS 服务器:
将
kubeSecondaryDNSNameServerIP
值添加到本地机器的resolv.conf
文件中。注意编辑
resolv.conf
文件会覆盖任何现有的 DNS 设置。将
kubeSecondaryDNSNameServerIP
值和集群 FQDN 添加到企业 DNS 服务器记录中。例如:vm.<FQDN>. IN NS ns.vm.<FQDN>.
ns.vm.<FQDN>. IN A 10.46.41.94
10.18.8.2. 使用集群 FQDN 连接到二级网络上的虚拟机
您可以使用集群的完全限定域名 (FQDN) 从集群外部访问附加到二级网络接口的虚拟机 (VM)。
先决条件
- QEMU 客户机代理必须在虚拟机上运行。
- 要使用 DNS 客户端(您要使用 DNS 客户端)要连接的虚拟机的 IP 地址必须是公共的。
- 您已为二级网络配置 DNS 服务器。
- 您已获取集群的完全限定域名 (FQDN)。
流程
使用以下命令检索虚拟机配置:
$ oc get vm -n <namespace> <vm_name> -o yaml
输出示例
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: labels: kubevirt.io/vm: example-vm name: example-vm namespace: example-namespace spec: running: true template: metadata: labels: kubevirt.io/vm: example-vm spec: domain: devices: # ... interfaces: - bridge: {} name: example-nic # ... networks: - multus: networkName: bridge-conf name: example-nic 1 # ...
- 1
- 指定二级网络接口的名称。
使用
ssh
命令连接到虚拟机:$ ssh <user_name>@<interface_name>.<vm_name>.<namespace>.vm.<FQDN> 1
- 1
- 指定用户名、接口名称、虚拟机名称、虚拟机名称、虚拟机名称和 FQDN。
Example
$ ssh you@example-nic.example-vm.example-namespace.vm.openshift.example.com
10.18.8.3. 其他资源
10.18.9. 为虚拟机使用 MAC 地址池
KubeMacPool 组件为命名空间中的虚拟机 NIC 提供 MAC 地址池服务。
10.18.9.1. 关于 KubeMacPool
KubeMacPool 为每个命名空间提供一个 MAC 地址池,并从池中为虚拟机 NIC 分配 MAC 地址。这样可确保为 NIC 分配一 个唯一的 MAC 地址,该地址与另一个虚拟机的 MAC 地址不会有冲突。
从该虚拟机创建的虚拟机实例会在重启后保留分配的 MAC 地址。
KubeMacPool 不处理独立于虚拟机创建的虚拟机实例。
安装 OpenShift Virtualization 时, KubeMacPool 会被默认启用。您可以通过将 mutatevirtualmachines.kubemacpool.io=ignore
标签添加到命名空间来在命名空间中禁用一个 MAC 地址池。通过删除标签为命名空间重新启用 KubeMacPool。
10.18.9.2. 在 CLI 中为命名空间禁用 MAC 地址池
通过将 mutatevirtualmachines.kubemacpool.io=ignore
标签添加到命名空间来禁用命名空间中虚拟机的 MAC 地址池。
流程
将
mutatevirtualmachines.kubemacpool.io=ignore
标签添加到命名空间。以下示例为<namespace1>
和<namespace2>
这两个命名空间禁用 KubeMacPool:$ oc label namespace <namespace1> <namespace2> mutatevirtualmachines.kubemacpool.io=ignore
10.18.9.3. 在 CLI 中为命名空间重新启用 MAC 地址池
如果您为命名空间禁用 KubeMacPool 并希望重新启用它,请从命名空间中删除 mutatevirtualmachines.kubemacpool.io=ignore
标签。
早期版本的 OpenShift Virtualization 使用标签 mutatevirtualmachines.kubemacpool.io=allocate
为命名空间启用 KubeMacPool。这仍然被支持,但是冗余的,因为 KubeMacPool 现在被默认启用。
流程
从命名空间中删除 KubeMacPool 标签。以下示例为
<namespace1>
和<namespace2>
这两个命名空间重新启用 KubeMacPool:$ oc label namespace <namespace1> <namespace2> mutatevirtualmachines.kubemacpool.io-