容器用户指南

容器用户指南

 

目录

法律声明............................................................................................................. 1

前言.................................................................................................................... 1

iSula容器引擎...................................................................................................... 3

3.1 概述............................................................................................................ 3

3.2 安装与部署.................................................................................................. 4

3.3 使用方法.................................................................................................... 25

3.4 附录......................................................................................................... 115

 

法律声明

商标声明

版权所有© 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容器引擎

3.1 概述

iSula通用容器引擎相比docker,是一种新的容器解决方案,提供统一的架构设计来满足CTIT领域的不同需求。相比Golang编写的Docker,轻量级容器使用C/C++实现,具有轻、灵、巧、快的特点,不受硬件规格和架构的限制,底噪开销更小,可应用领域更为广泛。

容器统一架构如图所示。

 

 

3.2 安装与部署

3.2.1 安装方法

iSulad可以通过yumrpm命令两种方式安装,由于yum会自动安装依赖,而rpm命令需要手动安装所有依赖,所以推荐使用yum安装。

这里给出两种安装方式的操作方法。

(推荐)使用yum安装iSulad,参考命令如下:

$ sudo yum install -y iSulad

使用rpm安装iSulad,需要下载iSulad及其所有依赖库的RPM包,然后手动安装。安装单个iSuladRPM包(依赖包安装方式相同),参考命令如下:

$ sudo rpm -ihv iSulad-xx.xx.xx-YYYYmmdd.HHMMSS.gitxxxxxxxx.aarch64.rpm

3.2.2 部署配置

3.2.2.1 部署方式

轻量级容器引擎(iSulad)服务端daemonisuladisulad可以通过配置文件进行配置,也可以通过命令行的方式进行配置,例如: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-filemax-sizelog-pathmax-file指日志文件个数;max-size指日志触发防爆的阈值,若max-file1max-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,容器Bcgroup父路径指定为容器Acgroup路径,在删除容器的时候需要先删除容器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仅供参考,请根据实际需要进行配置

3.2.2.2 存储说明

文件名

文件路径

内容

 

/etc/default/isulad/

存放isuladOCI配置文件和钩子模板文件,文件夹下的配置文件权限设置为0640sysmonitor检查脚本权限为0550

 

/etc/isulad/

isulad的默认配置文件和seccomp的默认配置文件

isulad.sock

/var/run/

管道通信文件,客户端和isulad的通信使用的socket文件

isulad.pid

/var/run/

存放isuladPID,同时也是一个文件锁防止启动多个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/ :容器rootfsmount

/var/lib/isulad/engines/lcr/ :存放lcr容器配置目录,每个容器一个目录(以容器名命名)

 

3.2.2.3 约束限制
  1. 高并发场景(并发启动200容器)下,glibc的内存管理机制会导致内存空洞以及虚拟内存较大(例如10GB)的问题。该问题是高并发场景下glibc内存管理机制的限制,而不是内存泄露,不会导致内存消耗无限增大。可以通过设置MALLOC_ARENA_MAX环境变量来减少虚拟内存的问题,而且可以增大减少物理内存的概率。但是这个环境变量会导致iSulad的并发性能下降,需要用户根据实际情况做配置。

参考实践情况,平衡性能和内存,可以设置MALLOC_ARENA_MAX4。(在arm64服务器上面对iSulad的性能影响在10%以内)

   配置方法:

1. 手动启动iSulad的场景,可以直接export MALLOC_ARENA_MAX=4,然后再启动iSulad即可。

2. systemd管理iSulad的场景,可以修改/etc/sysconfig/iSulad,增加一条MALLOC_ARENA_MAX=4即可。

  1. daemon指定各种运行目录时的注意事项

以–root为例,当使用/new/path/作为daemon新的Root Dir时,如果/new/path/下已经存在文件,且目录或文件名与isulad需要使用的目录或文件名冲突(例如:enginesmnt等目录)时,isulad可能会更新原有目录或文件的属性,包括属主、权限等为自己的属主和权限。

所以,用户需要明白重新指定各种运行目录和文件,会对冲突目录、文件属性的影响。建议用户指定的新目录或文件为isulad专用,避免冲突导致的文件属性变化以及带来的安全问题。

  1. 日志文件管理:

 须知:

日志功能对接: iSuladsystemd管理,日志也由systemd管理,然后传输给rsyslogdrsyslog默认会对写日志速度有限制,可以通过修改/etc/rsyslog.conf文件,增加”$imjournalRatelimitInterval 0”配置项,然后重启rsyslogd的服务即可。

  1. 命令行参数解析限制

使用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

  1. 启动一个isulad容器,不能够以非root用户进行isula run -i/-t/-ti以及isula attach/exec操作。
3.2.2.4 DAEMON多端口的绑定

描述

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])

若指定的hostunix socket,则必须是合法的unix socket,需要以”unix://“开头,后跟合法的socket绝对路径;

若指定的hosttcp端口,则必须是合法的tcp端口,需要以”tcp://“开头,后跟合法的IP地址和端口,IP地址可以为localhost

可以指定至多10个有效的端口,超过10个则会出现错误,isulad无法正常启动。

 

3.2.2.5 配置TLS认证与开启远程访问

描述

iSulad采用C/S模式进行设计,在默认情况,iSulad守护进程isulad只侦听本地/var/run/isulad.sock,因此只能在本地通过客户端isula执行相关命令操作容器。为了能使isula可以远程访问容器,isulad守护进程需要通过tcp:ip的方式侦听远程访问的端口。然而,仅通过简单配置tcp ip:port进行侦听,这样会导致所有的ip都可以通过调用isula -H tcp://:portisulad通信,容易导致安全问题,因此推荐使用较安全版本的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_VERBOSITYGRPC_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

