Kubernetes - CentOS7搭建k8s_v1.18集群高可用(kubeadm/二进制包部署方式)实测配置验证手册

embedded/2024/11/14 19:39:01/

Kubernetes - CentOS7搭建k8s集群高可用(kubeadm/二进制包部署方式)实测配置验证手册

在这里插入图片描述

前言概述:

一、Kubernetes—k8s是什么

Kubernetes 这个名字源于希腊语,意为“舵手“或”飞行员"。
Kubernetes,简称K8s,中间有8个字符用8代替缩写。
Google于2014年开源项目,为容器化应用提供集群和管理的开源工具,Kubernetes目标是让部署容器化的应用简单并且高效,提供了应用部署,规划,更新,维护的一种机制。

传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

主要特性:
1、高可用,不宕机,自动灾难恢复
2、灰度更新,不影响业务正常运转
3、一键回滚到历史版本
4、方便的伸缩扩展(应用伸缩,机器加减)、提供负载均衡有一个完善的生态

kubernetes__16">二、kubernetes 功能和架构

2.1 K8s 概述 :
Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。通过Kubernetes 能够进行应用的自动化部署和扩缩容。在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google 生产环境运行工作负载 15年的经验,并吸收了来自于社区的最佳想法和实践。
2.2 K8s 功能:
1)自动装箱 —基于容器对应用运行环境的资源配置要求自动部署应用容器
2)自我修复(自愈能力) —当容器失败时,会对容器进行重启,当所部署的Node 节点有问题时,会对容器进行重新部署和重新调度当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
3)水平扩展 —通过简单的命令、用户 UI界面或基于CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
4)服务发现 —用户不需使用额外的服务发现机制,就能够基于 Kubernetes 自身能力实现服务发现和负载均衡
5)滚动更新 —可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
6)版本回退 —可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
7)密钥和配置管理 —在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署
8)存储编排 —自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
9)批处理 —提供一次性任务,定时任务;满足批量数据处理和分析的场景

kubernetes_kubeadm_30">三、kubernetes 集群搭建(kubeadm/二进制包部署方式)

此次我们以kubeadm部署方式演示验证

3.1 前置知识点
目前生产部署 Kubernetes 集群主要有两种方式:
1) kubeadm Kubeadm是一个K8s部署工具,提供kubeadm
init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
2)二进制包 从Github下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。 Kubeadm
降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署 Kubernetes
集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

3.2 kubeadm 部署方式介绍 kubeadm 是官方社区推出的一个用于快速部署kubernetes
集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
1)创建一个 Master 节点 kubeadm init
2)将 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口>

四、安装要求

在配置Kubernetes集群节点之前,需要满足以下几个条件:
4.1 操作系统:支持Linux操作系统,推荐使用Ubuntu、CentOS等常见发行版;
4.2 主机数量:至少需要3台主机,建议一台用于Master节点,两台用于Worker节点;
4.3 硬件配置:至少2个CPU、2GB内存,硬盘30GB;
4.4 网络通信:集群中所有机器之间网络互通;
4.5 网络通信:可以访问外网,需要拉取镜像(需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点);
4.6 禁止SWAP分区 (kubernetes的想法是将实例紧密包装到尽可能接近100%。 所有的部署应该与CPU /内存限制固定在一起。 所以如果调度程序发送一个pod到一台机器,它不应该使用交换。设计者不想交换,因为它会减慢速度,所以关闭swap主要是为了性能考虑)。

五、最终目标/提纲

5.1 在所有节点上安装 Docker 和 kubeadm
5.2 部署 Kubernetes Master
5.3 部署容器网络插件
5.4 部署 Kubernetes Node,将节点加入 Kubernetes 集群中
5.5 部署 Dashboard Web 页面,可视化查看 Kubernetes 资源

六、学习课程前提

6.1 熟悉 Docker 的基本使用
6.2 熟悉 Linux 操作系统

相关环境:

在这里插入图片描述
在这里插入图片描述

实测步骤:

