本文主要讲解如何将kubernetes中的docker替换为containerd。并讲解关于容器相关的基础概念。 以及相关部署配置说明。 由于docker嵌入了太多自身内容,为了减轻容器负担。此次选用containerd作为kubernetes的容器实现方案。本文将带大家讲述如何搭建一个集成了containerd的k8s集群。

kubernetes集群三步安装

概念介绍

  • cri (Container runtime interface)

  • containerd

    • containerd is an industry-standard container runtime with an emphasis on simplicity, robustness and portability.
    • containerd完全支持运行容器的的CRI运行时规范。
    • cri在containerd1.1以上的版本的原生插件。它内置于containerd并默认启用。
    • containerd
  • cri-o

    • OCI-based implementation of Kubernetes Container Runtime Interface.
    • kubernetes为了兼容cri和oci孵化了项目cri-o。为了架设在cri和oci之间的一座桥梁。由此cri-o既兼容cri插件实现又兼容oci的容器运行时标准。
  • oci (Open Container Initiative)

  • runc

    • runc is a CLI tool for spawning and running containers according to the OCI specification.
    • runc,是对于OCI标准的一个参考实现,是一个可以用于创建和运行容器的CLI(command-line interface)工具。

    kubelet

环境准备

下载containerd二进制包。我这里已经编译并打包了好了,内含containerd、runc、crictl、ctr等。

下载链接:containerd-v1.2.4.tar.gz

  • runc版本: 1.0.1-dev
  • containerd版本: v1.2.4

安装

安装containerd

  • 解压二进制包并生成默认文件

    bash
    1
    2
    3
    4
    5
    tar -C /usr/local/bin -xzf containerd-v1.2.4.tar.gz
    chmod a+x /usr/local/bin/*
    mkdir -p /etc/containerd
    containerd config default > /etc/containerd/config.toml
        

    生成的默认配置文件注意 [grpc] 的 address 字段默认为 /run/containerd/containerd.sock

    配置文件其他参数含义参照github地址: containerd-config.md

  • /etc/systemd/system 目录下编写文件 containerd.service内容如下:

    containerd.service
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target
    
    [Service]
    ExecStartPre=/sbin/modprobe overlay
    ExecStart=/usr/local/bin/containerd
    Restart=always
    RestartSec=5
    Delegate=yes
    KillMode=process
    OOMScoreAdjust=-999
    LimitNOFILE=1048576
    LimitNPROC=infinity
    LimitCORE=infinity
    
    [Install]
    WantedBy=multi-user.target
        
  • 启动containerd

    bash
    1
    2
    3
    4
    systemctl enable containerd
    systemctl restart containerd
    systemctl status containerd
        

    看containerd启动状态如果是running就没有问题。下面我们测试拉取一下hub的镜像。

  • 测试containerd

    bash
    1
    2
    ctr images pull docker.io/library/nginx:alpine
        

    看到输出done,说明containerd运行一切正常。

使用crictl连接containerd

下一步我们使用crictl连接containerd。

  • 修改crictl的配置文件,在 /etc/crictl.yaml 写入以下内容:

    yaml`
    1
    2
    3
    4
    5
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    timeout: 10
    debug: false
        

    这里注意runtime-endpoint 和image-endpoint 必须与/etc/containerd/config.toml中配置保持一致。

  • 验证一下cri插件是否可用

    bash
    1
    2
    3
    4
    crictl  pull nginx:alpine
    crictl  rmi  nginx:alpine
    crictl  images
        
    其中 crictl images 会列出所有的cri容器镜像。

    到此我们的cri + containerd已经完成整合了。下一步我们需要修改kubeadm配置进行安装。

containerd部署脚本

到此我特意重新整理了部署脚本,包括containerd,ctr,circtl等配置。具体详细配置请移步containerd-dist

导入kubenetes离线镜像包(kubernetes调整)

这里我们就需要导入k8s的离线镜像包了。这里需要注意一下,kubernetes是调用的cri接口,所以导入时也需要从cri插件导入镜像。

  • cri导入镜像命令(cri导入镜像):

     ctr cri load  images.tar
    
  • containerd导入镜像命令(containerd导入镜像):

     ctr images import images.tar 
    

修改kubelet配置和kubeadm安装时配置(kubernetes调整)

  • 在 kubelet配置文件 10-kubeadm.conf 的[Service] 结点加入以下配置:

    conf
    1
    2
        Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --image-service-endpoint=unix:///run/containerd/containerd.sock"
        
  • 在kubeadm配置文件 kubeadm.yaml 中加入

    yaml
    1
    2
    3
    4
    5
    6
    apiVersion: kubeadm.k8s.io/v1beta1
    kind: InitConfiguration
    nodeRegistration:
        criSocket: /run/containerd/containerd.sock
        name: containerd
        

    到此containerd和kubernetes的集成就完成了。下面可以直接安装即可。