centos7使用containerd部署k8s集群

由于k8s高版本后面不支持docker,所以需要使用containerd替代docker,下面是部署过程,整个部署基本和原来记录的差距不大,但是还是有些注意事项
首先关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux:

sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

关闭swap交换分区

swapoff -a #临时关闭

永久关闭需要注释掉/etc/fstab文件中的swap行

安装一些必要的工具和依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

设置主机名,在每个节点设置对应的主机名,在每台主机的/etc/hosts文件中添加以下配置

192.168.1.72   master
192.168.1.73   worker1
192.168.1.74   worker2

然后设置每个节点的主机名
登录192.168.1.72节点

hostnamectl set-hostname master

登录192.168.1.73节点

hostnamectl set-hostname worker1

登录192.168.1.74节点

hostnamectl set-hostname worker2

将桥接的IPv4流量传递到iptables的链,在每个节点添加如下的命令

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

开启IP转发功能

echo "1" > /proc/sys/net/ipv4/ip_forward

加载br_netfilter模块

modprobe br_netfilter

查看是否加载

lsmod | grep br_netfilter

修改内核参数

echo "fs.may_detach_mounts = 1" >> /etc/sysctl.conf

使配置生效

sysctl --system

同步所有节点时间,也可以自行配置时钟源服务器,作为集群内时间服务器

yum install ntpdate -y
ntpdate time.windows.com

开启ipvs

yum -y install ipset ipvsadm

在所有节点执行以下命令

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 ipvs -e nf_conntrack_ipv4

所有节点安装containerd、kubeadm、kubelet
containerd版本下载,我们需要去这里:https://github.com/containerd/containerd/releases
需要下载containerd工具包和cri运行时,本地在本地部署containerd-1.7.10为例
首先下载需要的包

wget https://github.com/containerd/containerd/releases/download/v1.7.10/cri-containerd-1.7.10-linux-amd64.tar.gz

我们直接将cri-containerd-1.7.10-linux-amd64.tar.gz包解包覆盖根目录即可。

tar -zxvf cri-containerd-1.7.10-linux-amd64.tar.gz -C /

然后创建containerd配置文件目录

mkdir -p /etc/containerd
containerd config default >/etc/containerd/config.toml

config.toml中配置容器运行的cgroup driver改为systemd

SystemdCgroup = false
#改为
SystemdCgroup = true

sandbox_image 配置改为 "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8"
然后设置开机启动并启动

systemctl enable containerd --now
systemctl start containerd

到这里containerd配置就完成了,可以使用config命令查看containerd的配置

containerd config dump

设置crictl
使用除docke以外的CRI时,使用crictl来进行镜像管理,相当于docker-cli。

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

默认的containerd带的runc有些问题,我们直接执行runc有如下报错,我们需要下载替换下修复这个问题

微信截图_20231220111545.png

wget https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64
rm -rf /usr/local/sbin/runc
mv runc.amd64 /usr/local/sbin/runc
chmod +x /usr/local/sbin/runc

然后我们重启containerd

systemctl restart containerd

接着我们开始安装k8s,我这里安装指定了版本1.23.0,首先添加安装源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

然后进行k8s相关组件的安装

yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容:

vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动

systemctl enable kubelet

在master操作,首先生成default.yaml部署配置文件

cd /etc/kubernetes
kubeadm config print init-defaults > default.yaml

然后修改配置文件

sed -i "s/1.2.3.4/0.0.0.0/" /etc/kubernetes/default.yaml #修改集群能被所有ip访问
sed -i "s#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#" /etc/kubernetes/default.yaml #修改成国内源
sed -i '/10.96.0.0\/12/a\  podSubnet: 10.244.0.0\/16' /etc/kubernetes/default.yaml #增加POD网段
sed -i "s/name: node/name: $HOSTNAME/g" /etc/kubernetes/default.yaml #配置文件默认节点不是主机名,替换成主机名
sed -i "s/\/var\/run\/dockershim.sock/\/run\/containerd\/containerd.sock/g" /etc/kubernetes/default.yaml #设置cri的socket使用containerd的sock

然后初始化集群,注意此处记录下生成的token密钥

kubeadm init --config=default.yaml

根据提示信息,在k8s-master节点上使用kubectl工具,配置常规用户如何使用kubectl访问集群

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

接着我们修改k8s相关配置

vim /var/lib/kubelet/kubeadm-flags.env
--container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
改为
--container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8

主要就是pause容器的版本改到和config.toml内一致

重启kubelet加载新配置

systemctl daemon-reload
systemctl restart kubelet

上述操作完成以后最后就是安装网络组件,相关yaml文件可以在这里进行下载:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml

修改custom-resources.yaml文件内cidr地址范围配置

cidr: 192.168.0.0/16
#改为
cidr: 10.244.0.0/16

然后创建

kubectl create -f custom-resources.yaml

注意上述两个网络组件的yaml文件需要使用create命令创建,使用apply创建会报错。

最后等待网络组件安装,完成以后使用相关命令进行检查,正常说明集群搭建完成。

微信截图_20231220115324.png

其他节点可以通过之前生成的join命令加入这个集群,注意命令需要修改添加--cri-socket参数

kubeadm join 192.168.1.72:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:cf5f9730daca51a1c7c767f89be1334e280bdbc8c715d50b6ec0c3710558f97a \
        --cri-socket=unix:///var/run/containerd/containerd.sock


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/946.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。