1、搭建三台虚拟机并安装操作系统CentOS_7.9
2、三台系统进行初始化操作环境
3、在三台节点安装docker kubelet kubeadm kubectl
4、在Master节点安装kubeadm init命令进行初始化
5、在Node节点执行kubeadm join命令将node节点添加到集群
6、在Master节点安装CNI配置插件,如flannel等
kubernetesnginx_77">7、测试kubernetes集群,如nginx

开始搬砖:

一、系统初始化(ALL节点)

# 替换国内源配置
ls /etc/yum.repos.d/
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak  # 备份当前源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 阿里云 CentOS 7源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo # 网易163 CentOS 7源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.myhuaweicloud.com/repo/CentOS-7.repo # 华为云CentOS 7源# 清空缓存
yum clean all
# 生成缓存
yum makecache
# 安装前最好更新一下系统软件
yum -y install vim
yum -y install unzip
yum -y install lrzsz
yum -y update 
# IP配置
ip address
vi /etc/sysconfig/network-scripts/ifcfg-ens192
systemctl restart network# 主机名配置
Hostname
hostnamectl set-hostname k8s-master  # 192.168.10.160
hostnamectl set-hostname k8s-node01  # 192.168.10.161
hostnamectl set-hostname k8s-node02  # 192.168.10.162
# 防火墙配置
systemctl stop firewalld     # 关闭
systemctl disable firewalld  # 禁用
firewall-cmd --reload        # 重启防火墙,生效配置# SELinux安全机制配置
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时关闭
# 关闭SWAP
swapoff -a # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久 (需重启)
# 设置host映射和主机名
vim /etc/hosts或脚本
cat >> /etc/hosts << EOF 
192.168.10.160  k8s-master
192.168.10.161  k8s-node01
192.168.10.162  k8s-node02
EOF

在这里插入图片描述

# 将桥接的 IPv4 流量传递到 iptables 的链(内核参数修改---在所有主机上将桥接的ipv4流量传递到iptables的链将桥接的IPv4流量传递到iptables的链(有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失),配置kubernetes.conf文件(kubernetes.conf文件原来不存在,需要自己创建的)
vim /etc/sysctl.d/k8s.conf
-------------------------------------------
或脚本 
cat > /etc/sysctl.d/k8s.conf << EOF 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1 
EOF
sysctl -p   # 生效

在这里插入图片描述

# 同步NTP时间
yum install -y ntpdate    # 安装NTP
ntpdate time.windows.com  # 同步NTP服务器系统网络时间
# 统一重启
reboot

二、安装Docker/kubeadm/kubelet (ALL节点)

2.1 安装Docker

Dockershim中间件会一直保留到2021年末,直到发布Kubernetes1.23版本为止。2022年k8s的1.24版本正式剔除dockershim,不再支持让docker去调用containerd,而是直接操作containerd,先安装containerd来替换CRI接口调用。
本次验证v1.18.0版本,后续再验证最新v1.28.0版本。 Kubernetes 1.18.0版本默认 CRI(容器运行时)为Docker,因此先安装Docker,可参考之前部署手册

# 安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2# 安装 Docker 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 
# 查看仓库中所有的docker版本
yum list docker-ce --showduplicates | sort -r# 不指定版本号即默认安装
yum install -y docker-ce
# 如果要指定版本号安装
yum install docker-ce-18.06* -y ,此时指定的就是docker-ce-18.06.1的版本
yum install -y docker-ce-18.06.1.ce-3.el7 

在这里插入图片描述

# 启动docker并设置docker开机自启服务
systemctl start docker
systemctl enable docker# 测试验证docker是否安装成功
docker version# 永远的HelloWorld
docker run hello-world

在这里插入图片描述

# 镜像加速配置
1、URL:目前我这边测试环境使用阿里云容器镜像服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
2、注册账户:当然还有腾讯网易等都可以使用不指定,注册一个属于自己的阿里云账户
3、登入获取加速器地址及脚本:登陆阿里云开发者平台--点击控制台---选择容器镜像服务---获取加速器地址---粘贴脚本直接执行
4、重启服务器mkdir -p /etc/docker
vim /etc/docker/daemon.json
或脚本
cat > /etc/docker/daemon.json << EOF 
{ 
"registry-mirrors": ["https://k******f.mirror.aliyuncs.com"] 
} 
EOF

