k8s1.22
版本及以上
强制安装containerd
,要求卸载Docker
.
虽然Docker
能干的事Containerd
都能干,但Containerd
还有一个非常明显的缺陷:它的两个CLI工具ctr
和crictl
不够友好。
为了解决这个痛点,Containerd
官方推出了一个新的 CLI 叫 nerdctl
。nerdctl
的使用体验和 docker
一样顺滑.
https://mp.weixin.qq.com/s/Bjn0s5qRh2H9I__mAYh4jg
https://developer.aliyun.com/article/1094835
nerdctl
的目标并不是单纯地复制 docker
的功能,它还实现了很多 docker
不具备的功能,例如延迟拉取镜像(lazy-pulling)
、镜像加密(imgcrypt)
等。
如果你已经安装了Containerd
,只需要选择基础版
,否则就选择完整版
。
基础版
:nerdctl--linux-amd64.tar.gz : 只包含 nerdctl
。完整版
:nerdctl-full--linux-amd64.tar.gz : 包含了 nerdctl
和相关依赖组件
(containerd
, runc
, CNI
, …)。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
前提条件
已安装Containerd
。
nerdctl
的release
: https://github.com/containerd/nerdctl/releases
buildkit
项目地址:https://github.com/moby/buildkit
nerdctl
也可以和 buildkit
结合使用来构建容器镜像
。
# 查看Containerd服务
systemctl status containerd
#!/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
用法参考:
https://mdnice.com/writing/c57c45c557bf46b0835958134892abc4
https://mp.weixin.qq.com/s/vs_XIn-cpEXtWoF8Yb9vRw
# 运行容器
nerdctl run
# 进入容器
nerdctl exec
nerdctl ps #列出容器
nerdctl inspect #获取容器的详细信息。
nerdctl logs #获取容器日志
nerdctl stop #停止容器
nerdctl rm #删除容器
nerdctl images #镜像列表
nerdctl pull #拉取镜像
nerdctl push #推送镜像
nerdctl tag #镜像标签
nerdctl save #导出镜像
nerdctl rmi #删除镜像
nerdctl load #导入镜像
容器构建需要安装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
# 登录到dockerhub
nerdctl login
# 输入docker账号和密码
# 推送docker镜像
nerdctl push 镜像名