Kubernetes / 云原生

在K8s集群中部署容器运行时:Containerd的部署与配置

浅时光博客 · 5月10日 · 2021年 64335次已读

一、Containerd简介

containerd 是一个开源的容器运行时工具,用于管理和运行容器。它被设计为一个轻量级的容器执行引擎,用于在操作系统层面创建、运行和管理容器。c文章来源(Source):浅时光博客ontainerd 提供了容器的核心功能,例如容器的生命周期管理、镜像管理、文件系统挂载等,同时也可以与其他容器编排工具(如 Kubernetes、Docker)结合使用。

以下是 containerd 的一些关键特点和功能:

  1. 轻量级: containerd 被设计为一个相对轻量级的容器运行时,专注于容器的核心功能。它可以作为容器的基础执行引擎,为容器编排工具提供基本的容器管理功能。
  2. 容器生命周期管理: containerd 负责管理容器的生命周期,包括创建、启动、暂停、恢复、停止和销毁容器等操作。它提供了对容器状态的完整控制。
  3. 镜像管理: containerd 可以管理容器镜像,包括拉取、保存、上传、删除等操作。它支持 OCI(Open Container Initiative)规范定义的容器镜像格式。
  4. 文件系统挂载: containerd 允许容器在运行时挂载文件系统,以便容器可以访问宿主机上的文件或目录。
  5. 事件通知: containerd 支持发布和订阅容器事件,允许用户监控容器状态的变化并采取相应的操作。
  6. 扩展性: containerd 允许通过插件机制来扩展其功能。这意味着用户可以根据需要添加新的功能,例如网络管理、存储管理等。
  7. 与容器编排工具集成: containerd 可以与容器编排工具(如 Kubernetes、Docker)集成,作为其底层容器运行时。这使得容器编排工具可以使用 containerd 的功能来管理容器。

containerd 作为容器运行时工具,提供了容器的核心管理和运行功能。它的设计目标是提供一个通用的容器执行引擎,使得不同的容器编排工具可以共享容器的生命周期管理、镜像管理等基本功能,从而降低了容器技术的复杂性和依赖。

kubernetes官方社区在发布的v1.20版本中声明将弃用 Dockershim,即 Docker 容器运行时接口(CRI),这意味着不再支持 Docker,并将在后续版本中删除。

二、文章来源(Source):浅时光博客Containerd部署

1、下载分发二进制文件

  • 如果下载太慢,那么下载到本地电脑然后上传至服务器
  • 注意:经过测试,建议containerd部署v1.6+以上版本,低版本测试发现重启服务器后containerd.sock文件需要很久才会生成。
[root@k8s-master1 ~]# cd /opt/k8s/work/
[root@k8s-master1 work]# mkdir containerd
[root@k8s-master1 work]# tar -xvf containerd-1.6.0-linux-amd64.tar.gz -C containerd
[root@k8s-master1 work]# tar -xvf crictl-v1.23.0-linux-amd64.tar.gz

[root@k8s-master1 work]# mkdir cni-plugins
[root@k8s-master1 work]# tar -xvf cni-plugins-linux-amd64-v1.0.1.tgz -C cni-plugins
[root@k8s-master1 work]# mv runc.amd64 runc

