2022年5月3日,kubernetes 1.24版本正式发布,从1.24版本开始 kubernetes正式移除对Dockershim的支持,若需要1.24版本依然支持docker,则需要引入第三方cri-dockerd项目进行支持,本博客主要内容即为使用kubeadm 部署基于docker支持的k8s 1.24版本。文章如有疏漏或者疑惑的地方,可以随时指正或交流

本文大部分内容来源与B站(云原生说)视频讲解 ,本文在原视频的基础上,一步步实际操作,记录安装过程中的遇到的问题与解决方法

全网首发!kubeadm极速部署Kubernetes 1.24版本集群【Kubernetes 1.24部署集群发布及重磅改动】_哔哩哔哩_bilibili

1.24版本之前docker-shim 

 1.24版本docker-shim架构

目录

1、基础环境配置

1.1 关闭 selinux

1.2 关闭防火墙

1.3 配置时间同步状态(联网方式)

1.4 修改主机名

1.5 配置hosts集群信息

1.6 升级内核

1.7 加载br_netfilter模块

 1.8 添加网桥过滤及内核转发配置文件

1.8 安装ipset及ipvsadm

1.9 关闭SWAP分区

1.10 安装docker-ce 

2 cri-dockerd 安装

2.1 golang环境准备

2.2 部署cri-dockerd

3 配置k8s

3.1 配置k8s镜像源

3.2 安装 kubeadm kubelet kubectl 


1、基础环境配置

实际操作环境为3台虚拟机环境,配置为8C(CPU)、16G(内存)、200G(存储),操作系统为Centos7.9,为三台虚拟机分别设置不同的静态IP,hostname等

1.1 关闭 selinux

编辑vim /etc/selinux/config 

1.2 关闭防火墙

systemctl status firewalld

systemctl disable firewalld

  检查防火墙状态

firewall-cmd --state

1.3 配置时间同步状态(联网方式)

使用 crontab -e命令,在新界面按a见进入编辑模式,输入下面定时任务

0 */1 * * * ntpdate time1.aliyun.com

 保存退出,使用 crontab -l 查看定时任务状态

1.4 修改主机名

编辑 vim /etc/hostname

本文三个虚拟机主机hostname设置分别为 

master01

k8s-worker-01.com

k8s-worker-02.com

1.5 配置hosts集群信息

编辑/etc/hosts文件

1.6 升级内核 (该步骤可以省略)

导入elrepo gpg key

rpm -import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

安装 elrepo YUM源仓库

yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本

yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64

设置grub2默认引导为0

grub2-set-default 0

重新生成grub2引导文件

grub2-mkconfig -o /boot/grub2/grub.cfg

更新后,需要重启,使升级的内核生效

reboot

重启后执行 uname -ar 查看kernel 版本

f74d62bb8ccb9f7954037e7e1abc5ae6.png

1.7 加载br_netfilter模块

modprobe br_netfilter

 1.8 添加网桥过滤及内核转发配置文件

cat << EOF > /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

vm.swappiness=0

EOF

执行命令,刷新配置

sysctl -p /etc/sysctl.d/k8s.conf

查看是否加载

lsmod | grep br_netfilter

1.8 安装ipset及ipvsadm

yum install -y ipset ipvsadm

配置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

EOF

授权、运行、检查是否加载

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

1.9 关闭SWAP分区

修改完成后需要重启操作系统,如不重启,可临时关闭,命令为swapoff -a

永久关闭swap分区,需要屏蔽/etc/fstab文件中关于swap那一行,该操作需要重启操作系统,

1.10 安装docker-ce 

配置阿里云镜像站

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

Docker安装

yum install docker-ce -y

启动docker进程

systemctl enable --now docker

修改cgroup管理方式

/etc/docker/daemon.json 默认没有此文件,需要单独创建,里面填充下面的参数

{

"exec-opts":["native.cgroupdriver=systemd"]

}

2 cri-dockerd 安装

2.1 golang环境准备

获取golang安装包,由于接下来的cri-dockerd模块依赖是golang的特定版本,因此这里下载golang1.18,查看项目依赖go版本的方法是查看go.mod文件说明:

下载golang 1.18 版本

wget https://golang.google.cn/dl/go1.18.3.linux-amd64.tar.gz

