kubeadm部署K8S集群并使用containerd做容器 運行時

前言


去年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ū)別主要如下:

image.png

可以看到使用方式大同小異。

下面介紹一下使用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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容