搭建K8s集群

news2024/11/13 9:16:21

前言:本次将通过kubeadm部署1个master节点,2个worker节点K8s集群,本次集群使用的容器运行工具为docker(题外话:K8s的容器运行工具也可以用docker、containerd、cio等等,其中containerd是一个轻量级、工业级的容器运行工具,containerd是docker公司捐献给cncf基金会的,所以docker的功能会比containerd的功能多,并且需要值得注意的是K8s在1.24版本后并未抛弃docker,只是在K8s的1.24版本以后移除了docker-shim,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合,为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker ,所以想在K8s的1.24版本及以后的版本中使用docker,需要安装cri-dockerd)

安装K8s集群的准备条件:

1、准备3台主机,虚拟机也行,每台主机的内存都要在2GB以上,cpu都要在2颗以上,否则后续初始化K8s时会不通过,别不信邪,我亲身经历了的,后面搭建集群的人就不要学我了,血的教训(别说我骗你们,有图有真相)

[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[ERROR Mem]: the system RAM (972 MB) is less than the minimum 1700 MB
[ERROR CRI]: container runtime is not running: output: E1019 23:31:30.275460    2642 remote_runtime.go:948] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"

2、各主机间能通过网络互相通信(ping一下就知道通不通了)

3、禁用各主机上的swap设备(下面有教程,自己跟着来就行)

4、各主机时间同步(下面有教程,自己跟着来就行)

1、首先需要准备3台服务器或虚拟机,分别作为master、worker1、worker2节点(若是用虚拟机搭建集群,安装一台,其他两台克隆第一台即可;以下连接为虚拟机安装CentOS7的教程,有需要的同学可以看看)

https://blog.csdn.net/m0_64284147/article/details/126199002

2、禁止每个节点上的swap分区

swapoff -a

然后使用以下命令查看是否禁用成功

free -mh

禁用前:

 禁用后:

3、关闭每个节点上的防火墙

临时关闭:

systemctl stop firewalld

永久关闭:

systemctl disable firewalld

效果图:

5、关闭每个节点上的selinux

 临时关闭:

setenforce 0

永久关闭:

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

5、分别在3个节点上输入以下命令,更改每个节点上的主机名称,方便后续的查看

hostnamectl set-hostname 要改的名字

输入以下命令查看主机名 

hostname

master节点的效果图:

6、在master节点里添加hosts

cat >> /etc/hosts << EOF
主节点ip master
工作节点ip worker1
工作节点ip worker2
EOF

例:(每台机器的Ip不同,截图仅供参考) 

效果图:

7、分别在3个节点上输入以下命令,将桥接的IPV4流量传递到iptables的链(同一节点的不同pod是利用linux bridge在网路的第二层进行通讯,由于没有原路返回造成pod请求services时的session无法收到返回值而连接超时,所以需要进行设置让第二层的bridge在转发时也通过第三层的iptables进行通信。)

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

输入以下命令使设置生效

sysctl --system

master节点的效果图:

8、让3个节点上的时间保持一致

(1)分别在3个节点上输入以下命令安装软件包ntpdate

yum install ntpdate -y

(2)分别在3个节点上输入以下命令同步时间

ntpdate ntp1.aliyun.com

国内常用的NTP服务器 

1、cn.pool.ntp.org  中国开源免费NTP服务器
2、ntp1.aliyun.com 阿里云NTP服务器
3、ntp2.aliyun.com 阿里云NTP服务器
4、time1.aliyun.com 阿里云NTP服务器
5、time2.aliyun.com 阿里云NTP服务器

效果图:

9、由于要让K8s的容器运行工具Docker,所以需要先安装Docker


我的另一篇文章关于Docker的安装教程,有需要的同学可以拿来参考:https://blog.csdn.net/m0_64284147/article/details/126025ru


以上文章的安装教程是根据官方文档来进行的,比较繁琐,又需要安装的与Docker相关的东西,会占用内存,以下提供另一种简单的只安装Docker引擎的安装教程

