为安全容器配置网络
tap设备网络支持
安全容器技术是基于Qemu VM实现的,对于物理机系统来说,安全容器就相当于是一个VM,所以安全容器可以在Neutron网络中将VM通过TAP技术接入外部网络。我们这里不需要关心TAP设备的创建和网桥对接等问题,只需要将指定的TAP设备(host已经存在)热插进pause容器的VM,并更新网卡信息即可。
相关命令行如下:
为已经启动的容器添加一个tap网卡(interface)
$ cat ./test-iface.json | kata-runtime kata-network add-iface 6ec7a98 -
其中:6ec7a98是容器ID的截断,test-infs.json是描述网卡信息的文件,举例如下:
{ "device": "tap-test", "name": "eth-test", "IPAddresses": [ { "address": "172.16.0.3", "mask": "16" } ], "hwAddr":"02:42:20:6f:a3:69", "mtu": 1500, "vhostUserSocket":"/usr/local/var/run/openvswitch/vhost-user1", "queues":5 }
上述json文件中各个字段的含义说明如下:
设置网卡的主机端名字。支持字母、数字、下划线“\_”、“-” 以及“.”字符,必须以字母开头,且长度不超过15。需要确保同一个宿主机上device不能重复。
设置网卡的容器内名称。支持字母、数字、下划线“\_”、“-” 以及“.”字符,必须以字母开头,且长度不超过15。需要确保同一个Sandbox内name不能重复。
kata-runtime kata-network add-iface添加网卡命令执行返回结果说明:
命令执行成功:从命令的标准输出返回json格式插入网卡的信息,json格式内容和传入的网卡信息相同。
例如:
$ kata-runtime kata-network add-iface <container-id> net.json {"device":"tap_test","name":"eth-test","IPAddresses":[{"Family":2,"Address":"173.85.100.1","Mask":"24"}],"mtu":1500,"hwAddr":"02:42:20:6e:03:01","pciAddr":"01.0/00"}
命令执行失败:从命令的标准输出返回字符串null。
例如:
$ kata-runtime kata-network add-iface <container-id> netbad.json 2>/dev/null null
说明:
当网卡添加成功时,如果为其指定了IP地址,则kata会为新添加的网卡添加一条destination为同网段地址的默认路由,如上例中添加网卡之后容器内有如下路由被添加:[root@6ec7a98 /]# ip route 172.16.0.0/16 dev eth-test proto kernel scope link src 172.16.0.3
列出已经添加的网卡
$ kata-runtime kata-network list-ifaces 6ec7a98 [{"name":"eth-test","mac":"02:42:20:6f:a3:69","ip":["172.16.0.3/16"],"mtu":1500}]
可以查询到我们刚才添加的网卡信息。
kata-runtime kata-network list-ifaces列出已添加网卡命令执行返回结果说明:
命令执行成功:从命令的标准输出返回json格式的Pod中所有插入网卡的信息。
如果Pod中插入了多个网卡设备,返回的是一个json数组格式的网卡信息
$ kata-runtime kata-network list-ifaces <container-id> [{"name":"container_eth","mac":"02:42:20:6e:a2:59","ip":["172.17.25.23/8"],"mtu":1500},{"name":"container_eth_2","mac":"02:90:50:6b:a2:29","ip":["192.168.0.34/24"],"mtu":1500}]
如果Pod中没有插入任何网卡设备,从命令的标准输出返回字符串null。
$ kata-runtime kata-network list-ifaces <container-id> null
命令执行失败:从命令的标准输出返回字符串null,从命令的标准错误输出返回错误描述信息。
例如:
$ kata-runtime kata-network list-ifaces <container-id> null
为指定网卡添加一条路由
$ cat ./test-route.json | kata-runtime kata-network add-route 6ec7a98 - [{"dest":"default","gateway":"172.16.0.1","device":"eth-test"}]
kata-runtime kata-network add-route为指定网卡添加一条路由命令执行返回结果说明:
命令执行成功:从命令的标准输出返回json格式的添加的路由信息。
例如:
$ kata-runtime kata-network add-route <container-id> route.json [{"dest":"177.17.0.0/24","gateway":"177.17.25.1","device":"netport_test_1"}]
命令执行失败:从命令的标准输出返回字符串null,从命令的标准错误输出返回错误描述信息。
例如:
$ kata-runtime kata-network add-route <container-id> routebad.json 2>/dev/null null
字段说明如下:
dest:设置路由对应的网段。格式为<ip>/<mask>,<ip>必选。分如下3种情况:
- 配置<ip>/<mask>;
- 只配置<ip>,则默认掩码为32;
- 若配置了"dest":"default",默认无dest,需传入gateway。
gateway:设置路由的下一跳网关。设置"dest":"default"时,gateway必选;其他情况可选。
device:必选。设置路由对应的网卡名称,最长支持15字符。
说明:
如果为容器内的回环设备lo添加路由时,路由配置文件中的"device"字段对应的设备名称为"lo"。删除指定路由
$ cat ./test-route.json | kata-runtime kata-network del-route 6ec7a98 -
test-route.json字段与添加路由输入json文件的字段相同。
kata-runtime kata-network del-route删除指定路由命令执行返回结果说明:
命令执行成功:从命令的标准输出返回json格式的添加的路由信息。
例如:
$ kata-runtime kata-network del-route <container-id> route.json [{"dest":"177.17.0.0/24","gateway":"177.17.25.1","device":"netport_test_1"}]
命令执行失败:从命令的标准输出返回字符串null,从命令的标准错误输出返回错误描述信息。
例如:
$ kata-runtime kata-network del-route <container-id> routebad.json 2>/dev/null null
说明:
- 输入字段中dest为必选,device/gateway均为可选。kata根据不同字段进行模糊匹配,删除对应的路由规则。例如指定了dest为某个IP,则所有该IP的规则都会被删除。
- 如果删除的是容器内回环设备lo的路由时,路由配置文件中的"device"字段对应的设备名称为"lo"。
删除已经添加的网卡
$ cat ./test-iface.json | kata-runtime kata-network del-iface 6ec7a98 -
说明:
删除网卡时,仅根据网卡容器内名称(name字段)来删除。即便填写其他字段,kata也不会使用。kata-runtime kata-network del-iface删除网卡命令执行返回结果说明:
命令执行成功:从命令标准输出返回null字符串。
例如:
$ kata-runtime kata-network del-iface <container-id> net.json null
命令执行失败:从命令标准输出返回删除失败网卡json格式的信息,从命令的标准错误输出返回错误描述信息。
例如:
$ kata-runtime kata-network del-iface <container-id> net.json {"device":"tapname_fun_012","name":"netport_test_1","IPAddresses":[{"Family":0,"Address":"177.17.0.1","Mask":"8"}],"mtu":1500,"hwAddr":"02:42:20:6e:a2:59","linkType":"tap"}
以上为常用场景和命令行示例,具体命令行接口“附录 > 接口列表”。
kata IPVS子系统
安全容器提供添加ipvs命令的接口,支持对容器设置ipvs规则。功能包含对虚拟服务的添加/编辑/删除、对真实服务器的添加/编辑/删除、查询ipvs服务信息、设置连接超时、清理系统连接缓存,并支持对规则的批量导入。
为容器添加一个虚拟服务地址
kata-runtime kata-ipvs ipvsadm --parameters "--add-service --tcp-service 172.17.0.7:80 --scheduler rr --persistent 3000" <container-id>
修改容器虚拟服务参数
kata-runtime kata-ipvs ipvsadm --parameters "--edit-service --tcp-service 172.17.0.7:80 --scheduler rr --persistent 5000" <container-id>
删除容器虚拟服务地址
kata-runtime kata-ipvs ipvsadm --parameters "--delete-service --tcp-service 172.17.0.7:80" <container-id>
为虚拟服务地址添加一个真实服务器
kata-runtime kata-ipvs ipvsadm --parameters "--add-server --tcp-service 172.17.0.7:80 --real-server 172.17.0.4:80 --weight 100" <container-id>
修改容器真实服务器参数
kata-runtime kata-ipvs ipvsadm --parameters "--edit-server --tcp-service 172.17.0.7:80 --real-server 172.17.0.4:80 --weight 200" <container-id>
删除容器真实服务器
kata-runtime kata-ipvs ipvsadm --parameters "--delete-server --tcp-service 172.17.0.7:80 --real-server 172.17.0.4:80" <container-id>
查询服务信息
kata-runtime kata-ipvs ipvsadm --parameters "--list" <container-id>
逐条导入耗时太久,可将规则写入文件后,批量导入
kata-runtime kata-ipvs ipvsadm --restore - < <规则文件路径> <container-id>
说明:
单条添加时默认使用NAT模式,批量导入时添加真实服务器需手动添加-m参数使用NAT模式。
规则文件内容示例:
-A -t 10.10.11.12:100 -s rr -p 3000
-a -t 10.10.11.12:100 -r 172.16.0.1:80 -m
-a -t 10.10.11.12:100 -r 172.16.0.1:81 -m
-a -t 10.10.11.12:100 -r 172.16.0.1:82 -m清理系统连接缓存
kata-runtime kata-ipvs cleanup --parameters "--orig-dst 172.17.0.4 --protonum tcp" <container-id>
为tcp/tcpfin/udp连接设置超时
kata-runtime kata-ipvs ipvsadm --parameters "--set 100 100 200" <container-id>
说明:
- 每个容器支持iptables规则数量最大为20000条(5k service,3个server/service),add-service和add-server都算作规则。
- 批量导入前需清空已有规则。
- 不存在并发测试场景。
- 以上为常用命令示例,具体命令行接口请参见“附录 > 接口列表”。