5.2. 配置和使用多个网络
安装 MicroShift Multus Container Network Interface (CNI)后,您可以使用配置使用其他网络插件。
5.2.1. IP 地址管理类型和其他网络 复制链接链接已复制到粘贴板!
通过您配置的 IP 地址管理(IPAM) CNI 插件为额外网络置备 IP 地址。MicroShift 中支持的 IP 地址置备类型是 host-local
、static
和 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 接口。您还可以使用此处的示例工作流,它使用 host-local
IP 地址管理(IPAM)来配置其他支持的额外网络类型。
如果您使用 网桥和
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
$ oc get pods -n openshift-multus
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE dhcp-daemon-dfbzw 1/1 Running 0 5h multus-rz8xc 1/1 Running 0 5h
NAME READY STATUS RESTARTS AGE dhcp-daemon-dfbzw 1/1 Running 0 5h multus-rz8xc 1/1 Running 0 5h
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
NetworkAttachmentDefinition
配置文件,并使用以下示例文件作为参考:oc apply -f network-attachment-definition.yaml
$ oc apply -f network-attachment-definition.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NetworkAttachmentDefinition
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意使用网桥的名称特定于插件
的网桥
类型。其他插件在其NetworkAttachmentDefinition 中使用不同的字段
。例如,macvlan
和ipvlan
配置使用master
指定要附加的主机接口。
5.2.3. 将 pod 添加到额外网络 复制链接链接已复制到粘贴板!
您可以将 pod 添加到额外网络。在创建 pod 时,会附加额外网络。pod 继续通过默认网络发送与集群相关的普通网络流量。
如果要将额外网络附加到已在运行的 pod,您必须重启 pod。
先决条件
-
已安装 OpenShift CLI (
oc
)。 - 集群正在运行。
-
您要将 pod 附加到的
NetworkAttachmentDefinition
对象定义的网络。
流程
为
Pod
YAML 文件添加注解。只能使用以下注解格式之一:要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将
<network>
替换为要与 pod 关联的额外网络的名称:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<network
> 替换为要与 pod 关联的每个额外网络的名称。要指定多个额外网络,请使用逗号分隔各个网络。在逗号之间不要包括空格。如果您多次指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
网桥类型额外网络的注解示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要通过自定义来附加额外网络,请添加具有以下格式的注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要创建
Pod
YAML 文件并为额外网络添加NetworkAttachmentDefinition
注解,请运行以下命令并使用示例 YAML:oc apply -f ./<test_bridge>.yaml
$ oc apply -f ./<test_bridge>.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将 <test-bridge > 替换为您要使用的 pod 名称。
输出示例
pod/test-bridge created
pod/test-bridge created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test-bridge
pod YAML 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
NetworkAttachmentDefinition
注解正确:NetworkAttachmentDefinition
注解示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要确认
Pod
YAML 中是否存在NetworkAttachmentDefinition
注解,请运行以下命令,将 <name&
gt; 替换为 pod 的名称。oc get pod <name> -o yaml
$ oc get pod <name> -o yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将 <name > 替换为您要使用的 pod 名称。在以下示例中使用了
test-bridge
。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
k8s.v1.cni.cncf.io/network-status
参数是对象的 JSON 数组。每个对象描述附加到 pod 的额外网络的状态。注解值保存为纯文本值。
运行以下命令验证 pod 是否正在运行:
oc get pod
$ oc get pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE test-bridge 1/1 Running 0 81s
NAME READY STATUS RESTARTS AGE test-bridge 1/1 Running 0 81s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.2.4. 配置额外网络 复制链接链接已复制到粘贴板!
创建 NetworkAttachmentDefinition 对象并应用它后,使用以下示例步骤来配置额外网络。在本例中,使用了 网桥
类型额外网络。您还可以将此工作流用于其他额外网络类型。
前提条件
-
您创建并应用
NetworkAttachmentDefinition
对象配置。
流程
运行以下命令验证主机上是否已创建网桥:
ip a show br-test
$ ip a show br-test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,为网桥配置 IP 地址:
sudo ip addr add 10.10.0.10/24 dev br-test
$ sudo ip addr add 10.10.0.10/24 dev br-test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证 IP 地址配置是否已添加到桥接中:
ip a show br-test
$ ip a show br-test
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- IP 地址按预期配置。
运行以下命令,验证 pod 的 IP 地址:
oc get pod test-bridge --output=jsonpath='{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status}'
$ oc get pod test-bridge --output=jsonpath='{.metadata.annotations.k8s\.v1\.cni\.cncf\.io/network-status}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 网桥额外网络会如预期附加。
可选: 您可以使用
oc exec
访问 pod 并使用ip
命令确认其接口:oc exec -ti test-bridge -- ip a
$ oc exec -ti test-bridge -- ip a
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Pod 按预期附加到
net
1 接口上的 10.10.0.20 IP 地址。
通过从 MicroShift 主机访问 pod 中的 HTTP 服务器来确认连接按预期工作。使用以下命令:
curl 10.10.0.20:8080
$ curl 10.10.0.20:8080
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Hello MicroShift
Hello MicroShift
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.2.5. 从额外网络中删除 pod 复制链接链接已复制到粘贴板!
您只能通过删除 pod 来从额外网络中删除 pod。
先决条件
- 一个额外网络被附加到 pod。
-
安装 OpenShift CLI(
oc
)。 - 登录到集群。
流程
要删除 pod,输入以下命令:
oc delete pod <name> -n <namespace>
$ oc delete pod <name> -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
<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
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 和注解
中的值。 - 删除注解,以验证 pod 是否使用默认网络成功创建。如果没有,这可能表示 Multus 配置以外的网络问题。
如果您是设备管理员,您可以检查
crio.service
或microshift.service
日志,请特别注意kubelet
生成的内容。例如,
kubelet
的以下错误显示主 CNI 未运行。这种情况可能是由 pod 启动或因为 CRI-O 错误配置导致,如不正确的cni_default_network
设置。kubelet 生成的错误示例
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"
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"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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"`
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"
"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
。