(1)分别在3个节点上输入以下命令从阿里云上下载Docker的仓库配置文件

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

效果图:

(2)分别在3个节点上输入以下命令命令安装Docker

yum -y install docker-ce-20.10.17

(3)分别在3个节点上输入以下命令启动Docker并设置Docker开机自启动

systemctl enable docker && systemctl start docker

master节点效果图:

(4)分别在3个节点上输入以下命令查看Docker的版本

docker version

master节点效果图: 

10、配置阿里云镜像加速器,加快对Docker镜像的下载速度(因为Docker的镜像仓库在国外,不配置,下载镜像的速度会比较慢甚至被墙了的话Docker镜像就下载不下来了,注意!!!3个节点都要设置)

我的另一篇文章关于配置阿里云镜像加速器的教程,有需要的同学可以拿来参考:https://blog.csdn.net/m0_64284147/article/details/126807095

11、K8s在1.24版本后并未抛弃docker,而是K8s的1.24版本以后移除了docker-shim,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合,为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker ,所以想在K8s的1.24版本及以后的版本中使用docker,需要安装cri-dockerd,然后K8s集群通过cri-dockerd联系到docker(注意每个节点都要安装)

项目地址:https://github.com/Mirantis/cri-dockerd

 (1)查看主机的系统内核版本

uname -r

master节点效果图: 

 

(2)根据主机的系统内核版本来选择相应的包


rpm二进制包:已经使用GCC编译后的(二进制已经可以被操作系统直接执行了)

tar源码包:需要编译(源码包就是你能看懂的,基于字符的,还需要进行编译)


(3)根据自己主机的系统内核版本下载相应的包

例:

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6-3.el7.x86_64.rpm

master节点效果图: 

(4)安装cri-dockerd

例:

yum install -y cri-dockerd-0.2.6-3.el7.x86_64.rpm

效果图:

(5)查看cri-dockerd.sock

cd /var/run/

12、分别在3个节点上添加阿里云的yum软件源

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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

master节点效果图:

12、分别在3个节点上安装kubeadm、kubelet和kubectl(不选择版本会默认安装最新,我安装时kubeadm的最新版本为1.25.4)

yum install -y --nogpgcheck kubelet kubeadm kubectl

master节点效果图(仅供参考,反正安装过程中没报错就是安装成功了):

13、查看安装的kubeadm的版本

kubeadm version

效果图: 

kubeadm config images list

效果图:

14、分别在3个节点上设置开机自启动

systemctl enable kubelet

master节点效果图:


另:附上取消开机自启动的命令

systemctl disable kubelet

15、整合kubelet和cri-dockerd


需要注意的是,15及以下16步整合kubelet和cri-dockerd的操作也可以不用做,而是直接在后面的各种kubeadm命令后面加上“--cri-socket unix:///run/cri-dockerd.sock”选项。 (而且我也做了配置,不知道是不是我个人没配对的原因,最后还是没效果需要在后面的各种kubeadm命令后面加上“--cri-socket unix:///run/cri-dockerd.sock”选项)


(1)编辑cri-docker.service文件

vim /usr/lib/systemd/system/cri-docker.service

(2)把ExecStart的属性值变成以下内容

#各配置参数的解释
--network-plugin:指定网络插件规范的类型,这里要使用CNI;
--cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;
--cni-cache-dir:CNI插件使用的缓存目录;
--cni-conf-dir:CNI插件加载配置文件的目录;

ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d

效果图:

(3)重载并重启cri-docker.service服务

systemctl daemon-reload && systemctl restart cri-docker.service

16、配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“

(1)编辑文件/etc/sysconfig/kubelet(若没有则新建)

vim /etc/sysconfig/kubelet

(2)为KUBELET_EXTRA_ARGS添加以下指定参数

KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"

