由于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有如下报错,我们需要下载替换下修复这个问题
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创建会报错。
最后等待网络组件安装,完成以后使用相关命令进行检查,正常说明集群搭建完成。
其他节点可以通过之前生成的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