nerdctl容器管理

nerdctl容器管理工具

    • nerdctl简介
      • nerdctl的两个版本
    • 1.安装container
    • 2.安装nerdctl和buildkit
    • nerdctl使用方法
      • 1、运行/进入容器
      • 2、容器管理
      • 3、镜像管理
      • 4、镜像构建
      • 5、push镜像

nerdctl简介

k8s1.22版本及以上强制安装containerd,要求卸载Docker.
虽然Docker能干的事Containerd都能干,但Containerd还有一个非常明显的缺陷:它的两个CLI工具ctrcrictl不够友好。
为了解决这个痛点,Containerd 官方推出了一个新的 CLI 叫 nerdctlnerdctl 的使用体验和 docker 一样顺滑.

https://mp.weixin.qq.com/s/Bjn0s5qRh2H9I__mAYh4jg
https://developer.aliyun.com/article/1094835

nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)镜像加密(imgcrypt)等。


nerdctl的两个版本

如果你已经安装了Containerd,只需要选择基础版,否则就选择完整版

  • 基础版:nerdctl--linux-amd64.tar.gz : 只包含 nerdctl
  • 完整版:nerdctl-full--linux-amd64.tar.gz : 包含了 nerdctl 和相关依赖组件containerd, runc, CNI, …)。

1.安装container

k8s12.4之后不再支持Docker,需要安装container.io这个容器运行时。

#!/usr/bin/env bash

# 1.配置时间
set_time_service() {
    # 设置时区为上海
    timedatectl set-timezone Asia/Shanghai

    # 将硬件时钟调整为与本地时钟一致, 0 为设置为 UTC 时间
    timedatectl set-local-rtc 0

    # 重启时间服务依赖的服务
    systemctl restart rsyslog
    systemctl restart crond

    # 同步时间
    systemctl enable --now chronyd

    # 将时间写入到硬件
    hwclock -w

    # 查看时间同步是否成功
    chronyc sources -n
}

# 2.永久禁用swap
set_swapoff() {
    swapoff -a
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    echo '禁用swap'
}

# 3.禁用firewalld防火墙和iptables防火墙邮件服务postfix
disable_firewall_selinux() {
    systemctl disable --now firewalld
    ## 禁用iptables前要先安装iptables服务
    yum install -y iptables-services
    systemctl disable --now iptables
    ## 清空现有的所有iptables策略
    iptables -F
    # 禁用邮件服务
    systemctl disable --now postfix

    echo '禁用防火墙和邮件服务'

    # 禁用selinux
    sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
    setenforce 0
    echo '禁用selinux'
}

# 4.配置内核参数
config_kernel() {
    # 在os启动时加载内核br_netfilter网桥过滤模块
    cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
ip_conntrack
EOF

    # 现在加载br_netfilter网桥过滤模块
    modprobe overlay
    modprobe br_netfilter
    modprobe ip_conntrack

    echo '加载加载br_netfilter网桥过滤模块'

    cat <<EOF >/etc/sysctl.d/k8s.conf
# 在ip6tables链中过滤IPv6包
net.bridge.bridge-nf-call-ip6tables = 1
# 是否在iptables链中过滤IPv4包
net.bridge.bridge-nf-call-iptables = 1
# netfilter防火墙内核模块最大跟踪连接数
net.netfilter.nf_conntrack_max = 2310720

# 禁用用swap
vm.swappiness = 0

# 开启内核开启数据包转发
## 1为开启;0为关闭
net.ipv4.ip_forward = 1 

EOF

    # 使sysctl生效
    sysctl --system
    echo '开启配置k8s内核参数'
}

# 5.配置ipvs功能
config_lvs() {
    yum install -y ipset ipvsadm conntrack libseccomp

    ## 添加需要加载的模块写入脚本文件
    cat <<EOF >/etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
## 高版本内核nf_conntrack_ipv4被nf_conntrack替换了
# modprobe -- nf_conntrack_ipv4
modprobe -- nf_conntrack
EOF

    ## 为脚本添加执行权限
    chmod +x /etc/sysconfig/modules/ipvs.modules

    ## 执行脚本
    /bin/bash /etc/sysconfig/modules/ipvs.modules

    ## 查看对应模块是否加载
    lsmod | grep -e ip_vs -e nf_conntrack
}

