使用指南
简介
系统容器基于 iSula 容器引擎进行功能增强,提供系统容器相关功能。系统容器提供的容器管理功能和 iSula 容器引擎保持一致,其命令格式和功能与 iSula 容器引擎相同。
本文档仅描述系统容器提供的增强功能对应的使用方式,其它命令行操作请参考 “iSula 容器引擎” 章节。
系统容器功能仅涉及 isula create/run
命令行,后续未特别说明,各功能均使用此命令行。其命令行格式如下所示:
isula create/run [OPTIONS] [COMMAND] [ARG...]
其中:
- OPTIONS:命令参数,可以一个或者多个,可选参数请参见 “iSula 容器引擎 > 附录 > 命令行参数说明”。
- COMMAND:系统容器启动后执行的命令。
- ARG:系统容器启动后执行命令对应的参数。
指定 rootfs 创建容器
功能描述
系统容器不同于普通容器,普通容器需要指定一个容器镜像来启动,而系统容器通过参数 --external-rootfs
指定一个本地的根文件系统 rootfs(Root File System)来启动,rootfs 包含了容器运行时依赖的操作系统环境。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --external-rootfs | 字符串变量。 容器根文件系统对应的绝对路径,即 rootfs 的路径。 |
约束限制
- 参数
--external-rootfs
指定的 rootfs 目录必须为绝对路径,不能为相对路径。 - 参数
--external-rootfs
指定的 rootfs 目录必须为一个完整运行的操作系统环境,否则容器会启动失败。 - 容器删除时,不会删除
--external-rootfs
指定的 rootfs目录。 - 不支持在 x86 环境上运行基于 arm rootfs 的容器,也不支持在 arm 环境上运行基于 x86 rootfs 的容器。
- 同一份 rootfs,不建议启动多个容器实例,即同一份 rootfs 只供一个生命周期内的容器实例使用。
使用示例
假设本地 rootfs 的路径为 /root/myrootfs,那么启动一个系统容器的命令如下:
# isula run -tid --system-container --external-rootfs /root/myrootfs none init
说明: rootfs 为自定义的文件系统,请用户自行准备。例如容器镜像的 tar 包解压后,即为一个 rootfs。
通过 systemd 启动容器
功能描述
系统容器与普通容器最大的差异就在于容器启动的 init 进程,普通容器无法通过 systemd 启动系统服务,而系统容器具备这个能力,通过在启动容器时指定 --system-contianer
参数可以使能 systemd 服务。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --system-container | 布尔变量,取值为 true、false,未指定值时表示 true。 指定某个容器类型是否属于系统容器,必须使能。 |
约束限制
- systemd 服务需要调用一些特殊系统调用,包括 mount、umount2、unshare、reboot 以及 name_to_handle_at,所以在不开启特权容器标签的情况下,系统容器打开了调用上述接口的权限。
- 系统容器都是 init 启动,init 进程不响应表示正常退出的 SIGTERM 信号,stop 默认在 10s 之后才会强制杀死容器。如果需要快速结束,可以手动指定 stop 的超时时间。
--system-container
必须配合--external-rootfs
参数一起使用。- 系统容器内支持运行各类服务,服务的启停通过 systemctl 来管理,服务之间可能会出现相互依赖关系导致异常情况下某些服务进程出现 D/Z 状态,使得容器无法正常退出。
- 系统容器内的某些服务进程可能会影响其它操作结果,例如容器内若运行了 NetworkManager 服务,可能会影响向容器添加网卡的行为(网卡添加成功然后被 NetworkManger 停掉),导致不可预期的结果。
- 系统容器和主机暂时无法实现 udev 事件隔离,所以 fstab 配置也暂不支持。
使用示例
指定
--system-container
和--external-rootfs
参数启动系统容器。[root@localhost ~]# isula run -tid -n systest01 --system-container --external-rootfs /root/myrootfs none init
执行以上命令后容器成功运行,通过 exec 进容器查看进程信息,可看到 systemd 服务已启动。
[root@localhost ~]# isula exec -it systest01 bash [root@localhost /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 2 06:49 ? 00:00:00 init root 14 1 2 06:49 ? 00:00:00 /usr/lib/systemd/systemd-journal root 16 1 0 06:49 ? 00:00:00 /usr/lib/systemd/systemd-network dbus 23 1 0 06:49 ? 00:00:00 /usr/bin/dbus-daemon --system -- root 25 0 0 06:49 ? 00:00:00 bash root 59 25 0 06:49 ? 00:00:00 ps –ef
容器内执行 systemctl 命令查看服务状态,可看到服务被 systemd 管理。
[root@localhost /]# systemctl status dbus ● dbus.service - D-Bus System Message Bus Loaded: loaded (/usr/lib/systemd/system/dbus.service; static; vendor preset: disabled) Active: active (running) since Mon 2019-07-22 06:49:38 UTC; 2min 5 8s ago Docs: man:dbus-daemon(1) Main PID: 23 (dbus-daemon) CGroup: /system.slice/dbus.service └─23 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidf ile --systemd-activation --syslog-only Jul 22 06:49:38 localhost systemd[1]: Started D-Bus System Message Bus.
容器内通过
systemctl stop/start 服务
,可看到服务被 systemd 管理。[root@localhost /]# systemctl stop dbus Warning: Stopping dbus.service, but it can still be activated by: dbus.socket [root@localhost /]# systemctl start dbus
容器内 reboot/shutdown
功能描述
系统容器支持在容器内执行 reboot 和 shutdown 命令。执行 reboot 命令效果同重启容器一致;执行 shutdown 命令效果同停止容器一致。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --restart | 字符串变量。可取指定值:on-reboot:表示重启系统容器。 |
约束限制
- shutdown 功能,依赖于不同的 OS,以实际容器运行环境对应 OS 为准。
- 执行
shutdown -h now
命令关闭系统时,不能多次占用 console。例如isula run -ti
命令打开一个 console,在另一个 host bash 中isula attach
该容器,会打开另一个 console,此时执行 shutdown 会失败。
使用示例
容器启动时指定
--restart on-reboot
参数,示例如下:[root@localhost ~]# isula run -tid --restart on-reboot --system-container --external-rootfs /root/myrootfs none init 106faae22a926e22c828a0f2b63cf5c46e5d5986ea8a5b26de81390d0ed9714f
进入容器执行 reboot 命令:
[root@localhost ~]# isula exec -it 10 bash [root@localhost /]# reboot
查看容器是否重启:
[root@localhost ~]# isula exec -it 10 ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.0 21588 9504 ? Ss 12:11 0:00 init root 14 0.1 0.0 27024 9376 ? Ss 12:11 0:00 /usr/lib/system root 17 0.0 0.0 18700 5876 ? Ss 12:11 0:00 /usr/lib/system dbus 22 0.0 0.0 9048 3624 ? Ss 12:11 0:00 /usr/bin/dbus-d root 26 0.0 0.0 8092 3012 ? Rs+ 12:13 0:00 ps aux
进入容器执行 shutdown 命令:
[root@localhost ~]# isula exec -it 10 bash [root@localhost /]# shutdown -h now [root@localhost /]# [root@localhost ~]#
检查容器是否停止:
[root@localhost ~]# isula exec -it 10 bash Error response from daemon: Exec container error;Container is not running:106faae22a926e22c828a0f2b63cf5c46e5d5986ea8a5b26de81390d0ed9714f
cgroup 路径可配置
功能描述
系统容器提供在宿主机上进行容器资源隔离和预留的能力。通过 --cgroup-parent
参数,可以将容器使用的 cgroup 目录指定到某个特定目录下,从而达到灵活分配宿主机资源的目的。例如可以设置容器 a、b、c 的 cgroup 父路径为 /lxc/cgroup1
,容器 d、e、f 的 cgroup 父路径为 /lxc/cgroup2
,这样通过 cgroup路 径将容器分为两个 group,实现容器 cgroup 组层面的资源隔离。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --cgroup-parent | 字符串变量。指定容器 cgroup 父路径。 |
除了通过命令行指定单个系统容器对应的 cgroup 父路径外,还可通过修改 iSulad 容器引擎启动配置文件,指定所有容器的 cgroup 路径。
配置文件路径 | 配置项 | 配置项说明 |
---|---|---|
/etc/isulad/daemon.json | --cgroup-parent | 字符串变量。指定容器默认 cgroup 父路径。配置示例:”cgroup-parent”: “/lxc/mycgroup” |
约束限制
- 如果 daemon 端和客户端都设置了 cgroup parent 参数,最终以客户端指定的
--cgroup-parent
生效。 - 如果已启动容器 A,然后启动容器 B,容器 B 的 cgroup 父路径指定为容器 A 的 cgroup路径,在删除容器的时候需要先删除容器 B 再删除容器 A,否则会导致 cgroup 资源残留。
使用示例
启动系统容器,指定 --cgroup-parent
参数:
[root@localhost ~]# isula run -tid --cgroup-parent /lxc/cgroup123 --system-container --external-rootfs /root/myrootfs none init
115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
查看容器 init 进程的 cgroup 信息:
[root@localhost ~]# isula inspect -f "" 11
22167
[root@localhost ~]# cat /proc/22167/cgroup
13:blkio:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
12:perf_event:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
11:cpuset:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
10:pids:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
9:rdma:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
8:devices:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
7:hugetlb:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
6:memory:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
5:net_cls,net_prio:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
4:cpu,cpuacct:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
3:files:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
2:freezer:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
1:name=systemd:/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e/init.scope
0::/lxc/cgroup123/115878a4dfc7c5b8c62ef8a4b44f216485422be9a28f447a4b9ecac4609f332e
可以看到容器的 cgroup 父路径被设置为 /sys/fs/cgroup//lxc/cgroup123
同时,对于所有容器 cgroup 父路径的设置可以配置一下容器 daemon 文件,例如:
{
"cgroup-parent": "/lxc/cgroup123",
}
然后重启容器引擎,配置生效。
namespace 化内核参数可写
功能描述
对于运行在容器内的业务,如数据库,大数据,包括普通应用,有对部分内核参数进行设置和调整的需求,以满足最佳的业务运行性能和可靠性。内核参数要么不允许修改,要么全部允许修改(特权容器):
在不允许用户在容器内修改时,只提供了 --sysctl
外部接口,而且容器内不能灵活修改参数值。
在允许用户在容器内修改时,部分内核参数是全局有效的,某个容器修改后,会影响主机上所有的程序,安全性降低。
系统容器提供 --ns-change-opt
参数,可以指定 namespace 化的内核参数在容器内动态设置,当前仅支持 net、ipc。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --ns-change-opt | 字符串变量。 仅支持配置 net、ipc: net:支持 /proc/sys/net 目录下所有 namespace 化参数。ipc:支持的 namespace 化参数列表如下: /proc/sys/kernel/msgmax /proc/sys/kernel/msgmnb /proc/sys/kernel/msgmni/ proc/sys/kernel/sem /proc/sys/kernel/shmall /proc/sys/kernel/shmmax /proc/sys/kernel/shmmni /proc/sys/kernel/shm_rmid_forced /proc/sys/fs/mqueue/msg_default /proc/sys/fs/mqueue/msg_max /proc/sys/fs/mqueue/msgsize_default /proc/sys/fs/mqueue/msgsize_max /proc/sys/fs/mqueue/queues_max 支持通知指定多个 namespce 配置, 多个配置间通过逗号隔开, 例如: --ns-change-opt=net,ipc 。 |
约束限制
- 如果容器启动同时指定了
--privileged
(特权容器)和--ns-change-opt
,则--ns-change-opt
不生效。
使用示例
启动容器, 指定 --ns-change-opt=net
:
[root@localhost ~]# isula run -tid --ns-change-opt net --system-container --external-rootfs /root/myrootfs none init
4bf44a42b4a14fdaf127616c90defa64b4b532b18efd15b62a71cbf99ebc12d2
[root@localhost ~]# isula exec -it 4b mount | grep /proc/sys
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sys/net type proc (rw,nosuid,nodev,noexec,relatime)
可以看到容器内 /proc/sys/net
挂载点为 rw,说明 net 相关的 namespace 化的内核参数具有读写权限。
再启动一个容器,指定 --ns-change-opt=ipc
:
[root@localhost ~]# isula run -tid --ns-change-opt ipc --system-container --external-rootfs /root/myrootfs none init
c62e5e5686d390500dab2fa76b6c44f5f8da383a4cbbeac12cfada1b07d6c47f
[root@localhost ~]# isula exec -it c6 mount | grep /proc/sys
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/shmmax type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/shmmni type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/shmall type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/shm_rmid_forced type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/msgmax type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/msgmni type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/msgmnb type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/kernel/sem type proc (rw,nosuid,nodev,noexec,relatime)
proc on /proc/sys/fs/mqueue type proc (rw,nosuid,nodev,noexec,relatime)
可以看到容器内 ipc 相关的内核参数挂载点为 rw,说明 ipc 相关的 namespace 化的内核参数具有读写权限。
共享内存通道
功能描述
系统容器提供容器与主机进程通过共享内存进行通信的功能,通过在容器创建时配置 --host-channel
参数,可以在容器与主机之间共享同一 tmpfs,从而达到主机与容器间通信的功能。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --host-channel | 字符串变量,格式为: <host path>:<container path>:<rw/ro>:<size limit> 参数说明如下: <host path>:将在宿主机上挂载 tmpfs 的路径,必须是绝对路径。 <container path>:将在容器内挂载 tmpfs 的路径,必须是绝对路径。 <rw/ro>:在容器内挂载的文件系统的使用权限,只能配置为rw(可读写)或ro(只读),默认为rw。 <size limit>:挂载的 tmpfs 能够使用的最大限制,最小支持 1 物理页(4KB),最大支持系统总物理内存的 1/2 。默认为 64MB。 |
约束限制
- 宿主机上挂载的 tmpfs 的生命周期为从容器启动到容器删除,容器删除并解除对空间的占用后会移除这片空间。
- 容器删除时会将宿主机上挂载 tmpfs 的路径删除,所以不允许使用宿主机上已存在的目录。
- 为了宿主机上非 root 用户运行的进程能够与容器内进行通信,宿主机上 tmpfs 挂载的权限为 1777。
使用示例
创建容器时指定 --host-channel
参数:
[root@localhost ~]# isula run --rm -it --host-channel /testdir:/testdir:rw:32M --system-container --external-rootfs /root/myrootfs none init
root@3b947668eb54:/# dd if=/dev/zero of=/testdir/test.file bs=1024 count=64K
dd: error writing '/testdir/test.file': No space left on device
32769+0 records in
32768+0 records out
33554432 bytes (34 MB, 32 MiB) copied, 0.0766899 s, 438 MB/s
说明: - 使用
--host-channel
大小限制时,若在容器内创建共享文件,则会受到容器内的内存配额限制(在容器内存使用达到极限时可能会产生 oom)。 - 若用户在主机端创建共享文件,则不受容器内的内存配额限制。 - 若用户需要在容器内创建共享文件,且业务为内存密集型,可以通过设置容器内存配额为在原本基础上加上--host-channel
配置的大小来消除影响。
动态加载内核模块
功能描述
容器内业务可能依赖某些内核模块,可通过设置环境变量的方式,在系统容器启动前动态加载容器中业务需要的内核模块到宿主机,此特性需要配合 isulad-hooks
一起使用,具体使用可参看容器资源动态管理(isulad-tools)章节。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | -e KERNEL_MODULES=module_name1,module_name | 字符串变量。支持配置多个模块,模块名以逗号分隔。 |
约束限制
- 如果加载的内核模块是未经过验证的,或者跟宿主机已有模块冲突的场景,会导致宿主机出现不可预知问题,在做加载内核模块时需要谨慎操作。
- 动态加载内核模块通过将需要加载的内核模块传递给容器,此功能是依靠
isulad-tools
捕获到容器启动的环境变量实现,依赖isulad-tools
的正确安装部署。 - 加载的内核模块需要手动进行删除。
使用示例
启动系统容器时,指定 -e KERNEL_MODULES
参数,待系统容器启动后,可以看到 ip_vs 模块被成功加载到内核中。
[root@localhost ~]# lsmod | grep ip_vs
[root@localhost ~]# isula run -tid -e KERNEL_MODULES=ip_vs,ip_vs_wrr --hook-spec /etc/isulad-tools/hookspec.json --system-container --external-rootfs /root/myrootfs none init
ae18c4281d5755a1e153a7bff6b3b4881f36c8e528b9baba8a3278416a5d0980
[root@localhost ~]# lsmod | grep ip_vs
ip_vs_wrr 16384 0
ip_vs 176128 2 ip_vs_wrr
nf_conntrack 172032 7 xt_conntrack,nf_nat,nf_nat_ipv6,ipt_MASQUERADE,nf_nat_ipv4,nf_conntrack_netlink,ip_vs
nf_defrag_ipv6 20480 2 nf_conntrack,ip_vs
libcrc32c 16384 3 nf_conntrack,nf_nat,ip_vs
说明:
- 宿主机需要安装
isulad-tools
。- 需要指定
--hooks-spec
为 isulad hooks。
环境变量持久化
功能描述
系统容器支持通过指定 --env-target-file
接口参数将 env 变量持久化到容器 rootfs 目录下的配置文件中。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --env-target-file | 字符串变量。 env 持久化文件必须在 rootfs 目录下,且配置为绝对路径。 |
约束限制
--env-target-file
指定的目标文件如果存在的话,大小不能超过 10MB。--env-target-file
指定的参数为 rootfs 目录下的绝对路径。- 如果
--env
和目标文件里面的 env 出现冲突,以--env
指定值的参数为准。
使用示例
启动系统容器,指定 env 环境变量和 --env-target-file
参数:
[root@localhost ~]# isula run -tid -e abc=123 --env-target-file /etc/environment --system-container --external-rootfs /root/myrootfs none init
b75df997a64da74518deb9a01d345e8df13eca6bcc36d6fe40c3e90ea1ee088e
[root@localhost ~]# isula exec b7 cat /etc/environment
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TERM=xterm
abc=123
可以看到容器的 env 变量(abc=123)已经持久化到 /etc/environment
配置文件中。
最大句柄数限制
功能描述
系统容器支持对容器内使用文件句柄数进行限制,文件句柄包括普通文件句柄和网络套接字,启动容器时,可以通过指定 --files-limit
参数限制容器内打开的最大句柄数。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --files-limit | 整数值,不能为负数。 指定为 0 表示不受限制,最大值限制由当前内核 files cgroup 决定。 |
约束限制
- 如果
--files-limit
指定的值太小,可能会导致系统容器无法通过 exec 执行命令,报 ”open too many files” 错误,所以 files limit 的值应该设置大一些。 - 文件句柄包括普通文件句柄和网络套接字。
使用示例
使用 --files-limit
限制容器内打开文件句柄数需要内核支持 files cgroup,可以执行以下命令查看:
[root@localhost ~]# cat /proc/1/cgroup | grep files
10:files:/
结果显示 files,说明内核支持 files cgroup。
容器启动指定 --files-limit
参数,并检查 files.limit 参数是否成功写入:
[root@localhost ~]# isula run -tid --files-limit 1024 --system-container --external-rootfs /tmp/root-fs empty init 01e82fcf97d4937aa1d96eb8067f9f23e4707b92de152328c3fc0ecb5f64e91d
[root@localhost ~]# isula exec -it 01e82fcf97d4 bash
[root@localhost ~]# cat /sys/fs/cgroup/files/files.limit
1024
可以看出,容器内文件句柄数被成功限制。
安全性和隔离性
user namespace 多对多
功能描述
user namespace 是将容器的 root 映射到主机的普通用户,使得容器中的进程和用户在容器里有特权,但是在主机上就是普通权限,防止容器中的进程逃逸到主机上,进行非法操作。更进一步,使用 user namespace 技术后,容器和主机使用不同的 uid 和 gid,保证容器内部的用户资源和主机资源进行隔离,例如文件描述符等。
系统容器支持通过 --user-remap
接口参数将不同容器的 user namespace 映射到宿主机不同的 user namespace,实现容器 user namespace 隔离。
参数说明
命令 | 参数 | 参数指定值说明 |
---|---|---|
isula create/run | --user-remap | 参数格式为<uid>:<gid>:<offset>,参数说明如下: uid、gid 为整数型,且必须大于等于 0。 offset 为整数型,且必须大于 0,并且小于 65536。 取值不能太小,否则容器无法启动。 uid 加上 offset 的值必须小于等于 $2^{32}$-1, gid 加上 offset 的值必须小于等于 $2^{32}$-1, 否则容器启动会报错。 |
约束限制
- 如果系统容器指定了
--user-remap
,那么 rootfs 目录必须能够被--user-remap
指定的 uid/gid 用户所访问,否则会导致容器 user namespace 无法访问 rootfs,容器启动失败。 - 容器内所有的 id 都应该能映射到主机 rootfs,某些目录/文件可能是从主机 mount 到容器,比如 /dev/pts 目录下面的设备文件,如果 offset 值太小可能会导致 mount 失败。
- uid、gid 和 offset 的值由上层调度平台控制,容器引擎只做合法性检查。
--user-remap
只适用于系统容器。--user-remap
和--privileged
不能共存,否则容器启动会报错。- 如果 uid 或 gid 指定为 0,则
--user-remap
参数不生效。
使用指导
说明:
指定
--user-remap
参数前,请先将 rootfs 下所有目录和文件的 uid 和 gid 做整体偏移,偏移量为--user-remap
指定 uid 和 gid 的偏移量。例如将 dev 目录的 uid 和 gid 整体 uid 和 gid 偏移 100000 的参考命令为:
chown 100000:100000 dev
系统容器启动指定 --user-remap
参数:
[root@localhost ~]# isula run -tid --user-remap 100000:100000:65535 --system-container --external-rootfs /home/root-fs none /sbin/init
eb9605b3b56dfae9e0b696a729d5e1805af900af6ce24428fde63f3b0a443f4a
分别在宿主机和容器内查看 /sbin/init
进程信息:
[root@localhost ~]# isula exec eb ps aux | grep /sbin/init
root 1 0.6 0.0 21624 9624 ? Ss 15:47 0:00 /sbin/init
[root@localhost ~]# ps aux | grep /sbin/init
100000 4861 0.5 0.0 21624 9624 ? Ss 15:47 0:00 /sbin/init
root 4948 0.0 0.0 213032 808 pts/0 S+ 15:48 0:00 grep --color=auto /sbin/init
可以看到 /sbin/init
进程在容器内的 owner 是 root 用户,但是在宿主机的 owner 是 uid=100000 这个用户。
在容器内创建一个文件,然后在宿主机上查看文件的 owner:
[root@localhost ~]# isula exec -it eb bash
[root@localhost /]# echo test123 >> /test123
[root@localhost /]# exit
exit
[root@localhost ~]# ll /home/root-fs/test123
-rw-------. 1 100000 100000 8 Aug 2 15:52 /home/root-fs/test123
可以看到,在容器内生成了一个文件,它的 owner 是 root,但是在宿主机上看到的 owner 是 id=100000 这个用户。
用户权限控制
功能描述
容器引擎支持通过 TLS 认证方式来认证用户的身份,并依此控制用户的权限,当前容器引擎可以对接 authz 插件实现权限控制。
接口说明
通过配置 iSulad 容器引擎启动参数来指定权限控制插件,daemon 配置文件默认为 /etc/isulad/daemon.json
。
配置参数 | 示例 | 说明 |
---|---|---|
--authorization-plugin | “authorization-plugin”: “authz-broker” | 用户权限认证插件, 当前只支持 authz-broker。 |
约束限制
- authz 需要配置用户权限策略,策略文件默认为
/var/lib/authz-broker/policy.json
,该配置文件支持动态修改,修改完即时生效,不需要重启插件服务。 - 由于容器引擎为 root 用户启动,放开一般用户使用的一些命令可能会导致该用户不当获得过大权限,需谨慎配置。目前 container_attach、container_create和container_exec_create 动作可能会有风险。
- 对于某些复合操作,比如 isula exec、isula attach 等命令依赖 isula inspect 是否有权限,如果用户没有 inspect 权限会直接报错。
- 采用 SSL/TLS 加密通道在增加安全性的同时也会带来性能损耗,如增加延时,消耗较多的 CPU 资源,除了数据传输外,加解密需要更大吞吐量,因此在并发场景下,相比非 TLS 通信,其并发量有一定程度上的下降。经实测,在 ARM 服务器(Cortex-A72 64 核)接近空载情况下,采用 TLS 并发起容器,其最大并发量在 200~250 范围内。
- 服务端指定
--tlsverify
时,认证文件默认配置路径为/etc/isulad
。且默认文件名分别为 ca.pem、cert.pem、key.pem。
使用示例
确认宿主机安装了 authz 插件,如果需要安装,安装并启动 authz 插件服务命令如下:
[root@localhost ~]# dnf install authz [root@localhost ~]# systemctl start authz
要启动该功能,首先需要配置容器引擎和用户的 TLS 证书。可以使用 OPENSSL 来生成需要的证书,具体步骤如下:
#SERVERSIDE # Generate CA key openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "ca-key.pem" 4096 # Generate CA openssl req -new -x509 -days $VALIDITY -key "ca-key.pem" -sha256 -out "ca.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL" # Generate Server key openssl genrsa -out "server-key.pem" 4096 # Generate Server Certs. openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "server-key.pem" -out server.csr echo "subjectAltName = DNS:localhost,IP:127.0.0.1" > extfile.cnf echo "extendedKeyUsage = serverAuth" >> extfile.cnf openssl x509 -req -days $VALIDITY -sha256 -in server.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "server-cert.pem" -extfile extfile.cnf #CLIENTSIDE openssl genrsa -out "key.pem" 4096 openssl req -subj "/CN=$CLIENT_NAME" -new -key "key.pem" -out client.csr echo "extendedKeyUsage = clientAuth" > extfile.cnf openssl x509 -req -days $VALIDITY -sha256 -in client.csr -passin "pass:$PASSWORD" -CA "ca.pem" -CAkey "ca-key.pem" -CAcreateserial -out "cert.pem" -extfile extfile.cnf
若要直接使用以上过程作为脚本,需替换各变量为配置数值。生成 CA 时使用的参数若为空则写为“””。PASSWORD、COMMON_NAME、CLIENT_NAME、VALIDITY 为必选项。
容器引擎启动时添加 TLS 相关参数和认证插件相关参数,并保证认证插件的运行。此外,为了使用 TLS 认证,容器引擎必须使用 TCP 侦听的方式启动,不能使用传统的 unix socket 的方式启动。容器demon端配置如下:
{ "tls": true, "tls-verify": true, "tls-config": { "CAFile": "/root/.iSulad/ca.pem", "CertFile": "/root/.iSulad/server-cert.pem", "KeyFile":"/root/.iSulad/server-key.pem" }, "authorization-plugin": "authz-broker" }
然后需要配置策略,对于基本授权流程,所有策略都位于一个配置文件下
/var/lib/authz-broker/policy.json
。该配置文件支持动态修改,更改时不需要重新启动插件,只需要向 authz 进程发送 SIGHUP 信号。文件格式是每行一个策略 JSON 对象。每行只有一个匹配。具体的策略配置示例如下:- 所有用户都可以运行所有 iSulad 命令:
{“name”:“policy_0”,“users”:[””],“actions”:[””]}
。 - Alice 可以运行所有 iSulad 命令:
{“name”:“policy_1”,“users”:[“alice”],“actions”:[””]}
。 - 空用户都可以运行所有 iSulad 命令:
{“name”:“policy_2”,“users”:[””],“actions”:[””]}
。 - Alice 和 Bob 可以创建新的容器:
{“name”:“policy_3”,“users”:[“alice”,“bob”],“actions”:[“container_create”]}
。 - service_account 可以读取日志并运行 docker top:
{“name”:“policy_4”,“users”:[“service_account”],“actions”:[“container_logs”,“container_top”]}
。 - Alice 可以执行任何 container 操作:
{“name”:“policy_5”,“users”:[“alice”],“actions”:[“container”]}
。 - Alice 可以执行任何 container 操作,但请求的种类只能是 get:
{“name”:“policy_5”,“users”:[“alice”],“actions”:[“container”], “readonly”:true }
。
说明:
- 配置中匹配 action 支持正则表达式。
- users 不支持正则表达式。
- users 不能有重复用户,即同一用户不能被多条规则匹配。
- 所有用户都可以运行所有 iSulad 命令:
配置并更新完之后,客户端配置TLS参数连接容器引擎,即是以受限的权限访问。
[root@localhost ~]# isula version --tlsverify --tlscacert=/root/.iSulad/ca.pem --tlscert=/root/.iSulad/cert.pem --tlskey=/root/.iSulad/key.pem -H=tcp://127.0.0.1:2375
如果想默认配置 TLS 认证进行客户端连接,可以将文件移动到
~/.iSulad
,并设置 ISULAD_HOST 和 ISULAD_TLS_VERIFY 变量(而不是每次调用时传递-H=tcp://$HOST:2375
和--tlsverify
)。[root@localhost ~]# mkdir -pv ~/.iSulad [root@localhost ~]# cp -v {ca,cert,key}.pem ~/.iSulad [root@localhost ~]# export ISULAD_HOST=localhost:2375 ISULAD_TLS_VERIFY=1 [root@localhost ~]# isula version
proc 文件系统隔离(lxcfs)
场景描述
容器虚拟化带来轻量高效,快速部署的同时,也因其隔离性不够彻底,给用户带来一定程度的使用不便。由于 Linux 内核 namespace 本身还不够完善,因此容器在隔离性方面也存在一些缺陷。例如,在容器内部 proc 文件系统中可以看到宿主机上的 proc 信息(如 meminfo, cpuinfo,stat, uptime等)。利用 lxcfs 工具可以将容器内的看到宿主机 /proc 文件系统的内容,替换成本容器实例的相关 /proc 内容,以便容器内业务获取正确的资源数值。
接口说明
系统容器对外提供两个工具包:一个是 lxcfs 软件,另外一个是配合 lxcfs 一起使用的 isulad-lxcfs-toolkit
工具。其中 lxcfs 作为宿主机 daemon 进程常驻,isulad-lxcfs-toolkit
通过 hook 机制将宿主机的 lxcfs 文件系统绑定挂载到容器。
isulad-lxcfs-toolkit
命令行格式如下:
isulad-lxcfs-toolkit [OPTIONS] COMMAND [COMMAND_OPTIONS]
命令 | 功能说明 | 参数 |
---|---|---|
remount | 将 lxcfs 重新 mount 到容器中 | --all:对所有的容器执行 remout lxcfs 操作 --container-id:remount lxcfs 到特定的容器 ID |
umount | 将 lxcfs 从容器中 umount 掉 | --all:对所有的容器执行 umout lxcfs 操作 --container-id:对特定容器执行 umount lxcfs 操作 |
check-lxcfs | 检查 lxcfs 服务是否运行 | 无 |
prestart | 在 lxcfs 服务启动前 将 /var/lib/lxcfs 目录 mount 到容器中 |
无 |
约束限制
- 当前只支持 proc 文件系统下的 cpuinfo,meminfo,stat,diskstats,partitions,swaps 和 uptime文件,其他的文件和其他内核 API 文件系统(比如 sysfs)未做隔离 。
- 安装 rpm 包后会在
/var/lib/isulad/hooks/hookspec.json
生成样例 json 文件,用户如果需要增加日志功能,需要在定制时加入--log
配置。 - diskstats 只能显示支持 cfq 调度的磁盘信息,无法显示分区信息。容器内设备会被显示为 /dev 目录下的名字。若不存在则为空。此外,容器根目录所在设备会被显示为 sda。
- 挂载 lxcfs 时必须使用 slave 参数。若使用 shared 参数,可能会导致容器内挂载点泄露到主机,影响主机运行 。
- lxcfs 支持服务优雅降级使用,若 lxcfs 服务 crash 或者不可用,容器内查看到的 cpuinfo, meminfo,stat,diskstats,partitions,swaps 和uptime 均为 host 信息,容器其它业务功能不受影响。
- lxcfs 底层依赖 fuse 内核模块以及 libfuse 库,因此需要内核支持 fuse。
- lxcfs 当前仅支持容器内运行 64 位的 app,如果容器内运行 32 位的 app 可能会导致 app 读取到的 cpuinfo 信息不符合预期。
- lxcfs 只是对容器 cgroup 进行资源视图模拟,对于容器内的系统调用(例如 sysconf)获取到的仍然是主机的信息,lxcfs 无法做到内核隔离。
- lxcfs 使用隔离后的 cpuinfo 显示的 cpu 信息具有如下特征:
- processor:从 0 开始依次递增。
- physical id:从 0 开始依次递增。
- sibliing:固定为 1。
- core id:固定为 0。
- cpu cores:固定为 1。
使用示例
首先需要安装
lxcfs
和isulad-lxcfs-toolkit
这两个包,并启动lxcfs
服务。[root@localhost ~]# dnf install lxcfs isulad-lxcfs-toolkit [root@localhost ~]# systemctl start lxcfs
容器启动完成之后查看容器内是否存在 lxcfs 挂载点。
[root@localhost ~]# isula run -tid -v /var/lib/lxc:/var/lib/lxc --hook-spec /var/lib/isulad/hooks/hookspec.json --system-container --external-rootfs /home/root-fs none init a8acea9fea1337d9fd8270f41c1a3de5bceb77966e03751346576716eefa9782 [root@localhost ~]# isula exec a8 mount | grep lxcfs lxcfs on /var/lib/lxc/lxcfs type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) lxcfs on /proc/cpuinfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) lxcfs on /proc/diskstats type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) lxcfs on /proc/meminfo type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) lxcfs on /proc/partitions type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) lxcfs on /proc/stat type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) lxcfs on /proc/swaps type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other) lxcfs on /proc/uptime type fuse.lxcfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
执行
update
命令更新容器的 cpu 和 mem 资源配置,然后查看容器资源。根据如下回显可知,容器资源视图显示的是容器真实资源数据而不是宿主机的数据。[root@localhost ~]# isula update --cpuset-cpus 0-1 --memory 1G a8 a8 [root@localhost ~]# isula exec a8 cat /proc/cpuinfo processor : 0 BogoMIPS : 100.00 cpu MHz : 2400.000 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd08 CPU revision : 2 processor : 1 BogoMIPS : 100.00 cpu MHz : 2400.000 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid CPU implementer : 0x41 CPU architecture: 8 CPU variant : 0x0 CPU part : 0xd08 CPU revision : 2 [root@localhost ~]# isula exec a8 free -m total used free shared buff/cache available Mem: 1024 17 997 7 8 1006 Swap: 4095 0 4095
容器资源动态管理(isulad-tools)
普通容器无法支持对容器内的资源进行管理,例如添加一个块设备到容器、插入一块物理/虚拟网卡到容器。系统容器场景下,通过 isulad-tools
工具可以实现动态为容器挂载/卸载块设备,网络设备,路由和卷等资源。
要使用此功能,需要安装 isulad-tools
工具:
[root@localhost ~]# dnf install isulad-tools
设备管理
功能描述
isulad-tools
支持将宿主机上的块设备(比如磁盘、LVM)或字符设备(比如 GPU、binner、fuse)添加到容器中。在容器中使用该设备,例如可以对磁盘进行 fdisk 格式化,写入 fs 等操作。在容器不需要设备时,isulad-tools
可以将设备从容器中删除,归还宿主机。
命令格式
isulad-tools [COMMADN][OPTIONS] <container_id> [ARG...]
其中:
COMMAND:设备管理相关的命令。
OPTIONS:设备管理命令支持的选项。
container_id:容器 id。
ARG:命令对应的参数。
参数说明
命令 | 功能说明 | 选项说明 | 参数说明 |
---|---|---|---|
add-device | 将宿主机块设备/字符设备添加到容器中。 | 支持的选项如下: --blkio-weight-device:设置块设备 IO 权重(相对权重,10-100 之间)。 --device-read-bps:设置块设备读取速率限制(byte/秒)。 --device-read-iops:设置块设备读取速率限制(IO/秒)。 --device-write-bps:设置块设备写入速率限制(byte/秒)。 --device-write-iops:设置块设备写入速率限制(IO/秒)。 --follow-partition:如果块设备是基础块设备(主 SCSI 块磁盘),加入此参数可以添加主磁盘下的所有分区。 --force:如果容器中已有块设备/字符设备,使用此参数覆盖旧的块设备/字符设备文件。 --update-config-only:只更新配置文件不实际做添加磁盘动作。 |
参数格式为:hostdevice[:containerdevice][:permission] [hostdevice[:containerdevice][:permission] …] 其中: hostdevice:设备在主机上的路径。 containerdevice:设备在容器中的路径。 permission:容器内对设备的操作权限。 |
remove-device | 将块设备/字符设备从容器中删除,还原至宿主机。 | 支持的选项如下: --follow-partition:如果块设备是基础块设备(主 SCSI 块磁盘),加入此参数可以删除容器中主磁盘下的所有分区,还原至宿主机。 |
参数格式为:hostdevice[:containerdevice] [hostdevice[:containerdevice] …] 其中: hostdevice:设备在主机上的路径。 containerdevice:设备在容器中的路径。 |
list-device | 列出容器中所有的块设备/字符设备。 | 支持的选项如下: --pretty:按照json格式输出。 --sub-partition:如果某磁盘为主磁盘,加入此 flag,在显示主磁盘的同时,也显示主磁盘的子分区。 |
无 |
update-device | 更新磁盘 Qos。 | 支持的选项如下: --device-read-bps:设置块设备读取速率限制(byte/秒),建议设置值大于等于 1024。 --device-read-iops:设置块设备读取速率限制(IO/秒)。 --device-write-bps:设置块设备写入速率限制(byte/秒),建议设置值大于等于 1024。 --device-write-iops:设置块设备写入速率限制(IO/秒)。 |
无 |
约束限制
- 添加/删除设备的时机可以是容器实例非运行状态,完成操作后启动容器,容器内会有体现;也可以在容器运行时(running)动态添加。
- 不能在容器内和 host 上并发进行fdisk对磁盘的格式化写入,会影响容器磁盘使用。
- add-device 将磁盘添加到容器的特定目录时,如果容器内的父目录为多级目录(比如 /dev/a/b/c/d/e…)且目录层级不存在,则
isulad-tools
会自动在容器内创建对应目录;当删除时,不会将创建的父目录删除。如果用户下一次 add-device 到该父目录,则会提示已经存在无法添加成功。 - add-device 添加磁盘、更新磁盘参数时,配置磁盘 Qos;当配置磁盘 Qos 的 read/write bps、read/write IOPS 值时,不建议配置值过小,当设置过小时,会造成磁盘表现为不可读(实际原因是速度过慢),最终影响业务功能。
- 使用
--blkio-weight-device
来限制指定块设备的权重,如果当前块设备仅支持 BFQ 模式,可能会报错,提示用户检查当前 OS 环境是否支持 BFQ 块设备权重值设置。
使用示例
启动一个系统容器,指定
hook spec
为isulad hook
执行配置脚本[root@localhost ~]# isula run -tid --hook-spec /etc/isulad-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init eed1096c8c7a0eca6d92b1b3bc3dd59a2a2adf4ce44f18f5372408ced88f8350
添加一个块设备到容器
[root@localhost ~]# isulad-tools add-device ee /dev/sdb:/dev/sdb123 Add device (/dev/sdb) to container(ee,/dev/sdb123) done. [root@localhost ~]# isula exec ee fdisk -l /dev/sdb123 Disk /dev/sdb123: 50 GiB, 53687091200 bytes, 104857600 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xda58a448 Device Boot Start End Sectors Size Id Type /dev/sdb123p1 2048 104857599 104855552 50G 5 Extended /dev/sdb123p5 4096 104857599 104853504 50G 83 Linux
更新设备信息
[root@localhost ~]# isulad-tools update-device --device-read-bps /dev/sdb:10m ee Update read bps for device (/dev/sdb,10485760) done.
删除设备
[root@localhost ~]# isulad-tools remove-device ee /dev/sdb:/dev/sdb123 Remove device (/dev/sdb) from container(ee,/dev/sdb123) done. Remove read bps for device (/dev/sdb) done.
网卡管理
功能描述
isulad-tools
支持将宿主机上的物理网卡或虚拟网卡插入到容器,在不使用网卡的时候从容器中删除归还给宿主机,并且可以动态修改网卡配置。插入物理网卡即把宿主机上一块网卡直接添加到容器中,插入虚拟网卡则需要先创建一对 veth pair,之后将一端插入到容器中。
命令格式
isulad-tools [COMMADN][OPTIONS] <container_id>
其中:
COMMAND:网卡管理相关的命令。
OPTIONS:网卡管理命令支持的选项。
container_id:容器id。
参数说明
命令 | 功能说明 | 选项说明 |
---|---|---|
add-nic | 给容器创建一个网卡。 | 支持的选项如下: --type:设置网卡类型,当前只支持 eth/veth。 --name:设置网卡名称,格式为 [host:] --ip:设置网卡 IP 地址。 --mac:设置网卡 mac 地址。 --bridge:设置网卡绑定的网桥。 --mtu:设置网卡的 mtu 值,默认 1500。 --update-config-only:如果此 flag 设置了,只更新配置文件, 不会实际做添加网卡的动作。 --qlen:配置 qlen 值,默认为 1000。 |
remove-nic | 从容器中将网卡删除, 还原至宿主机。 |
支持的选项如下: --type:设置网卡的类型。 --name:设置网卡的名称,格式为 [host:] |
list-nic | 列出容器中所有的网卡。 | 支持的选项如下: --pretty:按照json格式输出。 --filter:按照过滤格式输出,比如--filter ‘{“ip”:“192.168.3.4⁄24”, “Mtu”:1500}‘。 |
update-nic | 更改容器内指定网卡 的配置参数。 |
支持的选项如下: --name:容器内网卡名(必须项)。 --ip:设置网卡 IP 地址。 --mac:设置网卡 mac 地址。 --bridge:设置网卡绑定的网桥。 --mtu:设置网卡的 mtu 值。 --update-config-only:如果此 flag 设置了,只更新配置文件, 不会实际做更新网卡的动作。 --qlen:配置 qlen 值。 |
约束限制
- 支持添加物理网卡(eth)和虚拟网卡(veth)两种类型。
- 在添加网卡时可以同时对网卡进行配置,参数包括 --ip/--mac/--bridge/--mtu/--qlen。
- 支持最多添加8个物理网卡到容器。
- 使用
isulad-tools add-nic
向容器添加 eth 网卡后,如果不加 hook,在容器退出前必须手工将 nic 删除,否则在 host 上的 eth 网卡的名字会被更改成容器内的名字。 - 对于物理网卡(1822 vf 网卡除外),add-nic 必须使用原 mac 地址,update-nic 禁止修改 mac 地址,容器内也不允许修改 mac 地址。
- 使用
isulad-tools add-nic
时,设置 mtu 值,设置范围跟具体的网卡型号有关。 - 使用
isulad-tools
向容器添加网卡和路由时,建议先执行add-nic
添加网卡,然后执行add-route
添加路由;使用isulad-tools
从容器删除网卡和路由时,建议先执行remove-route
删除路由,然后执行remove-nic
删除网卡。 - 使用
isulad-tools
添加网卡时,一块网卡只能添加到一个容器中。
使用示例
启动一个系统容器,指定
hook spec
为isulad hook
执行配置脚本:[root@localhost ~]# isula run -tid --hook-spec /etc/isulad-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init 2aaca5c1af7c872798dac1a468528a2ccbaf20b39b73fc0201636936a3c32aa8
添加一个虚拟网卡到容器
[root@localhost ~]# isulad-tools add-nic --type "veth" --name abc2:bcd2 --ip 172.17.28.5/24 --mac 00:ff:48:13:xx:xx --bridge docker0 2aaca5c1af7c Add network interface to container 2aaca5c1af7c (bcd2,abc2) done
添加一个物理网卡到容器
[root@localhost ~]# isulad-tools add-nic --type "eth" --name eth3:eth1 --ip 172.17.28.6/24 --mtu 1300 --qlen 2100 2aaca5c1af7c Add network interface to container 2aaca5c1af7c (eth3,eth1) done
说明:
添加虚拟网卡或物理网卡时,请确保网卡处于空闲状态,添加正在使用的网卡会导致系统网络断开。
路由管理
功能描述
isulad-tools
工具可以对系统容器进行动态添加/删除路由表。
命令格式
isulad-tools [COMMADN][OPTIONS] <container_id> [ARG...]
其中:
COMMAND:路由管理相关的命令。
OPTIONS:路由管理命令支持的选项。
container_id:容器 id。
ARG:命令对应的参数。
接口说明
命令 | 功能说明 | 选项说明 | 参数说明 |
---|---|---|---|
add-route | 将网络 路由规则 添加到 容器中。 |
支持的选项如下: --update-config-only:添加此参数, 只更新配置文件, 不做实际的更新路由表的动作。 |
参数格式: [{rule1},{rule2}] rule样例: ‘[ { “dest”:“default”, “gw”:“192.168.10.1” }, { “dest”:“192.168.0.0/16”, “dev”:“eth0”,“src”:“192.168.1.2” } ]’ dest:目标网络,如果为空则是默认网关。 src:路由源IP。 gw:路由网关。 dev:网络设备。 |
remove-route | 从容器中 删除路由。 |
支持的选项如下: --update-config-only:设置此参数, 只更新配置文件, 不做实际从容器中删除路由的动作。 |
参数格式: [{rule1},{rule2}] rule样例: ‘[ { “dest”:“default”, “gw”:“192.168.10.1” }, { “dest”:“192.168.0.0/16”, “dev”:“eth0”, “src”:“192.168.1.2” } ]’ dest:目标网络,如果为空则是默认网关。 src:路由源IP。 gw:路由网关。 dev:网络设备。 |
list-route | 列出容器中 所有的 路由规则。 |
支持的选项如下: --pretty:按照json格式输出。 --filter:按照过滤格式输出, 比如--filter ‘{“ip”:“192.168.3.4⁄24”, “Mtu”:1500}‘。 |
无 |
约束限制
- 使用
isulad-tools
向容器添加网卡和路由时,建议先执行add-nic
添加网卡,然后执行add-route
添加路由;使用isulad-tools
从容器删除网卡和路由时,建议先执行remove-route
删除路由,然后执行remove-nic
删除网卡。 - 向容器内添加路由规则时,需确保所添加的路由规则与容器内现有的路由规则不会产生冲突。
使用示例
启动一个系统容器,指定
hook spec
为isulad hook
执行配置脚本:[root@localhost ~]# isula run -tid --hook-spec /etc/isulad-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init 0d2d68b45aa0c1b8eaf890c06ab2d008eb8c5d91e78b1f8fe4d37b86fd2c190b
isulad-tools
向系统容器添加一块物理网卡:[root@localhost ~]# isulad-tools add-nic --type "eth" --name enp4s0:eth123 --ip 172.17.28.6/24 --mtu 1300 --qlen 2100 0d2d68b45aa0 Add network interface (enp4s0) to container (0d2d68b45aa0,eth123) done
isulad-tools
添加一条路由规则到系统容器,注意格式需按照 ’[{“dest”:“default”, “gw”:“192.168.10.1”},{“dest”:“192.168.0.0/16”,“dev”:“eth0”,“src”:“192.168.1.2”}]‘ 来配置。如果 dest 为空会自动填成 default。[root@localhost ~]# isulad-tools add-route 0d2d68b45aa0 '[{"dest":"172.17.28.0/32", "gw":"172.17.28.5","dev":"eth123"}]' Add route to container 0d2d68b45aa0, route: {dest:172.17.28.0/32,src:,gw:172.17.28.5,dev:eth123} done
查看容器内是否新增一条路由规则:
[root@localhost ~]# isula exec -it 0d2d68b45aa0 route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.17.28.0 172.17.28.5 255.255.255.255 UGH 0 0 0 eth123 172.17.28.0 0.0.0.0 255.255.255.0 U 0 0 0 eth123
挂卷管理
功能描述
普通容器仅支持在创建时指定 --volume参数将宿主机的目录/卷挂载到容器实现资源共享,但是无法在容器运行时将挂载到容器中的目录/卷卸载掉,也不支持将宿主机的目录/卷挂载到容器。系统容器可以通过 isulad-tools
工具实现动态将宿主机的目录/卷挂载到容器,以及将容器中的目录/卷进行卸载。
命令格式
isulad-tools [COMMADN][OPTIONS] <container_id> [ARG...]
其中:
COMMAND:路由管理相关的命令。
OPTIONS:路由管理命令支持的选项。
container_id:容器 id。
ARG:命令对应的参数。
接口说明
表 1
命令 | 功能说明 | 选项说明 | 参数说明 |
---|---|---|---|
add-path | 文件/目录添加到容器中。 | 无 | 参数格式为: hostpath:containerpath:permission [hostpath:containerpath:permission …] 其中: hostdevice:卷在主机上的路径。 containerdevice:卷在容器中的路径。 permission:容器内对挂载路径的操作权限。 |
remove-path | 目录/文件删除,还原到宿主机中。 | 无 | 参数格式为: hostpath:containerpath [hostpath:containerpath …] 其中: hostdevice:卷在主机上的路径。 containerdevice:卷在容器中的路径。 |
list-path | 列出容器中所有的 path 目录。 | 支持的选项如下: --pretty:按照 json 格式输出。 |
无 |
约束限制
- 挂载目录(add-path)的时候必须要指定绝对路径。
- 挂载目录(add-path)会在主机上生成
/.sharedpath
挂载点。 - 最多可以向单个容器中添加 128 个 volume,超过 128 后无法添加成功。
add-path
不能将主机目录覆盖容器中的根目录目录(/),否则会造成功能影响。
使用示例
启动一个系统容器,指定
hook spec
为isulad hook
执行配置脚本:[root@localhost ~]# isula run -tid --hook-spec /etc/isulad-tools/hookspec.json --system-container --external-rootfs /root/root-fs none init e45970a522d1ea0e9cfe382c2b868d92e7b6a55be1dd239947dda1ee55f3c7f7
isulad-tools
将宿主机某个目录挂载到容器,实现资源共享:[root@localhost ~]# isulad-tools add-path e45970a522d1 /home/test123:/home/test123 Add path (/home/test123) to container(e45970a522d1,/home/test123) done.
宿主机目录 /home/test123 创建一个文件,然后在容器内查看文件是否可以访问:
[root@localhost ~]# echo "hello world" > /home/test123/helloworld [root@localhost ~]# isula exec e45970a522d1 bash [root@localhost /]# cat /home/test123/helloworld hello world
isulad-tools
将挂载目录从容器内删除:[root@localhost ~]# isulad-tools remove-path e45970a522d1 /home/test123:/home/test123 Remove path (/home/test123) from container(e45970a522d1,/home/test123) done [root@localhost ~]# isula exec e45970a522d1 bash [root@localhost /]# ls /home/test123/helloworld ls: cannot access '/home/test123/helloworld': No such file or directory