解压golang至指定目录

tar -C /usr/local/ -zxvf ./go1.18.3.linux-amd64.tar.gz

创建gopath目录

mkdir /home/gopath

添加环境变量,编辑/etc/profile 文件,在文件末尾添加以下配置

export GOROOT=/usr/local/go

export GOPATH=/home/gopath

export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

加载/etc/profile文件

source /etc/profile

配置go proxy代理

go env -w GOPROXY="https://goproxy.io,direct"

验证golang是否安装完成,执行 go version命令

2.2 部署cri-dockerd

下载cri-dockerd源码

git clone https://github.com/Mirantis/cri-dockerd.git

进入cri-dockerd目录

cd cri-dockerd/

看cri-dockerd github项目主页 Build and install部分的介绍,介绍的步骤不一定要全部执行,图片下方为本人亲自测试的简单步骤。

执行 依赖包下载和命令构建

go get && go build

构建完成后生成cri-dockerd命令

接下来执行cri-dockerd命令的安装及环境配置命令

install -o root -g root -m 0755 cri-dockerd /usr/bin/cri-dockerd

cp -a packaging/systemd/* /etc/systemd/system

systemctl daemon-reload

systemctl enable cri-docker.service

systemctl enable --now cri-docker.socket

3 配置k8s

这里使用国内的阿里镜像源,安装部署k8s

3.1 配置k8s镜像源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=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

3.2 安装 kubeadm kubelet kubectl 

默认安装仓库中的最新版

yum install kubeadm kubelet kubectl -y

也可执行 yum list kubeadm kubelet kubectl --showduplicates | sort -r 按照输出的列表项安装特定版本.

拉取k8s指定版本的镜像

kubeadm config images pull --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers

执行主节点初始化任务,需要注意kubernetes-version的值要和上一步拉取的镜像版本号一致,apiserver-advertise-address填写master 节点的IP

kubeadm init --kubernetes-version=v1.24.2 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address={master Node IP} --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers

执行过程中遇到如下问题

查看/var/log/messages 日志信息发现如下问题

该问题可能属于k8s代码问题,解决办法使用国内源下载该版本镜像,然后重新打tag

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6

手动拉取成功后需执行如下命令清除kubeadm 安装历史信息

kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock

重新执行执行初始化命令,即可成功

kubeadm init --kubernetes-version=v1.24.2 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address={master Node IP} --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers

接下来在worker节点上执行相关的操作,worker节点与master节点的操作步骤的唯一区别是:master节点执行kubeadm init操作,woker节点执行kubeadm join操作,因此上面的步骤除了kubeadm init步骤之外,其他所有的步骤woker节点同样也需要执行。

执行kubeadm init 成功之后输出的 最后一行kubeadm join 命令,以下代码块仅供参考。

kubeadm join {master_ip:port} --token r5ztlz.kskrprlewgb3xczn \

--discovery-token-ca-cert-hash sha256:73f9047c5fb922fc26abd56e2c3cecc369d70dd28b44245fb1f9f0718b062bf7 --cri-socket unix:///var/run/cri-dockerd.sock

在worker 节点执行kubeadm join命令时,若同样遇到与kubeadm init 相同的问题时,解决办法一样。

手动下载阿里云pause:3.6容器,然后重新打tag

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6

清理上次执行产生的数据

kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock

重新执行

kubeadm join {master_ip:port} --token r5ztlz.kskrprlewgb3xczn \

--discovery-token-ca-cert-hash sha256:73f9047c5fb922fc26abd56e2c3cecc369d70dd28b44245fb1f9f0718b062bf7 --cri-socket unix:///var/run/cri-dockerd.sock

在woker 节点执行kubectl get nodes查看节点状况,如遇如下问题

原因:kubernetes master没有与本机绑定,集群初始化的时候没有绑定,此时设置在本机的环境变量即可解决问题。

将kubeadm init节点 /etc/kubernetes/ 目录下产生的 admin.conf 文件拷贝至该节点 /etc/kubernetes/目录下

配置环境变量信息

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

重新加载环境变量

source /etc/profile

然后再次执行

kubectl get nodes

Logo

开源、云原生的融合云平台

更多推荐