前言
去年12月份,當Kubernetes社區(qū)宣布1.20版本之后會逐步棄用 dockershim ,當時也有很多自媒體在宣傳Kubernetes棄用Docker。其實,我覺得這是一種誤導,也許僅僅是為了蹭熱度。
dockershim 是Kubernetes的一個組件,其作用是為了操作Docker。Docker是在2013年面世的,而Kubernetes是在2016年,所以Docker剛開始并沒有想到編排,也不會知道會出現(xiàn)Kubernetes這個龐然大物(它要是知道,也不會敗的那么快...)。但是Kubernetes在創(chuàng)建的時候就是以Docker作為容器運行時,很多操作邏輯都是針對的Docker,隨著社區(qū)越來越健壯,為了兼容更多的容器運行時,才將Docker的相關邏輯獨立出來組成了 dockershim 。
正因為這樣,只要Kubernetes的任何變動或者Docker的任何變動,都必須維護 dockershim ,這樣才能保證足夠的支持,但是通過 dockershim 操作Docker,其本質(zhì)還是操作Docker的底層運行時Containerd ,而且 Containerd 自身也是支持 CRI (Container Runtime Interface),那為什么還要繞一層Docker呢?是不是可以直接通過 CRI 和 Containerd 進行交互?這也是社區(qū)希望啟動dockershim 的原因之一吧。
那什么是Containerd呢?
Containerd是從Docker中分離的一個項目,旨在為Kubernetes提供容器運行時,負責管理鏡像和容器的生命周期。不過Containerd是可以拋開Docker獨立工作的。它的特性如下:
支持OCI鏡像規(guī)范,也就是runc
支持OCI運行時規(guī)范
支持鏡像的pull
支持容器網(wǎng)絡管理
存儲支持多租戶
支持容器運行時和容器的生命周期管理
支持管理網(wǎng)絡名稱空間
Containerd和Docker在命令使用上的一些區(qū)別主要如下:

可以看到使用方式大同小異。
下面介紹一下使用kubeadm安裝K8S集群,并使用containerd作為容器運行時的具體安裝步驟。
環(huán)境說明
主機節(jié)點

軟件說明

環(huán)境準備
(1)在每個節(jié)點上添加 hosts 信息:
$ cat /etc/hosts?

(2)禁用防火墻:
systemctl stop firewalld
systemctl disable firewalld
(3)禁用SELINUX:
$ setenforce 0
$ cat /etc/selinux/config
SELINUX=disabled
(4)創(chuàng)建/etc/sysctl.d/k8s.conf文件,添加如下內(nèi)容:
vim /etc/sysctl.d/k8s.conf?
--------------------------------------------
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
(5)執(zhí)行如下命令使修改生效:
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
(6)安裝 ipvs
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上面腳本創(chuàng)建了的/etc/sysconfig/modules/ipvs.modules文件,保證在節(jié)點重啟后能自動加載所需模塊。
使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已經(jīng)正確加載所需的內(nèi)核模塊。
(7)安裝了 ipset 軟件包:
yum install ipset -y
為了便于查看 ipvs 的代理規(guī)則,最好安裝一下管理工具 ipvsadm:
yum install ipvsadm -y
(8)同步服務器時間
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
chronyc sources
(9)關閉 swap 分區(qū):
swapoff -a
(10)修改/etc/fstab文件,注釋掉 SWAP 的自動掛載,使用free -m確認 swap 已經(jīng)關閉。swappiness 參
數(shù)調(diào)整,修改/etc/sysctl.d/k8s.conf添加下面一行:
vim /etc/sysctl.d/k8s.conf
-----------------------
vm.swappiness=0
執(zhí)行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。
(11)接下來可以安裝 Containerd
$ yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ yum list | grep containerd
可以選擇安裝一個版本,比如我們這里安裝最新版本:
yum install containerd.io-1.4.4 -y
(12)創(chuàng)建containerd配置文件:
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 替換配置文件
sed -i "s#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g"
/etc/containerd/config.toml
sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup =
true' /etc/containerd/config.toml
sed -i "s#https://registry-1.docker.io#https://registry.cnhangzhou.aliyuncs.com#g" ?/etc/containerd/config.toml
(13)啟動Containerd:
systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd
在確保 Containerd安裝完成后,上面的相關環(huán)境配置也完成了,現(xiàn)在我們就可以來安裝 Kubeadm 了,
我們這里是通過指定yum 源的方式來進行安裝,使用阿里云的源進行安裝:
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
然后安裝 kubeadm、kubelet、kubectl(我安裝的指定版本1.20.5,有版本要求自己設定版本):
yum install -y kubelet-1.20.5 kubeadm-1.20.5 kubectl-1.20.5
設置運行時:
crictl config runtime-endpoint /run/containerd/containerd.sock
可以看到我們這里安裝的是 v1.20.5版本,然后將 kubelet 設置成開機啟動:
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
“到這里為止上面所有的操作都需要在所有節(jié)點執(zhí)行配置。 ”
初始化集群
初始化Master
然后接下來在 master 節(jié)點配置 kubeadm 初始化文件,可以通過如下命令導出默認的初始化配置:
$ kubeadm config print init-defaults > kubeadm.yaml
然后根據(jù)我們自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式為 ipvs,需要
注意的是由于我們使用的containerd作為運行時,所以在初始化節(jié)點的時候需要指定 cgroupDriver 為
systemd 【1】


然后使用上面的配置文件進行初始化:
kubeadm init --config=kubeadm.yaml

拷貝 kubeconfig 文件
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
添加節(jié)點
記住初始化集群上面的配置和操作要提前做好,將 master 節(jié)點上面的 $HOME/.kube/config 文件拷貝到
node 節(jié)點對應的文件中,安裝 kubeadm、kubelet、kubectl,然后執(zhí)行上面初始化完成后提示的 join 命
令即可:
kubeadm join 192.168.3.10:6443 --token abcdef.0123456789abcdef \
? ?--discovery-token-ca-cert-hash
sha256:0d0e045cf3131fc3a780e52f920900355f17b03511a754cb0aac61871b1720de
執(zhí)行成功后運行 get nodes 命令:
$ kubectl get nodes

可以看到是 NotReady 狀態(tài),這是因為還沒有安裝網(wǎng)絡插件,接下來安裝網(wǎng)絡插件,可以在文檔 https://
kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 中選擇我們
自己的網(wǎng)絡插件,這里我們安裝 calio:
$ wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
# 因為有節(jié)點是多網(wǎng)卡,所以需要在資源清單文件中指定內(nèi)網(wǎng)網(wǎng)卡
$ vi calico.yaml

安裝calico網(wǎng)絡插件
$ kubectl apply -f calico.yaml
網(wǎng)絡插件運行成功了,node 狀態(tài)也正常了:

徹底卸載K8S集群
yum remove -y kubelet kubeadm kubectl
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd