5.2. 配置和使用多个网络
安装 MicroShift Multus Container Network Interface (CNI)后,您可以使用其他网络插件。
5.2.1. IP 地址管理类型和额外网络
通过您配置的 IP 地址管理(IPAM) CNI 插件为额外网络置备 IP 地址。MicroShift 中支持的 IP 地址置备类型是 主机本地
、静态
和 dhcp
。
5.2.1.1. 网桥接口特定
使用 网桥
类型接口和 dhcp
IPAM 时,需要一个侦听桥接网络的 DHCP 服务器。如果您使用防火墙,通过运行 firewall-cmd --remove-service=dhcp
命令配置 firewalld
服务,以允许网络区上的 DHCP 流量。
5.2.1.2. macvlan 接口特定
macvlan
类型接口访问主机所连接的网络。这意味着,如果使用 dhcp
IPAM 插件,接口可以从主机网络上的 DHCP 服务器接收 IP 地址。
5.2.1.3. IPVLAN 接口详情
ipvlan
接口还可以直接访问主机网络,但与主机接口共享 MAC 地址。由于共享 MAC 地址,ipvlan 类型接口不能与 dhcp
插件一起使用。IPAM 插件不支持使用
ClientID
的 DHCP 协议。
5.2.2. 为额外网络创建 NetworkAttachmentDefinition
使用以下步骤为额外网络创建 NetworkAttachmentDefinition
配置文件。在本例中,使用了 bridge-type 接口。您还可以使用此处的示例工作流,它使用 主机本地
IP 地址管理(IPAM)来配置其他支持的额外网络类型。
如果您使用 bridge
和 dhcp
IPAM,则需要侦听桥接网络的 DHCP 服务器。如果您也使用防火墙,需要将 firewalld 服务配置为允许网络区上的 DHCP 流量。在这种情况下,您可以运行 firewall-cmd --remove-service=dhcp
命令。
先决条件
- 已安装 MicroShift Multus CNI。
-
已安装 OpenShift CLI (
oc
)。 - 集群正在运行。
流程
可选:通过运行以下命令,验证 MicroShift 集群是否使用 Multus CNI 运行:
$ oc get pods -n openshift-multus
输出示例
NAME READY STATUS RESTARTS AGE dhcp-daemon-dfbzw 1/1 Running 0 5h multus-rz8xc 1/1 Running 0 5h
运行以下命令并使用以下示例文件来创建
NetworkAttachmentDefinition
配置文件:$ oc apply -f network-attachment-definition.yaml
NetworkAttachmentDefinition
文件示例apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: bridge-conf spec: config: '{ "cniVersion": "0.4.0", "type": "bridge", 1 "bridge": "br-test", 2 "mode": "bridge", "ipam": { "type": "host-local", 3 "ranges": [ [ { "subnet": "10.10.0.0/24", "rangeStart": "10.10.0.20", "rangeEnd": "10.10.0.50", "gateway": "10.10.0.254" } ], [ { "subnet": "fd00:IJKL:MNOP:10::0/64", 4 "rangeStart": "fd00:IJKL:MNOP:10::1", "rangeEnd": "fd00:IJKL:MNOP:10::9" "dataDir": "/var/lib/cni/br-test" } }'
注意使用网桥的名称特定于插件
的网桥
类型。其他插件使用其NetworkAttachmentDefinition 中的不同字段
。例如,macvlan
和ipvlan
配置使用master
来指定要附加的主机接口。
5.2.3. 将 pod 添加到额外网络
您可以将 pod 添加到额外网络。在创建 pod 时,会附加额外网络。pod 继续通过默认网络发送与集群相关的普通网络流量。
如果要将额外网络附加到已在运行的 pod,您必须重启 pod。
先决条件
-
已安装 OpenShift CLI (
oc
)。 - 集群正在运行。
-
要将 pod 附加到的
NetworkAttachmentDefinition
对象定义的网络。
流程
为
Pod
YAML 文件添加注解。只能使用以下注解格式之一:要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将 &
lt;network
> 替换为要与 pod 关联的额外网络的名称:apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1 # ...
- 1
- 将 &
lt;network
> 替换为要与 pod 关联的额外网络的名称。要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
网桥类型额外网络的注解示例
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf # ...
要通过自定义来附加额外网络,请添加具有以下格式的注解:
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", 1 "namespace": "<namespace>", 2 "default-route": ["<default-route>"] 3 } ] # ...
要创建
Pod
YAML 文件并为额外网络添加NetworkAttachmentDefinition
注解,请运行以下命令并使用示例 YAML:$ oc apply -f ./<test_bridge>.yaml 1
- 1
- 将
<test_bridge
> 替换为您要使用的 pod 名称。
输出示例
pod/test_bridge created
test_bridge
pod YAML 示例apiVersion: v1 kind: Pod metadata: name: test_bridge annotations: k8s.v1.cni.cncf.io/networks: bridge-conf labels: app: test_bridge spec: terminationGracePeriodSeconds: 0 containers: - name: hello-microshift image: quay.io/microshift/busybox:1.36 command: ["/bin/sh"] args: ["-c", "while true; do echo -ne \"HTTP/1.0 200 OK\r\nContent-Length: 16\r\n\r\nHello MicroShift\" | nc -l -p 8080 ; done"] ports: - containerPort: 8080 protocol: TCP securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true runAsUser: 1001 runAsGroup: 1001 seccompProfile: type: RuntimeDefault
确保
NetworkAttachmentDefinition
注解正确:NetworkAttachmentDefinition
注解示例apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf # ...
可选: 要确认
Pod
YAML 中是否存在NetworkAttachmentDefinition
注解,请运行以下命令,将 <name&
gt; 替换为 pod 的名称。$ oc get pod <name> -o yaml 1
- 1
- 将
<name
> 替换为您要使用的 pod 名称。在以下示例中,使用 <test_bridge&
gt;。
在以下示例中,
test_bridge
附加到net1
额外网络:$ oc get pod <test_bridge> -o yaml
输出示例
apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: bridge-conf k8s.v1.cni.cncf.io/network-status: |- 1 [{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.42.0.18" ], "default": true, "dns": {} },{ "name": "bridge-conf", "interface": "net1", "ips": [ "20.2.2.100" ], "mac": "22:2f:60:a5:f8:00", "dns": {} }] name: pod namespace: default spec: # ... status: # ...
- 1
k8s.v1.cni.cncf.io/network-status
参数是对象的 JSON 数组。每个对象描述附加到 pod 的额外网络的状态。注解值保存为纯文本值。
运行以下命令验证 pod 是否正在运行:
$ oc get pod
输出示例
NAME READY STATUS RESTARTS AGE test_bridge 1/1 Running 0 81s
5.2.4. 配置额外网络
创建 NetworkAttachmentDefinition 对象并应用后,请使用以下示例步骤配置额外网络。在本例中,使用 网桥
类型额外网络。您还可以将此工作流用于其他额外网络类型。
前提条件
-
已创建并应用
NetworkAttachmentDefinition
对象配置。
流程
运行以下命令,验证主机上是否已创建网桥:
$ ip a show br-test
输出示例
22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff inet6 fe80::34e2:bbff:fed2:31f2/64 scope link valid_lft forever preferred_lft forever
运行以下命令,为网桥配置 IP 地址:
$ sudo ip addr add 10.10.0.10/24 dev br-test
运行以下命令,验证 IP 地址配置是否已添加到网桥中:
$ ip a show br-test
输出示例
22: br-test: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 96:bf:ca:be:1d:15 brd ff:ff:ff:ff:ff:ff inet 10.10.0.10/24 scope global br-test 1 valid_lft forever preferred_lft forever inet6 fe80::34e2:bbff:fed2:31f2/64 scope link valid_lft forever preferred_lft forever
- 1
- IP 地址按预期配置。
运行以下命令验证 pod 的 IP 地址:
$ oc get pod test-bridge --output=jsonpath='{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status}'
输出示例
[{ "name": "ovn-kubernetes", "interface": "eth0", "ips": [ "10.42.0.17" ], "mac": "0a:58:0a:2a:00:11", "default": true, "dns": {} },{ "name": "default/bridge-conf", 1 "interface": "net1", "ips": [ "10.10.0.20" ], "mac": "82:01:98:e5:0c:b7", "dns": {}
- 1
- 网桥额外网络会如预期附加。
可选: 您可以使用
oc exec
访问 pod 并使用ip
命令确认其接口:$ oc exec -ti test-bridge -- ip a
输出示例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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 2: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 0a:58:0a:2a:00:11 brd ff:ff:ff:ff:ff:ff inet 10.42.0.17/24 brd 10.42.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::858:aff:fe2a:11/64 scope link valid_lft forever preferred_lft forever 3: net1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 82:01:98:e5:0c:b7 brd ff:ff:ff:ff:ff:ff inet 10.10.0.20/24 brd 10.10.0.255 scope global net1 1 valid_lft forever preferred_lft forever inet6 fe80::8001:98ff:fee5:cb7/64 scope link valid_lft forever preferred_lft forever
- 1
- pod 按预期附加到
net1 接口上 1
0.10.0.20 IP 地址。
通过从 MicroShift 主机访问 pod 中的 HTTP 服务器,确认连接正常工作。使用以下命令:
$ curl 10.10.0.20:8080
输出示例
Hello MicroShift
5.2.5. 从额外网络中删除 pod
您只能通过删除 pod 来从额外网络中删除 pod。
先决条件
- 一个额外网络被附加到 pod。
-
安装 OpenShift CLI(
oc
)。 - 登录到集群。
流程
要删除 pod,输入以下命令:
$ oc delete pod <name> -n <namespace>
-
<name>
是 pod 的名称。 -
<namespace>
是包含 pod 的命名空间。
-
5.2.6. Multus 网络故障排除
如果没有正确配置多个网络的设置,pod 可能无法启动。以下步骤可帮助您解决几个常见情况。
5.2.6.1. 无法配置 Pod 网络
如果 Multus CNI 插件无法将网络注解应用到 pod,则 pod 不会启动。如果任何额外网络 CNI 失败,Pod 也可以启动。
错误示例
Warning NoNetworkFound 0s multus cannot find a network-attachment-definitio (asdasd) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-ref-doesnt-exist" not found
在这种情况下,您可以执行以下步骤来解决 CNI 失败:
-
验证
NetworkAttachmentDefinition 和 annotations
中的值。 - 删除注解,以验证是否仅使用默认网络成功创建 pod。如果没有,这可能表示 Multus 配置以外的网络问题。
如果您是设备管理员,您可以检查
crio.service
或microshift.service
日志,请特别注意kubelet
生成的。例如,
kubelet
中的以下错误显示主 CNI 没有运行。这种情况可能是由 pod 没有启动,或者因为 CRI-O 错误配置(如不正确的cni_default_network
设置)导致。kubelet-generated 错误示例
Feb 06 13:47:31 dev microshift[1494]: kubelet E0206 13:47:31.163290 1494 pod_workers.go:1298] "Error syncing pod, skipping" err="network is not ready: container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: No CNI configuration file in /etc/cni/net.d/. Has your network provider started?" pod="default/samplepod" podUID="fe0f7f7a-8c47-4488-952b-8abc0d8e2602"
5.2.6.2. 缺少配置文件
有时无法创建 pod,因为注解引用了不存在的 NetworkAttachmentDefinition
配置 YAML。在这种情况下,通常会生成类似如下的错误:
日志示例
cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io "bad-conf" not found" pod="default/samplepod"`
错误输出示例
"CreatePodSandbox for pod failed" err="rpc error: code = Unknown desc = failed to create pod network sandbox k8s_samplepod_default_5fa13105-1bfb-4c6b-aee7-3437cfb50e25_0(7517818bd8e85f07b551f749c7529be88b4e7daef0dd572d049aa636950c76c6): error adding pod default_samplepod to CNI network \"multus-cni-network\": plugin type=\"multus\" name=\"multus-cni-network\" failed (add): Multus: [default/samplepod/5fa13105-1bfb-4c6b-aee7-3437cfb50e25]: error loading k8s delegates k8s args: TryLoadPodDelegates: error in getting k8s network for pod: GetNetworkDelegates: failed getting the delegate: getKubernetesDelegate: cannot find a network-attachment-definition (bad-conf) in namespace (default): network-attachment-definitions.k8s.cni.cncf.io \"bad-conf\" not found" pod="default/samplepod"
若要修复此错误,请创建并应用 NetworkAttachmentDefinition
YAML。