Containerd容器运行时的Kubernetes(K8s)环境搭建
在K8s 1.24版本以上不再支持Dockershim,因此很多人想改用containerd作为容器运行时。
Containerd容器运行时的Kubernetes(K8s)环境搭建
K8s需要全程在root用户下进行操作,因此需要先切换到root用户下:
sudo su
安装K8s一般使用kubeadm,官方文档:
kubeadm官方文档
按照官方文档进行安装
准备开始
这是官方文档的要求,最重要的一点在最后:
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器- 的发行版提供通用的指令。
- 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
CPU 2 核心及以上。 - 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
- 开启机器上的某些端口。
- 禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区。
这里需要用到的命令是:
但是重启机器后会失效,如果需要永久关闭需要编辑文件swapoff -a
在里面注释掉最后一行(应该有swap字样,大概长这样/dev/mapper/cl-swap swap swap defaults 0 0),如果不含swap那就还是别乱注释,每次开机运行上面的命令关一下吧。vi /etc/fstab
安装容器运行时
这一步以前一直是安装docker.io,但是在k8s 1.24版本以上不再支持Dockershim,具体文章如下:
移除Dockershim的通知
根据官方文档,我们安装containerd
K8s官方文档中写道:按照开始使用 containerd的说明进行操作。 这又转到了containerd的官方文档,可以看到Option2方法是从apt-get下载
而这里他说containerd包是分发在Docker源上面的,所以我们要点击下面的Ubuntu进入Docker官网看怎么给Ubuntu配置Docker源。
首先卸载原来的包
sudo apt-get remove docker docker-engine docker.io containerd runc
然后给我们的apt配置docker的仓库,首先安装依赖
sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common
信任 Docker 的 GPG 公钥:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
添加软件仓库: (这里使用清华源)
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
更新apt
sudo apt-get update
现在就可以安装containerd了
sudo apt install containerd.io
安装完成后,如果生成了/etc/containerd/config.toml
文件,就说明安装好了,可以回到k8s的官方文档了,里面写的是“创建有效的配置文件 config.toml 后返回此步骤。”
我们可以看k8s官方安装containerd的教程
我们需要生成有效的containerd配置文件,下面的命令可以自动生成一套默认配置:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
配置 systemd cgroup 驱动
官方文档中写道:结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml
中设置:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
我们使用命令
vim /etc/containerd/config.toml
然后找上面这一段,大概在第125行,改为true
配置registry.mirrors为阿里云镜像,大概在153行:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://bqr1dr1n.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://registry.aliyuncs.com/k8sxio"]
效果如下
更改sandbox_image:(这个命令是出去以后直接运行)
sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
最后重启服务
systemctl restart containerd
至此containerd就安装完成了
安装 kubeadm、kubelet 和 kubectl
apt官方库中是没有K8s的,需要在apt中添加K8s的源
可以看官方文档,官方文档中给出的安装命令如下,但是因为网络原因我们不用:
# 请不要使用这段代码,因为国内网络原因可能卡住。
# sudo apt-get update && sudo apt-get install -y apt-transport-https
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
# sudo apt-get update
# sudo apt-get install -y kubectl
官方文档在国内网络环境下并不适用,请使用以下代码:
第一步是apt安装https包
sudo apt-get update && sudo apt-get install -y apt-transport-https
但是,由于国内网络原因,不一定能连接Google,很可能第二步会卡死。
这里也可以使用阿里云的镜像,把第二步的命令改为:
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
然后运行:这一步是给apt的源里面添加k8s的阿里源,就能在apt中安装k8s了
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
修改完这个list文件后,更新一下apt-get的配置
apt-get update
下面这句就是安装kubelet,kubeadm,kubectl三个k8s的核心组件,默认安装最新版
# 如果需要指定版本,使用下一段的命令,此命令是默认安装最新版,我们需要安装1.22版本
不要用 apt install -y kubelet kubeadm kubectl
如果需要指定老版本,可以通过=<版本号>来指定版本,比如有人指定我要安装1.22版本,但1.22里面也有很多小版本,使用下面的命令查看1.22有哪些小版本
apt-cache madison kubectl
可以看到1.22的最终版是1.22.15-00,所以用下面的命令安装
apt install kubeadm=1.22.15-00 kubectl=1.22.15-00 kubelet=1.22.15-00
初始化集群
安装完成后,使用kubeadm初始化K8s集群master,配置 kubeadm 初始化文件,可以通过如下命令导出默认的初始化配置:
kubeadm config print init-defaults > kubeadm.yaml
然后修改其中一些参数:
vim kubeadm.yaml
内容如下:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.31.218 # 修改为自己的ip
bindPort: 6443
nodeRegistration:
criSocket: /var/run/containerd/containerd.sock # 修改为containerd的socket
imagePullPolicy: IfNotPresent
name: node
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 修改为阿里云镜像
kind: ClusterConfiguration
kubernetesVersion: 1.22.15 # 要安装的版本号
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 # 和即将要安装的网络插件有关
scheduler: {}
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd # 配置驱动为systemd
然后用上面的配置文件进行初始化:
kubeadm init --config=kubeadm.yaml
运行时会拉取镜像,可能要多等一会儿,最终结果如下:
注意最后两行是告诉你Worker节点如何加入集群,要记住这条命令,把他复制出来放在记事本之类的地方。
按照上面说的,如果是root用户,要运行
export KUBECONFIG=/etc/kubernetes/admin.conf
同时也要运行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
才能用kubectl命令,如果想不在root时,在普通用户下也运行kubectl,可以exit
退出root用户,用普通用户再次执行:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
然后这里还写了 需要部署pod network
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
部署网络插件
我们这里使用flannel插件,首先下载插件:
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
然后apply运行:
kubectl apply -f kube-flannel.yml
运行成功后,还需要稍等一会儿,可以使用下面的命令查看所有pods是否正常运行(可能还在拉取镜像)
kubectl get pods -n kube-system -o wide
全部都是Running后,节点也会变成Ready状态
kubectl get nodes
至此,主节点就配置成功了。
Worker节点配置
Work节点的容器安装等工作和Master节点是一样的,只有到安装完kubeadm、kubectl和kubelet之后,keadm的初始化不是init命令,而是上面主节点部署完后让记住的join命令
kubeadm join <你的主节点ip>:<端口号> --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxx(上面出现过)
如果忘记了上面的 join 命令可以使用命令kubeadm token create --print-join-command重新获取。
最后再在主节点执行
kubectl get nodes
可以看到两个节点。
更多推荐
所有评论(0)