3.2.3 卸载

卸载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

3.3 使用方法

3.3.1 容器管理

3.3.1.1创建容器

描述

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

允许执行的CPUe.g. 0-301

–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参数值可设置范围在0100之间。 此参数值越低,就会让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参数,在容器启动阶段校验usergroup时,容器如果使用的是OCI镜像,是从镜像的真实rootfsetc/passwdetc/group文件中校验,如果使用的是rootfs文件夹或块设备作为容器的rootfs,则校验的是host中的etc/passwdetc/group文件;查找时使用的rootfs会忽略-v 和–mount等挂载参数,意味着使用这些参数尝试覆盖etc/passwdetc/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...

3.3.1.2启动容器

描述

isula start命令用于启动一个或多个容器。

用法

isula start [OPTIONS] CONTAINER [CONTAINER...]

参数

start命令支持参数参考下表。

命令

参数

说明

start

-H, –host

指定要连接的iSulad socket文件路径

-R, –runtime

容器运行时,参数支持”lcr”,忽略大小写,因此”LCR””lcr”是等价的

示例

启动一个新容器

$ isula start fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

3.3.1.3 运行容器

描述

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

允许执行的CPUe.g. 0-301

–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参数值可设置范围在0100之间。 此参数值越低,就会让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=[]

挂载一个卷

约束限制

  1. 容器父进程进程退出时,则对应的容器也自动退出。
  2. 创建普通容器时父进程不能为init,因为普通容器的权限不够,导致容器可以创建成功,但是attach进去的时候会卡住。
  3. 运行容器时,不指定–net,默认hostnamelocalhost
  4. 使用–files-limit参数传入一个很小的值,如1时,启动容器时,iSulad创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时容器进程已经打开超过1个句柄,因而写入报错导致启动失败启动容器会失败。
  5. mount参数和–volume参数同时存在时,如果目的路径有冲突,则–mount会在–volume之后挂载(即将–volume中的挂载点覆盖掉)

 

备注:轻量级容器的参数中type支持bindsquashfs,当type=squashfs时,src是镜像的路径;原生docker的参数type支持bindvolumetmpfs

  1. restart重启策略不支持unless-stopped
  2. 以下三种情况与docker 返回值不一致,docker返回127,轻量级容器返回125

device参数指定主机设备为不存在的设备

hook-spec参数指定不存在的hook json文件

entrypoint 参数指定不存在的入口参数

  1. 使用–volume参数时,由于容器启动时会对/dev/ptmx设备进行删除重建,因此请勿将/dev目录挂载至容器/dev目录,应使用–device/dev下的设备在容器中进行挂载
  2. 禁止使用echo的方式向run命令的stdin输入数据,会导致客户端卡死。应该直接将echo的值作为命令行参数传给容器

 

