kubuadm 方式部署 k8s 集群
- 准备三台机器
 
| 主机名 | IP地址 | CPU/内存 | 操作系统版本 | 角色 | K8S版本 | Docker版本 | 
| k8s231 | 192.168.99.231 | 2C4G | Centos 7 | master | 1.23.17 | 20.10.24 | 
| k8s232 | 192.168.99.232 | 2C4G | Centos 7 | woker | 1.23.17 | 20.10.24 | 
| k8s233 | 192.168.99.233 | 2C4G | Centos 7 | woker | 1.23.17 | 20.10.24 | 
- 需要在K8S集群各节点上面安装docker,如未安装则参考 二进制部署 docker_docker 二进制包-CSDN博客
 
yum 方式部署 docker_配置docker的yum源-CSDN博客
- Harbor仓库如果不需要可以不装,如果需要则参考(可选安装)
 
基于 HTTP 协议部署 harbor 仓库-CSDN博客
基于 HTTPS 方式部署 harbor 仓库-CSDN博客
- 由于K8S与docker的爱恨情仇,1.23版本与1.24版本之后发生了巨大变化,就是1.24版本之后就不需要单独安装docker,而是需要安装containerd,但我又习惯使用docker,这次我就部署 1.23.17 版本
 
1. 各节点环境准备
1. 1 关闭 swap 分区
#临时关闭
swapoff -a && sysctl -w vm.swappiness=0
#基于配置文件永久关闭
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab 
1.2 确保各个节点MAC地址或Product_uuid唯一
ifconfig  eth0  | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid  
温馨提示:
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。
Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
1.3 检查网络节点是否互通
检查K8S集群各个节点是否互通,可以使用 ping 命令来测试
1.4 所有节点修改Linux内核参数调优
cat > /etc/sysctl.d/k8s.conf <<'EOF'
#允许 Linux 系统作为路由器转发 IPv4 数据包。当设置为 1 时,表示启用 IP 数据包转发功能。
net.ipv4.ip_forward = 1#启用桥接设备在通过 iptables 进行网络过滤时的调用。
net.bridge.bridge-nf-call-iptables = 1#启用桥接设备在通过 ip6tables 进行 IPv6 网络过滤时的调用。
net.bridge.bridge-nf-call-ip6tables = 1#允许 Linux 在不重新引起操作的情况下卸载正在使用的挂载点。
fs.may_detach_mounts = 1#设置内存过量分配策略。当设置为 1 时,Linux 将允许分配超过物理内存总量的虚拟内存。
vm.overcommit_memory=1#当内存耗尽(OOM,Out-Of-Memory)时,是否触发内核崩溃。设置为 0 表示禁用这个行为。
vm.panic_on_oom=0#设置用户可以监视的文件数量的最大值,对于文件系统监视服务很重要,比如 inotify。
fs.inotify.max_user_watches=89100#设置系统中打开的文件描述符的最大数量。
fs.file-max=52706963#设置系统中打开文件描述符的最大数量,和 fs.file-max 有类似的作用。
fs.nr_open=52706963#设置连接跟踪表的最大条目数量,用于管理网络连接状态。
net.netfilter.nf_conntrack_max=2310720#设置 TCP keepalive 超时时间(单位:秒),用于检测空闲连接是否仍然可用。
net.ipv4.tcp_keepalive_time = 600#在认定连接失效之前,发送多少个 TCP keepalive 探测包。
net.ipv4.tcp_keepalive_probes = 3#两次 TCP keepalive 探测之间的时间间隔(单位:秒)。
net.ipv4.tcp_keepalive_intvl =15#设置 TIME-WAIT 状态的最大连接数。
net.ipv4.tcp_max_tw_buckets = 36000#允许重新使用 TIME-WAIT 状态的 TCP 连接。
net.ipv4.tcp_tw_reuse = 1#允许系统保持的最大无主 TCP 连接数。
net.ipv4.tcp_max_orphans = 327680#设置在关闭套接字时内核应该进行多少次重试。
net.ipv4.tcp_orphan_retries = 3#启用 TCP SYN cookies,用于防范 SYN 攻击。
net.ipv4.tcp_syncookies = 1#设置 TCP SYN 队列的最大长度。
net.ipv4.tcp_max_syn_backlog = 16384#设置 IPv4 连接跟踪表的最大条目数量。
net.ipv4.ip_conntrack_max = 65536#控制着系统允许的未完成的 TCP 握手队列的最大长度
net.ipv4.tcp_max_syn_backlog = 16384#禁用 TCP 时间戳,可能用于防范某些攻击。
net.ipv4.tcp_timestamps = 0#设置系统级别的最大并发连接数,影响 TCP 和 UDP 套接字的 listen 函数的 backlog 参数的默认值。
net.core.somaxconn = 16384
EOF
 