2、分发二进制程序

  • 将程序包分发给Worker节点
  • NODE_IPS变量可以在profile中定义worker节点的IP地址数组
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"

    ssh root@${node_ip} "mkdir -p /opt/k8s/bin"
    scp containerd/bin/*  crictl  cni-plugins/*  runc  root@${node_ip}:/opt/k8s/bin
    ssh root@${node_ip} "chmod a+x /opt/k8s/bin/* && mkdir -p /etc/cni/net.d"
  done

3、创建和分发 containerd 配置文件

  • 通过下面的指令生成默认的配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
  • 注意修改一些配置
    • (1) 比如我这里的rootstate所对应的目录路径跟默认的是不一样的,需要我们手动修改
    • (2) 修改pause镜像的地址,不然使用默认的地址会下载不下来
    • (3) 使用 systemd cgroup 驱动程序,将配置中的SystemdCgroup改为true
[root@k8s-master1 work]# vim /etc/containerd/config.toml
disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/data/k8s/containerd/root"
state = "/data/k8s/containerd/state"
version = 2
...

[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    sandbox_image = "k8s.dockerproxy.com/pause"
    [plugins."io.containerd.grpc.v1.cri".cni]
      bin_dir = "/opt/k8s/bin"
      conf_dir = "/etc/cni/net.d"
...
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            BinaryName = ""
            CriuImagePath = ""
            CriuPath = ""
            CriuWorkPath = ""
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = ""
            ShimCgroup = ""
            SystemdCgroup = true
...
  • 分发配置文件至集群各个worker节点
  • NODE_IPS变量我是在/etc/profile中定义的各个Worker节点IP数组
  • CONTAINERD_DIR同样也是在/etc/profile中定义的,这里我定义的路径为/data/k8s/containerd
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    ssh root@${node_ip} "mkdir -p /etc/containerd/ ${CONTAINERD_DIR}/{root,state}"
    scp containerd-config.toml root@${node_ip}:/etc/containerd/config.toml
  done

4、创建 containerd systemd模板文件

[root@k8s-master1 work]# cat <<EOF | sudo tee containerd.service
[Unit]
Description=Lightweight Kubernetes
Documentation=https://containerd.io
After=network-online.target

[Service]
Environment="PATH=/opt/k8s/bin:/bin:/sbin:/usr/bin:/usr/sbin"
Environment="KUBELET_EXTRA_ARGS=--cgroup-driver=systemd"
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStartPre=-/bin/mkdir -p /run/containerd
ExecStart=/opt/k8s/bin/containerd \\
         -c /etc/containerd/config.toml \\
         -a /run/containerd/containerd.sock \\
         --state /data/k8s/containerd/state \\
         --root /data/k8s/containerd/root 

KillMode=process
Delegate=yes
OOMScoreAdjust=-999
LimitNOFILE=1024000
LimitNPROC=1024000
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF

5、分发 systemd文件并启动服务

[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    scp containerd.service root@${node_ip}:/etc/systemd/system
    ssh root@${node_ip} "systemctl enable containerd && systemctl restart containerd"
  done

三、部署crictl命令行工具

crictl 是兼容 CRI 容器运行时的命令行工具,提供类似于 docker 命令的功能。具体参考官方文档

1、创建和分发 crictl 配置文件

[root@k8s-master1 work]# cat << EOF | sudo tee crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
  • 分发到所有 worker 节点:
[root@k8s-master1 work]# for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    scp crictl.yaml root@${node_ip}:/etc/crictl.yaml
  done

2、crictl命令使用

Containerd命令Docker命令功能
crictl image lsdocker images获取image信息
crictl image pull nginxdocker pull nginxpull 一个nginx的image
crictl image tag nginx nginx-testdocker tag nginx nginx-test给一个nginx的image添加tag
crictl image push nginx-testdocker push nginx-testpush nginx-test的image
crictl image pull nginxdocker pull nginxpull 一个nginx的image
crictl image import nginx.tardocker load<nginx.tar.gz导入本地镜像ctr不支持压缩
crictl run -d –env dqzboy nginx-test nginxdocker run -d –name=nginx nginx-test运行的一个容器
crictl psdocker ps查看运行的容器

四、修改kubele使用systemd

  • 在kubelet启动配置中追加如下参数,然后重启kubelet
--cgroup-driver=systemd

本文作者:浅时光博客
原文链接:https://www.dqzboy.com/7018.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站提供的内容仅限于个人学习和研究使用;禁止将内容用于商业或非法用途。下载后请在24小时内彻底删除,否则后果由用户承担。访问和下载本站内容即表示您已同意上述条款 。

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!