长期支持版本

    社区创新版本

      安装与配置

      本章介绍iSulad的安装、安装后配置,以及升级和卸载的方法。

      说明: iSulad的安装、升级、卸载均需要使用root权限。

      安装方法

      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-xx.xxx.aarch64.rpm
        

      配置方法

      iSulad 安装完成后,可以根据需要进行相关配置。

      配置方式

      轻量级容器引擎(iSulad)服务端daemon为isulad,isulad可以通过配置文件进行配置,也可以通过命令行的方式进行配置,例如:isulad --xxx,优先级从高到低是:命令行方式>配置文件>代码中默认配置。

      说明:
      如果采用systemd管理iSulad进程,修改/etc/sysconfig/iSulad文件中的OPTIONS字段,等同于命令行方式进行配置。

      • 命令行方式

        在启动服务的时候,直接通过命令行进行配置。其配置选项可通过以下命令查阅:

        # isulad --help
        isulad
        
        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
              --container-log-driver               Set default container log driver, such as: json-file
              --container-log-opts                 Set default container log driver options, such as: max-file=7 to set max number of container log files
              --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
              --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 "pause-${machine}:3.0")
              --registry-mirrors                   Registry to be prepended when pulling unqualified images, can be specified multiple times
              --selinux-enabled                    Enable selinux support
              --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)
              --userns-remap                       User/Group setting for user namespaces
          -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和/etc/isulad/daemon_constants.json,各配置字段说明如下:

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

        --container-log-driver

        "container-log": {

        "driver": "json-file"

        }

        容器串口日志驱动默认配置

        指定所有容器的默认串口日志的驱动

        --start-timeout

        "start-timeout": "2m"

        启动容器的耗时

        "default-runtime": "lcr"

        创建容器时的runtime运行时,默认是lcr

        当命令行和配置文件均未指定时,默认为lcr,runtime的三种指定方式优先级:命令行>配置文件>默认lcr,当前支持lcr、kata-runtime。

        "runtimes":  {
            "kata-runtime": {
              "path": "/usr/bin/kata-runtime",
              "runtime-args": [
                "--kata-config",
                "/usr/share/defaults/kata-containers/configuration.toml"
              ]
            }
        }

        启动容器时,通过此字段指定多runtimes配置,在此集合中的元素均为有效的启动容器的runtime运行时。

        容器的runtime白名单,在此集合中的自定义runtime才是有效的。示例为以kata-runtime为例的配置。

        -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.override_kernel_check=true # 忽略内核版本检查
        overlay2.size=${size} # 设置rootfs quota限额为${size}大小
        overlay2.basesize=${size} #等价于overlay2.size

        --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。

        --websocket-server-listening-port

        "websocket-server-listening-port": 10350

        设置CRI websocket流式服务侦听端口,默认端口号10350

        指定CRI websocket流式服务侦听端,如果客户端指定了

        --websocket-server-listening-port,以客户端参数为准。端口范围1024-49151

        "cri-runtimes": {

        "kata": "io.containerd.kata.v2"

        }

        自定义cri runtimes的映射

        isulad通过自定义的cri runtimes映射,可以将runtimeclass转换为对应的runtime。

        配置文件/etc/isulad/daemon_constants.json

        配置参数

        配置文件示例

        参数解释

        备注

        不支持

        "default-host": "docker.io"

        如果镜像名以该镜像仓库名为前缀,则保存和显示时会去除该镜像仓库名前缀

        一般情况下该参数不需要修改

        不支持

        "registry-transformation": {

        "docker.io": "registry-1.docker.io",

        "index.docker.io": "registry-1.docker.io"

        }

        "key":"value"格式,表示从key指定的仓库拉取镜像时实际从value指定的仓库拉取镜像

        一般情况下该参数不需要修改

        示例:

        # cat /etc/isulad/daemon.json
        {
            "group": "isulad",
            "default-runtime": "lcr",
            "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": "",
            "native.umask": "secure",
            "network-plugin": "",
            "cni-bin-dir": "",
            "cni-conf-dir": "",
            "image-layer-check": false,
            "use-decrypted-key": true,
            "insecure-skip-verify-enforce": false,
            "cri-runtime": {
                "kata": "io.containerd.kata.v2"
            }
        }
        
        # cat /etc/isulad/daemon_constants.json
        {
            "default-host": "docker.io",
            "registry-transformation":{
                "docker.io": "registry-1.docker.io",
                "index.docker.io": "registry-1.docker.io"
            }
        }
        

        须知:
        默认配置文件/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/isulad/

      isulad运行的根目录,存放创建的容器配置、日志的默认路径、数据库文件、mount点等

      /var/lib/isulad/mnt/ :容器rootfs的mount点

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

      约束限制

      • 高并发场景(并发启动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即可。
        
      • 为daemon指定各种运行目录时的注意事项

        以--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的参数,具体如下:

        1. 使用短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,但不推荐这种使用方式,可能带来语义困扰。

        2. 使用长flag时,与“--”连接的字符串作为一个整体当成长flag,若包含=号,则=号前的字符串为长flag,=号后的为参数。

          isula run --user=root busybox
          

          等价于

          isula run --user root busybox
          
      • 启动一个isulad容器,不能够以非root用户进行isula run -i/-t/-ti以及isula attach/exec操作。

      • isulad的临时文件存放路径默认为/var/lib/isulad/isulad_tmpdir,如果更换了isulad的根目录,则路径为$isulad_root/isulad_tmpdir。如果需要修改isulad存放临时文件的目录,可以通过在启动isulad前配置ISULAD_TMPDIR环境变量来实现,isulad启动时会进行检查,如果发现配置了ISULAD_TMPDIR环境变量,则会将$ISULAD_TMPDIR/isulad_tmpdir目录作为临时文件存放的路径,注意$ISULAD_TMPDIR下面的不要存放名称为isulad_tmpdir的文件/文件夹等,因为isulad启动时会递归删除$ISULAD_TMPDIR/isulad_tmpdir目录来防止数据残留。同时请确保$ISULAD_TMPDIR路径只有root用户可以访问,防止其他用户操作导致的安全问题。

      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])
        
      • 若指定的host是unix socket,则必须是合法的unix socket,需要以"unix://"开头,后跟合法的socket绝对路径;

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

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

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

      描述

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

      配置devicemapper存储驱动

      使用devicemapper存储驱动需要先配置一个thinpool设备,而配置thinpool需要一个独立的块设备,且该设备需要有足够的空闲空间用于创建thinpool,请用户根据实际需求确定。这里假设独立块设备为/dev/xvdf,具体的配置方法如下:

      一、配置thinpool

      1. 停止isulad服务。

        # systemctl stop isulad
        
      2. 基于块设备创建一个lvm卷。

        # pvcreate /dev/xvdf
        
      3. 使用刚才创建的物理卷创建一个卷组。

        # vgcreate isula /dev/xvdf
        Volume group "isula" successfully created:
        
      4. 创建名为thinpool和thinpoolmeta的两个逻辑卷。

        # lvcreate --wipesignatures y -n thinpool isula -l 95%VG
        Logical volume "thinpool" created.
        
        # lvcreate --wipesignatures y -n thinpoolmeta isula -l 1%VG
        Logical volume "thinpoolmeta" created.
        
      5. 将新创建的两个逻辑卷转换成thinpool以及thinpool所使用的metadata,这样就完成了thinpool配置。

        # lvconvert -y --zero n -c 512K --thinpool isula/thinpool --poolmetadata isula/thinpoolmeta
        
        WARNING: Converting logical volume isula/thinpool and isula/thinpoolmeta to
        thin pool's data and metadata volumes with metadata wiping.
        THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
        Converted isula/thinpool to thin pool.
        

        

      二、修改isulad配置文件

      1. 如果环境之前运行过isulad,请先备份之前的数据。

        # mkdir /var/lib/isulad.bk
        # mv /var/lib/isulad/* /var/lib/isulad.bk
        
      2. 修改配置文件

        这里提供了两种配置方式,用户可根据实际情况的选择合适的方式。

        • 编辑/etc/isulad/daemon.json,配置storage-driver字段值为devicemapper,并配置storage-opts字段的相关参数,支持参数请参见参数说明。配置参考如下所示:

          {
              "storage-driver": "devicemapper"
              "storage-opts": [
          	    "dm.thinpooldev=/dev/mapper/isula-thinpool",
          	    "dm.fs=ext4",
                      "dm.min_free_space=10%"
              ]
          }
          
        • 或者也可以通过编辑/etc/sysconfig/iSulad,在isulad启动参数里显式指定,支持参数请参见参数说明。配置参考如下所示:

          OPTIONS="--storage-driver=devicemapper --storage-opt dm.thinpooldev=/dev/mapper/isula-thinpool --storage-opt dm.fs=ext4 --storage-opt dm.min_free_space=10%"
          
      3. 启动isulad,使配置生效。

        # systemctl start isulad
        

      参数说明

      storage-opts 支持的参数请参见表1

      表 1 storage-opts字段参数说明

      参数

      是否必选

      含义

      dm.fs

      用于指定容器使用的文件系统类型。当前必须配置为ext4,即dm.fs=ext4

      dm.basesize

      用于指定单个容器的最大存储空间大小,单位为k/m/g/t/p,也可以使用大写字母,例如dm.basesize=50G。该参数只在首次初始化时有效。

      dm.mkfsarg

      用于在创建基础设备时指定额外的mkfs参数。例如“dm.mkfsarg=-b 1024”

      dm.mountopt

      用于在挂载容器时指定额外的mount参数。例如dm.mountopt=nodiscard

      dm.thinpooldev

      用于指定容器/镜像存储时使用的thinpool设备。

      dm.min_free_space

      用于指定最小的预留空间,用百分比表示。例如dm.min_free_space=10%,表示当剩余存储空间只剩10%左右时,创建容器等和存储相关操作就会失败。

      注意事项

      • 配置devicemapper时,如果系统上没有足够的空间给thinpool做自动扩容,请禁止自动扩容功能。

        禁止自动扩容的方法是把/etc/lvm/profile/isula-thinpool.profile中thin_pool_autoextend_threshold和thin_pool_autoextend_percent两个值都改成100,如下所示:

        activation {   
          thin_pool_autoextend_threshold=100   
          thin_pool_autoextend_percent=100 
        }
        
      • 使用devicemapper时,容器文件系统必须配置为ext4,需要在isulad的配置参数中加上--storage-opt dm.fs=ext4。

      • 当graphdriver为devicemapper时,如果metadata文件损坏且不可恢复,需要人工介入恢复。禁止直接操作或篡改daemon存储devicemapper的元数据。

      • 使用devicemapper lvm时,异常掉电导致的devicemapper thinpool损坏,无法保证thinpool损坏后可以修复,也不能保证数据的完整性,需重建thinpool。

      iSulad开启了user namespace特性,切换devicemapper存储池时的注意事项

      • 一般启动容器时,deviceset-metadata文件为:/var/lib/isulad/devicemapper/metadata/deviceset-metadata。
      • 使用了user namespace场景下,deviceset-metadata文件使用的是:/var/lib/isulad/{userNSUID.GID}/devicemapper/metadata/deviceset-metadata。
      • 使用devicemapper存储驱动,容器在user namespace场景和普通场景之间切换时,需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空;针对thinpool扩容或者重建的场景下,也同样的需要将对应deviceset-metadata文件中的BaseDeviceUUID内容清空,否则isulad服务会重启失败。

      文档捉虫

      “有虫”文档片段

      问题描述

      提交类型 issue

      有点复杂...

      找人问问吧。

      PR

      小问题,全程线上修改...

      一键搞定!

      问题类型
      规范和低错类

      ● 错别字或拼写错误;标点符号使用错误;

      ● 链接错误、空单元格、格式错误;

      ● 英文中包含中文字符;

      ● 界面和描述不一致,但不影响操作;

      ● 表述不通顺,但不影响理解;

      ● 版本号不匹配:如软件包名称、界面版本号;

      易用性

      ● 关键步骤错误或缺失,无法指导用户完成任务;

      ● 缺少必要的前提条件、注意事项等;

      ● 图形、表格、文字等晦涩难懂;

      ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

      正确性

      ● 技术原理、功能、规格等描述和软件不一致,存在错误;

      ● 原理图、架构图等存在错误;

      ● 命令、命令参数等错误;

      ● 代码片段错误;

      ● 命令无法完成对应功能;

      ● 界面错误,无法指导操作;

      风险提示

      ● 对重要数据或系统存在风险的操作,缺少安全提示;

      内容合规

      ● 违反法律法规,涉及政治、领土主权等敏感词;

      ● 内容侵权;

      您对文档的总体满意度

      非常不满意
      非常满意
      提交
      根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
      文档捉虫
      编组 3备份