先聊几个必要的知识点
1,k8s 1.24之后弃用了docker-shim。
dockershim 的作用是 Kubernetes 通过 CRI 来操作 Docker,所以Kubernetes 任何的功能变动或 Docker 有任何的功能特性变更,dockershim 代码必须加以改动保证能够支持相关的变更。(维护特别不方便)
另外,Docker 的底层运行时是 containerd(大家装docker的时候应该也会发现有containerd这样几个东西),最终都是要调用 containerd且 containerd 自身也支持 CRI 。那为什么要先绕过一层 Docker 呢?是不是可以直接通过 CRI 跟 Containerd 进行交互呢?这也就造成了现在 Kubernetes 社区弃用 dockershim的原因。
2,linux操作系统systemd的服务管理
系统服务在/usr/lib/systemd/system目录下,名字为*.service之类的文件,systemctl可以通过文件名管理服务。这就是为什么有些systemctl 可以管理一些二进制启动的服务,linux的3.10的内核以后直接后台运行二进制程序显然不够优雅。
3,主流的平台platform有x86(amd),arm(aarch)等等,操作系统也是分linux/windows的。
参考cpu架构,如果不熟悉的话,还是不好记住的,特别是amd/arm这种容易混。特别注意的是,用ctr命令拉取、导入、导出镜像,是需要指定平台的,否则有时候会报相关错误,ctr也支持全平台,但是文件就比较大了。
4,containerd的工具为ctr,k8s管理containerd的工具为crictl
ctr是containerd的工具,它运行时,需要在ctr 紧后加入-n namespace。例如k8s的镜像是放在k8s.io的命名空间下的,你直接用ctr查看,是看不到镜像的,你需要这样才能看到:ctr -n k8s.io images list。但是可以用crictl直接查看到k8s运行的服务的镜像。
准备工作:
containerd的二进制下载地址(我用的1.6.22):
https://github.com/containerd/containerd/releases
k8s二进制的下载地址(直接修改版本号可用):
例如:
wget https://dl.k8s.io/v1.23.1/bin/linux/arm64/kubeadm --no-check-certificatewget
wget https://dl.k8s.io/v1.27.1/bin/linux/amd64/kubeadm --no-check-certificate
干点正事:
一,启动containerd
包下载好到本地,解压出来。
tar -xzvf [cri-containerd包名] -C [解压目标目录]
可以看到解压出来这么多东东,图中的是需要跑的二进制文件,
可以放到/usr/bin/
也可以放到/usr/local/bin/
因为这两个目录都具有系统的环境变量,可以直接运行。比如ssh命令其实就在/usr/bin/ssh
赋予它们可执行权限,4=读,2=写,1=可执行,加一起就是他的权限。
chmod 0755 /usr/bin/containerd*
chmod 0755 /usr/bin/crictl
chmod 0755 /usr/bin/ctd-decoder
chmod 0755 /usr/bin/runc
chmod 0755 /usr/bin/ctr
把上面解压的这个文件containerd.service,放到systemd的目录下:/usr/lib/systemd/system/
同样要赋予权限
chmod 0755 /usr/lib/systemd/system/containerd.service
如果你不想每次使用crictl都带一行类似下面这样的参数,
crictl --image-endpoint unix:///var/run/containerd/containerd.sock
那么你就执行下面的命令
cat >>/etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF
以下是我自己的service,与包里的稍微有一些不一致
vim /usr/lib/systemd/system/containerd.service
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
#After=network-online.target firewalld.service
[Service]
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
ExecStart=/usr/bin/containerd
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
好了,到这里基本上安装好了,接下来,就启动它吧。是不是特别简单啊
systemctl daemon-reload
systemctl enable containerd
systemctl start containerd
二,containerd的使用
首先,通过类似的方式,我下载了kubeadm kubectl kubelet,本地离线安装了一个k8s环境。
那么我想做k8s整套的离线包,就需要把镜像导出来,以下是正确的导入导出方式
回顾:平台ARM=arm64,x86=amd64
containerd拉取、导入、导出镜像都是分平台的,--all-platform是全平台
镜像拉取:
ctr -n k8s.io i pull --platform=amd64 [镜像名:tag]
镜像导出:
ctr -n k8s.io images export --platform=amd64 [out包名.tar] [镜像名称:tag]
镜像导入:
ctr -n k8s.io images import --platform=amd64 n.tar
修改tag:
ctr -n k8s.io i tag src_name:src_tag dst_name:dst_tag