[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 ~]#

  1. 使用host的根目录(/)作为容器的文件系统,那么在挂载路径时,如果有如下情况

 

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_MAX4。(在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

3.3.1.4 停止容器

描述

isula stop命令用于停止一个或多个运行中的容器。首先向容器中的首进程会发送SIGTERM信号,在指定时间(默认为10s)内容器未停止时,会发送SIGKILL

用法

isula stop [OPTIONS] CONTAINER [CONTAINER...]

参数

stop命令支持参数参考下表。

命令

参数

说明

stop

-f, –force

强制停止正在运行的容器

-H, –host

指定要连接的iSulad socket文件路径

-t, –time

先优雅停止,超过这个时间,则强行终止

约束限制

  1. 指定t参数且t<0时,请确保自己容器的应用会处理stop信号。

Stop的原理:Stop会首先给容器发送Stop 信号(SIGTERM),然后等待一定的时间(这个时间就是用户输入的 t),过了指定时间如果容器还仍处于运行状态,那么就发送kill信号(SIGKILL)使容器强制退出。

  1. 输入参数t的含义:

t<0 : 表示一直等待,不管多久都等待程序优雅退出,既然用户这么输入了,表示对自己的应用比较放心,认为自己的程序有 合理的stop信号的处理机制。

t=0 表示不等,立即发送kill -9 到容器。

t>0 表示等一定的时间,如果容器还未退出,就发送kill -9 到容器。

所以如果用户使用t<0 (比如t=-1),请确保自己容器的应用会正确处理SIGTERM. 如果容器忽略了该信号,会导致isula stop一直卡住。

示例

停止一个容器

$ isula stop fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

3.3.1.5 强制停止容器

描述

isula kill命令用于强制停止一个或多个运行中的容器。

用法

isula kill [OPTIONS] CONTAINER [CONTAINER...]

参数

kill命令支持参数参考下表。

命令

参数

说明

kill

-H, –host

指定要连接的iSulad socket文件路径

-s, –signal

发送给容器的信号

示例

杀掉一个容器

$ isula kill fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

3.3.1.6 删除容器

描述

isula rm命令用于删除一个或多个容器。

用法

isula rm [OPTIONS] CONTAINER [CONTAINER...]

参数

rm命令支持参数参考下表。

命令

参数

说明

rm

-f, –force

强制移除正在运行的容器

-H, –host

指定要连接的iSulad socket文件路径

-v, –volume

移除挂载在容器上的卷(备注:目前iSulad尚不使用此功能)

约束限制

IO正常情况,空环境(只有1个容器)删除一个running容器的时间为T1200个容器的环境(容器无大量IO操作,host IO正常)删除一个running容器所需时间为T2T2的规格为:T2 = max { T1 * 3, 5 } 秒钟。

示例

删除一个停止状态的容器

 

$ isula rm fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

3.3.1.7 接入容器

描述

isula attach命令用于将当前终端的标准输入、标准输出和标准错误连接到正在运行的容器。仅支持runtime类型为lcr的容器。

用法

isula attach [OPTIONS] CONTAINER

参数

attach命令支持参数参考下表。

 

命令

参数

说明

attach

–help

打印帮助信息

-H, –host

指定要连接的iSulad socket文件路径

-D, –debug

开启debug模式

约束限制

原生docker attach容器会直接进入容器,而isulad attach容器后需要敲一个回车才进入。

示例

接入一个运行状态的容器

$ isula attach fd7376591a9c3d8ee9a14f5d2c2e5255b02cc44cddaabca82170efd4497510e1

/ #

/ #

3.3.1.8 重命名容器

描述

isula rename命令用于重命名容器。

用法

isula rename [OPTIONS] OLD_NAME NEW_NAME

参数

rename命令支持参数参考下表。

命令

参数

说明

rename

-H, –host

重命名容器

示例

重命名一个容器

$ isula rename my_container my_new_container

 

3.3.1.9 在容器中执行命令

描述

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

指定用户登录容器执行命令

 

约束限制

  1. isula exec 不指定任何参数时,会默认使用-it参数, 表示分配一个伪终端,以交互式的方式进入容器
  2. 当使用isula exec 执行脚本,在脚本中执行后台进程时,需使用nohup标志忽略SIGHUP信号。

使用isula exec运行脚本,在脚本中运行后台进程需使用nohup标志。否则内核会在exec执行的进程(session首进程)退出时,向后台执行的进程发送SIGHUP信号,导致后台进程退出,出现僵尸进程。

  1. isula exec 进入容器进程后,不能执行后台程序,否则会出现卡死现象。

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卡住,进程不退出。

  1. isula exec 不能用后台方式执行,否则可能会出现卡死现象。

isula exec后台执行的方式如下:

使用**isula exec 脚本 & **的方式后台执行exec,如:isula exec container_name script & isula exec 后台执行,执行的脚本中不断cat某一文件,正常时在当前终端有输出,如果在当前终端执行回车操作,客户端会因读IO失败而退出读stdout的动作,使终端不再输出,服务端由于进程仍然在cat文件,会继续往fifobuffer里写入数据,当缓存写满时,容器内进程会卡死在write动作上。

 

  1. 轻量级容器使用exec执行带有管道操作的命令时,建议使用/bin/bash -c 方式执行该命令。

 

典型应用场景:

 

使用isula exec container_name -it ls /test | grep xx | wc -l,用于统计test目录下xx的文件个数,因exec执行的为”ls /test,其输出通过管道进行grepwc 处理。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 ~]#

  1. 禁止使用echo的方式向exec命令的stdin输入数据,会导致客户端卡死。应该直接将echo的值作为命令行参数传给容器

 

[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

3.3.1.10 查询单个容器信息

描述

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": ""

        }

    }

]

3.3.1.11 查询所有容器信息

描述

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

 

3.3.1.12 重启容器

描述

isula restart 用于重启一个或者多个容器。

用法

isula restart [OPTIONS] CONTAINER [CONTAINER...]

参数

restart命令支持参数参考下表。

命令

参数

说明

restart

-H, –host

指定要连接的iSulad socket文件路径

-t, –time

先优雅停止,超过这个时间,则强行终止

约束限制

  1. 指定t参数且t<0时,请确保自己容器的应用会处理stop信号。

restart会首先调用stop停止容器。stop会首先给容器发送stop信号(SIGTERM),然后等待一定的时间(这个时间就是用户输入的 t),过了一定时间如果容器仍处于运行状态,那么就发送kill信号(SIGKILL)使容器强制退出。

  1. 输入参数t的含义:

t<0 : 表示一直等待,不管多久都等待程序优雅退出,既然用户这么输入了,表示对自己的应用比较放心,认为自己的程序有合理的stop信号的处理机制。

t=0 表示不等,立即发送kill -9 到容器。

t>0 表示等一定的时间,如果容器还未退出,就发送kill -9 到容器。

所以如果用户使用t<0(比如t=-1),请确保自己容器的应用会正确处理SIGTERM. 如果容器忽略了该信号,会导致isula restart一直卡住。

示例

重启单个容器

$ isula restart c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a

c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a

3.3.1.13 等待容器退出

描述

isula wait用于等待一个或者多个容器退出。仅支持runtime类型为lcr的容器。

用法

isula wait [OPTIONS] CONTAINER [CONTAINER...]

参数

wait命令支持参数参考下表。

命令

参数

说明

wait

-H, –host

指定要连接的iSulad socket文件路径

/

阻塞,直到容器停止,然后打印退出代码

示例

等待单个容器退出

$ isula wait c75284634beeede3ab86c828790b439d16b6ed8a537550456b1f94eb852c1c0a

 137

3.3.1.14 查看容器中进程信息

描述

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

3.3.1.15 查看容器使用的资源

描述

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 

3.3.1.16 获取容器日志

描述

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

3.3.1.17 容器与主机之间数据拷贝

描述

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文件路径

