TLES V15.00
容器用户指南
目录
商标声明
版权所有© 2020 北京拓林思软件有限公司。Turbolinux是北京拓林思软件有限公司的注册商标。Linux是Linus Torvalds先生的注册商标。openEuler为华为技术有限公司的商标。本文档提及的其他所有商标或注册商标,由各自的所有人拥有。所有其它商标归其相应的所有者所有。
免责声明
本文档仅供信息参考,这里提供的信息可能有所变化,将不另行通知。Turbolinux公司不承诺对于本文档有关的任何保证负责。
概述
TurboLinux Enterprise Server 15是一款基于openEuler开源源码开发的开源操作系统。
TurboLinux Enterprise Server 15中提供容器运行的基础平台 iSula。
iSula 为华为容器技术方案品牌,其原意是一种非常强大的蚂蚁,学术上称为“子弹蚁”,因为被它咬一口,犹如被子弹打到那般疼痛。在居住于中南美洲亚马逊丛林的巴西原住民眼里,iSula 是世界上非常强大的昆虫之一。华为容器技术方案品牌因其含义取名。
iSula 基础容器平台同时提供 Docker engine 与轻量化容器引擎 iSulad,用户可根据需要自主选择。
同时根据不同使用场景,提供多种容器形态,包括:
适合大部分通用场景的普通容器
适合强隔离与多租户场景的安全容器
适合使用systemd管理容器内业务场景的系统容器
本文档提供容器引擎的安装和使用方法以及各个容器形态的部署使用方法。
读者对象
本文档主要适用于使用TurboLinux Enterprise Server 15并需要安装容器的用户。用户需要具备以下经验和技能:
熟悉Linux基本操作
对容器有一定了解
iSula通用容器引擎相比docker,是一种新的容器解决方案,提供统一的架构设计来满足CT和IT领域的不同需求。相比Golang编写的Docker,轻量级容器使用C/C++实现,具有轻、灵、巧、快的特点,不受硬件规格和架构的限制,底噪开销更小,可应用领域更为广泛。
容器统一架构如图所示。
iSulad可以通过yum或rpm命令两种方式安装,由于yum会自动安装依赖,而rpm命令需要手动安装所有依赖,所以推荐使用yum安装。
这里给出两种安装方式的操作方法。
(推荐)使用yum安装iSulad,参考命令如下:
$ sudo yum install -y iSulad
使用rpm安装iSulad,需要下载iSulad及其所有依赖库的RPM包,然后手动安装。安装单个iSulad的RPM包(依赖包安装方式相同),参考命令如下:
$ sudo rpm -ihv iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm
轻量级容器引擎(iSulad)服务端daemon为isulad,isulad可以通过配置文件进行配置,也可以通过命令行的方式进行配置,例如:isulad –xxx,优先级从高到低是:命令行方式>配置文件>代码中默认配置。
说明:如果采用systemd管理iSulad进程,修改/etc/sysconfig/iSulad文件中的OPTIONS字段,等同于命令行方式进行配置。
命令行方式
在启动服务的时候,直接通过命令行进行配置。其配置选项可通过以下命令查阅:
$
isulad --help
lightweight container runtime daemon
Usage: isulad [global options]
GLOBAL OPTIONS:
--authorization-plugin Use authorization plugin
--cgroup-parent Set parent cgroup for all containers
--cni-bin-dir The full path of the directory in which to search for CNI plugin binaries. Default: /opt/cni/bin
--cni-conf-dir The full path of the directory in which to search for CNI config files. Default: /etc/cni/net.d
--default-ulimit Default ulimits for containers (default [])
-e, --engine Select backend engine
-g, --graph Root directory of the iSulad runtime
-G, --group Group for the unix socket(default is isulad)
--help Show help
--hook-spec Default hook spec file applied to all containers
-H, --host The socket name used to create gRPC server
--image-layer-check Check layer intergrity when needed
--image-opt-timeout Max timeout(default 5m) for image operation
--insecure-registry Disable TLS verification for the given registry
--insecure-skip-verify-enforce Force to skip the insecure verify(default false)
--log-driver Set daemon log driver, such as: file
-l, --log-level Set log level, the levels can be: FATAL ALERT CRIT ERROR WARN NOTICE INFO DEBUG TRACE
--log-opt Set daemon log driver options, such as: log-path=/tmp/logs/ to set directory where to store daemon logs
--native.umask Default file mode creation mask (umask) for containers
--network-plugin Set network plugin, default is null, suppport null and cni
-p, --pidfile Save pid into this file
--pod-sandbox-image The image whose network/ipc namespaces containers in each pod will use. (default "rnd-dockerhub.huawei.com/library/pause-${machine}:3.0")
--registry-mirrors Registry to be prepended when pulling unqualified images, can be specified multiple times
--start-timeout timeout duration for waiting on a container to start before it is killed
-S, --state Root directory for execution state files
--storage-driver Storage driver to use(default overlay2)
-s, --storage-opt Storage driver options
--tls Use TLS; implied by --tlsverify
--tlscacert Trust certs signed only by this CA (default "/root/.iSulad/ca.pem")
--tlscert Path to TLS certificate file (default "/root/.iSulad/cert.pem")
--tlskey Path to TLS key file (default "/root/.iSulad/key.pem")
--tlsverify Use TLS and verify the remote
--use-decrypted-key Use decrypted private key by default(default true)
-V, --version Print the version
--websocket-server-listening-port CRI websocket streaming service listening port (default 10350)
示例: 启动isulad,并将日志级别调整成DEBUG
$ isulad -l DEBUG
配置文件方式
isulad配置文件为/etc/isulad/daemon.json,各配置字段说明如下:
配置参数 |
配置文件示例 |
参数解释 |
备注 |
-e, –engine |
“engine”: “lcr” |
iSulad的运行时,默认是lcr |
无 |
-G, –group |
“group”: “isulad” |
socket所属组 |
无 |
–hook-spec |
“hook-spec”: “/etc/default/isulad/hooks/default.json” |
针对所有容器的默认钩子配置文件 |
无 |
-H, –host |
“hosts”: “unix:///var/run/isulad.sock” |
通信方式 |
除本地socket外,还支持tcp://ip:port方式,port范围(0-65535,排除被占用端口) |
–log-driver |
“log-driver”: “file” |
日志驱动配置 |
无 |
-l, –log-level |
“log-level”: “ERROR” |
设置日志输出级别 |
无 |
–log-opt |
“log-opts”: { “log-file-mode”: “0600”, “log-path”: “/var/lib/isulad”, “max-file”: “1”, “max-size”: “30KB” } |
日志相关的配置 |
可以指定max-file,max-size,log-path。max-file指日志文件个数;max-size指日志触发防爆的阈值,若max-file为1,max-size失效;log-path指定日志文件存储路径;log-file-mode用于设置日志文件的读写权限,格式要求必须为八进制格式,如0666。 |
–start-timeout |
“start-timeout”: “2m” |
启动容器的耗时 |
无 |
-p, –pidfile |
“pidfile”: “/var/run/isulad.pid” |
保存pid的文件 |
当启动一个容器引擎的时候不需要配置,当需要启动两个以上的容器引擎时才需要配置。 |
-g, –graph |
“graph”: “/var/lib/isulad” |
iSulad运行时的根目录 |
|
-S, –state |
“state”: “/var/run/isulad” |
执行文件的根目录 |
|
–storage-driver |
“storage-driver”: “overlay2” |
镜像存储驱动,默认为overlay2 |
当前只支持overlay2 |
-s, –storage-opt |
“storage-opts”: [ “overlay2.override_kernel_check=true” ] |
镜像存储驱动配置选项 |
可使用的选项为:
overlay2.overri说明如下:de_kernel_check=true # 忽略内核版本检查
overlay2.size=${size} # 设置rootfs quota限额为${size}大小
overlay2.basesize=${size} #等价于overlay2.size
|
–image-opt-timeout |
“image-opt-timeout”: “5m” |
镜像操作超时时间,默认为5m |
值为-1表示不限制超时。 |
–registry-mirrors |
“registry-mirrors”: [ “docker.io” ] |
镜像仓库地址 |
无 |
–insecure-registry |
“insecure-registries”: [ ] |
不使用TLS校验的镜像仓库 |
无 |
–native.umask |
“native.umask”: “secure” |
容器umask策略,默认”secure”,normal为不安全配置 |
设置容器umask值。 支持配置空字符(使用默认值0027)、”normal”、”secure”:
normal # 启动的容器umask值为0022
secure # 启动的容器umask值为0027(默认值)
|
–pod-sandbox-image |
“pod-sandbox-image”: “rnd-dockerhub.huawei.com/library/pause-aarch64:3.0” |
pod默认使用镜像,默认为”rnd-dockerhub.huawei.com/library/pause-${machine}:3.0” |
无 |
–network-plugin |
“network-plugin”: “” |
指定网络插件,默认为空字符,表示无网络配置,创建的sandbox只有loop网卡。 |
支持cni和空字符,其他非法值会导致isulad启动失败。 |
–cni-bin-dir |
“cni-bin-dir”: “” |
指定cni插件依赖的二进制的存储位置 |
默认为/opt/cni/bin |
–cni-conf-dir |
“cni-conf-dir”: “” |
指定cni网络配置文件的存储位置 |
默认为/etc/cni/net.d |
–image-layer-check=false |
“image-layer-check”: false |
开启镜像层完整性检查功能,设置为true;关闭该功能,设置为false。默认为关闭。 |
isulad启动时会检查镜像层的完整性,如果镜像层被破坏,则相关的镜像不可用。isulad进行镜像完整性校验时,无法校验内容为空的文件和目录,以及链接文件。因此若镜像因掉电导致上述类型文件丢失,isulad的镜像数据完整性校验可能无法识别。isulad版本变更时需要检查是否支持该参数,如果不支持,需要从配置文件中删除。 |
–insecure-skip-verify-enforce=false |
“insecure-skip-verify-enforce”: false |
Bool类型,是否强制跳过证书的主机名/域名验证,默认为false。当设置为true时,为不安全配置,会跳过证书的主机名/域名验证 |
默认为false(不跳过),注意:因isulad使用的yajl json 解析库限制,若在/etc/isulad/daemon.json配置文件中配置非Bool类型的其他符合json格式的值时,isulad将使用默认值false。 |
–use-decrypted-key=true |
“use-decrypted-key”: true |
Bool类型,指定是否使用不加密的私钥。指定为true,表示使用不加密的私钥;指定为false,表示使用的为加密后的私钥,即需要进行双向认证。 |
默认配置为true(使用不加密的私钥),注意:因isulad使用的yajl json 解析库限制,若在/etc/isulad/daemon.json配置文件中配置非Bool类型的其他符合json格式的值时,isulad将使用默认值true。 |
–tls |
“tls”:false |
Bool类型,是否使用TLS |
默认值为false, 仅用于-H tcp://IP:PORT方式 |
–tlsverify |
“tlsverify”:false |
Bool类型,是否使用TLS,并验证远程访问 |
仅用于-H tcp://IP:PORT方式 |
–tlscacert –tlscert –tlskey |
“tls-config”: { “CAFile”: “/root/.iSulad/ca.pem”, “CertFile”: “/root/.iSulad/server-cert.pem”, “KeyFile”:“/root/.iSulad/server-key.pem” } |
TLS证书相关的配置 |
仅用于-H tcp://IP:PORT方式 |
–authorization-plugin |
“authorization-plugin”: “authz-broker” |
用户权限认证插件 |
当前只支持authz-broker |
–cgroup-parent |
“cgroup-parent”: “lxc/mycgroup” |
字符串类型,容器默认cgroup父路径 |
指定daemon端容器默认的cgroup父路径,如果客户端指定了–cgroup-parent,以客户端参数为准。 注意:如果启了一个容器A,然后启一个容器B,容器B的cgroup父路径指定为容器A的cgroup路径,在删除容器的时候需要先删除容器B再删除容器A,否则会导致cgroup资源残留。 |
–default-ulimits |
“default-ulimits”: { “nofile”: { “Name”: “nofile”, “Hard”: 6400, “Soft”: 3200 } } |
ulimit指定限制的类型,soft值及hard值 |
指定限制的资源类型,如“nofile”。两个字段名字必须相同,即都为nofile,否则会报错。Hard指定的值需要大于等于Soft’。如果Hard字段或者Soft字段未设置,则默认该字段默认为0。 |
server-listening-port |
“websocket-server-listening-port“: 10350 |
设置CRI websocket流式服务监听端口,默认端口号10350 |
指定CRI websocket流式服务监听端,如果客户端指定了 –websocket-server-listening-port,以客户端参数为准。端口范围1024-49151 |
示例:
$
cat /etc/isulad/daemon.json
{
"group": "isulad",
"graph": "/var/lib/isulad",
"state": "/var/run/isulad",
"engine": "lcr",
"log-level": "ERROR",
"pidfile": "/var/run/isulad.pid",
"log-opts": {
"log-file-mode": "0600",
"log-path": "/var/lib/isulad",
"max-file": "1",
"max-size": "30KB"
},
"log-driver": "stdout",
"hook-spec": "/etc/default/isulad/hooks/default.json",
"start-timeout": "2m",
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": [
"docker.io"
],
"insecure-registries": [
"rnd-dockerhub.huawei.com"
],
"pod-sandbox-image": "",
"image-opt-timeout": "5m",
"native.umask": "secure",
"network-plugin": "",
"cni-bin-dir": "",
"cni-conf-dir": "",
"image-layer-check": false,
"use-decrypted-key": true,
"insecure-skip-verify-enforce": false
}
说明:默认配置文件/etc/isulad/daemon.json仅供参考,请根据实际需要进行配置
文件名 |
文件路径 |
内容 |
|
/etc/default/isulad/ |
存放isulad的OCI配置文件和钩子模板文件,文件夹下的配置文件权限设置为0640,sysmonitor检查脚本权限为0550 |
|
/etc/isulad/ |
isulad的默认配置文件和seccomp的默认配置文件↵ |
isulad.sock |
/var/run/ |
管道通信文件,客户端和isulad的通信使用的socket文件 |
isulad.pid |
/var/run/ |
存放isulad的PID,同时也是一个文件锁防止启动多个isulad实例 |
|
/run/lxc/ |
文件锁文件,isula运行过程创建的文件 |
|
/var/run/isulad/ |
实时通讯缓存文件,isulad运行过程创建的文件 |
|
/var/run/isula/ |
实时通讯缓存文件,isula运行过程创建的文件 |
|
/var/lib/lcr/ |
LCR 组件临时目录 |
* |
/var/lib/isulad/ |
isulad运行的根目录,存放创建的容器配置、日志的默认路径、数据库文件、mount点等 /var/lib/isulad/mnt/ :容器rootfs的mount点 /var/lib/isulad/engines/lcr/ :存放lcr容器配置目录,每个容器一个目录(以容器名命名) |
参考实践情况,平衡性能和内存,可以设置MALLOC_ARENA_MAX为4。(在arm64服务器上面对iSulad的性能影响在10%以内)
配置方法:
1. 手动启动iSulad的场景,可以直接export MALLOC_ARENA_MAX=4,然后再启动iSulad即可。
2. systemd管理iSulad的场景,可以修改/etc/sysconfig/iSulad,增加一条MALLOC_ARENA_MAX=4即可。
以–root为例,当使用/new/path/作为daemon新的Root Dir时,如果/new/path/下已经存在文件,且目录或文件名与isulad需要使用的目录或文件名冲突(例如:engines、mnt等目录)时,isulad可能会更新原有目录或文件的属性,包括属主、权限等为自己的属主和权限。
所以,用户需要明白重新指定各种运行目录和文件,会对冲突目录、文件属性的影响。建议用户指定的新目录或文件为isulad专用,避免冲突导致的文件属性变化以及带来的安全问题。
须知:
日志功能对接: iSulad由systemd管理,日志也由systemd管理,然后传输给rsyslogd。rsyslog默认会对写日志速度有限制,可以通过修改/etc/rsyslog.conf文件,增加”$imjournalRatelimitInterval 0”配置项,然后重启rsyslogd的服务即可。
使用iSulad命令行接口时,其参数解析方式与docker略有不同,对于命令行中带参数的flag,不管使用长flag还是短flag,只会将该flag后第一个空格或与flag直接相连接的’=‘后的字符串作为flag的参数,具体如下:
使用短flag时,与“-”连接的字符串中的每个字符都被当作短flag(当有=号时,=号后的字符串当成=号前的短flag的参数)。
isula run -du=root busybox 等价于 isula run -du root busybox 或 isula run -d -u=root busybox 或 isula run -d -u root busybox ,当使用isula run -du:root时,由于-:不是有效的短flag,因此会报错。前述的命令行也等价于isula run -ud root busybox,但不推荐这种使用方式,可能带来语义困扰。
使用长flag时,与“–”连接的字符串作为一个整体当成长flag,若包含=号,则=号前的字符串为长flag,=号后的为参数。
isula run --user=root busybox
等价于
isula run --user root busybox
描述
daemon端可以绑定多个unix socket或者tcp端口,并在这些端口上监听,客户端可以通过这些端口和daemon端进行交互。
接口
用户可以在/etc/isulad/daemon.json文件的hosts字段配置一个或者多个端口。当然用户也可以不指定hosts。
{
"hosts": [
"unix:///var/run/isulad.sock",
"tcp://localhost:5678",
"tcp://127.0.0.1:6789"
]
}
用户也可以在/etc/sysconfig/iSulad中通过-H或者–host配置端口。用户同样可以不指定hosts。
OPTIONS='-H unix:///var/run/isulad.sock --host tcp://127.0.0.1:6789'
如果用户在daemon.json文件及iSulad中均未指定hosts,则daemon在启动之后将默认监听unix:///var/run/isulad.sock。
限制
用户不可以在/etc/isulad/daemon.json和/etc/sysconfig/iSuald两个文件中同时指定hosts,如果这样做将会出现错误,isulad无法正常启动;
unable to configure the isulad with file /etc/isulad/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [unix:///var/run/isulad.sock tcp://127.0.0.1:6789], from file: [unix:///var/run/isulad.sock tcp://localhost:5678 tcp://127.0.0.1:6789])
若指定的host是unix socket,则必须是合法的unix socket,需要以”unix://“开头,后跟合法的socket绝对路径;
若指定的host是tcp端口,则必须是合法的tcp端口,需要以”tcp://“开头,后跟合法的IP地址和端口,IP地址可以为localhost;
可以指定至多10个有效的端口,超过10个则会出现错误,isulad无法正常启动。
描述
iSulad采用C/S模式进行设计,在默认情况,iSulad守护进程isulad只侦听本地/var/run/isulad.sock,因此只能在本地通过客户端isula执行相关命令操作容器。为了能使isula可以远程访问容器,isulad守护进程需要通过tcp:ip的方式侦听远程访问的端口。然而,仅通过简单配置tcp ip:port进行侦听,这样会导致所有的ip都可以通过调用isula -H tcp://:port与isulad通信,容易导致安全问题,因此推荐使用较安全版本的TLS(Transport Layer Security - 安全传输层协议)方式进行远程访问。
生成TLS证书
明文私钥和证书生成方法示例
#!/bin/bash
set -e
echo -n "Enter pass phrase:"
read password
echo -n "Enter public network ip:"
read publicip
echo -n "Enter host:"
read HOST
echo " => Using hostname: $publicip, You MUST connect to iSulad using this host!"
mkdir -p $HOME/.iSulad
cd $HOME/.iSulad
rm -rf $HOME/.iSulad/*
echo " => Generating CA key"
openssl genrsa -passout pass:$password -aes256 -out ca-key.pem 4096
echo " => Generating CA certificate"
openssl req -passin pass:$password -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=CN/ST=zhejiang/L=hangzhou/O=Huawei/OU=iSulad/CN=iSulad@huawei.com"
echo " => Generating server key"
openssl genrsa -passout pass:$password -out server-key.pem 4096
echo " => Generating server CSR"
openssl req -passin pass:$password -subj /CN=$HOST -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = DNS:$HOST,IP:$publicip,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
echo " => Signing server CSR with CA"
openssl x509 -req -passin pass:$password -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
echo " => Generating client key"
openssl genrsa -passout pass:$password -out key.pem 4096
echo " => Generating client CSR"
openssl req -passin pass:$password -subj '/CN=client' -new -key key.pem -out client.csr
echo " => Creating extended key usage"
echo extendedKeyUsage = clientAuth > extfile-client.cnf
echo " => Signing client CSR with CA"
openssl x509 -req -passin pass:$password -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
加密私钥和证书请求文件生成方法示例
#!/bin/bash
echo -n "Enter public network ip:"
read publicip
echo -n "Enter pass phrase:"
read password
# remove certificates from previous execution.
rm -f *.pem *.srl *.csr *.cnf
# generate CA private and public keys
echo 01 > ca.srl
openssl genrsa -aes256 -out ca-key.pem -passout pass:$password 2048
openssl req -subj '/C=CN/ST=zhejiang/L=hangzhou/O=Huawei/OU=iSulad/CN=iSulad@huawei.com' -new -x509 -days $DAYS -passin pass:$password -key ca-key.pem -out ca.pem
# create a server key and certificate signing request (CSR)
openssl genrsa -aes256 -out server-key.pem -passout pass:$PASS 2048
openssl req -new -key server-key.pem -out server.csr -passin pass:$password -subj '/CN=iSulad'
echo subjectAltName = DNS:iSulad,IP:${publicip},IP:127.0.0.1 > extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
# sign the server key with our CA
openssl x509 -req -days $DAYS -passin pass:$password -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem -extfile extfile.cnf
# create a client key and certificate signing request (CSR)
openssl genrsa -aes256 -out key.pem -passout pass:$password 2048
openssl req -subj '/CN=client' -new -key key.pem -out client.csr -passin pass:$password
# create an extensions config file and sign
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -passin pass:$password -in client.csr -CA ca.pem -CAkey ca-key.pem -out cert.pem -extfile extfile.cnf
# remove the passphrase from the client and server key
openssl rsa -in server-key.pem -out server-key.pem -passin pass:$password
openssl rsa -in key.pem -out key.pem -passin pass:$password
# remove generated files that are no longer required
rm -f ca-key.pem ca.srl client.csr extfile.cnf server.csr
接口
{
"tls": true,
"tls-verify": true,
"tls-config": {
"CAFile": "/root/.iSulad/ca.pem",
"CertFile": "/root/.iSulad/server-cert.pem",
"KeyFile":"/root/.iSulad/server-key.pem"
}
}
限制
服务端支持的模式如下:
模式1(验证客户端):tlsverify, tlscacert, tlscert, tlskey。
模式2(不验证客户端):tls, tlscert, tlskey。
客户端支持的模式如下:
模式1(使用客户端证书进行身份验证,并根据给定的CA验证服务器):tlsverify, tlscacert, tlscert, tlskey。
模式2(验证服务器):tlsverify, tlscacert。
如果需要采用双向认证方式进行通讯,则服务端采用模式1,客户端采用模式1;
如果需要采用单向认证方式进行通讯,则服务端采用模式2,客户端采用模式2。
须知:
- 采用RPM安装方式时,服务端配置可通过/etc/isulad/daemon.json以及/etc/sysconfig/iSulad配置修改
- 相比非认证或者单向认证方式,双向认证具备更高的安全性,推荐使用双向认证的方式进行通讯
- GRPC开源组件日志不由iSulad进行接管,如果需要查看GRPC相关日志,请按需设置GRPC_VERBOSITY和GRPC_TRACE环境变量
示例
服务端:
isulad -H=tcp://0.0.0.0:2376 --tlsverify --tlscacert ~/.iSulad/ca.pem --tlscert ~/.iSulad/server-cert.pem --tlskey ~/.iSulad/server-key.pem
客户端:
isula version -H=tcp://$HOSTIP:2376 --tlsverify --tlscacert ~/.iSulad/ca.pem --tlscert ~/.iSulad/cert.pem --tlskey ~/.iSulad/key.pem
卸载iSulad的操作步骤如下:
卸载iSulad及其依赖软件包
若使用yum方式安装,卸载的参考命令如下:
$ sudo yum remove iSulad
若使用rpm方式安装,需卸载iSulad及其依赖包,卸载单个RPM包的参考命令如下:
sudo rpm -e iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm
镜像、容器、volumes以及相关配置文件不会自动删除,需要手动删除。参考命令如下:
$ sudo rm -rf /var/lib/iSulad
描述
isula create 命令用于创建一个新的容器。容器引擎会使用指定的容器镜像创建容器读写层,或者使用指定的本地rootfs作为容器的运行环境。创建完成后,会将容器的ID输出到标准输出,后续可以使用isula start 命令启动该容器。新创建的容器状态为inited状态
用法
isula create [OPTIONS] IMAGE [COMMAND] [ARG...]
参数
create命令支持参数参考下表。
命令 |
参数 |
说明 |
create
|
–annotation |
设置容器的annotations。例如支持native.umask选项:
–annotation native.umask=normal # 启动的容器umask值为0022
–annotation native.umask=secure # 启动的容器umask值为0027
注意如果没有配置该参数,则使用isulad中的umask配置。 |
–cap-drop |
删除Linux 权限功能 |
|
–cgroup-parent |
指定容器cgroup父路径 |
|
–cpuset-cpus |
允许执行的CPU(e.g. 0-3,0,1) |
|
–cpu-shares |
CPU份额(相对权重) |
|
–cpu-quota |
限制CPU CFS(完全公平调度器)的配额 |
|
–device=[] |
为容器添加一个主机设备 |
|
–dns |
添加DNS服务器 |
|
–dns-opt |
添加DNS选项 |
|
–dns-search |
设定容器的搜索域 |
|
-e, –env |
设置环境变量 |
|
–env-file |
通过文件配置环境变量 |
|
–entrypoint |
启动容器时要运行的入口点 |
|
–external-rootfs=PATH |
指定一个不由iSulad管理的rootfs(可以为文件夹或块设备)给容器 |
|
–files-limit |
调整容器内能够打开的文件句柄数(-1表示不限制) |
|
–group-add=[] |
指定额外的用户组添加到容器 |
|
–help |
打印帮助信息 |
|
–health-cmd |
在容器内执行的命令 |
|
–health-exit-on-unhealthy |
检测到容器非健康时是否杀死容器 |
|
–health-interval |
相邻两次命令执行的间隔时间 |
|
–health-retries |
健康检查失败最大的重试次数 |
|
–health-start-period |
容器初始化时间 |
|
–health-timeout |
单次检查命令执行的时间上限 |
|
–hook-spec |
钩子配置文件 |
|
-H, –host |
指定要连接的iSulad socket文件路径 |
|
-h, –hostname |
容器主机名称 |
|
-i, –interactive |
即使没有连接到容器的标准输入,也要保持容器的标准输入打开 |
|
–hugetlb-limit=[] |
大页文件限制,例如:–hugetlb-limit 2MB:32MB |
|
–log-opt=[] |
日志驱动程序选项,默认禁用记录容器串口日志功能,可以通过”–log-opt disable-log=false”来开启。 |
|
-l,–label |
为容器设置标签 |
|
–lablel-file |
通过文件设置容器标签 |
|
-m, –memory |
内存限制 |
|
–memory-reservation |
设置容器内存限制,默认与–memory一致。可认为–memory是硬限制,–memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和–memory一起使用,数值小于–memory的预设值,最小设置为4MB。 |
|
–memory-swap |
正整数,内存 + 交换空间,-1 表示不限制 |
|
–memory-swappiness |
正整数,swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间,默认值为-1,表示使用系统默认值。 |
|
–mount |
挂载主机目录到容器中 |
|
–no-healthcheck |
禁用健康检查配置 |
|
–name=NAME |
容器名 |
|
–net=none |
容器连接到网络 |
|
–pids-limit |
调整容器内能够执行的进程数(-1表示不限制) |
|
–privileged |
给予容器扩展的特权 |
|
-R, –runtime |
容器运行时,参数支持”lcr”,忽略大小写,因此”LCR”和”lcr”是等价的 |
|
–read-only |
设置容器的根文件系统为只读 |
|
–restart |
当容器退出时重启策略 系统容器支持–restart on-reboot |
|
–storage-opt |
配置容器的存储驱动选项 |
|
-t, –tty |
分配伪终端 |
|
–ulimit |
为容器设置ulimit限制 |
|
-u, –user |
用户名或UID,格式[ |
|
-v, –volume=[] |
挂载一个卷 |
约束限制
使用–user或–group-add参数,在容器启动阶段校验user或group时,容器如果使用的是OCI镜像,是从镜像的真实rootfs的etc/passwd和etc/group文件中校验,如果使用的是rootfs文件夹或块设备作为容器的rootfs,则校验的是host中的etc/passwd和etc/group文件;查找时使用的rootfs会忽略-v 和–mount等挂载参数,意味着使用这些参数尝试覆盖etc/passwd和etc/group两个文件时,在查找阶段不生效,只在容器真正启动时生效。生成的配置保存在”iSulad根目录/engine/容器ID/start_generate_config.json”,文件格式如下:
{
"uid": 0,
"gid": 8,
"additionalGids": [
1234,
8
]
}
示例
创建一个新容器
$ isula create busybox
fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
$ isula ps -a
STATUS PID IMAGE COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME ID NAMES inited - busybox "sh" 0 0 - - lcr fd7376591a9c fd7376591a9c4521...
描述
isula start命令用于启动一个或多个容器。
用法
isula start [OPTIONS] CONTAINER [CONTAINER...]
参数
start命令支持参数参考下表。
命令 |
参数 |
说明 |
start |
-H, –host |
指定要连接的iSulad socket文件路径 |
-R, –runtime |
容器运行时,参数支持”lcr”,忽略大小写,因此”LCR”和”lcr”是等价的 |
示例
启动一个新容器
$ isula start fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
描述
isula run命令命令用于创建一个新的容器。会使用指定的容器镜像创建容器读写层,并且为运行指定的命令做好准备。创建完成后,使用指定的命令启动该容器。run命令相当于create然后start容器。
用法
isula run [OPTIONS] ROOTFS|IMAGE [COMMAND] [ARG...]
参数
run命令支持参数参考下表。
命令 |
参数 |
说明 |
run |
–annotation |
设置容器的annotations。例如支持native.umask选项:
–annotation native.umask=normal # 启动的容器umask值为0022
–annotation native.umask=secure # 启动的容器umask值为0027
注意如果没有配置该参数,则使用isulad中的umask配置。 |
–cap-add |
添加Linux功能 |
|
–cap-drop |
删除Linux功能 |
|
–cgroup-parent |
指定容器cgroup父路径 |
|
–cpuset-cpus |
允许执行的CPU(e.g. 0-3,0,1) |
|
–cpu-shares |
CPU份额(相对权重) |
|
–cpu-quota |
限制CPU CFS(完全公平调度器)的配额 |
|
-d, –detach |
后台运行容器并打印容器ID |
|
–device=[] |
为容器添加一个主机设备 |
|
–dns |
添加DNS服务器 |
|
–dns-opt |
添加DNS选项 |
|
–dns-search |
设定容器的搜索域 |
|
-e, –env |
设置环境变量 |
|
–env-file |
通过文件配置环境变量 |
|
–entrypoint |
启动容器时要运行的入口点 |
|
–external-rootfs=PATH |
指定一个不由iSulad管理的rootfs(可以为文件夹或块设备)给容器 |
|
–files-limit |
调整容器内能够打开的文件句柄数(-1表示不限制) |
|
–group-add=[] |
指定额外的用户组添加到容器 |
|
–help |
打印帮助信息 |
|
–health-cmd |
在容器内执行的命令 |
|
–health-exit-on-unhealthy |
检测到容器非健康时是否杀死容器 |
|
–health-interval |
相邻两次命令执行的间隔时间 |
|
–health-retries |
健康检查失败最大的重试次数 |
|
–health-start-period |
容器初始化时间 |
|
–health-timeout |
单次检查命令执行的时间上限 |
|
–hook-spec |
钩子配置文件 |
|
-H, –host |
指定要连接的iSulad socket文件路径 |
|
-h, –hostname |
容器主机名称 |
|
–hugetlb-limit=[] |
大页文件限制,例如:–hugetlb-limit 2MB:32MB |
|
-i, –interactive |
即使没有连接到容器的标准输入,也要保持容器的标准输入打开 |
|
–log-opt=[] |
日志驱动程序选项,默认禁用记录容器串口日志功能,可以通过”–log-opt disable-log=false”来开启。 |
|
-m, –memory |
内存限制 |
|
–memory-reservation |
设置容器内存限制,默认与–memory一致。可认为–memory是硬限制,–memory-reservation是软限制;当使用内存超过预设值时,会动态调整(系统回收内存时尝试将使用内存降低到预设值以下),但不确保一定不超过预设值。一般可以和–memory一起使用,数值小于–memory的预设值,最小设置为4MB。 |
|
–memory-swap |
正整数,内存 + 交换空间,-1 表示不限制 |
|
–memory-swappiness |
正整数,swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存;参数值越高就是反过来,使内核更多的去使用swap空间,默认值为-1,表示使用系统默认值。 |
|
–mount |
挂载主机目录到容器中 |
|
–no-healthcheck |
禁用健康检查配置 |
|
–name=NAME |
容器名 |
|
–net=none |
容器连接到网络 |
|
–pids-limit |
调整容器内能够执行的进程数(-1表示不限制) |
|
–privileged |
给予容器扩展的特权 |
|
-R, –runtime |
容器运行时,参数支持”lcr”,忽略大小写,因此”LCR”和”lcr”是等价的 |
|
–read-only |
设置容器的根文件系统为只读 |
|
–restart |
当容器退出时重启策略 系统容器支持–restart on-reboot |
|
–rm |
当容器退出时自动清理容器 |
|
–storage-opt |
配置容器的存储驱动选项 |
|
-t, –tty |
分配伪终端 |
|
–ulimit |
为容器设置ulimit限制 |
|
-u, –user |
用户名或UID,格式[ |
|
-v, –volume=[] |
挂载一个卷 |
约束限制
备注:轻量级容器的参数中type支持bind或squashfs,当type=squashfs时,src是镜像的路径;原生docker的参数type支持bind、volume、tmpfs。
–device参数指定主机设备为不存在的设备
–hook-spec参数指定不存在的hook json文件
–entrypoint 参数指定不存在的入口参数
[root@localhost ~]# echo ls | isula run -i busybox /bin/sh
^C
[root@localhost ~]#
上述命令出现客户端卡死现象,这是由于上述命令相当于往stdin输入ls,随后EOF被读取,客户端不再发送数据,等待服务端退出,但是服务端无法区分客户端是否需要继续发送数据,因而服务端卡在read数据上,最终导致双方均卡死。
正确的执行方式为:
[root@localhost ~]# isula run -i busybox ls
bin
dev
etc
home
proc
root
sys
tmp
usr
var
[root@localhost ~]#
Host 路径(source) |
容器路径(dest) |
/home/test1 |
/mnt/ |
/home/test2 |
/mnt/abc |
须知:
第一种情况,先挂载/home/test1,然后挂载/home/test2,这种情况会导致/home/test1的内容覆盖掉原来/mnt下面的内容,这样可能导致/mnt下面不存在abc目录,这样会导致挂载/home/test2到/mnt/abc失败。
第二种情况,先挂载/home/test2,然后挂载/home/test1。这种情况,第二次的挂载会把/mnt的内容替换为/home/test1的内容,这样第一次挂载的/home/test2到/mnt/abc的内容就看不到了。
因此,不支持第一种使用方式;第二种使用用户需要了解这种数据无法访问的风险
须知:
- 高并发场景(并发启动200容器)下,glibc的内存管理机制会导致内存空洞以及虚拟内存较大(例如10GB)的问题。该问题是高并发场景下glibc内存管理机制的限制,而不是内存泄露,不会导致内存消耗无限增大。可以通过设置MALLOC_ARENA_MAX环境变量来减少虚拟内存的问题,而且可以增大减少物理内存的概率。但是这个环境变量会导致iSulad的并发性能下降,需要用户根据实际情况做配置。
参考实践情况,平衡性能和内存,可以设置MALLOC_ARENA_MAX为4。(在arm64服务器上面对iSulad的性能影响在10%以内)
配置方法:
1. 手动启动iSulad的场景,可以直接export MALLOC_ARENA_MAX=4,然后再启动iSulad即可。
2. systemd管理iSulad的场景,可以修改/etc/sysconfig/iSulad,增加一条MALLOC_ARENA_MAX=4即可。
示例
运行一个新容器
$ isula run -itd busybox
9c2c13b6c35f132f49fb7ffad24f9e673a07b7fe9918f97c0591f0d7014c713b
描述
isula stop命令用于停止一个或多个运行中的容器。首先向容器中的首进程会发送SIGTERM信号,在指定时间(默认为10s)内容器未停止时,会发送SIGKILL。
用法
isula stop [OPTIONS] CONTAINER [CONTAINER...]
参数
stop命令支持参数参考下表。
命令 |
参数 |
说明 |
stop |
-f, –force |
强制停止正在运行的容器 |
-H, –host |
指定要连接的iSulad socket文件路径 |
|
-t, –time |
先优雅停止,超过这个时间,则强行终止 |
约束限制
Stop的原理:Stop会首先给容器发送Stop 信号(SIGTERM),然后等待一定的时间(这个时间就是用户输入的 t),过了指定时间如果容器还仍处于运行状态,那么就发送kill信号(SIGKILL)使容器强制退出。
t<0 : 表示一直等待,不管多久都等待程序优雅退出,既然用户这么输入了,表示对自己的应用比较放心,认为自己的程序有 合理的stop信号的处理机制。
t=0 : 表示不等,立即发送kill -9 到容器。
t>0 : 表示等一定的时间,如果容器还未退出,就发送kill -9 到容器。
所以如果用户使用t<0 (比如t=-1),请确保自己容器的应用会正确处理SIGTERM. 如果容器忽略了该信号,会导致isula stop一直卡住。
示例
停止一个容器
$ isula stop fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
描述
isula kill命令用于强制停止一个或多个运行中的容器。
用法
isula kill [OPTIONS] CONTAINER [CONTAINER...]
参数
kill命令支持参数参考下表。
命令 |
参数 |
说明 |
kill |
-H, –host |
指定要连接的iSulad socket文件路径 |
-s, –signal |
发送给容器的信号 |
示例
杀掉一个容器
$ isula kill fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
描述
isula rm命令用于删除一个或多个容器。
用法
isula rm [OPTIONS] CONTAINER [CONTAINER...]
参数
rm命令支持参数参考下表。
命令 |
参数 |
说明 |
rm |
-f, –force |
强制移除正在运行的容器 |
-H, –host |
指定要连接的iSulad socket文件路径 |
|
-v, –volume |
移除挂载在容器上的卷(备注:目前iSulad尚不使用此功能) |
约束限制
在IO正常情况,空环境(只有1个容器)删除一个running容器的时间为T1,200个容器的环境(容器无大量IO操作,host IO正常)删除一个running容器所需时间为T2。T2的规格为:T2 = max { T1 * 3, 5 } 秒钟。
示例
删除一个停止状态的容器
$ isula rm fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
描述
isula attach命令用于将当前终端的标准输入、标准输出和标准错误连接到正在运行的容器。仅支持runtime类型为lcr的容器。
用法
isula attach [OPTIONS] CONTAINER
参数
attach命令支持参数参考下表。
命令 |
||
约束限制
原生docker attach容器会直接进入容器,而isulad attach容器后需要敲一个回车才进入。
示例
接入一个运行状态的容器
$ isula attach fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1
/ #
/ #
描述
isula rename命令用于重命名容器。
用法
isula rename [OPTIONS] OLD_NAME NEW_NAME
参数
rename命令支持参数参考下表。
命令 |
参数 |
说明 |
rename |
-H, –host |
重命名容器 |
示例
重命名一个容器
$ isula rename my_container my_new_container
描述
isula exec命令用于正在运行的容器中运行一个新命令。新执行的命令将在容器的默认目录中运行。如果基础镜像指定了自定义目录,则将使用该目录。
用法
isula exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数
exec命令支持参数参考下表。
命令 |
参数 |
说明 |
exec
|
-d, –detach |
后台运行命令 |
-e, –env |
设置环境变量(备注:目前iSulad尚不使用此功能) |
|
-H, –host |
指定要连接的iSulad socket文件路径 |
|
-i, –interactive |
没有连接,也要保持标准输入打开(备注:目前iSulad尚不使用此功能) |
|
-t, –tty |
分配伪终端(备注:目前iSulad尚不使用此功能) |
|
-u, –user |
指定用户登录容器执行命令 |
约束限制
使用isula exec运行脚本,在脚本中运行后台进程需使用nohup标志。否则内核会在exec执行的进程(session首进程)退出时,向后台执行的进程发送SIGHUP信号,导致后台进程退出,出现僵尸进程。
isula exec执行后台进程的方式如下:
使用isula exec进入容器终端,isula exec container_name bash
进入容器后,执行 script &
执行exit,导致终端卡死
isula exec 进入容器后,执行后台程序卡住的原因为isula exec进入容器运行后台while1程序,当bash退出时,while1程序并不会退出,变为孤儿进程由1号
进程接管,while1程序是由容器的初始bash进程fork &exec执行的,while1进程复制了bash进程的文件句柄,导致bash退出时,句柄并未完全关闭,导致
console进程收不到句柄关闭事件,epoll_wait卡住,进程不退出。
isula exec后台执行的方式如下:
使用**isula exec 脚本 & **的方式后台执行exec,如:isula exec container_name script & ,isula exec 后台执行,执行的脚本中不断cat某一文件,正常时在当前终端有输出,如果在当前终端执行回车操作,客户端会因读IO失败而退出读stdout的动作,使终端不再输出,服务端由于进程仍然在cat文件,会继续往fifo的buffer里写入数据,当缓存写满时,容器内进程会卡死在write动作上。
典型应用场景:
使用isula exec container_name -it ls /test | grep “xx” | wc -l,用于统计test目录下xx的文件个数,因exec执行的为”ls /test”,其输出通过管道进行grep、wc 处理。exec执行的为”ls /test”的输出会换行,再针对该输出进行处理时,结果有误。
原因:使用exec 执行ls /test,输出带有换行,针对该输出进行“| grep “xx” | wc -l“,处理结果为2(两行)
[root@localhost ~]# isula exec -it container ls /test
xx xx10 xx12 xx14 xx3 xx5 xx7 xx9
xx1 xx11 xx13 xx2 xx4 xx6 xx8
[root@localhost ~]#
建议处理方式:使用run/exec执行带有管道操作的命令时,使用/bin/bash -c 执行命令,在容器中执行管道操作。
[root@localhost ~]# isula exec -it container /bin/sh -c "ls /test | grep "xx" | wc -l"
15
[root@localhost ~]#
[root@localhost ~]# echo ls | isula exec 38 /bin/sh
^C
[root@localhost ~]#
上述命令可能出现客户端卡死现象,这是由于上述命令相当于往stdin输入ls,随后EOF被读取,客户端不再发送数据,等待服务端退出,但是服务端无法区分客户端是否需要继续发送数据,因而服务端卡在read数据上,最终导致双方均卡死。
正确的执行方式为:
[root@localhost ~]# isula exec 38 ls
bin dev etc home proc root sys tmp usr var
示例
在运行中的容器中,执行echo命令
$ isula exec c75284634bee echo "hello,world"
hello,world
描述
isula inspect提供了容器的详细信息。
用法
isula inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]
参数
inspect命令支持参数参考下表。
命令 |
参数 |
说明 |
inspect
|
-H, –host |
指定要连接的iSulad socket文件路径 |
-f, –format |
使用模板格式化输出 |
|
-t, –time |
超时时间的秒数,若在该时间内inspect查询容器信息未执行成功,则停止等待并立即报错,默认为120秒,当配置小于等于0的值,表示不启用timeout机制inspect查询容器信息会一直等待,直到获取容器信息成功后返回。 |
约束限制
轻量级容器不支持format为“{{.State}}”的格式化输出,支持“{{json .State}}”的json格式化输出。当inspect镜像时,不支持-f参数。
示例
查询容器信息
$ isula inspect c75284634bee
[
{
"Id": "c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a",
"Created": "2019-08-01T22:48:13.993304927-04:00",
"Path": "sh",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"Pid": 21164,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-08-02T06:09:25.535049168-04:00",
"FinishedAt": "2019-08-02T04:28:09.479766839-04:00",
"Health": {
"Status": "",
"FailingStreak": 0,
"Log": []
}
},
"Image": "busybox",
"ResolvConfPath": "",
"HostnamePath": "",
"HostsPath": "",
"LogPath": "none",
"Name": "c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a",
"RestartCount": 0,
"HostConfig": {
"Binds": [],
"NetworkMode": "",
"GroupAdd": [],
"IpcMode": "",
"PidMode": "",
"Privileged": false,
"SystemContainer": false,
"NsChangeFiles": [],
"UserRemap": "",
"ShmSize": 67108864,
"AutoRemove": false,
"AutoRemoveBak": false,
"ReadonlyRootfs": false,
"UTSMode": "",
"UsernsMode": "",
"Sysctls": {},
"Runtime": "lcr",
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"CapAdd": [],
"CapDrop": [],
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": [],
"HookSpec": "",
"CPUShares": 0,
"Memory": 0,
"OomScoreAdj": 0,
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"CPUPeriod": 0,
"CPUQuota": 0,
"CPURealtimePeriod": 0,
"CPURealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"SecurityOpt": [],
"StorageOpt": {},
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"OomKillDisable": false,
"PidsLimit": 0,
"FilesLimit": 0,
"Ulimits": [],
"Hugetlbs": [],
"HostChannel": {
"PathOnHost": "",
"PathInContainer": "",
"Permissions": "",
"Size": 0
},
"EnvTargetFile": "",
"ExternalRootfs": ""
},
"Mounts": [],
"Config": {
"Hostname": "localhost",
"User": "",
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Tty": true,
"Cmd": [
"sh"
],
"Entrypoint": [],
"Labels": {},
"Annotations": {
"log.console.file": "none",
"log.console.filerotate": "7",
"log.console.filesize": "1MB",
"rootfs.mount": "/var/lib/isulad/mnt/rootfs",
"native.umask": "secure"
},
"HealthCheck": {
"Test": [],
"Interval": 0,
"Timeout": 0,
"StartPeriod": 0,
"Retries": 0,
"ExitOnUnhealthy": false
}
},
"NetworkSettings": {
"IPAddress": ""
}
}
]
描述
isula ps 用于查询所有容器的信息。
用法
isula ps [OPTIONS]
参数
ps命令支持参数参考下表。
命令 |
参数 |
说明 |
ps
|
-a, –all |
显示所有的容器 |
-H, –host |
指定要连接的iSulad socket文件路径 |
|
-q, –quiet |
只显示容器名字 |
|
-f, –filter |
增加筛选过滤条件 |
|
–format |
按照模板声明的方式输出数据 |
|
–no-trunc |
不对容器ID进行截断打印 |
示例
查询所有容器信息
$ isula ps -a
ID IMAGE STATUS PID COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME NAMES
e84660aa059c rnd-dockerhub.huawei.com/official/busybox running 304765 "sh" 0 0 13 minutes ago - lcr e84660aa059cafb0a77a4002e65cc9186949132b8e57b7f4d76aa22f28fde016
$ isula ps -a --format "table {{.ID}} {{.Image}}" --no-trunc
ID IMAGE
e84660aa059cafb0a77a4002e65cc9186949132b8e57b7f4d76aa22f28fde016 rnd-dockerhub.huawei.com/official/busybox
描述
isula restart 用于重启一个或者多个容器。
用法
isula restart [OPTIONS] CONTAINER [CONTAINER...]
参数
restart命令支持参数参考下表。
命令 |
参数 |
说明 |
restart |
-H, –host |
指定要连接的iSulad socket文件路径 |
-t, –time |
先优雅停止,超过这个时间,则强行终止 |
约束限制
restart会首先调用stop停止容器。stop会首先给容器发送stop信号(SIGTERM),然后等待一定的时间(这个时间就是用户输入的 t),过了一定时间如果容器仍处于运行状态,那么就发送kill信号(SIGKILL)使容器强制退出。
t<0 : 表示一直等待,不管多久都等待程序优雅退出,既然用户这么输入了,表示对自己的应用比较放心,认为自己的程序有合理的stop信号的处理机制。
t=0 : 表示不等,立即发送kill -9 到容器。
t>0 : 表示等一定的时间,如果容器还未退出,就发送kill -9 到容器。
所以如果用户使用t<0(比如t=-1),请确保自己容器的应用会正确处理SIGTERM. 如果容器忽略了该信号,会导致isula restart一直卡住。
示例
重启单个容器
$ isula restart c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a
c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a
描述
isula wait用于等待一个或者多个容器退出。仅支持runtime类型为lcr的容器。
用法
isula wait [OPTIONS] CONTAINER [CONTAINER...]
参数
wait命令支持参数参考下表。
命令 |
参数 |
说明 |
wait |
-H, –host |
指定要连接的iSulad socket文件路径 |
/ |
阻塞,直到容器停止,然后打印退出代码 |
示例
等待单个容器退出
$ isula wait c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a
137
描述
isula top用于查看容器中的进程信息。仅支持runtime类型为lcr的容器。
用法
isula top [OPTIONS] container [ps options]
参数
top命令支持参数参考下表。
命令 |
参数 |
说明 |
top
|
-H, –host |
指定要连接的iSulad socket文件路径 |
/ |
查询运行容器的进程信息 |
示例
查询容器中进程信息
$ isula top 21fac8bb9ea8e0be4313c8acea765c8b4798b7d06e043bbab99fc20efa72629c
UID PID PPID C STIME TTY TIME CMD
root 22166 22163 0 23:04 pts/1 00:00:00 sh
描述
isula stats用于实时显示资源使用的统计信息。仅支持runtime类型为lcr的容器。
用法
isula stats [OPTIONS] [CONTAINER...]
参数
stats命令支持参数参考下表。
命令 |
参数 |
说明 |
stats
|
-H, –host |
指定要连接的iSulad socket文件路径 |
-a, –all |
显示所有容器(默认只显示运行中的容器) |
|
–no-stream |
非流式方式的stats,只打印第一次结果 |
示例
显示资源使用的统计信息
$ isula stats --no-stream 21fac8bb9ea8e0be4313c8acea765c8b4798b7d06e043bbab99fc20efa72629c CONTAINER CPU % MEM USAGE / LIMIT MEM % BLOCK I / O PIDS
21fac8bb9ea8 0.00 56.00 KiB / 7.45 GiB 0.00 0.00 B / 0.00 B 1
描述
isula logs用于获取容器的日志。仅支持runtime类型为lcr的容器。
用法
isula logs [OPTIONS] [CONTAINER...]
参数
logs命令支持参数参考下表。
命令 |
参数 |
说明 |
logs
|
-H, –host |
指定要连接的iSulad socket文件路径 |
-f, –follow |
跟踪日志输出 |
|
–tail |
显示日志行数 |
约束限制
容器串口logs日志记录功能,默认为开启状态,需要关闭可以通过 isula create –log-opt disable-log=true 或 isula run –log-opt disable-log=true 关闭。
示例
获取容器日志
$ isula logs 6a144695f5dae81e22700a8a78fac28b19f8bf40e8827568b3329c7d4f742406
hello, world
hello, world
hello, world
描述
isula cp 用于容器与主机之间的数据拷贝,仅支持runtime类型为lcr的容器。
用法
isula cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
isula cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
参数
cp命令支持参数参考下表。
命令 |
参数 |
说明 |
cp |
-H, –host |
指定要连接的iSulad socket文件路径 |
约束限制
[root@localhost tmp]# isula cp b330e9be717a:/etc/hostname /tmp/hostname
[root@localhost tmp]# cat /tmp/hostname
[root@localhost tmp]#
[root@localhost tmp]# rm -rf /tmp/test_file_to_dir && mkdir /tmp/test_file_to_dir
[root@localhost tmp]# isula exec b330e9be717a /bin/sh -c "rm -rf /tmp/test_file_to_dir && touch /tmp/test_file_to_dir"
[root@localhost tmp]# isula cp b330e9be717a:/tmp/test_file_to_dir /tmp
[root@localhost tmp]# ls -al /tmp | grep test_file_to_dir
-rw-r----- 1 root root 0 Apr 26 09:59 test_file_to_dir
示例
将主机/test/host目录拷贝到容器21fac8bb9ea8的/test目录下。
isula cp /test/host 21fac8bb9ea8:/test
将容器21fac8bb9ea8的/www目录拷贝到主机的/tmp目录中。
isula cp 21fac8bb9ea8:/www /tmp/
描述
isula pause用于暂停容器中所有的进程,仅支持runtime类型为lcr的容器。
用法
isula pause CONTAINER [CONTAINER...]
参数
命令 |
参数 |
说明 |
pause |
-H, –host |
指定要连接的iSulad socket文件路径 |
约束限制
示例
暂停一个正在运行的容器,命令示例如下:
$ isula pause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
描述
isula unpause用于恢复容器中所有的进程, 为isula pause的逆过程,仅支持runtime类型为lcr的容器。
用法
isula unpause CONTAINER [CONTAINER...]
参数
命令 |
参数 |
说明 |
pause |
-H, –host |
指定要连接的iSulad socket文件路径 |
约束限制
只有状态为paused的容器可以被执行unpause操作
示例
恢复一个被暂停的容器,命令示例如下:
$ isula unpause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac
描述
isula events用于从服务端实时获取容器镜像生命周期、运行等事件消息, 仅支持runtime类型为lcr的容器。
用法
isula events [OPTIONS]
参数
命令 |
参数 |
说明 |
events |
-H, –host |
指定要连接的iSulad socket文件路径 |
-n, –name |
获取指定容器的事件消息 |
|
-S, –since |
获取指定时间以来的事件消息 |
示例
从服务端实时获取事件消息,命令示例如下:
$ isula events
描述
实现CRI接口对接CNI网络的能力,包括CNI网络配置文件的解析、CNI网络的加入和退出。Pod需要支持网络时,例如通过canal等容器网络插件提供网络能力,那么需要CRI接口能够和canal实现对接,并且调用canal的接口,为Pod提供网络能力。
接口
CNI对用户可见的接口,主要涉及CNI网络配置和Pod配置中CNI网络相关的项。
CNI网络配置接口
|
命令行 |
配置文件 |
说明 |
设置CNI网络插件二进制文件所在路径 |
–cni-bin-dir |
“cni-bin-dir”: “”, |
默认为/opt/cni/bin |
设置CNI网络配置文件所在路径 |
–cni-conf-dir |
“cni-conf-dir”: “”, |
系统会遍历目录下面所有后缀名为”.conf”、”.conflist”和 “.json”的文件。默认为/etc/cni/net.d |
指定网络模式 |
–network-plugin |
“network-plugin”: “”, |
指定网络插件,默认为空字符,表示无网络配置,创建的sandbox只有loop网卡。支持cni和空字符,其他非法值会导致isulad启动失败。 |
附加CNI网络配置方式:
在Pod的配置文件的”annotations”中,增加一项”network.alpha.kubernetes.io/network”: “网络平面配置”;
网络平面配置为json格式,包含两项:
附件CNI网络配置方式示例如下:
"annotations" : {
"network.alpha.kubernetes.io/network": "{\"name\": \"mynet\", \"interface\": \"eth1\"}"
}
CNI网络配置说明
CNI网络配置包含两种类型,文件格式都为json:
单网络平面配置,以.conf和.json为后缀的文件:具体的配置项请参见”附录 > CNI配置参数” 章节的 “表 CNI单网络配置参数”。
多网络平面配置,以.conflist为后缀的文件:具体的配置项请参见”附录 > CNI配置参数” 章节的 “表3 CNI多网络配置参数”。
加入CNI网络列表
如果iSulad配置了–network-plugin=cni,而且设置了default网络平面配置,那么在启动Pod的时候,会自动把Pod加入到default网络平面。如果在Pod的配置中配置了附加网络配置,那么启动Pod的时候也会把Pod加入到这些附加网络平面中。
Pod配置中和网络相关的还有port_mappings项,用于设置Pod的端口映射关系。配置方式如下:
"port_mappings":[
{
"protocol": 1,
"container_port": 80,
"host_port": 8080
}
]
退出CNI网络列表
StopPodSandbox的时候,会调用退出CNI网络的接口,清理网络相关的资源。
说明:
在调用RemovePodSandbox接口之前,至少要调用一次StopPodSandbox接口
StopPodSandbox调用CNI接口失败,可能导致的网络资源残留。
使用限制
描述
容器间或者容器与host之间可以共享namespace信息,包括pid, net, ipc, uts。
用法
isula create/run时使用namespace相关的参数共享资源,具体参数见下方参数列表。
参数
create/run时可以指定下列参数。
参数项 |
参数说明 |
取值范围 |
是否必选 |
–pid |
指定要共享的pid namespace |
[none, host, container: |
否 |
–net |
指定要共享的net namespace |
[none, host, container: |
否 |
–ipc |
指定要共享的ipc namespace |
[none, host, container: |
否 |
–uts |
指定要共享的uts namespace |
[none, host, container: |
否 |
示例
如果两个容器需要共享同一个pid namespace,在运行容器时,直接加上–pid container: 即可,如:
isula run -tid --name test_pid busybox sh
isula run -tid --name test --pid container:test_pid busybox sh
描述
可以通过参数限制容器的各项cpu资源值。
用法
isula create/run时使用cpu相关的参数限制容器的各项cpu资源值,具体参数及取值见下方参数列表。
参数
create/run时可以指定下列参数。
参数项 |
参数说明 |
取值范围 |
是否必选 |
–cpu-period |
限制容器中cpu cfs(完全公平调度)周期 |
64位整数(int64) |
否 |
–cpu-quota |
限制容器中cpu cfs(完全公平调度) 的配额 |
64位整数(int64) |
否 |
–cpu-shares |
限制容器中cpu相对权重 |
64位整数(int64) |
否 |
–cpuset-cpus |
限制容器中使用cpu节点 |
字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1. |
否 |
–cpuset-mems |
限制容器中cpuset使用的mem节点 |
字符串。值为要设置的cpu编号,有效范围为主机上的cpu数量,例如可以设置0-3或者0,1. |
否 |
示例
如果需要限制容器只是用特定的cpu,在运行容器时,直接加上–cpuset-cpus number 即可,如:
isula run -tid --cpuset-cpus 0,2-3 busybox sh
说明:是否设置成功,请参见“查询单个容器信息”章节。
描述
可以通过参数限制容器的各项内存值上限。
用法
isula create/run时使用内存相关的参数限制容器的各项内存使用上限,具体参数及取值见下方参数列表。
参数
create/run时可以指定下列参数。
参数项 |
参数说明 |
取值范围 |
是否必选 |
–memory |
限制容器中内存使用上限 |
64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB. |
否 |
–memory-reservation |
限制容器中内存的软上限 |
64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB. |
否 |
–memory-swap |
限制容器中交换内存的上限 |
64位整数(int64)。值为-1或非负数,-1表示不限制,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB. |
否 |
–kernel-memory |
限制容器中内核内存的上限 |
64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB. |
否 |
示例
如果需要限制容器内内存的上限,在运行容器时,直接加上–memory []即可,如:
isula run -tid --memory 1G busybox sh
描述
可以通过参数限制容器中设备读写速度。
用法
isula create/run时使用–device-read-bps/–device-write-bps :[]来限制容器中设备的读写速度。
参数
create/run时指定–device-read/write-bps参数。
参数项 |
参数说明 |
取值范围 |
是否必选 |
–device-read-bps/–device-write-bps |
限制容器中设备的读速度/写速度 |
64位整数(int64)。值为正整数,可以为0,0表示不设置(不限制);单位可以为空(byte),KB,MB,GB,TB,PB. |
否 |
示例
如果需要限制容器内设备的读写速度,在运行容器时,直接加上–device-write-bps/–device-read-bps :[]即可,例如,限制容器busybox内设备/dev/sda的读速度为 1MB 每秒,则命令如下:
isula run -tid --device-write /dev/sda:1mb busybox sh
限制写速度的命令如下:
isula run -tid read-bps /dev/sda:1mb busybox sh
描述
在ext4上使用overlay2时,可以设置单个容器的文件系统限额,比如设置A容器的限额为5G,B容器为10G。
该特性通过ext4文件系统的project quota功能来实现,在内核支持的前提下,通过系统调用SYS_IOCTL设置某个目录的project ID,再通过系统调用SYS_QUOTACTL设置相应的project ID的hard limit和solft limit值达到限额的目的。
用法
1)环境准备
文件系统支持Project ID和Project Quota属性,4.19版本内核已经支持,外围包e2fsprogs版本不低于1.43.4-2。
2)在容器挂载overlayfs之前,需要对不同容器的upper目录和work目录设置不同的project id,同时设置继承选项,在容器挂载overlayfs之后不允许再修改project id和继承属性。
3)配额的设置需要在容器外以特权用户进行。
4)daemon中增加如下配置
-s overlay2 --storage-opt overlay2.override_kernel_check=true
5)daemon支持以下选项,用于为容器设置默认的限制,
–storage-opt overlay2.basesize=128M 指定默认限制的大小,若isula run时也指定 了–storeage-opt size选项,则以run时指定来生效,若daemon跟isula run时都不指定大小,则表示不限制。
6)需要开启文件系统Project ID和Project Quota属性。
新格式化文件系统并mount
# mkfs.ext4 -O quota,project /dev/sdb
# mount -o prjquota /dev/sdb /var/lib/isulad
参数
create/run时指定–storage-opt参数。
参数项 |
参数说明 |
取值范围 |
是否必选 |
–storage-opt size=${rootfsSize} |
限制容器rootfs存储空间。 |
rootfsSize解析出的大小为int64范围内以字节表示的正数,默认单位为B,也可指定为([kKmMgGtTpP])?[iI]?[bB]?$ |
否 |
示例
在isula run/create命令行上通过已有参数“–storage-opt size=”来设置限额。其中value是一个正数,单位可以是[kKmMgGtTpP]?[iI]?[bB]?,在不带单位的时候默认单位是字节。
$ [root@localhost ~]# isula run -ti --storage-opt size=10M busybox
/ # df -h
Filesystem Size Used Available Use% Mounted on
overlay 10.0M 48.0K 10.0M 0% /
none 64.0M 0 64.0M 0% /dev
none 10.0M 0 10.0M 0% /sys/fs/cgroup
tmpfs 64.0M 0 64.0M 0% /dev
shm 64.0M 0 64.0M 0% /dev/shm
/dev/mapper/vg--data-ext41
9.8G 51.5M 9.2G 1% /etc/hostname
/dev/mapper/vg--data-ext41
9.8G 51.5M 9.2G 1% /etc/resolv.conf
/dev/mapper/vg--data-ext41
9.8G 51.5M 9.2G 1% /etc/hosts
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 64.0M 0 64.0M 0% /proc/kcore
tmpfs 64.0M 0 64.0M 0% /proc/keys
tmpfs 64.0M 0 64.0M 0% /proc/timer_list
tmpfs 64.0M 0 64.0M 0% /proc/sched_debug
tmpfs 3.9G 0 3.9G 0% /proc/scsi
tmpfs 64.0M 0 64.0M 0% /proc/fdthreshold
tmpfs 64.0M 0 64.0M 0% /proc/fdenable
tmpfs 3.9G 0 3.9G 0% /sys/firmware
/ #
/ # dd if=/dev/zero of=/home/img bs=1M count=12 && sync
dm-4: write failed, project block limit reached.
10+0 records in
9+0 records out
10432512 bytes (9.9MB) copied, 0.011782 seconds, 844.4MB/s
/ # df -h | grep overlay
overlay 10.0M 10.0M 0 100% /
/ #
约束
1)限额只针对rw层。
overlay2的限额是针对容器的rw层的,镜像的大小不计算在内。
2)内核支持并使能。
内核必须支持ext4的project quota功能,并在mkfs的时候要加上-O quota,project,挂载的时候要加上-o prjquota。任何一个不满足,在使用–storage-opt size=时都将报错。
$ [root@localhost ~]# isula run -it --storage-opt size=10Mb busybox df -h
Error response from daemon: Failed to prepare rootfs with error: time="2019-04-09T05:13:52-04:00" level=fatal msg="error creating read-
write layer with ID "a4c0e55e82c55e4ee4b0f4ee07f80cc2261cf31b2c2dfd628fa1fb00db97270f": --storage-opt is supported only for overlay over
xfs or ext4 with 'pquota' mount option"
3)限制额度的说明。
4)指定storage-opt为4k时,轻量级容器启动与docker有差异
使用选项 storage-opt size=4k 和镜像 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest 运行容器。
docker启动失败。
[root@localhost ~]# docker run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest
docker: Error response from daemon: symlink /proc/mounts /var/lib/docker/overlay2/e6e12701db1a488636c881b44109a807e187b8db51a50015db34a131294fcf70-init/merged/etc/mtab: disk quota exceeded.
See 'docker run --help'.
轻量级容器不报错,正常启动
[root@localhost ~]# isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest
636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728
[root@localhost ~]# isula ps
STATUS PID IMAGE COMMAND EXIT_CODE RESTART_COUNT STARTAT FINISHAT RUNTIME ID NAMES
running 17609 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest /bin/bash 0 0 2 seconds ago - lcr 636480b1fc2c 636480b1fc2cf8ac895f46e77d86439fe2b359a1ff78486ae81c18d089bbd728
在启动容器的过程中,如果需要在容器的rootfs路径下创建文件,若镜像本身占用的大小超过4k,且此时的quota设置为4k,则创建文件必定失败。
docker在启动容器的过程中,会比isulad创建更多的挂载点,用于挂载host上的某些路径到容器中,如/proc/mounts, /dev/shm等,如果镜像内本身不存在这些文件,则会创建,根据上述原因该操作会导致文件创建失败,因而容器启动失败。
轻量级容器在启动容器过程中,使用默认配置时,挂载点较少,如/proc,或/sys等路径不存在时,才会创建。用例中的镜像 rnd-dockerhub.huawei.com/official/ubuntu-arm64:latest本身含有/proc, /sys等,因此整个启动容器的过程中,都不会有新文件或路径生成,故轻量级容器启动过程不会报错。为验证这一过程,当把镜像替换为 rnd-dockerhub.huawei.com/official/busybox-aarch64:latest时,由于该镜像内无/proc存在,轻量级容器启动一样会报错。
[root@localhost ~]# isula run -itd --storage-opt size=4k rnd-dockerhub.huawei.com/official/busybox-aarch64:latest
8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4
Error response from daemon: Start container error: runtime error: 8e893ab483310350b8caa3b29eca7cd3c94eae55b48bfc82b350b30b17a0aaf4:tools/lxc_start.c:main:404 starting container process caused "Failed to setup lxc,
please check the config file."
5)其他说明。
使用限额功能的isulad切换数据盘时,需要保证被切换的数据盘使用`prjquota`选项挂载,且/var/lib/isulad/storage/overlay2目录的挂载方式与/var/lib/isulad相同。
说明:切换数据盘时需要保证/var/lib/isulad/storage/overlay2的挂载点被卸载。
描述
可以通过参数限制容器中可以打开的文件句柄数。
用法
isula create/run时使用–files-limit来限制容器中可以打开的文件句柄数。
参数
create/run时指定–files-limit参数。
参数项 |
参数说明 |
取值范围 |
是否必选 |
–files-limit |
限制容器中可以打开的文件句柄数。 |
64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。 由于创建容器的过程中会临时打开一些句柄,所以此值不能设置的太小,不然容器可能不受files limit的限制(如果设置的数小于当前已经打开的句柄数,会导致cgroup文件写不进去),建议大于30。 |
否 |
示例
在运行容器时,直接加上–files-limit n 即可,如:
isula run -ti --files-limit 1024 busybox bash
约束
使用–files-limit参数传入一个很小的值,如1,可能导致容器启动失败。
[root@localhost ~]# isula run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
Error response from daemon: Start container error: Container is not running:004858d9f9ef429b624f3d20f8ba12acfbc8a15bb121c4036de4e5745932eff4
而docker会启动成功,其files.limit cgroup值为max。
[root@localhost ~]# docker run -itd --files-limit 1 rnd-dockerhub.huawei.com/official/busybox-aarch64
ef9694bf4d8e803a1c7de5c17f5d829db409e41a530a245edc2e5367708dbbab
[root@localhost ~]# docker exec -it ef96 cat /sys/fs/cgroup/files/files.limit
max
根因是lxc和runc启动过程的原理不一样,lxc创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时该进程已经打开超过1个句柄,因而写入报错导致启动失败。runc创建cgroup子组后先将容器进程的PID写入该子组的cgroup.procs文件,再设置files.limit值,此时由于该子组内的进程已经打开超过1个句柄,因而写入files.limit不会生效,内核也不会报错,容器启动成功。
描述
可以通过参数限制容器中能够创建的进程/线程数。
用法
在容器create/run时,使用参数–pids-limit来限制容器中可以创建的进程/线程数。
参数
create/run时指定–pids-limit参数。
数项 |
参数说明 |
取值范围 |
是否必选 |
–pids-limit |
限制容器中可以打开的文件句柄数。 |
64位整数(int64)。可以为0、负,但不能超过2的63 次方减 1,0、负表示不做限制(max)。 |
否 |
示例
在运行容器时,直接加上–pids-limit n 即可,如:
isula run -ti --pids-limit 1024 busybox bash
约束
由于创建容器的过程中会临时创建一些进程,所以此值不能设置的太小,不然容器可能起不来,建议大于10。
描述
可以通过参数控制执行程序的资源。
用法
在容器create/run时配置–ulimit参数,或通过daemon端配置,控制容器中执行程序的资源。
参数
通过两种方法配置ulimit
参数项 |
参数说明 |
取值范围 |
是否必选 |
–ulimit |
限制shell执行程序的资源 |
soft/hard是64位整数(int64)。soft取值 <= hard取值,如果仅仅指定了soft的取值,则hard=soft。对于某些类型的资源并不支持负数,详见下表 |
否 |
2)通过daemon端参数或配置文件
详见”(命令行参数说明”与”部署方式”的–default-ulimits相关选项。
–ulimit可以对以下类型的资源进行限制。
类型 |
说明 |
取值范围 |
core |
limits the core file size (KB) |
64位整数(INT64),无单位。可以为0、负、其中-1表示UNLIMITED,即不做限制,其余的负数会被强制转换为一个大的正整数。 |
cpu |
max CPU time (MIN) |
|
data |
max data size (KB) |
|
fsize |
maximum filesize (KB) |
|
locks |
max number of file locks the user can hold |
|
memlock |
max locked-in-memory address space (KB) |
|
msgqueue |
max memory used by POSIX message queues (bytes) |
|
nice |
nice priority |
|
nproc |
max number of processes |
|
rss |
max resident set size (KB) |
|
rtprio |
max realtime priority |
|
rttime |
realtime timeout |
|
sigpending |
max number of pending signals |
|
stack |
max stack size (KB) |
|
nofile |
max number of open file descriptors |
64位整数(int64),无单位。不可以为负,负数被强转为大数,设置时会出现Operation not permitted |
示例
在容器的创建或者运行时,加上–ulimit =[:]即可,如:
isula create/run -tid --ulimit nofile=1024:2048 busybox sh
约束
不能在daemon.json和/etc/sysconfig/iSulad文件(或isulad命令行)中同时配置ulimit限制,否则isulad启动会报错。
场景说明
iSulad默认启动的是普通容器,普通容器适合启动普通进程,其权限非常受限,仅具备/etc/default/isulad/config.json中capabilities所定义的默认权限。当需要特权操作时(比如操作/sys下的设备),需要特权容器完成这些操作,使用该特性,容器内的root将拥有宿主机的root权限, 否则,容器内的root在只是宿主机的普通用户权限。
使用限制
特权容器为容器提供了所有功能,还解除了设备cgroup控制器强制执行的所有限制,具备以下特性:
普通容器默认权能为:
Capability Key |
Capability Description |
SETPCAP |
修改进程权能 |
MKNOD |
允许使用mknod()系统调用创建特殊文件 |
AUDIT_WRITE |
向内核审计日志写记录 |
CHOWN |
对文件的 UIDs 和 GIDs 做任意的修改(参考 chown(2)) |
NET_RAW |
使用 RAW 和 PACKET sockets;为透明代理绑定任何地址 |
DAC_OVERRIDE |
忽略文件的DAC访问限制 |
FOWNER |
忽略文件属主ID必须和进程用户ID相匹配的限制 |
FSETID |
允许设置文件的setuid位 |
KILL |
允许对不属于自己的进程发送信号 |
SETGID |
允许改变进程的组ID |
SETUID |
允许改变进程的用户ID |
NET_BIND_SERVICE |
允许绑定到小于1024的端口 |
SYS_CHROOT |
允许使用chroot()系统调用 |
SETFCAP |
允许向其他进程转移能力以及删除其他进程的能力 |
当容器为特权模式时,将添加以下权能:
Capability Key |
Capability Description |
SYS_MODULE |
加载和卸载内核模块 |
SYS_RAWIO |
允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备 |
SYS_PACCT |
允许执行进程的BSD式审计 |
SYS_ADMIN |
允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 |
SYS_NICE |
允许提升优先级及设置其他进程的优先级 |
SYS_RESOURCE |
忽略资源限制 |
SYS_TIME |
允许改变系统时钟 |
SYS_TTY_CONFIG |
允许配置TTY设备 |
AUDIT_CONTROL |
启用和禁用内核审计;修改审计过滤器规则;提取审计状态和过滤规则 |
MAC_ADMIN |
覆盖强制访问控制 (Mandatory Access Control (MAC)),为Smack Linux安全模块(Linux Security Module (LSM)) 而实现 |
MAC_OVERRIDE |
允许 MAC 配置或状态改变。为 Smack LSM 而实现 |
NET_ADMIN |
允许执行网络管理任务 |
SYSLOG |
执行特权 syslog(2) 操作 |
DAC_READ_SEARCH |
忽略文件读及目录搜索的DAC访问限制 |
LINUX_IMMUTABLE |
允许修改文件的IMMUTABLE和APPEND属性标志 |
NET_BROADCAST |
允许网络广播和多播访问 |
IPC_LOCK |
允许锁定共享内存片段 |
IPC_OWNER |
忽略IPC所有权检查 |
SYS_PTRACE |
允许跟踪任何进程 |
SYS_BOOT |
允许重新启动系统 |
LEASE |
允许修改文件锁的FL_LEASE标志 |
WAKE_ALARM |
触发将唤醒系统的功能,如设置 CLOCK_REALTIME_ALARM 和 CLOCK_BOOTTIME_ALARM 定时器 |
BLOCK_SUSPEND |
可以阻塞系统挂起的特性 |
使用指导
iSulad使用–privileged给容器添加特权模式,在非必要情况下,不要给容器添加特权,遵循最小特权原则,减少存在的安全风险。
isula run --rm -it --privileged busybox
CRI API 接口是由kubernetes 推出的容器运行时接口,CRI定义了容器和镜像的服务接口。ISulad使用CRI接口,实现和kubernetes 的对接。
因为容器运行时与镜像的生命周期是彼此隔离的,因此需要定义两个服务。该接口使用Protocol Buffer定义,基于gRPC。
当前实现CRI版本为v1alpha1版本,官方API描述文件如下:
https://github.com/kubernetes/kubernetes/blob/release-1.14/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto
ISulad使用的为pass使用的1.14版本API描述文件,与官方API略有出入,以本文档描述的接口为准。
说明:CRI接口websocket流式服务,服务端侦听地址为127.0.0.1,端口为10350,端口可通过命令行–websocket-server-listening-port参数接口或者daemon.json配置文件进行配置。
接口列表
DNSConfig:配置sandbox的DNS服务器和搜索域
Protocol:协议的enum值列表
PortMapping:指定sandbox的端口映射配置
MountPropagation:挂载传播属性的enum列表
Mount:Mount指定host上的一个挂载卷挂载到容器中(只支持文件和文件夹)
NamespaceOption
Capability:包含待添加与待删除的权能信息
Int64Value:int64类型的封装
UInt64Value:uint64类型的封装
LinuxSandboxSecurityContext:配置sandbox的linux安全选项。注意,这些安全选项不会应用到sandbox中的容器中,也可能不适用于没有任何running进程的sandbox
LinuxPodSandboxConfig:设定和Linux主机及容器相关的一些配置
PodSandboxMetadata:Sandbox元数据包含构建sandbox名称的所有信息,鼓励容器运行时在用户界面中公开这些元数据以获得更好的用户体验,例如,运行时可以根据元数据生成sandbox的唯一命名。
PodSandboxConfig:包含创建sandbox的所有必选和可选配置信息
PodSandboxNetworkStatus:描述sandbox的网络状态
Namespace:命名空间选项
LinuxPodSandboxStatus:描述Linux sandbox的状态
PodSandboxState:sandbox状态值的enum数据
PodSandboxStatus:描述Podsandbox的状态信息
PodSandboxStateValue:对PodSandboxState的封装
PodSandboxFilter:用于列出sandbox时添加过滤条件,多个条件取交集显示
PodSandbox:包含最小化描述一个sandbox的数据
KeyValue:键值对的封装
SELinuxOption:应用于容器的SELinux标签
ContainerMetadata:Container元数据包含构建container名称的所有信息,鼓励容器运行时在用户界面中公开这些元数据以获得更好的用户体验,例如,运行时可以根据元数据生成container的唯一命名。
ContainerState:容器状态值的enum列表
ContainerStateValue:封装ContainerState的数据结构
ContainerFilter:用于列出container时添加过滤条件,多个条件取交集显示
LinuxContainerSecurityContext:指定应用于容器的安全配置
LinuxContainerResources:指定Linux容器资源的特定配置
Image:Image信息描述一个镜像的基本数据。
ImageSpec:表示镜像的内部数据结构,当前,ImageSpec只封装容器镜像名称
StorageIdentifier:唯一定义storage的标识
FilesystemUsage
AuthConfig
Container:用于描述容器信息,例如ID, 状态等。
ContainerStatus:用于描述容器状态信息
ContainerStatsFilter:用于列出container stats时添加过滤条件,多个条件取交集显示
ContainerStats:用于列出container stats时添加过滤条件,多个条件取交集显示
ContainerAttributes:列出container的基本信息
CpuUsage:列出container的CPU使用信息
MemoryUsage:列出container的内存使用信息
FilesystemUsage:列出container的读写层信息
Device:指定待挂载至容器的主机卷
LinuxContainerConfig
包含特定于Linux平台的配置
ContainerConfig:包含用于创建容器的所有必需和可选字段
NetworkConfig:Runtime的网络配置
RuntimeConfig:Runtime的网络配置
RuntimeCondition:描述runtime的状态信息
RuntimeStatus:Runtime的状态
Runtime服务中包含操作pod和容器的接口,以及查询runtime自身配置和状态信息的接口。
RunPodSandbox
StopPodSanbox
RemovePodSanbox
PodSanboxStatus
ListPodSanbox
CreateContainer
StartContainer
StopContainer
RemoveContainer
ListContainer
ContainerStatus
UpdateContainerResources
ExecSync
Exec
Attach
ContainerStats
ListContainerStats
UpdateRuntimeConfig
Stats
提供了从镜像仓库拉取、查看、和移除镜像的gRPC API。
ListImages
ImagesStatus
PullImage
RemoveImage
ImageFsInfo
1)如果创建sandbox时,PodSandboxConfig参数中配置了log_directory,则所有属于该sandbox的container在创建时必须在ContainerConfig中指定log_path,否则可能导致容器无法使用CRI接口启动,甚至无法使用CRI接口删除。
容器的真实LOGPATH=log_directory/log_path,如果log_path不配置,那么最终的LOGPATH会变为LOGPATH=log_directory。
如果该路径不存在,isulad在启动容器时会创建一个软链接,指向最终的容器日志真实路径,此时log_directory变成一个软链接,此时有两种情况:
第一种情况,如果该sandbox里其它容器也没配置log_path,在启动其它容器时,log_directory会被删除,然后重新指向新启动容器的log_path,导致之前启动的容器日志指向后面启动容器的日志。
第二种情况,如果该sandbox里其它容器配置了log_path,则该容器的LOGPATH=log_directory/log_path,由于log_directory实际是个软链接,使用log_directory/log_path为软链接指向容器真实日志路径时,创建会失败。
如果该路径存在,isulad在启动容器时首先会尝试删除该路径(非递归),如果该路径是个文件夹,且里面有内容,删除会失败,从而导致创建软链接失败,容器启动失败,删除该容器时,也会出现同样的现象,导致删除失败。
2)如果创建sandbox时,PodSandboxConfig参数中配置了log_directory,且container创建时在ContainerConfig中指定log_path,那么最终的LOGPATH=log_directory/log_path,isulad不会递归的创建LOGPATH,因而用户必须保证dirname(LOGPATH)存在,即最终的日志文件的上一级路径存在。
3)如果创建sandbox时,PodSandboxConfig参数中配置了log_directory,如果有两个或多个container创建时在ContainerConfig中指定了同一个log_path,或者不同的sandbox内的容器最终指向的LOGPATH是同一路径,若容器启动成功,则后启动的容器日志路径会覆盖掉之前启动的容器日志路径。
4)如果远程镜像仓库中镜像内容发生变化,调用CRI Pull image接口重新下载该镜像时,若本地原来存储有原镜像,则原镜像的镜像名称、TAG会变更为“none”
举例如下:
本地已存储镜像:
IMAGE TAG IMAGE ID SIZE
rnd-dockerhub.huawei.com/pproxyisulad/test latest 99e59f495ffaa 753kB
远程仓库中rnd-dockerhub.huawei.com/pproxyisulad/test:latest 镜像更新后,重新下载后:
IMAGE TAG IMAGE ID SIZE
rnd-dockerhub.huawei.com/pproxyisulad/test latest d8233ab899d41 1.42MB
使用isula images 命令行查询,REF显示为”-“:
REF IMAGE ID CREATED SIZE
rnd-dockerhub.huawei.com/pproxyisulad/test:latest d8233ab899d41 2019-02-14 19:19:37 1.42MB
- 99e59f495ffaa 2016-05-04 02:26:41 753kB
描述
isula login命令用于登录到镜像仓库。登录成功后可以使用isula pull命令从该镜像仓库拉取镜像。如果镜像仓库不需要密码,则拉取镜像前不需要执行该命令。
用法
isula login [OPTIONS] SERVER
参数
login命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表1 表1-20 login命令参数列表” 。
示例
$ isula login -u abc my.csp-edge.com:5000
Login Succeeded
描述
isula logout命令用于从镜像仓库退出登录。退出登录成功后再执行isula pull命令从该镜像仓库拉取镜像会因为未认证而拉取失败。
用法
isula logout SERVER
参数
logout命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表2 logout命令参数列表”。
示例
$ isula logout my.csp-edge.com:5000
Logout Succeeded
描述
从镜像仓库拉取镜像到本地。
用法
isula pull [OPTIONS] NAME[:TAG|@DIGEST]
参数
login命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表3 pull命令参数列表”。
示例
$ isula pull localhost:5000/official/busybox
Image "localhost:5000/official/busybox" pulling
Image "localhost:5000/official/busybox@sha256:bf510723d2cd2d4e3f5ce7e93bf1e52c8fd76831995ac3bd3f90ecc866643aff" pulled
描述
删除一个或多个镜像。
用法
isula rmi [OPTIONS] IMAGE [IMAGE...]
参数
rmi命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表4 rmi命令参数列表”。
示例
$ isula rmi rnd-dockerhub.huawei.com/official/busybox
Image "rnd-dockerhub.huawei.com/official/busybox" removed
描述
从一个tar包加载镜像。该tar包必须是使用docker save命令导出的tar包或格式一致的tar包。
用法
isula load [OPTIONS]
参数
load命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表5 load命令参数列表”。
示例
$ isula load -i busybox.tar
Load image from "/root/busybox.tar" success
描述
列出当前环境中所有镜像。
用法
isula images
参数
images命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表6 images命令参数列表”。
示例
$ isula images
REF IMAGE ID CREATED SIZE
rnd-dockerhub.huawei.com/official/busybox:latest e4db68de4ff2 2019-06-15 08:19:54 1.376 MB
描述
返回该镜像的配置信息。可以使用-f参数过滤出需要的信息。
用法
isula inspect [options] CONTAINER|IMAGE [CONTAINER|IMAGE...]
参数
inspect命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表7 inspect命令参数列表”。
示例
$ isula inspect -f "{{json .image.id}}" rnd-dockerhub.huawei.com/official/busybox
"e4db68de4ff27c2adfea0c54bbb73a61a42f5b667c326de4d7d5b19ab71c6a3b"
描述
开启该功能后isulad和镜像仓库之间的通信采用https通信,isulad和镜像仓库都会验证对方的合法性。
用法
要支持该功能,需要镜像仓库支持该功能,同时isulad也需要做相应的配置:
修改isulad的配置(默认路径/etc/isulad/daemon.json),将配置里的use-decrypted-key项配置为false。
需要将相关的证书放置到/etc/isulad/certs.d目录下对应的镜像仓库命名的文件夹下,证书具体的生成方法见docker的官方链接:
https://docs.docker.com/engine/security/certificates/
https://docs.docker.com/engine/security/https/
执行systemctl restart isulad重启isulad。
参数
可以在/etc/isulad/daemon.json中配置参数,也可以在启动isulad时携带参数:
isulad --use-decrypted-key=false
示例
配置use-decrypted-key参数为false
$ cat /etc/isulad/daemon.json
{
"group": "isulad",
"graph": "/var/lib/isulad",
"state": "/var/run/isulad",
"engine": "lcr",
"log-level": "ERROR",
"pidfile": "/var/run/isulad.pid",
"log-opts": {
"log-file-mode": "0600",
"log-path": "/var/lib/isulad",
"max-file": "1",
"max-size": "30KB"
},
"log-driver": "stdout",
"hook-spec": "/etc/default/isulad/hooks/default.json",
"start-timeout": "2m",
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": [
"docker.io"
],
"insecure-registries": [
"rnd-dockerhub.huawei.com"
],
"pod-sandbox-image": "",
"image-opt-timeout": "5m",
"native.umask": "secure",
"network-plugin": "",
"cni-bin-dir": "",
"cni-conf-dir": "",
"image-layer-check": false,
"use-decrypted-key": false,
"insecure-skip-verify-enforce": false
}
将证书放到对应的目录下
$ pwd
/etc/isulad/certs.d/my.csp-edge.com:5000
$ ls
ca.crt tls.cert tls.key
重启isulad
$ systemctl restart isulad
执行pull命令从仓库下载镜像
$ isula pull my.csp-edge.com:5000/busybox
Image "my.csp-edge.com:5000/busybox" pulling
Image "my.csp-edge.com:5000/busybox@sha256:f1bdc62115dbfe8f54e52e19795ee34b4473babdeb9bc4f83045d85c7b2ad5c0" pulled
描述
根据embedded镜像的manifest加载镜像。注意–type的值必须填写embedded。
用法
isula load [OPTIONS] --input=FILE --type=TYPE
参数
load命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表5 load命令参数列表”。
示例
$ isula load -i test.manifest --type embedded
Load image from "/root/work/bugfix/tmp/ci_testcase_data/embedded/img/test.manifest" success
描述
列出当前环境中所有镜像。
用法
isula images [OPTIONS]
参数
images命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表6 images命令参数列表”。
示例
$ isula images
REF IMAGE ID CREATED SIZE
test:v1 9319da1f5233 2018-03-01 10:55:44 1.273 MB
描述
返回该镜像的配置信息。可以使用-f参数过滤出需要的信息。
用法
isula inspect [options] CONTAINER|IMAGE [CONTAINER|IMAGE...]
参数
inspect命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表7 inspect命令参数列表”。
示例
$ isula inspect -f "{{json .created}}" test:v1
"2018-03-01T15:55:44.322987811Z"
描述
删除一个或多个镜像。
用法
isula rmi [OPTIONS] IMAGE [IMAGE...]
参数
rmi命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表4 rmi命令参数列表”。
示例
$ isula rmi test:v1
Image "test:v1" removed
场景说明
在实际的生产环境中,开发者提供的应用程序或者平台提供的服务难免存在bug,因此,一套管理系统对运行的应用程序进行周期性的健康检查和修复就是不可或缺的。容器健康检查机制便添加了用户定义的对容器进行健康检查的功能。在容器创建时配置–health-cmd选项,在容器内部周期性地执行命令,通过命令的返回值来监测容器的健康状态。
配置方法
在容器启动时的配置:
isula run -itd --health-cmd "echo iSulad >> /tmp/health_check_file || exit 1" --health-interval 5m --health-timeout 3s --health-exit-on-unhealthy busybox bash
可配置的选项:
–health-cmd,必选,在容器内执行的命令。返回值为0表示成功,非0表示失败。
–health-interval,默认 30s,最大为int64上限(纳秒),自定义配置最小值1s,相邻两次命令执行的间隔时间(注:入参0s时视为default)。
–health-timeout,默认 30s,最大为int64上限(纳秒),自定义配置最小值1s,单次检查命令执行的时间上限,超时则任务命令执行失败(注:入参0s时视为default),仅支持runtime类型为lcr的容器。
–health-start-period,默认 0s,最大为int64上限(纳秒),自定义配置最小值1s,容器初始化时间。
–health-retries,默认 3,最大为int32上限,健康检查失败最大的重试次数。
–health-exit-on-unhealthy,默认false,检测到容器非健康时是否杀死容器。
检查规则
容器启动后,容器状态中显示health:starting。
经过start-period时间后开始,以interval为间隔周期性在容器中执行CMD。即:当一次命令执行完毕后,经过interval时间,执行下一次命令。
若CMD命令在timeout限制的时间内执行完毕,并且返回值为0,则视为一次检查成功。否则视为一次检查失败。检查成功后,容器状态变为health:healthy。
若CMD命令连续retries次检查失败,则容器状态变为health:unhealthy。失败后容器也会继续进行健康检查。
容器状态为health:unhealthy时,任意一次检查成功会使得容器状态变为health:healthy。
设置–exit-on-unhealthy的情况下,如果容器因为非被杀死退出(退出返回值137)后,健康检查只有容器在重新启动后才会继续生效。
CMD执行完毕或超时时,docker daemon会将这次检查的起始时间、返回值和标准输出记录到容器的配置文件中。最多记录5条。此外,容器的配置文件中还存储着健康检查的相关参数。
运行中的容器的健康检查状态也会被写入容器配置中。通过isula inspect可以看到。
"Health": {
"Status": "healthy",
"FailingStreak": 0,
"Log": [
{
"Start": "2018-03-07T07:44:15.481414707-05:00",
"End": "2018-03-07T07:44:15.556908311-05:00",
"ExitCode": 0,
"Output": ""
},
{
"Start": "2018-03-07T07:44:18.557297462-05:00",
"End": "2018-03-07T07:44:18.63035891-05:00",
"ExitCode": 0,
"Output": ""
},
......
}
使用限制
容器内健康检查的状态信息最多保存5条。会保存最后得到的5条记录。
容器启动时若健康检查相关参数配置为0,则按照默认值处理。
带有健康检查配置的容器启动后,若iSulad daemon退出,则健康检查不会执行。iSulad daemon再次启动后,正在运行且带有健康检查配置的容器其健康状态会变为starting。之后检查规则同上。
如果健康检查从第一次开始便一直失败,其状态保持与之前一致(starting),直到达到指定失败次数(–health-retries)后变为unhealthy,或者检查成功后变为healthy。
对于OCI类型的runtime的容器,健康检查功能待完善。目前仅完整支持lcr类型的容器。
查询服务版本信息
描述
isula version 命令用于查询iSulad服务的版本信息。
用法
isula version
实例
查询版本信息
isula version
如果isulad服务正常运行,则可以查看到客户端、服务端以及OCI config的版本等信息。
Client:
Version: 1.0.31
Git commit: fa7f9902738e8b3d7f2eb22768b9a1372ddd1199
Built: 2019-07-30T04:21:48.521198248-04:00
Server:
Version: 1.0.31
Git commit: fa7f9902738e8b3d7f2eb22768b9a1372ddd1199
Built: 2019-07-30T04:21:48.521198248-04:00
OCI config:
Version: 1.0.0-rc5-dev
Default file: /etc/default/isulad/config.json
若isulad服务未运行,则仅仅查询到客户端的信息,并提示无法连接到服务端。
Client:
Version: 1.0.31
Git commit: fa7f9902738e8b3d7f2eb22768b9a1372ddd1199
Built: 2019-07-30T04:21:48.521198248-04:00
Can not connect with server.Is the iSulad daemon running on the host?
因此,isula version命令也常常用来检验isulad是否正常运行。
查询系统级信息
描述
isula info命令用于对系统级信息,以及容器和镜像数目等信息的查询。
用法
isula info
示例
查询系统级信息,可以展示容器数目,镜像数目,内核版本、操作系统等信息
$ isula info
Containers: 2
Running: 0
Paused: 0
Stopped: 2
Images: 8
Server Version: 1.0.31
Logging Driver: json-file
Cgroup Driverr: cgroupfs
Hugetlb Pagesize: 2MB
Kernel Version: 4.19
Operating System: Fedora 29 (Twenty Nine)
OSType: Linux
Architecture: x86_64
CPUs: 8
Total Memory: 7 GB
Name: localhost.localdomain
iSulad Root Dir: /var/lib/isulad
场景说明
seccomp(secure computing mode)是linux kernel从2.6.23版本开始引入的一种简洁的sandboxing机制。在一些特定场景下,用户需要在容器中执行一些“特权”操作,但又不想启动特权容器,用户经常会在run时添加–cap-add来获得一些“小范围”的权限。对于安全要求比较严格的容器实例,上述的CAP粒度不一定能够满足安全需要,可使用一些办法精细化控制权限范围。
举例
普通容器场景中,用户使用-v将宿主机某目录(包含某普通用户无法执行的二进制),映射到容器中。
在容器中,可以将二进制修改权限chmod 4777加入S标志位。这样在宿主机上,原先不能运行二进制的普通用户(或者运行此二进制受限),可以在S标志位的添加动作后,在运行此二进制的时候,获取到二进制自身的权限(比如root),从而提权运行或者访问其他文件。
这个场景,如果在严格安全要求下,需要使用seccomp裁剪chmod、fchmod、fchmodat系统调用。
使用限制
seccomp可能会影响性能,设置seccomp之前需要对场景进行评估,确定必要时加入seccomp配置。
使用指导
通过–security-opt将配置文件传给要过滤系统调用的容器。
isula run -itd --security-opt seccomp=/path/to/seccomp/profile.json rnd-dockerhub.huawei.com/official/busybox
说明:
1)创建容器时通过–security-opt将配置文件传给容器时,采用默认配置文件(/etc/isulad/seccomp_default.json)。
2)创建容器时–security-opt设置为unconfined时,对容器不过滤系统调用。
3)“/path/to/seccomp/profile.json”需要是绝对路径。
获取普通容器的默认seccomp配置
启动一个普通容器(或者是带–cap-add的容器),并查看默认权限配置:
cat /etc/isulad/seccomp_default.json | python -m json.tool > profile.json
可以看到”seccomp”字段中,有很多的”syscalls”,在此基础上,仅提取syscalls的部分,参考定制seccomp配置文件,进行定制化操作。
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
{
"action": "SCMP_ACT_ALLOW",
"name": "accept"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "accept4"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "access"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "alarm"
},
{
"action": "SCMP_ACT_ALLOW",
"name": "bind"
},
]...
查看转换为lxc可识别的seccomp配置
cat /var/lib/isulad/engines/lcr/74353e38021c29314188e29ba8c1830a4677ffe5c4decda77a1e0853ec8197cd/seccomp
...
waitpid allow
write allow
writev allow
ptrace allow
personality allow [0,0,SCMP_CMP_EQ,0]
personality allow [0,8,SCMP_CMP_EQ,0]
personality allow [0,131072,SCMP_CMP_EQ,0]
personality allow [0,131080,SCMP_CMP_EQ,0]
personality allow [0,4294967295,SCMP_CMP_EQ,0]
...
定制seccomp配置文件
在启动容器的时候使用–security-opt引入seccomp配置文件,容器实例会按照配置文件规则进行限制系统API的运行。首先获取普通容器的默认seccomp,得到完整模板,然后按照本节定制配置文件,启动容器:
isula run --rm -it --security-opt seccomp:/path/to/seccomp/profile.json rnd-dockerhub.huawei.com/official/busybox
配置文件模板:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "syscall-name",
"action": "SCMP_ACT_ERRNO",
"args": null
}
]
}
须知:
- defaultAction、syscalls:对应的action的类型是一样的,但其值是不能一样的,目的就是让所有的syscal都有一个默认的action,并且如果syscalls数组中有明确的定义,就以syscalls中的为准,由于defaultAction、action的值不一样,就能保证action不会有冲突。当前支持的action有:
“SCMP_ACT_ERRNO”:禁止,并打印错误信息。
“SCMP_ACT_ALLOW”:允许。
- syscalls: 数组,可以只有一个syscall,也可以有多个,可以带args,也可以不带。
- name:要过滤的syscall。
- args:数组,里面的每个object的定义如下:
type Arg struct {
Index uint `json:"index"` //参数的序号,如open(fd, buf, len),fd 对应的就是0,buf为1
Value uint64 `json:"value"` //跟参数进行比较的值
ValueTwo uint64 `json:"value_two"` //仅当Op=MaskEqualTo时起作用,用户传入值跟Value按位与操作后,跟ValueTwo进行比较,若相等则执行action。
Op Operator `json:"op"`
}
args中的Op,其取值可以下页面的任意一种:
“SCMP_CMP_NE”: NotEqualTo
“SCMP_CMP_LT”: LessThan
“SCMP_CMP_LE”: LessThanOrEqualTo
“SCMP_CMP_EQ”: EqualTo
“SCMP_CMP_GE”: GreaterThanOrEqualTo
“SCMP_CMP_GT”: GreaterThan
“SCMP_CMP_MASKED_EQ”: MaskEqualTo
场景说明
capabilities机制是linux kernel 2.2之后引入的安全特性,用更小的粒度控制超级管理员权限,可以避免使用 root 权限,将root用户的权限细分为不同的领域,可以分别启用或禁用。capabilities详细信息可通过Linux Programmer’s Manual进行查看(capabilities(7) - Linux man page):
man capabilities
使用限制
isulad默认Capabilities(白名单)配置如下,普通容器进程将默认携带:
"CAP_CHOWN",
"CAP_DAC_OVERRIDE",
"CAP_FSETID",
"CAP_FOWNER",
"CAP_MKNOD",
"CAP_NET_RAW",
"CAP_SETGID",
"CAP_SETUID",
"CAP_SETFCAP",
"CAP_SETPCAP",
"CAP_NET_BIND_SERVICE",
"CAP_SYS_CHROOT",
"CAP_KILL",
"CAP_AUDIT_WRITE"
默认的权能配置,包含了CAP_SETUID和CAP_FSETID,如host和容器共享目录,容器可对共享目录的二进制文件进行文件权限设置,host上的普通用户可能使用该特性进行提权攻击。CAP_AUDIT_WRITE,容器可以对host写入,存在一定的风险,如果使用场景不需要,推荐在启动容器的时候使用–cap-drop将其删除。
增加Capabilities意味着容器进程具备更大的能力,同时也会开放更多的系统调用接口。
使用指导
iSulad使用–cap-add/–cap-drop给容器增加/删去特定的权限,在非必要情况下,不要给容器增加额外的权限,推荐将容器默认但非必要的权限也去掉。
isula run --rm -it --cap-add all --cap-drop SYS_ADMIN rnd-dockerhub.huawei.com/official/busybox
场景说明
SELinux(Security-Enhanced Linux)是一个linux内核的安全模块,提供了访问控制安全策略机制,iSulad将采用MCS(多级分类安全)实现对容器内进程打上标签限制容器访问资源的方式,减少提权攻击的风险,防止造成更为重要的危害。
使用限制
确保宿主机已使能SELinux,且daemon端已打开SELinux使能开发(/etc/isulad/daemon.json中“selinux-enabled”字段为true, 或者命令行参数添加–selinux-enabled)
确保宿主机上已配置合适的selinux策略,推荐使用container-selinux进行配置
引入SELinux会影响性能,设置SELinux之前需要对场景进行评估,确定必要时打开daemon端SELinux开关并设置容器SELinux配置
对挂载卷进行标签配置时,源目录不允许为/、/usr、/etc、/tmp、/home、/run、/var、/root以及/usr的子目录。
说明:
- 目前iSulad不支持对容器的文件系统打标签,确保容器文件系统及配置目录打上容器可访问标签,需使用chcon命令对其打上标签。
- 若iSulad启用SELinux访问控制,建议daemon启动前对/var/lib/isulad目录打上标签,容器容器创建时目录下生产的文件及文件夹将默认继承其标签,例如:
chcon -R system_u:object_r:container_file_t:s0 /var/lib/isulad
使用指导
daemon端使能selinux:
isulad --selinux-enabled
启动容器时配置selinux标签安全上下文
–security-opt=“label=user:USER” 配置安全上下文用户
–security-opt=“label=role:ROLE” 配置安全上下文角色
–security-opt=“label=type:TYPE” 配置安全上下文类型
–security-opt=“label=level:LEVEL” 配置安全上下文域
–security-opt=“label=disable” 容器禁用SELinux配置
$ isula run -itd --security-opt label=type:container_t --security-opt label=level:s0:c1,c2 rnd-dockerhub.huawei.com/official/centos
9be82878a67e36c826b67f5c7261c881ff926a352f92998b654bc8e1c6eec370
为挂载卷打selinux标签(‘z’为共享模式)
$ isula run -itd -v /test:/test:z rnd-dockerhub.huawei.com/official/centos
9be82878a67e36c826b67f5c7261c881ff926a352f92998b654bc8e1c6eec370
$ls -Z /test
system_u:object_r:container_file_t:s0 file
描述
支持在容器的生命周期中,运行OCI标准hooks。包括三种类型的hooks:
prestart hook:在执行isula start命令之后,而在容器的1号进程启动之前,被执行。
poststart hook:在容器1号进程启动之后,而在isula start命令返回之前,被执行。
poststop hook:在容器被停止之后,但是在停止命令返回之前,被执行。
OCI hooks的配置格式规范如下:
path:格式是字符串,必须项,必须为绝对路径,指定的文件必须有可执行权限。
args:格式是字符串数组,可选项,语义和execv的args一致。
env:格式是字符串数组,可选项,语义和环境变量一致,内容为键值对,如:”PATH=/usr/bin”。
timeout:格式是整数,可选项,必须大于0,表示钩子执行的超时时间。如果钩子进程运行时间超过配置的时间,那么钩子进程会被杀死。
hook的配置为json格式,一般存放在json结尾的文件中,示例如下:
{
"prestart": [
{
"path": "/usr/bin/echo",
"args": ["arg1", "arg2"],
"env": [ "key1=value1"],
"timeout": 30
},
{
"path": "/usr/bin/ls",
"args": ["/tmp"]
}
],
"poststart": [
{
"path": "/usr/bin/ls",
"args": ["/tmp"],
"timeout": 5
}
],
"poststop": [
{
"path": "/tmp/cleanup.sh",
"args": ["cleanup.sh", "-f"]
}
]
}
接口
isulad和isula都提供了hook的接口,isulad提供了默认的hook配置,会作用于所有容器;而isula提供的hook接口,只会作用于当前创建的容器。
isulad提供的默认OCI hooks配置:
通过/etc/isulad/daemon.json配置文件的hook-spec配置项设置hook配置的文件路径:”hook-spec”: “/etc/default/isulad/hooks/default.json”。
通过isulad –hook-spec参数设置hook配置的文件路径。
isula提供的OCI hooks配置:
isula create –hook-spec:指定hook配置的json文件的路径。
isula run –hook-spec:指定hook配置的json文件的路径。
run的配置其实也是在create阶段生效了。
使用限制
hook-spec指定的路径必须是绝对路径。
hook-spec指定的文件必须存在。
hook-spec指定的路径对应的必须是普通文本文件,格式为json。
hook-spec指定的文件大小不能超过10MB。
hooks配置的path字段必须为绝对路径。
hooks配置的path字段指定文件必须存在。
hooks配置的path字段指定文件必须有可执行权限。
hooks配置的path字段指定文件的owner必须是root。
hooks配置的path字段指定文件必须只有root有写权限。
hooks配置的timeout必须大于0。
login命令参数列表
命令 |
参数 |
说明 |
login
|
-H, –host |
指定要连接的iSulad socket文件路径 |
-p, –password |
登录镜像仓库的密码 |
|
–password-stdin |
从标准输入获取仓库的密码 |
|
-u, –username |
登录镜像仓库的用户名 |
logout命令参数列表
命令 |
参数 |
说明 |
logout |
-H, –host |
指定要连接的iSulad socket文件路径 |
pull命令参数列表
命令 |
参数 |
说明 |
pull |
-H, –host |
指定要连接的iSulad socket文件路径 |
rmi命令参数列表
命令 |
参数 |
说明 |
rmi
|
-H, –host |
指定要连接的iSulad socket文件路径 |
-f, –force |
强制移除镜像 |
load命令参数列表
命令 |
参数 |
说明 |
load |
-H, –host (仅 isula支持) |
指定要连接的iSulad socket文件路径 |
-i, –input |
指定从哪里导入镜像。如果是docker类型,则为镜像压缩包路径,如果是embedded类型,则为镜像manifest路径。 |
|
–tag |
不使用默认的镜像名称,而是使用TAG指定的名称,type为docker类型时支持该参数 |
|
-t, –type |
镜像类型,取值为embedded或docker(默认值) |
images命令参数列表
命令 |
参数 |
说明 |
images
|
-H, –host |
指定要连接的iSulad socket文件路径 |
-q, –quit |
只显示镜像名字 |
inspect命令参数列表
命令 |
参数 |
说明 |
inspect |
-H, –host |
指定要连接的iSulad socket文件路径 |
-f, –format |
使用模板格式化输出 |
|
-t, –time |
超时时间的秒数,若在该时间内inspect查询容器信息未执行成功,则停止等待并立即报错,默认为120秒,当配置小于等于0的值,表示不启用timeout机制inspect查询容器信息会一直等待,直到获取容器信息成功后返回。 |
CNI单网络配置参数
参数 |
类型 |
是否可选 |
说明 |
cniVersion |
string |
必选 |
CNI版本号,当前只支持0.3.0,0.3.1。 |
name |
string |
必选 |
网络名称,由用户自定义,需保证唯一。 |
type |
string |
必选 |
网络类型。目前支持的网络类型: underlay_ipvlan overlay_l2 underlay_l2 vpc-router dpdk-direct phy-direct |
ipmasp |
bool |
可选 |
设置IP masquerade |
ipam |
结构体 |
可选 |
详细定义参考IPAM参数定义 |
ipam.type |
string |
可选 |
IPAM类型,目前支持的类型: (1)underlay_l2、overlay_l2、vpc-router组网默认值distributed_l2,且只支持distributed_l2。 (2)underlay_ipvlan组网,默认distributed_l2。CCN场景只支持null、fixed;CCE和FST 5G core场景只支持null、distributed_l2。 (3)phy-direct、dpdk-direct组网,默认l2,可选null、distributed_l2。FST 5G core场景只支持null、distributed_l2。 说明: 超出选择范围(比如host-local),Canal会自动设置为默认,不会返回错误。 null:不使用canal管理ip。 fixed:固定ip,CCN场景使用。 l2:目前没有场景使用。 distributed_l2:使用分布式小子网管理ip。 |
ipam.subnet |
string |
可选 |
子网信息。Canal支持的subnet mask范围为[8,29],并且要求IP地址不能为Multicast地址(如224.0.0.0/4),保留地址(240.0.0.0/4),本地link地址(169.254.0.0/16)以及本地loop地址(127.0.0.0/8)。 |
ipam.gateway |
string |
可选 |
网关IP |
ipam.range-start |
string |
可选 |
可用的起始IP地址 |
ipam.range-end |
string |
可选 |
可用的结束IP地址 |
ipam.routes |
结构体 |
可选 |
subnet列表,每个元素都是一个route字典。参考route定义. |
ipam.routes.dst |
string |
可选 |
表示目的网络 |
ipam.routes.gw |
string |
可选 |
表示网关地址 |
dns |
结构体 |
可选 |
包含一些DNS的特殊值。 |
dns.nameservers |
[]string |
可选 |
nameservers |
dns.domain |
string |
可选 |
domain |
dns.search |
[]string |
可选 |
search |
dns.options |
[]string |
可选 |
选项 |
multi_entry |
int |
可选 |
表示一个vnic需要的ip数量,范围0~16。对于物理直通,单个网卡最多可申请128个IP。 |
backup_mode |
bool |
可选 |
表示主备模式,仅用于phy-direct和dpdk-direct组网。 |
vlanID |
int |
可选 |
0~4095,允许PaaS直接指定。 |
vlan_inside |
bool |
可选 |
true表示vlan功能由Node内部实现,false表示vlan在外部实现。 |
vxlanID |
int |
可选 |
0~16777215,允许PaaS直接指定。 |
vxlan_inside |
bool |
可选 |
true表示vlan功能由Node内部实现,false表示vlan在外部实现。 |
action |
string |
可选 |
该参数只能和特殊containerID “000000000000”一起使用。 Create表示创建网络。 Delete表示删除网络。 |
args |
map[string]interface{} |
可选 |
主要描述键值对类型。表2 |
runtimeConfig |
结构体 |
可选 |
无 |
capabilities |
结构体 |
可选 |
无 |
CNI args参数表
参数 |
类型 |
是否可选 |
说明 |
K8S_POD_NAME |
string |
可选 |
申请固定IP(runtimeConfig.ican_caps.fixed_ip为true)时需要设置K8S_POD_NAME |
K8S_POD_NAMESPACE |
string |
可选 |
申请固定IP(runtimeConfig.ican_caps.fixed_ip为true)时需要设置K8S_POD_NAMESPACE |
SECURE_CONTAINER |
string |
可选 |
安全容器标志 |
multi_port |
int |
可选 |
默认值为1,取值范围1-8。只支持phy-direct和dpdk-direct两种类型网络,指定直通网卡数量 |
phy-direct |
string |
可选 |
用于在创建硬直通容器网络时指定接入的网卡 |
dpdk-direct |
string |
可选 |
用于在创建dpdk直通容器网络时指定接入的网卡 |
tenant_id |
string |
可选 |
租户的ID。 只支持vpc-router类型网络。 |
vpc_id |
string |
可选 |
VPC的ID。 只支持vpc-router类型网络。 |
secret_name |
string |
可选 |
表示k8s apiserver中保存有ak sk的对象名。 只支持vpc-router类型网络 参考配置VPC-Router逻辑网络 |
IP |
string |
可选 |
用户指定ip地址,格式“192.168.0.10” |
K8S_POD_NETWORK_ARGS |
string |
可选 |
指定ip地址,格式“192.168.0.10”。若args中IP和K8S_POD_NETWORK_ARGS都不为空,以K8S_POD_NETWORK_ARGS为准。 |
INSTANCE_NAME |
string |
可选 |
INSTANCE ID。 参考支持容器固定IP |
dist_gateway_disable |
bool |
可选 |
true表示不创建gateway,false表示创建gateway。 |
phynet |
string或[]string |
可选 |
所需加入的的物理平面信息,为预先定义好的物理网络名称,与SNC体系中的呼应,输入两个平面名时,支持主备平面。例如:”phy_net1” 或 [“phy_net2”,“phy_net3”] |
endpoint_policies |
struct |
可选 |
“endpoint_policies”: [ { “Type”: “”, “ExceptionList”: [ ”” ], “NeedEncap”: true, “DestinationPrefix”: “” } ] |
port_map |
struct |
可选 |
NAT类型网络中,支持容器端口发布至主机端口。 “port_map”: [ { “local_port”: number, “host_port”: number, “protocol”: [string…] }… ] |
CNI多网络配置参数
参数 |
类型 |
是否可选 |
说明 |
cniVersion |
string |
必选 |
CNI版本号,当前只支持0.3.0,0.3.1。 |
name |
string |
必选 |
网络名称,由用户自定义,需保证唯一。 |
plugins |
struct |
必选 |
具体配置请参见表1 CNI单网络配置参数。 |