17、在master节点输入以下命令,对master节点做初始化(这个理论上配置完15、16步就不用在命令后面加--cri-socket unix:///var/run/cri-dockerd.sock这一选项,但我也尝试了,会报缺失--cri-socket unix:///var/run/cri-dockerd.sock这一选项的错误)

#参数解释
–apiserver-advertise-address:用于指定
–image-repository: 指定镜像仓库地址
kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围

kubeadm init --apiserver-advertise-address=192.168.194.128 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.25.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.224.0.0/16

实际上还是需要加上“--cri-socket unix:///var/run/cri-dockerd.sock”这一选项才能进行kubelet和cri-dockerd的整合,下面这句初始化命令给各位同学参考:

#参数解释
–apiserver-advertise-address:用于指定
–image-repository: 指定镜像仓库地址
kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围
--cri-socket就是整合cri-docker

kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --cri-socket unix:///var/run/cri-dockerd.sock

注意:卡在这里不要慌,只是主机在下载镜像,有点慢而已

master节点初始化成功的效果图(只要出现我截图里圈起来的提醒语句就是成功了): 

然后往下看初始K8s时输出的日志,能看到初始化K8s后日志里给出了后续K8s的安装步骤,我们接下来按照日志里的提示来继续安装即可。

18、根据日志的提示创建文件夹

创建文件夹的目的是把客户端所使用的配置文件放进这个文件夹

mkdir -p $HOME/.kube

19、根据日志的提示把配置文件复制进刚刚新创建的文件夹里

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

20、根据日志的提示输入以下命令

chown $(id -u):$(id -g) $HOME/.kube/config

21、根据提示把worker节点加进master节点,复制你们各自在日志里的提示,然后分别粘贴在2个worker节点上,最后回车即可(注意要在后面加上--cri-socket unix:///var/run/cri-dockerd.sock这一参数,不然可能会失败)

kubeadm join 192.168.194.128:6443 --token 8fcaro.ekkbz9l62zemm1js --discovery-token-ca-cert-hash sha256:81244cd26a3e7cf6dd49a74d9f1a765321a7951a548ecdeab2b30972ce75c92e --cri-socket unix:///var/run/cri-dockerd.sock

效果图:

worker1节点效果图: 

 worker2节点效果图:

22、查看K8s集群node节点的状态

kubectl get nodes

效果图: 


若报“The connection to the server localhost:8080 was refused - did you specify the right host or port?”的错误,可以参考我的另一篇文章来解决

https://blog.csdn.net/m0_64284147/article/details/128072008


23、使用calico给K8s集群做网络支撑

calico是一种自定义的软件,并不是K8s集群的标准的资源对象

(1)命令下载calico

wget https://docs.projectcalico.org/manifests/tigera-operator.yaml

 效果图:

(2)安装calico的operator

kubectl create -f tigera-operator.yaml

效果图:

(3)下载自定义配置文件

wget https://docs.projectcalico.org/manifests/custom-resources.yaml

效果图:

(4)打开刚刚下载完的custom-resources.yaml文件

vim custom-resources.yaml

效果图: 

(5)修改custom-resources.yaml文件里cidr的值,然后保存并退出


 注意!!!注意!!!注意!!!

这里cidr修改成17步初始化K8s时填的cidr,即10.224.0.0,我17步填的是10.224.0.0(如下命令所示),需要各位同学根据自己在17步填的cidr再在这里填一次,否则会出问题,后续会进行不下去

#参数解释
–apiserver-advertise-address:用于指定
–image-repository: 指定镜像仓库地址
kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围
--cri-socket就是整合cri-docker

kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --cri-socket unix:///var/run/cri-dockerd.sock

效果图: 

(6)应用custom-resources.yaml配置文件

kubectl apply -f custom-resources.yaml

效果图:

(7)实时查看网络插件部署情况

watch kubectl get pods -n calico-system

效果图:

24、当calico网络插件下载完毕后重新查看K8s集群节点的状态,此时显示3个节点的STATUS都是Ready,至此K8s集群搭建成功。

kubectl get nodes

 效果图:

其他:

1、报错信息

Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v=5 or higher

 2、原因:

没有整合kubelet和cri-dockerd

3、解决办法,在命令后面加上以下选项

--cri-socket unix:///var/run/cri-dockerd.sock
[root@worker2 ~]# kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
[init] Using Kubernetes version: v1.25.4
[preflight] Running pre-flight checks
	[WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
	[WARNING Hostname]: hostname "worker2" could not be reached
	[WARNING Hostname]: hostname "worker2": lookup worker2 on 8.8.8.8:53: no such host
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

2、卸载K8s的命令(同样需要在命令后面加上--cri-socket unix:///var/run/cri-dockerd.sock选项)

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

效果图:

创作不易,如果这篇文章对你有帮助,希望能点个赞帮助文章的推广,如果文章有错漏,希望各位能批评指正,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

aws eks 使用paker构建自定义ami

资料 如何创建用于 Amazon EKS 的自定义 Amazon Linux AMI&#xff1f; 构建预置容器镜像的EKS自定义AMI解决方案 https://github.com/awslabs/amazon-eks-ami https://github.com/awslabs/amazon-eks-ami/blob/master/doc/USER_GUIDE.md https://developer.hashicorp.com/…

[Cortex-M3]-3-分散加载文件解析(.sct)

目录 1 分散加载文件.sct 2 如何生成.sct文件 3 *(InRoot$$Sections) 说明 4 如何修改分散加载文件 5 已经初始化变量的初值&#xff0c;存储位置 6 RW ZI和RO如何执行 1 分散加载文件.sct MDK的分散加载主要是通过.sct文件实现的&#xff0c;链接器根据.sct…

黄菊华老师,Python毕业设计毕设辅导教程(2):Python开发准备,Window 平台安装 Python

Python3 开发准备 Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手机Windows CEAcorn/RISC OSBeOSAmigaVMS/…

网络安全专业学习路线

​最专业、全面的网络安全学习路线来咯~&#xff08;虽然是网络安全学习路线&#xff0c;但重心还是在Web安全上&#xff09; 展示学习路线之前&#xff0c;建议大家先了解一下这几个问题&#xff0c;既是认清形势&#xff0c;也是认清自我&#xff1a; 为什么要学网络安全&a…

二 TypeScript 基础(初识和语法)

变量 什么是变量 变量是存储信息的容器,其中的值(内容)是可变的。 变量的声明 我们使用var关键字来声明变量&#xff0c;新的关键字let来声明带有(块级作用域)属性的变量。 var a 或者 let a 使用 来赋值 var a 1; //如果只声明变量,井没有赋值的话,该变量的值为 undef…

初识TypeScript编译器(tsc)

须知少时凌云志&#xff0c; 曾许人间第一流。 哪晓岁月蹉跎过&#xff0c; 依旧名利俩无收。 文章目录1. 安装 TypeScript2. 熟悉tsc的编译选项3. 编译.ts文件4. TS报错后那JS呢4.1 通过noEmitOnError禁止在出错的情况下编译出JS目标文件5. 查看编译生成的JS文件5.1 通过targe…

数据库分库分表方案

一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用数据库连接少甚至无连接可用。接下来就可以想象了吧&#xff08;并发…

文华财经期货量化短线策略支撑压力指标公式,短线行情无未来函数多空均线红涨绿跌信号

很多人从行情历史走势图发现&#xff0c;金叉行情上涨&#xff0c;死叉行情下跌的规律&#xff0c;告诉大家那些完美冬形只是过去式而已&#xff0c;行情震荡时&#xff0c;指标失灵可以把你震荡到爆仓。我们也会经常发现不好的指标在很多情况下会相互矛盾&#xff0c;这个指标…

[程序人生] [世界杯] 程序员世界杯的熬夜调节套餐 - 茶叶篇

&#x1f341;简介 最近看世界杯熬夜,搞点小酒(百威/威士忌/各种洋酒) 配花生米,再搞点串 简直人生不要太爽, 但是&#xff01;&#xff01;&#xff01; 问题来了&#xff0c;几天下来 喉咙不适,肺部不适觉得痰多, 查了一下是酒辛辣食品太多了&#xff01;早上萎靡不振咖啡提神…

车载诊断新驱动——远程诊断

文章目录 前言一、远程诊断作用二、解决方案三、现状和趋势总结前言 今天是2022年12月5日&#xff0c;终于迎来了疫情尾声的消息。 分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工科男&#xff1a; 与其热闹着引人注目&#xff0c;步步紧逼&#xff0c;不如趋向…

基于springboot的作业管理系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

软件测试基础篇(3)

测试用例:围绕着软件需求文档来进行设计测试用例 测试用例:本质上是一种集合&#xff0c;是为了实施测试而向被测试系统发出的一组集合&#xff0c;实施测试集合&#xff0c;这个集合的操作者设计者就是测试人员&#xff0c;这组集合的内容包括:测试环境&#xff0c;操作步骤&a…

【JavaScript】用echarts绘制饼图

&#x1f64b;‍ 哈喽大家好&#xff0c;本次是JavaScript专栏echarts板块第一期 ⭐本期内容&#xff1a;用echarts绘制饼图 &#x1f3c6;系列专栏&#xff1a;JavaScript &#x1f44d;一起学习&#xff0c;一起加油&#xff01; 文章目录前言效果图思路准备一个dom基于准备好…

网络安全对避免勒索软件侵害的5个原因

近几年来&#xff0c;勒索病毒已成为全球最热门的关键字之一&#xff0c;已造成了及其严重的经济损失。许多企业意识到这种情况&#xff0c;并试图集中精力保护自己免受这类威胁。在这里本人结合案例分享出5个原因&#xff0c;以让更多企业避免勒索软件的侵害。 原因1.勒索软…

【C++】模拟实现STL容器:list

目录 一、list的介绍 二、list的排序 三、迭代器 1、list的迭代器失效问题 2、迭代器的功能分类 3、list迭代器的模拟实现 3.1普通迭代器 3.2const迭代器 4、迭代器价值 5、迭代器operator->的重载 四、模拟实现时遇到的困惑及注意点 1、调用拷贝构造时&#xf…

Spring Cloud Gateway核心过滤器之请求限流详解

环境&#xff1a;SpringBoot2.4.13 Spring Cloud Gateway3.0.1 概述 RequestRateLimiter GatewayFilter工厂使用一个RateLimiter实现来确定当前请求是否允许继续。如果不是&#xff0c;返回HTTP 429 - Too Many Requests(默认情况下)的状态。 该过滤器接受一个可选的keyReso…

基于51单片机的贪吃蛇游戏设计

1绪 论 1.1本课题研究的背景及意义 随着当今社会的发展&#xff0c;人们的生活节奏变得越来越快&#xff0c;人们开始逐渐的融入全球化的世界。人们已经不再局限于一小块天地&#xff0c;加班&#xff0c;出差已经占据了现代人生活的绝大部分。这个时候&#xff0c;一款简单易携…

ChatGPT 体验和思考

一、体验 1、辅助写代码 2、检查代码&#xff08;遗憾的是&#xff0c;不一定是对的&#xff09; 3、分析代码 4、帮你了解/入门一项陌生的技术 小结&#xff1a; AI 会慢慢成为程序员的得力帮手&#xff0c;但目前来看&#xff0c;似乎还是不够成熟。 当然&#xff0c;大多…

《软件工程》2013年期末试卷

北京信息科技大学《软件工程》2013年期末试卷

青岛山水新城二期景观设计 全套设计

目录 1前言 2 1.1 青岛市地理位置与自然概况 2 1.2 山水新城小区概况 3 1.3设计的目的和意义 4 1.4小区园林景观设计现状和发展趋势 5 2本论 6 2.1设计依据 6 2.1.1 平面规划图 6 2.1.2 国家及地方有关规定及标准 6 2.2 设计指导思想 6 2.2.1 “以人为本”的设计理念 6 2.2.2 “…