约束限制

  1. iSulad在执行拷贝时,不会挂载/etc/hostname /etc/resolv.conf/etc/hosts三个文件,也不会对–volume和–mount参数传入的参数挂载到host,所以对这些文件的拷贝使用的是镜像中的原始文件,而不是真实容器中的文件。

[root@localhost tmp]# isula cp b330e9be717a:/etc/hostname /tmp/hostname

[root@localhost tmp]# cat /tmp/hostname

[root@localhost tmp]#

  1. iSulad在解压文件时,不会对文件系统中即将被覆盖的文件或文件夹做类型判断,而是直接覆盖,所以在拷贝时,如果源为文件夹,同名的文件会被强制覆盖为文件夹;如果源为文件,同名的文件夹会被强制覆盖为文件。

[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

  1. iSulad cp拷贝过程中,会将容器freeze住,在拷贝完成后,恢复容器运行。

示例

将主机/test/host目录拷贝到容器21fac8bb9ea8/test目录下。

isula cp /test/host 21fac8bb9ea8:/test

将容器21fac8bb9ea8/www目录拷贝到主机的/tmp目录中。

isula cp 21fac8bb9ea8:/www /tmp/

3.3.1.18 暂停容器

描述

isula pause用于暂停容器中所有的进程,仅支持runtime类型为lcr的容器。

用法

isula pause CONTAINER [CONTAINER...]

参数

命令

参数

说明

pause

-H, –host

指定要连接的iSulad socket文件路径

约束限制

  1. 只有状态为running的容器可以被执行pause操作
  2. 当容器被pause后,无法执行其他生命周期管理操作(如restart/exec/attach/kill/stop/rm等)
  3. 当带有健康检查配置的容器被pause后,容器状态最终变为unhealthy状态

示例

暂停一个正在运行的容器,命令示例如下:

$ isula pause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac

 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac

3.3.1.19 恢复容器

描述

isula unpause用于恢复容器中所有的进程, isula pause的逆过程,仅支持runtime类型为lcr的容器。

用法

isula unpause CONTAINER [CONTAINER...]

参数

命令

参数

说明

pause

-H, –host

指定要连接的iSulad socket文件路径

约束限制

只有状态为paused的容器可以被执行unpause操作

示例

恢复一个被暂停的容器,命令示例如下:

$ isula unpause 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac

 8fe25506fb5883b74c2457f453a960d1ae27a24ee45cdd78fb7426d2022a8bac

3.3.1.20 从服务端实时获取时间信息

描述

isula events用于从服务端实时获取容器镜像生命周期、运行等事件消息, 仅支持runtime类型为lcr的容器。

用法

isula events [OPTIONS]

参数

命令

参数

说明

events

-H, –host

指定要连接的iSulad socket文件路径

-n, –name

获取指定容器的事件消息

-S, –since

获取指定时间以来的事件消息

示例

从服务端实时获取事件消息,命令示例如下:

$ isula events

3.3.2 支持CNI网络

描述

实现CRI接口对接CNI网络的能力,包括CNI网络配置文件的解析、CNI网络的加入和退出。Pod需要支持网络时,例如通过canal等容器网络插件提供网络能力,那么需要CRI接口能够和canal实现对接,并且调用canal的接口,为Pod提供网络能力。

接口

CNI对用户可见的接口,主要涉及CNI网络配置和Pod配置中CNI网络相关的项。

  1. CNI网络配置相关的接口,主要是isulad指定CNI网络配置文件所在路径、CNI网络插件二进制文件所在的路径以及使用的网络模式。详情请参见表1 CNI网络配置接口。
  2. Pod配置中CNI网络相关的项,主要是设置Pod加入的附加CNI网络列表,默认情况Pod只会加入到default 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格式,包含两项:

  1. name:指定CNI网络平面的名字
  2. interface:指定网络接口的名字

附件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

      }

]

  1. protocal:表示映射使用的协议,支持tcp(用0标识)、udp(用1标识);
  2. container_port:表示容器映射出去的port
  3. host_port:表示映射到主机的port

 

退出CNI网络列表

StopPodSandbox的时候,会调用退出CNI网络的接口,清理网络相关的资源。

 说明:

在调用RemovePodSandbox接口之前,至少要调用一次StopPodSandbox接口

StopPodSandbox调用CNI接口失败,可能导致的网络资源残留。

使用限制

  1. cniVersion的版本,当前只支持0.3.00.3.1。由于后期可能需要支持0.1.00.2.0,错误日志打印时,保留了0.1.00.2.0的提示信息。
  2. name:必须是小写字符、数字、’-‘以及’.‘组成; .‘和’-‘不能作为首字符和尾字符; 而且长度不超过200个字符。
  3. 配置文件个数不超过200个,单个配置文件大小不超过1MB
  4. 扩展之后的参数,需要根据实际网络需求来配置,不需要使用的可选参数可以不写入到netconf.json文件中。

3.3.3 容器资源管理

3.3.3.1 资源共享

描述

容器间或者容器与host之间可以共享namespace信息,包括pid, net, ipc, uts

用法

isula create/run时使用namespace相关的参数共享资源,具体参数见下方参数列表。

参数

create/run时可以指定下列参数。

参数项

参数说明

取值范围

是否必选

–pid

指定要共享的pid namespace

[none, host, container:]none表示不共享,host表示与host共用namespacecontainer:表示与容器containerID共享同一个namespace

–net

指定要共享的net namespace

