• 《Kubernetes部署篇:Ubuntu20.04基于二进制安装安装cri-containerd-cni》


    一、背景

    由于客户网络处于专网环境下, 使用kubeadm工具安装K8S集群,由于无法连通互联网,所有无法使用apt工具安装kubeadm、kubelet、kubectl,当然你也可以使用apt-get工具在一台能够连通互联网环境的服务器上下载cri-tools、containerd、kubernetes-cni软件包,然后拷贝到专网主机上,通过dpkg工具安装cri-tools、containerd、kubernetes-cni,这里并没有采用这种方式,在当前客户主机网络环境下,我们使用二进制方式来安装cri-tools、containerd、kubernetes-cni。

    环境信息如下所示:

    操作系统 内核版本 cri-containerd-cni版本
    Ubuntu 20.04.5 LTS 5.15.0-69-generic 1.7.2

    说明:根据官方文档,自1.1版本之后,提供了cri-tools、containerd、runc、cni二进制合集包

    cri-containerd-cni二进制包,包含如下软件:

    软件名称 软件版本
    cri-tools 1.26.0
    containerd 1.7.2
    runc 1.1.7
    cni 1.2.0

    问题一:为什么安装containerd,需要同时安装runc及cni网络插件?

    安装containerd,需要同时安装runc及cni网络插件。Containerd不能直接操作容器,需要通过runc来运行容器。默认Containerd管理的容器仅有lo网络(无法访问容器之外的网络),如果需要访问容器之外的网络则需要安装CNI网络插件。CNI(Container Network Interface) 是一套容器网络接口规范,用于为容器分配ip地址,通过CNI插件Containerd管理的容器可以访问容器之外的网络。


    问题二:为什么安装cri-tools?

    cri-tools(容器运行时工具):这是一个 用于与Kubernetes容器运行时接口(CRI)进行交互的命令行工具集。它提供了一些有用的功能,如创建、销毁和管理容器等。


    二、操作步骤

    2.1、方法一

    1、下载软件包

    wget https://github.com/containerd/containerd/releases/download/v1.7.2/cri-containerd-cni-1.7.2-linux-amd64.tar.gz
    
    • 1

    2、解压安装

    tar axf cri-containerd-cni-1.7.2-linux-amd64.tar.gz -C /
    
    • 1

    3、生成默认配置文件

    mkdir -p /etc/containerd && containerd config default > /etc/containerd/config.toml
    
    • 1

    4、配置systemd cgroup驱动

    sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
    
    • 1

    5、重载沙箱pause镜像

    sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml
    
    • 1

    6、设置cni插件在创建网络配置文件时使用的模板文件路径

    sed -i 's#conf_template = ""#conf_template = "/etc/cni/net.d/cni-default.conf"#g' /etc/containerd/config.toml
    
    • 1

    6、网络插件CNI配置文件

    rm -f /etc/cni/net.d/10-containerd-net.conflist
    cat <<EOF | sudo tee /etc/cni/net.d/cni-default.conf 
    {
        "name": "mynet",
        "cniVersion": "0.3.1",
        "type": "bridge",
        "bridge": "mynet0",
        "isDefaultGateway": true,
        "ipMasq": true,
        "hairpinMode": true,
        "ipam": {
            "type": "host-local",
            "subnet": "10.48.0.0/16"
        }
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    说明:

    1、10.48.0.0/16是集群pod网段
    2、cni-default.conf 文件中cniVersion的版本号要与10-containerd-net.conflist版本中定义的保持一致。

    7、重启containerd服务并设置开机自启

    systemctl daemon-reload && systemctl restart containerd && systemctl enable containerd
    
    • 1

    安装完成后,确保k8s集群所有节点的runc和containerd版本如下所示:

    root@k8s-master-63:~# containerd -v
    containerd github.com/containerd/containerd v1.7.2 0cae528dd6cb557f7201036e9f43420650207b58
    
    root@k8s-master-63:~# runc -v
    runc version 1.1.7
    commit: v1.1.7-0-g860f061b
    spec: 1.0.2-dev
    go: go1.20.4
    libseccomp: 2.5.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    说明:由于网络问题,无法下载国外的K8S镜像,所以这里使用阿里云的镜像仓库地址registry.cn-hangzhou.aliyuncs.com/google_containers代替。如果你有阿里云的账号,可以对 containerd配置镜像加速地址来实现快速下载镜像。


    2.2、方法二

    1、安装cri-tools

    # 1、下载二进制包
    wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.26.0/crictl-v1.26.0-linux-amd64.tar.gz
    tar axf crictl-v1.26.0-linux-amd64.tar.gz -C /usr/local/bin
    
    # 2、配置/etc/crictl.yaml
    cat <<EOF | sudo tee /etc/crictl.yaml
    runtime-endpoint: unix:///run/containerd/containerd.sock
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2、安装cni网络插件

    # 1、下载二进制包
    wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
    
    # 2、解压文件
    mkdir -p /opt/cni/bin
    tar axf cni-plugins-linux-amd64-v1.2.0.tgz -C /opt/cni/bin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3、安装runc

    wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
    cp runc.amd64 /usr/bin/runc
    
    • 1
    • 2

    4、安装containerd

    # 1、下载二进制包并解压
    wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz
    tar axf containerd-1.7.2-linux-amd64.tar.gz -C /usr/local
    
    # 2、生成默认配置文件
    mkdir -p /etc/containerd && containerd config default > /etc/containerd/config.toml
    
    # 3、配置systemd cgroup驱动
    sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
    
    # 4、重载沙箱pause镜像
    sed -i 's#sandbox_image = "registry.k8s.io/pause:3.8"#sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"#g' /etc/containerd/config.toml
    
    # 5、设置cni插件在创建网络配置文件时使用的模板文件路径
    sed -i 's#conf_template = ""#conf_template = "/etc/cni/net.d/cni-default.conf"#g' /etc/containerd/config.toml
    
    # 6、网络插件CNI配置文件
    cat <<EOF | sudo tee /etc/cni/net.d/cni-default.conf 
    {
        "name": "mynet",
        "cniVersion": "0.3.1",
        "type": "bridge",
        "bridge": "mynet0",
        "isDefaultGateway": true,
        "ipMasq": true,
        "hairpinMode": true,
        "ipam": {
            "type": "host-local",
            "subnet": "10.48.0.0/16"
        }
    }
    EOF
    
    # 7、创建service文件
    vim /etc/systemd/system/containerd.service 
    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target local-fs.target
    
    [Service]
    #uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
    #Environment="ENABLE_CRI_SANDBOXES=sandboxed"
    ExecStartPre=-/sbin/modprobe overlay
    ExecStart=/usr/local/bin/containerd
    
    Type=notify
    Delegate=yes
    KillMode=process
    Restart=always
    RestartSec=5
    # Having non-zero Limit*s causes performance problems due to accounting overhead
    # in the kernel. We recommend using cgroups to do container-local accounting.
    LimitNPROC=infinity
    LimitCORE=infinity
    LimitNOFILE=infinity
    # Comment TasksMax if your systemd version does not supports it.
    # Only systemd 226 and above support this version.
    TasksMax=infinity
    OOMScoreAdjust=-999
    
    [Install]
    WantedBy=multi-user.target
    
    # 8、重启containerd服务并设置开机自启
    systemctl daemon-reload && systemctl restart containerd && systemctl enable containerd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    总结:整理不易,如果对你有帮助,可否点赞关注一下?

    更多详细内容请参考:企业级K8s集群运维实战

  • 相关阅读:
    病毒和战争齐飞,24 届秋招会更惨吗?
    Ubuntu Pycharm Anaconda 管理&切换环境
    qml基础语法
    Day1:用原生JS把你的设备变成一台架子鼓!
    HTML 的学习-1|HTML 简介
    最优化基础(一)
    (dist)vue docker nginx 部署
    string类的实现
    LNMP及论坛的搭建
    MySQL高级-读写分离-分库分表
  • 原文地址:https://blog.csdn.net/m0_37814112/article/details/132583494