在这里插入图片描述

# 重启服务
systemctl restart docker
# 查看生效信息
docker info
2.2 安装kubeadm、kubelet、kubectl

kubeadm和kubectl都是工具,kubelet才是系统服务
安装包说明:
kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm 用于初始化集群,启动集群的命令工具
kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

# 配置k8s镜像源
# 添加 yum 源 
vim /etc/yum.repos.d/kubernetes.repo
或脚本
cat > /etc/yum.repos.d/kubernetes.repo << EOF 
[kubernetes]
name=Kubernetes Repo
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64   
gpgcheck=0
enabled=1
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpgphttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 
EOF

在这里插入图片描述

# 查询kubeadm可用的版本
yum list kubeadm --showduplicates# 安装kubeadm、kubelet、kubect,# 此次测试验证v1.24之前版本,最新v1.28.2
yum  install -y kubeadm-1.18.0 kubelet-1.18.0 kubectl-1.18.0# 设置kubelet开机自启(先不用启动,会报错,后面kubeadm init初始化master时会自动拉起kubelet)
systemctl enable kubelet

在这里插入图片描述

四、集群初始化Kubernetes Master

在Master节点安装kubeadm init命令进行初始化

4.1 k8s-master节点初始化 (在192.168.10.160 k8s-master节点操作)
# 集群初始化
kubeadm init --apiserver-advertise-address=192.168.10.160 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
或脚本(去掉##注释,脚本 \ 后面不能有空格)
kubeadm init \											        #在master节点执行初始化(node节点不用执行)
--apiserver-advertise-address=192.168.10.160 \			        #指定apiserver的IP,即master节点的IP,指定master的interface
--image-repository registry.aliyuncs.com/google_containers \	#设置镜像仓库为国内的阿里云镜像仓库
--kubernetes-version v1.18.0 \								    #设置k8s的版本,跟步骤三的kubeadm版本一致
--service-cidr=10.96.0.0/12 \									#设置node节点的网络
--pod-network-cidr=10.244.0.0/16							    #指定Pod服务的虚拟IP地址范围,设置node节点的网络
#--------------------------------------#
# 记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中

在这里插入图片描述

输出 Your Kubernetes control-plane has initialized successfully!
表示master节点安装成功。

#如果失败可以重置,注意版本。如安装成功后直接跳到下一步。
kubeadm reset
rm -rf $HOME/.kube/config​
# 根据提示执行,使用 kubectl 工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看集群节点
kubectl get nodes

在这里插入图片描述

五、将Node节点全部加入到集群

在Node节点执行kubeadm join命令将node节点添加到集群
在这里插入图片描述

在k8s-node01/node02节点操作,把node节点加入集群
# 向集群添加新节点,执行在kubeadm init输出的kubeadm join命令
kubeadm join 192.168.10.160:6443 --token ntpc3i.81ga63fqtkprsrx8 \--discovery-token-ca-cert-hash sha256:399fced327c9274c660325648300b822aa3714f42b466f0edbba2cb32b754ae8 

在这里插入图片描述

选择语言默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作命令如下:
kubeadm token create --print-join-command
# 在master节点上,再次查看集群节点,输出如下信息表示node节点加入集群成功
kubectl get nodes

在这里插入图片描述

状态为NotReady未准备就绪是因为需要部署网络插件才能生效。

六、部署Pod(CNI)网络插件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

在这里插入图片描述

# 默认镜像地址无法访问,sed命令修改为dockerhub镜像仓库:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 运行所有插件
kubectl get pods -n kube-system
-----------------------------------------------------------------------
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-7ff77c879f-ctd28             1/1     Running   0          6d17h
coredns-7ff77c879f-xpbd9             1/1     Running   0          6d17h
etcd-k8s-master                      1/1     Running   0          6d17h
kube-apiserver-k8s-master            1/1     Running   0          6d17h
kube-controller-manager-k8s-master   1/1     Running   0          6d17h
kube-proxy-6chlp                     1/1     Running   0          6d17h
kube-proxy-7rfbc                     1/1     Running   0          6d17h
kube-proxy-mzmsg                     1/1     Running   0          6d17h
kube-scheduler-k8s-master            1/1     Running   0          6d17h

在这里插入图片描述

# 启动所有插件后,再观察集群活动状态为Ready,准备就绪了
kubectl get nodes

在这里插入图片描述
在这里插入图片描述

kubernetes_351">七、测试验证kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行

# 拉取nginx镜像
kubectl create deployment nginx --image=nginx
# 开通80端口对外
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看运行状态
kubectl get pod,svc
-----------------------------------------------------------------------
NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-f89759699-zgrqt   1/1     Running   0          2m44sNAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        6d17h
service/nginx        NodePort    10.104.45.57   <none>        80:30400/TCP   9s

在这里插入图片描述

# 测试访问地址:http://NodeIP:Port
http://192.168.10.160:30400/
http://192.168.10.161:30400/
http://192.168.10.162:30400/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上,感谢!


http://www.ppmy.cn/embedded/18829.html

相关文章

UE5、CesiumForUnreal实现建筑白模生成及白模美化功能

1.实现目标 在专栏上篇文章基于GeoJson文件生成城市级白模(本文建筑白模数量12w+)的基础上修改,计算法线和纹理坐标,并基于特定材质进行美化,美化后的白模GIF动图如下所示: 文章目录 1.实现目标2.实现过程2.1 基于Cesium材质美化2.1.1实现原理2.1.2 C++代码2.1.3 蓝图应…

【node:19212】 解决 Node.js 报错 “将文件视为 CommonJS 模块“

【node:19212】 解决 Node.js 报错 “将文件视为 CommonJS 模块” 当在 Node.js 中运行 JavaScript 文件时&#xff0c;可能会遇到类似以下的报错信息&#xff1a; (node:19212) Warning: To load an ES module, set "type": "module" in the package.js…

ArcGIS小技巧—你分得清投影与定义投影吗

Arcmap中关于投影的工具有四个&#xff0c;分别是定义投影、投影、投影栅格、批量投影。这四个工具既有相同之处也有不同之处&#xff0c;下面我将一一介绍。 ①定义投影&#xff1a;Arcmap中关于定义投影工具是这样描述的&#xff1a;“所有地理数据集均具有一个用于显示、测…

k8s部署alertmanager

修改alertmanager-pvc.yaml文件中的信息&#xff0c;然后应用YAML文件 cat > /opt/k8s/alertmanager/alertmanager-pvc.yaml <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata:name: alertmanager-data-pvc spec:accessModes:- ReadWriteManystorageClass…

iOS 使用Hex色值设置颜色(可设置透明度使用4个字节色值赋值)

一、先了解什么是Hex色值 简单来说就是用十六机制来表示三原色&#xff0c;三原色不同强度组合出不同颜色&#xff1b; 详见&#xff1a;Hex色值是什么&#xff08;含透明度&#xff09; 二、代码实现 iOS不如 Kotlin 有API可直接支持HEX赋值&#xff0c;得自己写个扩展方法…

AI时代的新沟通能力:结构化提示词

结构化提示词&#xff08;Structured Prompts&#xff09;是在使用大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;时&#xff0c;用来引导模型生成特定类型输出的输入文本。这些提示词通常包含明确的指令和上下文信息&#xff0c;使得生成的文本更…

新版IDEA频繁卡顿(UI 冻结)解决方案

当开启多项目多环境或复杂项目大项目时&#xff0c;新版IDEA会频繁卡顿冻结UI。 因为IDEA是Java写的&#xff0c;卡顿自然就是因为频繁Full GC导致的。 新版IDEA使用了G1垃圾回收器&#xff0c;当期望STW内一直无法有效回收大对象时&#xff0c;就会触发Full GC&#xff08;G1的…

vscode中jsconfig.json文件首行提示错误

在使用react框架开发前端时&#xff0c;文件jsconfig.json首行提示错误&#xff0c;打开设置&#xff0c;勾选如下图这项