[none, host, container:]none表示不共享,host表示与host共用namespacecontainer:表示与容器containerID共享同一个namespace

–ipc

指定要共享的ipc namespace

[none, host, container:]none表示不共享,host表示与host共用namespacecontainer:表示与容器containerID共享同一个namespace

–uts

指定要共享的uts namespace

[none, host, container:]none表示不共享,host表示与host共用namespacecontainer:表示与容器containerID共享同一个namespace

 

示例

如果两个容器需要共享同一个pid namespace,在运行容器时,直接加上–pid container: 即可,如:

isula run -tid --name test_pid busybox sh

isula run -tid --name test --pid container:test_pid busybox sh

3.3.3.2 限制运行时的cpu资源

描述

可以通过参数限制容器的各项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

说明:是否设置成功,请参见“查询单个容器信息”章节。

3.3.3.3 限制运行时的内存

描述

可以通过参数限制容器的各项内存值上限。

用法

isula create/run时使用内存相关的参数限制容器的各项内存使用上限,具体参数及取值见下方参数列表。

参数

create/run时可以指定下列参数。

参数项

参数说明

取值范围

是否必选

–memory

限制容器中内存使用上限

64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte)KBMBGBTBPB.

–memory-reservation

限制容器中内存的软上限

64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte)KBMBGBTBPB.

–memory-swap

限制容器中交换内存的上限

64位整数(int64)。值为-1或非负数,-1表示不限制,0表示不设置(不限制);单位可以为空(byte)KBMBGBTBPB.

–kernel-memory

限制容器中内核内存的上限

64位整数(int64)。值为非负数,0表示不设置(不限制);单位可以为空(byte)KBMBGBTBPB.

 

示例

如果需要限制容器内内存的上限,在运行容器时,直接加上–memory []即可,如:

 

isula run -tid --memory 1G busybox sh

3.3.3.4 限制运行时的IO资源

描述

可以通过参数限制容器中设备读写速度。

用法

isula create/run时使用–device-read-bps/device-write-bps :[]来限制容器中设备的读写速度。

参数

create/run时指定–device-read/write-bps参数。

参数项

参数说明

取值范围

是否必选

–device-read-bps/–device-write-bps

限制容器中设备的读速度/写速度

64位整数(int64)。值为正整数,可以为00表示不设置(不限制);单位可以为空(byte)KBMBGBTBPB.

示例

如果需要限制容器内设备的读写速度,在运行容器时,直接加上–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

 

 

3.3.3.5 限制容器rootfs存储空间

描述

ext4上使用overlay2时,可以设置单个容器的文件系统限额,比如设置A容器的限额为5GB容器为10G

该特性通过ext4文件系统的project quota功能来实现,在内核支持的前提下,通过系统调用SYS_IOCTL设置某个目录的project ID,再通过系统调用SYS_QUOTACTL设置相应的project IDhard limitsolft limit值达到限额的目的。

 

用法

1)环境准备

文件系统支持Project IDProject Quota属性,4.19版本内核已经支持,外围包e2fsprogs版本不低于1.43.4-2

2)在容器挂载overlayfs之前,需要对不同容器的upper目录和work目录设置不同的project id,同时设置继承选项,在容器挂载overlayfs之后不允许再修改project id和继承属性。

3)配额的设置需要在容器外以特权用户进行。

4daemon中增加如下配置

 

-s overlay2 --storage-opt overlay2.override_kernel_check=true

5daemon支持以下选项,用于为容器设置默认的限制,

storage-opt overlay2.basesize=128M 指定默认限制的大小,若isula run时也指定 了–storeage-opt size选项,则以run时指定来生效,若daemonisula run时都不指定大小,则表示不限制。

 

6)需要开启文件系统Project IDProject 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)内核支持并使能。

内核必须支持ext4project 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)限制额度的说明。

  1. 限制的额度大于isuladroot所在分区的size时,在容器内用df看到的文件系统的额度是isuladroot所在分区的size,而不是设置的限额。
  2. storage-opt size=0代表不限制,且设置值不能小于4096size的精度为1个字节,如果指定精度含小数个字节,小数部分被忽略,如指定size=0.1实际等同于size=0不限制。(受计算机存储浮点数精度的限制,即0.9999999999999999999999999991是等价的,具体的9的个数不同计算机可能存在差异,故设置4095.9999999999999999999999999994096等价,其它情况类似),注意isula inspect显示原始命令行指定形式,如果含小数字节,需自行忽略小数部分。
  3. 限制的额度过小时,比如–storage-opt size=4k,可能会导致容器无法启动,因为启动容器本身需要创建一些文件。
  4. 上一次启动isulad时,isuladroot所在分区挂载时加了-o prjquota选项,这次启动时不加,那么上一次启动中创建的带quota的容器的设置值不生效。
  5. daemon端配额–storage-opt overlay2.basesize,其取值范围与–storage-opt size相同。

4)指定storage-opt4k时,轻量级容器启动与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的挂载点被卸载。

3.3.3.6 限制容器内文件句柄数

描述

可以通过参数限制容器中可以打开的文件句柄数。

用法

isula create/run时使用–files-limit来限制容器中可以打开的文件句柄数。

参数

create/run时指定–files-limit参数。

参数项

参数说明

取值范围

是否必选

–files-limit

限制容器中可以打开的文件句柄数。

64位整数(int64)。可以为0、负,但不能超过263 次方减 10、负表示不做限制(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

根因是lxcrunc启动过程的原理不一样,lxc创建cgroup子组后先设置files.limit值,再将容器进程的PID写入该子组的cgroup.procs文件,此时该进程已经打开超过1个句柄,因而写入报错导致启动失败。runc创建cgroup子组后先将容器进程的PID写入该子组的cgroup.procs文件,再设置files.limit值,此时由于该子组内的进程已经打开超过1个句柄,因而写入files.limit不会生效,内核也不会报错,容器启动成功。

3.3.3.7 限制容器内可以创建的进程、线程数

描述

可以通过参数限制容器中能够创建的进程/线程数。

用法

在容器create/run时,使用参数–pids-limit来限制容器中可以创建的进程/线程数。

参数

create/run时指定–pids-limit参数。

数项

参数说明

取值范围

是否必选

–pids-limit

限制容器中可以打开的文件句柄数。

64位整数(int64)。可以为0、负,但不能超过263 次方减 10、负表示不做限制(max)。

 

示例

在运行容器时,直接加上–pids-limit n 即可,如:

isula run -ti --pids-limit 1024 busybox bash

约束

由于创建容器的过程中会临时创建一些进程,所以此值不能设置的太小,不然容器可能起不来,建议大于10

3.3.3.8 配置容器内的ulimit

描述

可以通过参数控制执行程序的资源。

用法

在容器create/run时配置–ulimit参数,或通过daemon端配置,控制容器中执行程序的资源。

参数

通过两种方法配置ulimit

  1. isula create/run时使用–ulimit =[:]来控制shell执行程序的资源。

参数项

参数说明

取值范围

是否必选

–ulimit

限制shell执行程序的资源

soft/hard64位整数(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启动会报错。

3.3.4 特权容器

场景说明

iSulad默认启动的是普通容器,普通容器适合启动普通进程,其权限非常受限,仅具备/etc/default/isulad/config.jsoncapabilities所定义的默认权限。当需要特权操作时(比如操作/sys下的设备),需要特权容器完成这些操作,使用该特性,容器内的root将拥有宿主机的root权限, 否则,容器内的root在只是宿主机的普通用户权限。

使用限制

特权容器为容器提供了所有功能,还解除了设备cgroup控制器强制执行的所有限制,具备以下特性:

 

  1. Secompblock任何系统调用
  2. /sys/proc路径可写
  3. 容器内能访问主机上所有设备
  4. 系统的权能将全部打开

 

普通容器默认权能为:

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

允许修改文件的IMMUTABLEAPPEND属性标志

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

3.3.5 CRI接口

3.3.5.1 描述

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配置文件进行配置。

3.3.5.2 接口

接口列表

DNSConfig:配置sandboxDNS服务器和搜索域

Protocol:协议的enum值列表

PortMapping:指定sandbox的端口映射配置

MountPropagation:挂载传播属性的enum列表

MountMount指定host上的一个挂载卷挂载到容器中(只支持文件和文件夹)

NamespaceOption

Capability:包含待添加与待删除的权能信息

Int64Valueint64类型的封装

UInt64Valueuint64类型的封装

LinuxSandboxSecurityContext:配置sandboxlinux安全选项。注意,这些安全选项不会应用到sandbox中的容器中,也可能不适用于没有任何running进程的sandbox

LinuxPodSandboxConfig:设定和Linux主机及容器相关的一些配置

PodSandboxMetadataSandbox元数据包含构建sandbox名称的所有信息,鼓励容器运行时在用户界面中公开这些元数据以获得更好的用户体验,例如,运行时可以根据元数据生成sandbox的唯一命名。

PodSandboxConfig:包含创建sandbox的所有必选和可选配置信息

PodSandboxNetworkStatus:描述sandbox的网络状态

Namespace:命名空间选项

LinuxPodSandboxStatus:描述Linux sandbox的状态

PodSandboxStatesandbox状态值的enum数据

PodSandboxStatus:描述Podsandbox的状态信息

PodSandboxStateValue:对PodSandboxState的封装

PodSandboxFilter:用于列出sandbox时添加过滤条件,多个条件取交集显示

PodSandbox:包含最小化描述一个sandbox的数据

KeyValue:键值对的封装

SELinuxOption:应用于容器的SELinux标签

ContainerMetadataContainer元数据包含构建container名称的所有信息,鼓励容器运行时在用户界面中公开这些元数据以获得更好的用户体验,例如,运行时可以根据元数据生成container的唯一命名。

ContainerState:容器状态值的enum列表

ContainerStateValue:封装ContainerState的数据结构

ContainerFilter:用于列出container时添加过滤条件,多个条件取交集显示

LinuxContainerSecurityContext:指定应用于容器的安全配置

LinuxContainerResources:指定Linux容器资源的特定配置

ImageImage信息描述一个镜像的基本数据。

ImageSpec:表示镜像的内部数据结构,当前,ImageSpec只封装容器镜像名称

StorageIdentifier:唯一定义storage的标识

FilesystemUsage

AuthConfig

Container:用于描述容器信息,例如ID, 状态等。

ContainerStatus:用于描述容器状态信息

ContainerStatsFilter:用于列出container stats时添加过滤条件,多个条件取交集显示

ContainerStats:用于列出container stats时添加过滤条件,多个条件取交集显示

ContainerAttributes:列出container的基本信息

CpuUsage:列出containerCPU使用信息

MemoryUsage:列出container的内存使用信息

FilesystemUsage:列出container的读写层信息

Device:指定待挂载至容器的主机卷

LinuxContainerConfig

包含特定于Linux平台的配置

ContainerConfig:包含用于创建容器的所有必需和可选字段

NetworkConfigRuntime的网络配置

RuntimeConfigRuntime的网络配置

RuntimeCondition:描述runtime的状态信息

RuntimeStatusRuntime的状态

Runtime服务

Runtime服务中包含操作pod和容器的接口,以及查询runtime自身配置和状态信息的接口。

RunPodSandbox

StopPodSanbox

RemovePodSanbox

PodSanboxStatus

ListPodSanbox

CreateContainer

StartContainer

StopContainer

RemoveContainer

ListContainer

ContainerStatus

UpdateContainerResources

ExecSync

Exec

Attach

ContainerStats

ListContainerStats

UpdateRuntimeConfig

Stats

Image服务

提供了从镜像仓库拉取、查看、和移除镜像的gRPC API

ListImages

ImagesStatus

PullImage

RemoveImage

ImageFsInfo

3.3.5.3 约束

1)如果创建sandbox时,PodSandboxConfig参数中配置了log_directory,则所有属于该sandboxcontainer在创建时必须在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_pathisulad不会递归的创建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

                                                     99e59f495ffaa       753kB

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

3.3.6镜像管理

3.3.6.1 docker镜像管理
3.3.6.1.1 登录到镜像仓库

描述

isula login命令用于登录到镜像仓库。登录成功后可以使用isula pull命令从该镜像仓库拉取镜像。如果镜像仓库不需要密码,则拉取镜像前不需要执行该命令。

用法

isula login [OPTIONS] SERVER

参数

login命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表1 1-20 login命令参数列表”

示例

$ isula login -u abc my.csp-edge.com:5000

 

Login Succeeded

3.3.6.1.2 从镜像仓库退出登录

描述

isula logout命令用于从镜像仓库退出登录。退出登录成功后再执行isula pull命令从该镜像仓库拉取镜像会因为未认证而拉取失败。

用法

isula logout SERVER

参数

logout命令支持参数请参见附录 > 命令行参数说明章节的2 logout命令参数列表

示例

$ isula logout my.csp-edge.com:5000

Logout Succeeded

3.3.6.1.3 从镜像仓库拉取镜像

描述

从镜像仓库拉取镜像到本地。

用法

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

3.3.6.1.4 删除镜像

描述

删除一个或多个镜像。

用法

isula rmi [OPTIONS] IMAGE [IMAGE...]

参数

rmi命令支持参数请参见附录 > 命令行参数说明章节的4 rmi命令参数列表

示例

$ isula rmi rnd-dockerhub.huawei.com/official/busybox

Image "rnd-dockerhub.huawei.com/official/busybox" removed

3.3.6.1.5 加载镜像

描述

从一个tar包加载镜像。该tar包必须是使用docker save命令导出的tar包或格式一致的tar包。

用法

isula load [OPTIONS]

参数

load命令支持参数请参见附录 > 命令行参数说明章节的5 load命令参数列表

示例

$ isula load -i busybox.tar

Load image from "/root/busybox.tar" success

3.3.6.1.6 列出镜像

描述

列出当前环境中所有镜像。

用法

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

3.3.6.1.7 检视镜像

描述

返回该镜像的配置信息。可以使用-f参数过滤出需要的信息。

用法

isula inspect [options] CONTAINER|IMAGE [CONTAINER|IMAGE...]

参数

inspect命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表7 inspect命令参数列表”。

示例

$ isula inspect -f "{{json .image.id}}" rnd-dockerhub.huawei.com/official/busybox

"e4db68de4ff27c2adfea0c54bbb73a61a42f5b667c326de4d7d5b19ab71c6a3b"

3.3.6.1.8 双向认证

描述

开启该功能后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

3.3.6.2 embedded镜像管理
3.3.6.2.1 加载镜像

描述

根据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

3.3.6.2.2 列出镜像

描述

列出当前环境中所有镜像。

用法

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

3.3.6.2.3 检视镜像

描述

返回该镜像的配置信息。可以使用-f参数过滤出需要的信息。

用法

isula inspect [options] CONTAINER|IMAGE [CONTAINER|IMAGE...]

参数

inspect命令支持参数请参见”附录 > 命令行参数说明” 章节的 “表7 inspect命令参数列表”。

示例

$ isula inspect -f "{{json .created}}" test:v1

"2018-03-01T15:55:44.322987811Z"

3.3.6.2.4 删除镜像

描述

删除一个或多个镜像。

用法

isula rmi [OPTIONS] IMAGE [IMAGE...]

参数

rmi命令支持参数请参见附录 > 命令行参数说明章节的4 rmi命令参数列表

示例

$ isula rmi test:v1

Image "test:v1" removed

3.3.7 容器健康状态检查

场景说明

在实际的生产环境中,开发者提供的应用程序或者平台提供的服务难免存在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类型的容器。

3.3.8 查询信息

查询服务版本信息

描述

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

3.3.9 安全特性

3.3.9.1 seccomp安全配置场景

场景说明

seccompsecure computing mode)是linux kernel2.6.23版本开始引入的一种简洁的sandboxing机制。在一些特定场景下,用户需要在容器中执行一些“特权”操作,但又不想启动特权容器,用户经常会在run时添加–cap-add来获得一些“小范围”的权限。对于安全要求比较严格的容器实例,上述的CAP粒度不一定能够满足安全需要,可使用一些办法精细化控制权限范围。

 