# 6.安装container包
install_container_pkg() {
    # 安装yum-utils
    yum install -y yum-utils

    # 卸载旧版docker-CE

    # 添加docker-ce源 https://docs.docker.com/engine/install/centos/
    ## docker-ce国内源--aliyun
    # yum-config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    ## docker-ce官方源
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    echo '添加docker-ce源'

    # 查看repolist中docker-ce仓库是否添加成功
    yum repolist

    yum clean all && yum makecache

    echo '刷新yum缓存'

    # 安装docker-ce
    yum -y install containerd.io

    echo '安装containerd.io'
}



# 7.重启container服务
restart_container() {
    ## 重载服务
    systemctl daemon-reload
    ## 重启container服务
    systemctl restart containerd
    # 设置container开机自启
    systemctl enable containerd

    echo '重启服务并设置开启自启动'
}

# 安装docker完整版
full_install_container() {
    # 1.配置时间
    set_time_service
    # 2.永久禁用swap
    set_swapoff
    # 3.禁用防火墙和SElinux
    disable_firewall_selinux
    # 4.配置内核参数
    config_kernel
    # 5.配置ipvs功能
    config_lvs
    # 6.安装container包
    install_container_pkg
    # 7.重启container服务
    restart_container
}

# 卸载docker
uninstall_docker() {
    # 卸载旧版docker
    yum -y remove docker \
        docker-ce \
        docker-client \
        docker-client-latest \
        docker-common \
        docker-latest \
        docker-latest-logrotate \
        docker-logrotate \
        docker-engine

    # 卸载较新版本docker
    yum autoremove -y
    docker-ce \
        docker-ce-cli \
        containerd.io \
        docker-buildx-plugin \
        docker-compose-plugin \
        docker-ce-rootless-extras

    # 查看卸载完没有
    rpm -qa | grep docker

    echo '卸载docker-CE'
}

#开始菜单
function start_menu() {
    clear
    echo "========================="
    echo " 介绍:适用于CentOS7"
    echo " 作者:Miles"
    echo " 网站:https://blog.csdn.net/omaidb"
    echo "========================="
    echo "注意:本脚本只支持Centos7"
    echo "1. 安装container"
    echo "2. 卸载container"
    echo "0. 退出脚本"
    echo "请输入数字:"
    read -r num
    case "$num" in
    1)
        # 执行完整安装container
        echo "开始安装container"
        full_install_container
        ;;
    2)
        echo "开始卸载container"
        uninstall_docker
        ;;
    0)
        exit 1
        ;;
    *)
        clear
        echo "请输入正确数字"
        sleep 5s
        start_menu
        ;;
    esac
}

# main方法,显示菜单
start_menu

2.安装nerdctl和buildkit

前提条件已安装Containerd
nerdctlrelease: https://github.com/containerd/nerdctl/releases
buildkit项目地址:https://github.com/moby/buildkit
nerdctl 也可以和 buildkit 结合使用来构建容器镜像

# 查看Containerd服务
systemctl status containerd

nerdctl容器管理_第1张图片


#!/usr/bin/env bash

# 定义版本
nerdctl_VERSION=1.2.1
buildkit_VERSION=0.11.4

# 安装nerdctl_mini
install_nerdctl_mini() {
    # 下载nerdctl到指定/usr/local/src/
    ## -c 断点续传
    ## —P 下载到指定目录
    wget -c -P /usr/local/src/ https://github.com/containerd/nerdctl/releases/download/v$nerdctl_VERSION/nerdctl-$nerdctl_VERSION-linux-amd64.tar.gz

    # 创建nerdctl对应目录
    mkdir -p /usr/local/containerd/bin

    # 解压nerdctl到指定路径
    ls /usr/local/containerd/bin/nerdctl &>/dev/null && echo 'nerdctl已存在,请先删除旧版' && exit 1
    tar -xvf nerdctl-$nerdctl_VERSION-linux-amd64.tar.gz -C /usr/local/containerd/bin/
    # 创建软链接
    ln -s /usr/local/containerd/bin/nerdctl /usr/bin/nerdctl
    # 查看是否安装成功
    which nerdctl
    # 设置nerdctl自动补全
    source /usr/share/bash-completion/bash_completion
    source <(nerdctl completion bash)
    echo "source <(nerdctl completion bash)" >>/etc/profile
    ## 使nerdctl自动补全生效
    source /etc/profile

    # 设置nerdctl别名为docker
    echo "alias docker='nerdctl -n=k8s.io'" >>/etc/profile
    # 解决docker别名自动补全问题
    ## https://github.com/containerd/nerdctl/issues/1845#issuecomment-1384224699
    echo 'complete -o default -F __start_nerdctl docker' >>/etc/profile
    # 使别名立即生效
    source /etc/profile

    # 使用docker命令(无法使用自动补全)
    docker images

    # 配置nerdctl
    # 原文链接:https://blog.csdn.net/u010533742/article/details/123062942
    mkdir -p /etc/nerdctl/
    cat >/etc/nerdctl/nerdctl.toml <<'EOF'
namespace = "k8s.io"
insecure_registry = true
EOF
}

