以下部分提供有关如何创建和管理基于主接口的 MAC-VLAN、IP-VLAN 和 VLAN 子接口的说明和信息。
您可以创建一个基于存在于容器命名空间中的master
接口的 MAC-VLAN、IP-VLAN 或 VLAN 子接口。您也可以在单独的网络附件定义 CRD 中将master
接口作为 Pod 网络配置的一部分创建。
要使用容器命名空间master
接口,必须为NetworkAttachmentDefinition
CRD 的子接口配置中存在的linkInContainer
参数指定true
。
利用此功能的一个用例示例是基于 SR-IOV VF 创建多个 VLAN。为此,首先创建一个 SR-IOV 网络,然后为 VLAN 接口定义网络附件。
以下示例显示如何配置此图中所示的设置。
您已安装 OpenShift CLI (oc
)。
您可以作为具有cluster-admin
角色的用户访问集群。
您已安装 SR-IOV 网络操作符。
使用以下命令创建一个要部署 Pod 的专用容器命名空间
$ oc new-project test-namespace
创建 SR-IOV 节点策略
创建一个SriovNetworkNodePolicy
对象,然后将 YAML 保存到sriov-node-network-policy.yaml
文件中
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: sriovnic
namespace: openshift-sriov-network-operator
spec:
deviceType: netdevice
isRdma: false
needVhostNet: true
nicSelector:
vendor: "15b3" (1)
deviceID: "101b" (2)
rootDevices: ["00:05.0"]
numVfs: 10
priority: 99
resourceName: sriovnic
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
SR-IOV 网络节点策略配置示例,设置 |
1 | SR-IOV 网络设备的供应商十六进制代码。值15b3 与 Mellanox NIC 相关联。 |
2 | SR-IOV 网络设备的设备十六进制代码。 |
运行以下命令应用 YAML
$ oc apply -f sriov-node-network-policy.yaml
由于节点需要重新启动,因此应用此操作可能需要一些时间。 |
创建 SR-IOV 网络
为附加 SR-IOV 网络附件创建SriovNetwork
自定义资源 (CR),如以下示例 CR 中所示。将 YAML 保存为文件sriov-network-attachment.yaml
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: sriov-network
namespace: openshift-sriov-network-operator
spec:
networkNamespace: test-namespace
resourceName: sriovnic
spoofChk: "off"
trust: "on"
运行以下命令应用 YAML
$ oc apply -f sriov-network-attachment.yaml
创建 VLAN 附加网络
使用以下 YAML 示例,创建一个名为vlan100-additional-network-configuration.yaml
的文件
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: vlan-100
namespace: test-namespace
spec:
config: |
{
"cniVersion": "0.4.0",
"name": "vlan-100",
"plugins": [
{
"type": "vlan",
"master": "ext0", (1)
"mtu": 1500,
"vlanId": 100,
"linkInContainer": true, (2)
"ipam": {"type": "whereabouts", "ipRanges": [{"range": "1.1.1.0/24"}]}
}
]
}
1 | VLAN 配置需要指定master 名称。这可以在 Pod 网络注释中配置。 |
2 | 必须指定linkInContainer 参数。 |
运行以下命令应用 YAML 文件
$ oc apply -f vlan100-additional-network-configuration.yaml
使用前面指定的网络创建 Pod 定义
使用以下 YAML 示例,创建一个名为pod-a.yaml
的文件
下面的清单包含 2 个资源
|
apiVersion: v1
kind: Namespace
metadata:
name: test-namespace
labels:
pod-security.kubernetes.io/enforce: privileged
pod-security.kubernetes.io/audit: privileged
pod-security.kubernetes.io/warn: privileged
security.openshift.io/scc.podSecurityLabelSync: "false"
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: test-namespace
annotations:
k8s.v1.cni.cncf.io/networks: '[
{
"name": "sriov-network",
"namespace": "test-namespace",
"interface": "ext0" (1)
},
{
"name": "vlan-100",
"namespace": "test-namespace",
"interface": "ext0.100"
}
]'
spec:
securityContext:
runAsNonRoot: true
containers:
- name: nginx-container
image: nginxinc/nginx-unprivileged:latest
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
ports:
- containerPort: 80
seccompProfile:
type: "RuntimeDefault"
1 | 用作 VLAN 接口master 的名称。 |
运行以下命令应用 YAML 文件
$ oc apply -f pod-a.yaml
运行以下命令,获取test-namespace
命名空间内nginx-pod
的详细信息
$ oc describe pods nginx-pod -n test-namespace
Name: nginx-pod
Namespace: test-namespace
Priority: 0
Node: worker-1/10.46.186.105
Start Time: Mon, 14 Aug 2023 16:23:13 -0400
Labels: <none>
Annotations: k8s.ovn.org/pod-networks:
{"default":{"ip_addresses":["10.131.0.26/23"],"mac_address":"0a:58:0a:83:00:1a","gateway_ips":["10.131.0.1"],"routes":[{"dest":"10.128.0.0...
k8s.v1.cni.cncf.io/network-status:
[{
"name": "ovn-kubernetes",
"interface": "eth0",
"ips": [
"10.131.0.26"
],
"mac": "0a:58:0a:83:00:1a",
"default": true,
"dns": {}
},{
"name": "test-namespace/sriov-network",
"interface": "ext0",
"mac": "6e:a7:5e:3f:49:1b",
"dns": {},
"device-info": {
"type": "pci",
"version": "1.0.0",
"pci": {
"pci-address": "0000:d8:00.2"
}
}
},{
"name": "test-namespace/vlan-100",
"interface": "ext0.100",
"ips": [
"1.1.1.1"
],
"mac": "6e:a7:5e:3f:49:1b",
"dns": {}
}]
k8s.v1.cni.cncf.io/networks:
[ { "name": "sriov-network", "namespace": "test-namespace", "interface": "ext0" }, { "name": "vlan-100", "namespace": "test-namespace", "i...
openshift.io/scc: privileged
Status: Running
IP: 10.131.0.26
IPs:
IP: 10.131.0.26
您可以基于存在于容器命名空间中的桥接master
接口创建子接口。创建子接口可以应用于其他类型的接口。
您已安装 OpenShift CLI(oc
)。
您已以具有cluster-admin
权限的用户身份登录到 OpenShift Container Platform 集群。
输入以下命令,创建一个您要部署 Pod 的专用容器命名空间
$ oc new-project test-namespace
使用以下 YAML 示例,创建一个名为bridge-nad.yaml
的桥接NetworkAttachmentDefinition
自定义资源定义 (CRD) 文件
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: bridge-network
spec:
config: '{
"cniVersion": "0.4.0",
"name": "bridge-network",
"type": "bridge",
"bridge": "br-001",
"isGateway": true,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"subnet": "10.0.0.0/24",
"routes": [{"dst": "0.0.0.0/0"}]
}
}'
运行以下命令,将NetworkAttachmentDefinition
CRD 应用到您的 OpenShift Container Platform 集群
$ oc apply -f bridge-nad.yaml
输入以下命令,验证您是否已成功创建NetworkAttachmentDefinition
CRD
$ oc get network-attachment-definitions
NAME AGE
bridge-network 15s
使用以下 YAML 示例,创建一个名为ipvlan-additional-network-configuration.yaml
的文件,用于 IPVLAN 附加网络配置
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: ipvlan-net
namespace: test-namespace
spec:
config: '{
"cniVersion": "0.3.1",
"name": "ipvlan-net",
"type": "ipvlan",
"master": "ext0", (1)
"mode": "l3",
"linkInContainer": true, (2)
"ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]}
}'
1 | 指定要与网络附件关联的以太网接口。这随后会在 Pod 网络注释中进行配置。 |
2 | 指定master 接口位于容器网络命名空间中。 |
运行以下命令应用 YAML 文件
$ oc apply -f ipvlan-additional-network-configuration.yaml
运行以下命令,验证NetworkAttachmentDefinition
CRD 是否已成功创建
$ oc get network-attachment-definitions
NAME AGE
bridge-network 87s
ipvlan-net 9s
使用以下 YAML 示例,创建一个名为pod-a.yaml
的文件,用于 Pod 定义
apiVersion: v1
kind: Pod
metadata:
name: pod-a
namespace: test-namespace
annotations:
k8s.v1.cni.cncf.io/networks: '[
{
"name": "bridge-network",
"interface": "ext0" (1)
},
{
"name": "ipvlan-net",
"interface": "ext1"
}
]'
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: test-pod
image: quay.io/openshifttest/hello-sdn@sha256:c89445416459e7adea9a5a416b3365ed3d74f2491beb904d61dc8d1eb89a72a4
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
1 | 指定用作 IPVLAN 接口master 的名称。 |
运行以下命令应用 YAML 文件
$ oc apply -f pod-a.yaml
使用以下命令验证 Pod 是否正在运行
$ oc get pod -n test-namespace
NAME READY STATUS RESTARTS AGE
pod-a 1/1 Running 0 2m36s
运行以下命令,显示test-namespace
命名空间内pod-a
资源的网络接口信息
$ oc exec -n test-namespace pod-a -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: eth0@if105: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default
link/ether 0a:58:0a:d9:00:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.217.0.93/23 brd 10.217.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::488b:91ff:fe84:a94b/64 scope link
valid_lft forever preferred_lft forever
4: ext0@if107: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.2/24 brd 10.0.0.255 scope global ext0
valid_lft forever preferred_lft forever
inet6 fe80::bcda:bdff:fe7e:f437/64 scope link
valid_lft forever preferred_lft forever
5: ext1@ext0: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global ext1
valid_lft forever preferred_lft forever
inet6 fe80::beda:bd00:17e:f437/64 scope link
valid_lft forever preferred_lft forever
此输出显示网络接口ext1
与物理接口ext0
关联。