10.21. 虚拟机网络
10.21.1. 为默认 pod 网络配置虚拟机
您可以通过将其网络接口配置为使用 masquerade
绑定模式,将虚拟机连接到默认的内部 pod 网络
附加到默认 pod 网络的虚拟网络接口卡 (vNIC) 上的流量在实时迁移过程中中断。
10.21.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.21.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.21.2. 创建服务以公开虚拟机
您可以使用 Service
对象在集群内或集群外部公开虚拟机。
10.21.2.1. 关于服务
一个 Kubernetes 服务是一个抽象的方式,用于公开在一组 pod 上运行的应用程序作为网络服务。服务允许您的应用程序接收流量。通过在 Service
对象中指定 spec.type
,可以使用不同的方式公开服务:
- ClusterIP
-
在集群中的内部 IP 地址上公开服务。
ClusterIP
是默认服务类型
。 - NodePort
-
在集群中每个所选节点的同一端口上公开该服务。
NodePort
使服务可从集群外部访问。 - LoadBalancer
在当前云中创建外部负载均衡器(如果支持),并为该服务分配固定的外部 IP 地址。
注意对于内部集群,您可以通过部署 MetalLB Operator 来配置负载均衡服务。
10.21.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.21.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.21.2.3. 其他资源
10.21.3. 将虚拟机连接到 Linux 网桥网络
默认情况下,OpenShift Virtualization 安装了一个内部 pod 网络。
您必须创建一个 Linux 网桥网络附加定义(NAD)以连接到额外网络。
将虚拟机附加到额外网络:
- 创建 Linux 网桥节点网络配置策略。
- 创建 Linux 网桥网络附加定义。
- 配置虚拟机,使虚拟机能够识别网络附加定义。
有关调度、接口类型和其他节点网络活动的更多信息,请参阅节点网络部分。
10.21.3.1. 通过网络附加定义连接到网络
10.21.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.21.3.2. 创建 Linux 网桥网络附加定义
不支持在虚拟机的网络附加定义中配置 IP 地址管理(IPAM)。
10.21.3.2.1. 在 web 控制台中创建 Linux 网桥网络附加定义
网络管理员可创建网络附加定义,为 Pod 和虚拟机提供第 2 层网络。
流程
-
在 Web 控制台中,点击 Networking
Network Attachment Definitions。 点 Create Network Attachment Definition。
注意网络附加定义必须与 pod 或虚拟机位于同一个命名空间中。
- 输入唯一 Name 和可选 Description。
- 点击 Network Type 列表并选择 CNV Linux bridge。
- 在 Bridge Name 字段输入网桥名称。
- 可选:如果资源配置了 VLAN ID,请在 VLAN Tag Number 字段中输入 ID 号。
- 可选: 选择 MAC Spoof Check 来启用 MAC spoof 过滤。此功能只允许单个 MAC 地址退出 pod,从而可以防止使用 MAC 欺骗进行的安全攻击。
点 Create。
注意Linux 网桥网络附加定义是将虚拟机连接至 VLAN 的最有效方法。
10.21.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.21.3.3. 为 Linux 网桥网络配置虚拟机
10.21.3.3.1. 在 web 控制台中为虚拟机创建 NIC
从 web 控制台创建并附加额外 NIC。
先决条件
- 网络附加定义必须可用。
流程
-
在 OpenShift Container Platform 控制台的正确项目中,从侧边菜单中点 Virtualization
VirtualMachines。 - 选择虚拟机以打开 VirtualMachine 详情页面。
- 点 Network Interfaces 选项卡查看已附加到虚拟机的 NIC。
- 点 Add Network Interface 在列表中创建新插槽。
- 从 Network 列表中选择额外网络的网络附加定义。
- 填写新 NIC 的 Name、Model、Type 和 MAC Address。
- 点 Save 保存并附加 NIC 到虚拟机。
10.21.3.3.2. 网络字段
名称 | 描述 |
---|---|
Name | 网络接口控制器的名称。 |
model | 指明网络接口控制器的型号。支持的值有 e1000e 和 virtio。 |
网络 | 可用网络附加定义的列表。 |
类型 | 可用绑定方法列表。选择适合网络接口的绑定方法:
|
MAC 地址 | 网络接口控制器的 MAC 地址。如果没有指定 MAC 地址,则会自动分配一个。 |
10.21.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.21.4. 将虚拟机连接到 SR-IOV 网络
您可以通过执行以下步骤将虚拟机 (VM) 连接到单根 I/O 虚拟化 (SR-IOV) 网络:
- 配置 SR-IOV 网络设备。
- 配置 SR-IOV 网络。
- 将虚拟机连接到 SR-IOV 网络。
10.21.4.1. 先决条件
10.21.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.21.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.21.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.21.5. 将虚拟机连接到服务网格
OpenShift Virtualization 现在与 OpenShift Service Mesh 集成。您可以使用 IPv4 监控、视觉化和控制在默认 pod 网络上运行虚拟机工作负载的 pod 之间的流量。
10.21.5.1. 先决条件
- 您必须已安装了 Service Mesh Operator 并部署了服务网格 control plane。
- 您必须已将创建虚拟机的命名空间添加到 服务网格 member roll 中。
-
您必须将
masquerade
绑定方法用于默认 pod 网络。
10.21.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.21.6. 为虚拟机配置 IP 地址
您可以为虚拟机配置静态和动态 IP 地址。
10.21.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.21.7. 在虚拟机上查看 NIC 的 IP 地址
您可以使用 Web 控制台或 oc
客户端查看网络接口控制器 (NIC) 的 IP 地址。QEMU 客户机代理显示有关虚拟机辅助网络的附加信息。
10.21.7.1. 先决条件
- 在虚拟机上安装 QEMU 客户机代理。
10.21.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.21.7.3. 在 web 控制台中查看虚拟机接口的 IP 地址
IP 信息显示在虚拟机的 VirtualMachine Details 页面中。
流程
-
在 OpenShift Container Platform 控制台中,从侧边菜单中点 Virtualization
VirtualMachines。 - 选择虚拟机名称以打开 VirtualMachine 详情页。
每个附加 NIC 的信息会显示在 Details 标签页中的 IP Address 下。
10.21.8. 为虚拟机使用 MAC 地址池
KubeMacPool 组件为命名空间中的虚拟机 NIC 提供 MAC 地址池服务。
10.21.8.1. 关于 KubeMacPool
KubeMacPool 为每个命名空间提供一个 MAC 地址池,并从池中为虚拟机 NIC 分配 MAC 地址。这样可确保为 NIC 分配一 个唯一的 MAC 地址,该地址与另一个虚拟机的 MAC 地址不会有冲突。
从该虚拟机创建的虚拟机实例会在重启后保留分配的 MAC 地址。
KubeMacPool 不处理独立于虚拟机创建的虚拟机实例。
安装 OpenShift Virtualization 时, KubeMacPool 会被默认启用。您可以通过将 mutatevirtualmachines.kubemacpool.io=ignore
标签添加到命名空间来在命名空间中禁用一个 MAC 地址池。通过删除标签为命名空间重新启用 KubeMacPool。
10.21.8.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.21.8.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-