# 安装buildkit
install_buildkit() {
    # 下载buildkit
    ## -c 断点续传
    ## —P 下载到指定目录
    wget -c -P /usr/local/src/ https://github.com/moby/buildkit/releases/download/v$buildkit_VERSION/buildkit-v$buildkit_VERSION.linux-amd64.tar.gz
    # 创建buildkit对应目录
    mkdir -p /usr/local/containerd/

    # 解压buildkit到指定路径
    ## buildkit压缩包里有bin目录
    ls /usr/local/containerd/bin/buildkitd &>/dev/null && echo 'buildkitd已存在,请先删除旧版' && exit 1
    tar -xvf /usr/local/src/buildkit-v$buildkit_VERSION.linux-amd64.tar.gz -C /usr/local/containerd
    # 创建buildkitd软连接
    ln -s /usr/local/containerd/bin/buildkitd /usr/local/bin/buildkitd
    ln -s /usr/local/containerd/bin/buildctl /usr/local/bin/buildctl

    # 创建buildkit.socket服务文件
    cat >/usr/lib/systemd/system/buildkit.socket <<'EOF'
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Socket]
ListenStream=%t/buildkit/buildkitd.sock

[Install]
WantedBy=sockets.target
EOF

    # 创建buildkit.service服务文件
    cat >/usr/lib/systemd/system/buildkit.service <<'EOF'
[Unit]
Description=BuildKit
Requires=buildkit.socket
After=buildkit.socketDocumentation=https://github.com/moby/buildkit

[Service]
ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true

[Install]
WantedBy=multi-user.target
EOF
    # 开机自启buildkit服务
    systemctl daemon-reload
    systemctl enable --now buildkit
}

# 安装nerdctl_mini
install_nerdctl_mini

# 安装buildkit服务
install_buildkit

nerdctl使用方法

nerdctl用法参考:
https://mdnice.com/writing/c57c45c557bf46b0835958134892abc4

https://mp.weixin.qq.com/s/vs_XIn-cpEXtWoF8Yb9vRw


1、运行/进入容器

# 运行容器
nerdctl run

# 进入容器
nerdctl exec

2、容器管理

nerdctl ps #列出容器
nerdctl inspect #获取容器的详细信息。
nerdctl logs #获取容器日志
nerdctl stop #停止容器
nerdctl rm #删除容器

3、镜像管理

nerdctl images #镜像列表
nerdctl pull #拉取镜像
nerdctl push #推送镜像
nerdctl tag #镜像标签
nerdctl save #导出镜像
nerdctl rmi #删除镜像
nerdctl load #导入镜像

4、镜像构建

容器构建需要安装buildkit
https://blog.csdn.net/omaidb/article/details/128673207

# 从 Dockerfile 构建镜像
## -t 指定输出的镜像名和tag
## . 默认的Dockerfile文件名称
nerdctl build -t alpine:3.16.3-test .

# 构建镜像时不使用缓存(默认值:false)
nerdctl build --no-cache 

nerdctl容器管理_第2张图片
在这里插入图片描述


5、push镜像

# 登录到dockerhub
nerdctl login
# 输入docker账号和密码

nerdctl容器管理_第3张图片

# 推送docker镜像
nerdctl push 镜像名

nerdctl容器管理_第4张图片

dockerhub页面上查看是否推送成功。
在这里插入图片描述

你可能感兴趣的:(容器,k8s,Containerd,nerdctl)