举例

 

普通容器场景中,用户使用-v将宿主机某目录(包含某普通用户无法执行的二进制),映射到容器中。

 

在容器中,可以将二进制修改权限chmod 4777加入S标志位。这样在宿主机上,原先不能运行二进制的普通用户(或者运行此二进制受限),可以在S标志位的添加动作后,在运行此二进制的时候,获取到二进制自身的权限(比如root),从而提权运行或者访问其他文件。

 

这个场景,如果在严格安全要求下,需要使用seccomp裁剪chmodfchmodfchmodat系统调用。

 

使用限制

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

}

]

}

须知:

- defaultActionsyscalls:对应的action的类型是一样的,但其值是不能一样的,目的就是让所有的syscal都有一个默认的action,并且如果syscalls数组中有明确的定义,就以syscalls中的为准,由于defaultActionaction的值不一样,就能保证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 对应的就是0buf

   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

3.3.9.2 capabilities安全配置场景

场景说明

capabilities机制是linux kernel 2.2之后引入的安全特性,用更小的粒度控制超级管理员权限,可以避免使用 root 权限,将root用户的权限细分为不同的领域,可以分别启用或禁用。capabilities详细信息可通过Linux Programmers 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_SETUIDCAP_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

3.3.9.3 SELinux安全配置场景