1.5 加载文件
sysctl --system 
1.6 配置主机解析
cat >> /etc/hosts <<EOF
192.168.99.250 linux250
192.168.99.251 linux251
192.168.99.252 linux252
EOF 
1.7 禁用防火墙,网络管理,邮箱
systemctl disable  --now firewalld NetworkManager postfix 
1.8 禁用SELinux
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config 
grep ^SELINUX= /etc/selinux/config 
1.9 修改cgroup的管理进程systemd
阿里云镜像加速
harbor私有仓库解析
修改cgroup的管理进程systemd
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://0pcinxc2.mirror.aliyuncs.com"],
"insecure-registries": ["harbor253.bihuang.com","192.168.99.253"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF#重启docker
systemctl restart docker#查看是否修改
[root@linux250 ~]# docker info | grep "Cgroup"Cgroup Driver: systemdCgroup Version: 1 
温馨提示:
如果不修改cgroup的管理驱动为systemd,则默认值为cgroupfs,在初始化 master 节点时会失败
2. 所有节点安装 kubeadm,kubelet,kubectl
2.1 安装包概述
你需要在每台机器上安装以下的软件包:
kubeadm:
用来初始化集群的指令。
kubelet:
在集群中的每个节点上用来启动Pod和容器等。
kubectl:
用来与集群通信的命令行工具。
kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要确保它们与通过kubeadm安装的控制平面(master)的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。
然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但kubelet的版本不可以超过"API SERVER"的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的"API SERVER",反之则不可以。
2.2 配置软件源
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
repo_gpgcheck=0
EOF 
2.3 查看 kubeadm 的版本
yum -y list kubeadm --showduplicates | sort -r 
2.4 安装 kubeadm,kubelet,kubectl软件包(可联网直接安装)
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0 
如果没有办法联网的话,可以找一台能联网的机器,将 yum 安装保存rpm包功能打开,然后安装好之后,将rpm打包,再发送到各个节点,如下:
2.4.1 打开 yum 保存 rpm 包
[root@k8s233 ~]# cat /etc/yum.conf 
[main]
#rpm包存储目录
cachedir=/var/cache/yum/$basearch/$releasever
#值为1为开启rpm包保存,为0则关闭
keepcache=1
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release 
2.4.2 安装 kubeadm,kubelet,kubectl
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0 
2.4.3 打包保存的rpm包
mkdir kubeadm--kubelet-kubectl/
find /var/cache/yum -name "*.rpm" | xargs mv -t kubeadm--kubelet-kubectl/
tar zcf bihuang-kubeadm--kubelet-kubectl.tar.gz 
2.4.4 发送到其他节点
scp bihuang-kubeadm--kubelet-kubectl.tar.gz root@linux251:~
scp bihuang-kubeadm--kubelet-kubectl.tar.gz root@linux252:~ 
2.4.5 各个节点解压并安装
tar xf bihuang-kubeadm--kubelet-kubectl.tar.gz
yum -y localinstall kubeadm--kubelet-kubectl/*.rpm 
2.5 启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!)
systemctl enable --now kubelet
systemctl status kubelet 
3. 初始化 Master 节点
3.1 使用kubeadm 初始化 master
kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=172.100.0.0/16 --service-cidr=172.200.0.0/16 --service-dns-domain=bihuang.com#相关参数说明
    --kubernetes-version:       指定K8S master组件的版本号。           --image-repository:       指定下载k8s master组件的镜像仓库地址。           --pod-network-cidr:       指定Pod的网段地址。           --service-cidr:       指定SVC的网段    --service-dns-domain:       指定service的域名。若不指定,默认为"cluster.local"。 
3.2 如果集群初始化失败可以重置
kubeadm reset –f 
3.3 拷贝授权文件用于管理 K8S 集群
这个命令看你初始化完成之后反馈的内容如图,不要复制我的
  mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config 

3.4 查看集群节点
kubectl get cs#scheduler 状态OK
#controller-manager 状态 OK
#etcd-0 状态OK#APIserver 状态OK因为kubectl get cs 命令是发送给 API server 的能够查询出来说明API server 正常 

4. 添加worker nodes 节点到集群
master 初始化完成之后会有返回信息,如图:
将这个命令在其他 worker node 节点上执行一下即可

注意:每次部署的时候这个命令都不一样
4.1 查看添加前集群 nodes 节点
kubectl get nodes 

4.2 查看添加后当前集群 nodes 节点
kubectl get nodes 

5. 部署 Flannel 组件
5.1 查看现有的网络插件
一般常用的两种网络插件:
Calico:可实现网络策略,适用于需要网络策略的特殊场景
Flannel:支持更多的网络协议
需要哪个组件直接点击哪个组件即可,这里下载的是 Flannel
安装扩展(Addon) | Kubernetes

5.2 下载 Flannel 资源清单文件

如图:
使用master 节点在初始化的时候,使用的是默认的网段(10.244.0.0/16)则直接执行图中的命令即可。
如果没有使用默认的,而是单独指定了网段则需要将 kube-flannel.yml 下载下来稍作修改。也就是 --pod-network-cidr=172.100.0.0/16 这个参数

5.3 下载 kube-flannel.yaml 文件
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml 
 
5.4 修改 kube-flannel.yaml 文件
1.#查看 当前使用的网段
grep "\"Network\"" kube-flannel.yml2.#将默认网段修改为 master 初始化指定的网段 172.100
[root@k8s231 ~]# sed -ri '/\"Network\"/s#10.244#172.100#' kube-flannel.yml3.#查看是否修改成功
[root@k8s231 ~]# grep "\"Network\"" kube-flannel.yml "Network": "172.100.0.0/16", 
 
5.5 部署 flannel 组件
#在配置文件目录运行
kubectl apply -f kube-flannel.yml
 
5.6 查看 flannel 组件是否正常运行
kubectl get pods -A -o wide | grep flannel 

5.7 查看各节点是否正常
[root@k8s231 ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE    VERSION
k8s231   Ready    control-plane,master   106m   v1.23.17
k8s232   Ready    <none>                 98m    v1.23.17
k8s233   Ready    <none>                 98m    v1.23.17 
都为 Ready 状态则为正常
部署 flannel 之前的状态,都为 NotReady
相关文章:
kubuadm 方式部署 k8s 集群
准备三台机器 主机名IP地址CPU/内存操作系统版本角色K8S版本Docker版本k8s231192.168.99.2312C4GCentos 7master1.23.1720.10.24k8s232192.168.99.2322C4GCentos 7woker1.23.1720.10.24k8s233192.168.99.2332C4GCentos 7woker1.23.1720.10.24 需要在K8S集群各节点上面安装dock…...
Android studio 打包低版本的Android项目报错
一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…...
【教程】lighttpd配置端口反向代理
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 1、修改配置文件: sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy: 3、然后添加端口映射: 4、保存&…...
微服务之服务保护策略【持续更新】
文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离(Hystix隔离),每个被隔离的业务都要创建一个独立的线程池,线程过多会带来额外的CPU…...
微信小程序的开发
前端:微信小程序开发的技术 后端:springboot的框架 一:微信小程序环境的搭建 1. 访问微信开发者官⽅⽹站的⼩程序开发⼯具下载⻚⾯。 2. 根据你的操作系统(Windows、macOS或Linux)选择合适的版本进⾏下载。 3. 下…...
Oracle中CREATE FORCE VIEW的说明和例子
Oracle数据库中的CREATE FORCE VIEW语句用于创建视图,即使在视图所依赖的基表或对象不存在,或者创建视图的用户对这些对象没有足够的权限时,也能强制创建视图。不过,需要明确的是,尽管视图能被强制创建,但在…...
C#反射基本应用
1、反射 反射是.NET Framework的一个特性,它允许在运行时获取类型的信息以及动态创建对象,调用方法,以及访问字段和属性。 2、代码 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy…...
1.英语中的从句学习
名词性从句: 1.最常见的连接词是that在宾语从句中的运用,如:I know that you will come. 句中的that 就是连接词,作用就是连接主句和从句,不充当成分也没有含义,只起风向标的作用,告诉你接下来…...
Perl语言简介
Perl语言,全称为Practical Extraction and Report Language(实用提取与报告语言),是一种高级、通用、解释型的编程语言。它由Larry Wall于1987年首次发布,并迅速因其强大的文本处理能力和高度的灵活性而受到广泛应用。…...
【SpringBoot3】使用Jasypt加密数据库用户名、密码等敏感信息
一、使用步骤介绍 使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以及应用程序启动时自动解密。以下是详细的使用说明&…...
如何确定MySQL中哪些列适合做索引
1、查询频率 频繁出现在WHERE子句、JOIN条件、ORDER BY子句或GROUP BY子句中的列是创建索引的候选列。 2、数据唯一性 具有唯一性约束的列(如主键、唯一索引)是创建索引的理想选择,因为它们可以确保查询的快速返回。 如果列中的值大部分都…...
C# winform中权限页面的设计和开发
在C# WinForm应用中设计和开发权限页面,主要涉及到用户界面的创建、数据模型的构建以及业务逻辑的实现。以下是一个基本的步骤,可用来参考构建一个权限管理页面: 第一步:设计用户界面 创建一个新的WinForm:在Visual S…...
本地Windows电脑 连接 Windows 服务器
Windows电脑 连接 Windows 服务器 方式1:直接搜索 在电脑的搜索栏,输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”,打开 远程桌面连接 方式2:运行框打开服务器连接 同时按:Windows徽标键…...
【分布式计算框架 MapReduce】MapReduce 初级编程
目录 一、MapReduce 示例程序的导入并运行测试 二、准备 4 个小文件(文件大小分别为 1.7M,5.1M,3.4M,6.8M) 1. 第一种情况,默认分片:不修改程序代码,直接使用 WordCount 源程序 2…...
VideoPrism——探索视频分析领域模型的算法与应用
概述 论文地址:https://arxiv.org/pdf/2402.13217.pdf 视频是我们观察世界的生动窗口,记录了从日常瞬间到科学探索的各种体验。在这个数字时代,视频基础模型(ViFM)有可能分析如此海量的信息并提取新的见解。迄今为止,…...
Spring Boot项目的两种发布方式
一、通过jar包发布 1、在pom中添加一个SpringBoot的构建的插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot-maven-plugin</artifactId>…...
Java中的服务注册与发现原理与实现
Java中的服务注册与发现原理与实现 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的服务注册与发现的原理及其实现方式。在现代分布式…...
【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer
【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主…...
Java面试八股文
一、Redis 1. 使用场景 (1)Redis的数据持久化策略有哪些 RDB:全称Redis Database Backup file(Redis数据备份文件),也被叫作Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故…...
周周星分享7.3—基于气象大数据的自动站实况联合预测
赛题 2024中国高校计算机大赛 — 大数据挑战赛 经验分享 大家好,我是扫地僧团队的队长,以前参加这样打榜的比赛比较少,了解的打榜技巧不是太多,所以想从科研的角度给大家一点分享。 这次比赛主要从以下五个步骤进行:…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
