metadata:
annotations:
k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] (1)
作为集群用户,您可以将Pod附加到附加网络。
您可以将Pod添加到附加网络。Pod将继续通过默认网络发送正常的集群相关网络流量。
创建Pod时,附加网络会附加到它。但是,如果Pod已经存在,则无法将附加网络附加到它。
Pod必须与附加网络位于相同的命名空间。
安装OpenShift CLI (oc
)。
登录到集群。
向Pod
对象添加注释。只能使用以下注释格式之一
要附加附加网络而无需任何自定义,请使用以下格式添加注释。将<network>
替换为要与Pod关联的附加网络的名称
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] (1)
1 | 要指定多个附加网络,请用逗号分隔每个网络。逗号之间不要包含空格。如果多次指定相同的附加网络,则该Pod将有多个网络接口附加到该网络。 |
要附加具有自定义的附加网络,请使用以下格式添加注释
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: |-
[
{
"name": "<network>", (1)
"namespace": "<namespace>", (2)
"default-route": ["<default-route>"] (3)
}
]
1 | 指定由NetworkAttachmentDefinition 对象定义的附加网络的名称。 |
2 | 指定定义NetworkAttachmentDefinition 对象的命名空间。 |
3 | 可选:指定默认路由的覆盖,例如192.168.17.1 。 |
要创建Pod,请输入以下命令。将<name>
替换为Pod的名称。
$ oc create -f <name>.yaml
可选:要确认Pod
CR中是否存在注释,请输入以下命令,将<name>
替换为Pod的名称。
$ oc get pod <name> -o yaml
在以下示例中,example-pod
Pod附加到net1
附加网络
$ oc get pod example-pod -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-bridge
k8s.v1.cni.cncf.io/network-status: |- (1)
[{
"name": "ovn-kubernetes",
"interface": "eth0",
"ips": [
"10.128.2.14"
],
"default": true,
"dns": {}
},{
"name": "macvlan-bridge",
"interface": "net1",
"ips": [
"20.2.2.100"
],
"mac": "22:2f:60:a5:f8:00",
"dns": {}
}]
name: example-pod
namespace: default
spec:
...
status:
...
1 | k8s.v1.cni.cncf.io/network-status 参数是对象的JSON数组。每个对象都描述附加到Pod的附加网络的状态。注释值存储为纯文本值。 |
将Pod附加到附加网络时,您可能希望在特定Pod中指定有关该网络的更多属性。这允许您更改某些路由方面,以及指定静态IP地址和MAC地址。为此,您可以使用JSON格式的注释。
Pod必须与附加网络位于相同的命名空间。
安装OpenShift CLI (oc
)。
您必须登录到集群。
要在指定寻址和/或路由选项的同时将Pod添加到附加网络,请完成以下步骤
编辑Pod
资源定义。如果要编辑现有的Pod
资源,请运行以下命令以在默认编辑器中编辑其定义。将<name>
替换为要编辑的Pod
资源的名称。
$ oc edit pod <name>
在Pod
资源定义中,将k8s.v1.cni.cncf.io/networks
参数添加到pod的metadata
映射中。k8s.v1.cni.cncf.io/networks
接受一个JSON字符串,该字符串是一个对象列表,除了指定附加属性外,还引用NetworkAttachmentDefinition
自定义资源 (CR) 的名称。
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' (1)
1 | 将<network> 替换为如下示例所示的JSON对象。单引号是必需的。 |
在以下示例中,注释指定哪个网络附件将具有默认路由,使用default-route
参数。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
annotations:
k8s.v1.cni.cncf.io/networks: '[
{
"name": "net1"
},
{
"name": "net2", (1)
"default-route": ["192.0.2.1"] (2)
}]'
spec:
containers:
- name: example-pod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: centos/tools
1 | name 键是与Pod关联的附加网络的名称。 |
2 | default-route 键指定路由表中不存在其他路由条目时要通过其路由流量的网关的值。如果指定多个default-route 键,则会导致Pod无法激活。 |
默认路由将导致任何在其他路由中未指定的流量路由到网关。
将默认路由设置为OpenShift Container Platform的默认网络接口以外的接口可能会导致预期用于Pod间流量的流量通过另一个接口路由。 |
要验证Pod的路由属性,可以使用oc
命令在Pod内执行ip
命令。
$ oc exec -it <pod_name> -- ip route
您还可以参考Pod的 |
要为Pod设置静态IP地址或MAC地址,可以使用JSON格式的注释。这需要您创建专门允许此功能的网络。这可以在CNO的rawCNIConfig中指定。
运行以下命令编辑CNO CR
$ oc edit networks.operator.openshift.io cluster
以下YAML描述了CNO的配置参数
name: <name> (1)
namespace: <namespace> (2)
rawCNIConfig: '{ (3)
...
}'
type: Raw
1 | 为要创建的附加网络附件指定一个名称。此名称在指定的namespace 内必须唯一。 |
2 | 指定创建网络附件的命名空间。如果不指定值,则使用default 命名空间。 |
3 | 以JSON格式指定CNI插件配置,该配置基于以下模板。 |
以下对象描述了使用静态MAC地址和IP地址的macvlan CNI插件的配置参数
{
"cniVersion": "0.3.1",
"name": "<name>", (1)
"plugins": [{ (2)
"type": "macvlan",
"capabilities": { "ips": true }, (3)
"master": "eth0", (4)
"mode": "bridge",
"ipam": {
"type": "static"
}
}, {
"capabilities": { "mac": true }, (5)
"type": "tuning"
}]
}
1 | 指定要创建的附加网络附件的名称。此名称在指定的namespace 内必须唯一。 |
2 | 指定CNI插件配置数组。第一个对象指定macvlan插件配置,第二个对象指定调整插件配置。 |
3 | 指定请求启用CNI插件运行时配置功能的静态IP地址功能。 |
4 | 指定macvlan插件使用的接口。 |
5 | 指定请求启用CNI插件的静态MAC地址功能。 |
上述网络附件可以在JSON格式的注释中引用,并带有键以指定将为给定Pod分配哪个静态IP和MAC地址。
使用以下命令编辑Pod
$ oc edit pod <name>
apiVersion: v1
kind: Pod
metadata:
name: example-pod
annotations:
k8s.v1.cni.cncf.io/networks: '[
{
"name": "<name>", (1)
"ips": [ "192.0.2.205/24" ], (2)
"mac": "CA:FE:C0:FF:EE:00" (3)
}
]'
1 | 使用创建rawCNIConfig 时提供的<name> 。 |
2 | 提供包含子网掩码的IP地址。 |
3 | 提供MAC地址。 |
静态IP地址和MAC地址不必同时使用,您可以单独使用它们,也可以一起使用。 |
要验证具有附加网络的Pod的IP地址和MAC属性,请使用oc
命令在Pod内执行ip命令。
$ oc exec -it <pod_name> -- ip a