场景说明

SELinux(Security-Enhanced Linux)是一个linux内核的安全模块,提供了访问控制安全策略机制,iSulad将采用MCS(多级分类安全)实现对容器内进程打上标签限制容器访问资源的方式,减少提权攻击的风险,防止造成更为重要的危害。

使用限制

确保宿主机已使能SELinux,且daemon端已打开SELinux使能开发(/etc/isulad/daemon.json中“selinux-enabled”字段为true, 或者命令行参数添加–selinux-enabled

确保宿主机上已配置合适的selinux策略,推荐使用container-selinux进行配置

引入SELinux会影响性能,设置SELinux之前需要对场景进行评估,确定必要时打开daemonSELinux开关并设置容器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

3.3.10 支持OCI hooks

描述

支持在容器的生命周期中,运行OCI标准hooks。包括三种类型的hooks

prestart hook:在执行isula start命令之后,而在容器的1号进程启动之前,被执行。

poststart hook:在容器1号进程启动之后,而在isula start命令返回之前,被执行。

poststop hook:在容器被停止之后,但是在停止命令返回之前,被执行。

OCI hooks的配置格式规范如下:

path:格式是字符串,必须项,必须为绝对路径,指定的文件必须有可执行权限。

args:格式是字符串数组,可选项,语义和execvargs一致。

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"]

            }

        ]

}

接口

isuladisula都提供了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

3.4 附录

3.4.1 命令行参数说明

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指定的名称,typedocker类型时支持该参数

-t, –type

镜像类型,取值为embeddeddocker(默认值)

 

images命令参数列表

命令

参数

说明

images

  

-H, –host

指定要连接的iSulad socket文件路径

-q, –quit

只显示镜像名字

inspect命令参数列表

命令

参数

说明

inspect

-H, –host

指定要连接的iSulad socket文件路径

-f, –format

使用模板格式化输出

-t, –time

超时时间的秒数,若在该时间内inspect查询容器信息未执行成功,则停止等待并立即报错,默认为120秒,当配置小于等于0的值,表示不启用timeout机制inspect查询容器信息会一直等待,直到获取容器信息成功后返回。

 

3.4.2 CNI配置参数

CNI单网络配置参数

参数

类型

是否可选

说明

cniVersion

string

必选

CNI版本号,当前只支持0.3.00.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类型,目前支持的类型:

1underlay_l2overlay_l2vpc-router组网默认值distributed_l2,且只支持distributed_l2

2underlay_ipvlan组网,默认distributed_l2CCN场景只支持nullfixedCCEFST 5G core场景只支持nulldistributed_l2

3phy-directdpdk-direct组网,默认l2,可选nulldistributed_l2FST 5G core场景只支持nulldistributed_l2

说明:

超出选择范围(比如host-local),Canal会自动设置为默认,不会返回错误。

null:不使用canal管理ip

fixed:固定ipCCN场景使用。

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。对于物理直通,单个网卡最多可申请128IP

backup_mode

bool

可选

表示主备模式,仅用于phy-directdpdk-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

可选

申请固定IPruntimeConfig.ican_caps.fixed_iptrue)时需要设置K8S_POD_NAME

K8S_POD_NAMESPACE

string

可选

申请固定IPruntimeConfig.ican_caps.fixed_iptrue)时需要设置K8S_POD_NAMESPACE

SECURE_CONTAINER

string

可选

安全容器标志

multi_port

int

可选

默认值为1,取值范围1-8。只支持phy-directdpdk-direct两种类型网络,指定直通网卡数量

phy-direct

string

可选

用于在创建硬直通容器网络时指定接入的网卡

dpdk-direct

string

可选

用于在创建dpdk直通容器网络时指定接入的网卡

tenant_id

string

可选

租户的ID

只支持vpc-router类型网络。

vpc_id

string

可选

VPCID

只支持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”。若argsIPK8S_POD_NETWORK_ARGS都不为空,以K8S_POD_NETWORK_ARGS为准。

INSTANCE_NAME

string

可选

INSTANCE ID

参考支持容器固定IP

dist_gateway_disable

bool

可选

true表示不创建gatewayfalse表示创建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.00.3.1

name

string

必选

网络名称,由用户自定义,需保证唯一。

plugins

struct

必选

具体配置请参见1 CNI单网络配置参数