基于Kubeadm实现K8S集群扩缩容指南
一、集群缩容操作流程
1.1 缩容核心步骤
-
驱逐节点上的Pod
执行kubectl drain命令驱逐节点上的Pod,并忽略DaemonSet管理的Pod:kubectl drain <节点名> --ignore-daemonsets # 示例:驱逐worker233节点 kubectl drain worker233 --ignore-daemonsets
-
检查节点状态是否变为
SchedulingDisabled:kubectl get nodes
-
-
下线节点kubelet服务
在待移除节点上停止并禁用kubelet:systemctl disable --now kubelet.service
-
数据清理与重置节点
- 需手动清理残留文件(如CNI配置、iptables规则)。
-
执行
kubeadm reset清除节点上的K8S痕迹:kubeadm reset -f
-
从集群移除节点
在Master节点删除节点信息:kubectl delete node <节点名> # 示例:移除worker233 kubectl delete node worker233
二、集群扩容操作流程
2.1 扩容前提准备
-
新节点环境配置
-
安装Docker/Containerd、kubeadm、kubelet、kubectl。
-
系统优化:禁用Swap、内核参数调优、确保CPU≥2核。
-
2.2 生成加入集群的Token
在Master节点创建永不过期的Token并生成加入命令:
kubeadm token create <自定义Token名> --ttl 0 --print-join-command # 示例:创建Token并输出加入命令kubeadm token create cancan.caofacan66666666 --print-join-command --ttl 0
--print-join-command 打印加入集群的命令
--tty 0 token永不过期
-
Token格式要求:6位小写字母数字 + 16位小写字母数字(如
abcd12.xyz4567890abcdef)。
2.3 新节点加入集群
-
启动kubelet服务
systemctl enable --now kubelet.service
-
执行加入命令
使用Master生成的命令加入集群:
kubeadm join <MasterIP:端口> --token <Token值> --discovery-token-ca-cert-hash <哈希值> # 示例(具体参数以实际输出为准) kubeadm join 10.0.0.231:6443 --token oldboy-cluster-join.abcdef123456 --discovery-token-ca-cert-hash sha256:xxxxxx
-
验证节点状态
在Master节点查看新节点是否就绪:kubectl get nodes
三、关键注意事项
-
缩容注意事项
-
确保所有非DaemonSet Pod已被驱逐,避免业务中断。
-
重置节点后需清理残留数据,防止敏感信息泄露。
-
-
扩容注意事项
-
Token有效期:默认24小时,
--ttl 0设置为永久有效。 -
确保新节点与Master网络互通,防火墙放行6443端口。
-
-
常见问题排查
-
节点无法加入:检查Token有效性、时间同步、网络连通性。
-
节点状态非Ready:等待网络插件(如Calico)自动配置,检查kubelet日志:
journalctl -u kubelet -f
-
四、操作示例全流程
4.1缩容操作实录
# 1. 驱逐节点worker233 kubectl drain worker233 --ignore-daemonsets# 2. 下线kubelet(worker233执行) systemctl disable --now kubelet.service# 3. 重置节点(worker233执行) kubeadm reset -f# 4. 从集群移除节点(Master执行) kubectl delete node worker233
缩容前最后先把要驱逐的节点做好数据备份,这一步还是非常重要的
4.1.1缩容数据清理与重置节点思路
1. 核心步骤说明
在缩容节点时,数据清理与重置节点是确保集群安全性和避免数据泄露的核心环节,需按顺序执行以下操作:
2. 详细操作流程
2.1 数据备份与迁移
关键原则:
若节点运行有状态服务(如数据库、PV持久化存储),需先备份数据并迁移到其他节点。
操作示例:
1.1进入节点查看持久化数据目录(假设数据存储在 /data 目录)
ssh worker233
ls /data# 使用rsync备份到其他节点(如备份到NFS或存储服务器)
rsync -avz /data/ backup-server:/backups/worker233/
1.2驱逐Pod并下线服务
在Master节点驱逐Pod:kubectl drain worker233 --ignore-daemonsets --delete-emptydir-data
--delete-emptydir-data:强制删除使用emptyDir的Pod数据。清理Kubernetes痕迹
在待移除节点执行:# 重置Kubernetes配置
kubeadm reset -f# 手动清理残留文件
rm -rf /etc/cni/net.d # 删除CNI网络配置
iptables -F && iptables -t nat -F # 清空iptables规则
ipvsadm --clear # 清空IPVS表(如集群使用IPVS模式)
rm -rf $HOME/.kube/config # 删除本地kubeconfig文件2.1 格式化磁盘(可选但关键)
适用场景:
若节点挂载了独立的数据磁盘(如云服务器的附加云盘),需单独格式化。操作示例:# 查看磁盘信息(假设附加磁盘为 /dev/sdb)
lsblk# 格式化磁盘(谨慎操作!确认目标磁盘无误!)
umount /dev/sdb # 卸载磁盘
wipefs -a /dev/sdb # 擦除文件系统签名
dd if=/dev/zero of=/dev/sdb bs=1M count=100 # 覆盖磁盘头部数据3.1重装操作系统(高安全场景必选)
适用场景:
金融、政务等高安全等级环境,需彻底消除残留数据。操作建议:使用自动化工具(如PXE、Cobbler)快速重装系统。安装后重新做基础安全加固(如关闭SSH密码登录、更新内核)。4. 操作注意事项
备份验证:备份完成后,在目标服务器验证数据完整性:# 对比备份文件和源文件哈希值
sha256sum /data/important-file
sha256sum /backups/worker233/important-file
磁盘格式化风险:确保仅格式化附加磁盘,避免误操作系统盘导致节点无法启动。云服务器用户可直接在控制台卸载并删除云盘。重装系统后的配置:若计划未来重新加入集群,保留基础依赖(如Docker、kubeadm)的安装脚本。示例脚本(保存为install-k8s-node.sh):#!/bin/bash
apt-get update
apt-get install -y docker.io kubeadm=1.23.17-00 kubelet=1.23.17-00
systemctl enable docker kubelet
4.1.2缩容全流程(附加数据保护)
生产环境完整缩容流程示例
# 1. Master节点:驱逐Pod并标记不可调度
kubectl drain worker233 --ignore-daemonsets --delete-emptydir-data# 2. Worker233节点:下线服务并清理K8S
systemctl disable --now kubelet
kubeadm reset -f
rm -rf /etc/cni/net.d /etc/kubernetes/ $HOME/.kube/# 3. 格式化附加磁盘(假设数据盘为/dev/sdb)
umount /dev/sdb
wipefs -a /dev/sdb
mkfs.ext4 /dev/sdb # 仅测试环境,生产环境建议物理销毁# 4. Master节点:移除节点
kubectl delete node worker233# 5. (可选)重装操作系统后,保留脚本以便未来扩容
scp install-k8s-node.sh worker233:/root/
5. 安全建议
审计日志:记录所有操作日志,便于溯源。自动化工具:使用Ansible或SaltStack批量执行磁盘清理,降低人工误操作风险。物理安全:若为物理服务器,退役后需对硬盘进行消磁或物理销毁。通过以上步骤,可确保节点缩容过程既符合Kubernetes最佳实践,又能满足企业级数据安全要求。
4.4扩容操作实录
# 1. Master生成加入命令 kubeadm token create mytoken-join --ttl 0 --print-join-command # 输出示例:kubeadm join 10.0.0.231:6443 --token mytoken-join.abc123... --discovery-token-ca-cert-hash sha256:xxxx# 2. 新节点执行加入命令 kubeadm join 10.0.0.231:6443 --token mytoken-join.abc123... --discovery-token-ca-cert-hash sha256:xxxx# 3. 验证新节点(Master执行) kubectl get nodes # 应看到新节点状态为Ready
通过以上步骤,可以安全地实现Kubernetes集群的弹性扩缩容。建议在生产环境中结合自动化工具(如Ansible)批量管理节点,可以提升运维效率。
相关文章:
基于Kubeadm实现K8S集群扩缩容指南
一、集群缩容操作流程 1.1 缩容核心步骤 驱逐节点上的Pod 执行kubectl drain命令驱逐节点上的Pod,并忽略DaemonSet管理的Pod: kubectl drain <节点名> --ignore-daemonsets # 示例:驱逐worker233节点 kubectl drain worker233 --ignor…...
模拟-与-现实协同训练:基于视觉机器人操控的简单方法
25年3月来自 UT Austin、Nvidia、UC Berkeley 和纽约大学的论文“Sim-and-Real Co-Training: A Simple Recipe for Vision-Based Robotic Manipulation”。 大型现实世界机器人数据集在训练通才机器人模型方面拥有巨大潜力,但扩展现实世界人类数据收集既耗时又耗资…...
WRS-PHM电机智能安康系统:为浙江某橡胶厂构筑坚实的生产防线
以行业工况为背景 一、顾客工厂的背景 浙江某橡胶厂以电机为中心生产设备必须连续平稳运行。但由于缺乏有效的故障预警体系,电机故障就像潜伏着的“不定时炸弹”,不但不时地造成生产流程的中断,也使对生产进行管理异常艰难,对持续安全生产提…...
将 CrewAI 与 Elasticsearch 结合使用
作者:来自 Elastic Jeffrey Rengifo 学习如何使用 CrewAI 为你的代理团队创建一个 Elasticsearch 代理,并执行市场调研任务。 CrewAI 是一个用于编排代理的框架,它通过角色扮演的方式让多个代理协同完成复杂任务。 如果你想了解更多关于代理…...
wait 和notify ,notifyAll,sleep
wait 使线程进入阻塞状态,释放CPU,以及锁 sleep 使线程进入睡眠状态,sleep方法不会释放CPU资源和锁资源,而是让出CPU的使用权。操作系统会将CPU分配给其他就绪线程,但当前线程依然存在,不会释放其占用的…...
ECMAScript 6 新特性(二)
ECMAScript 6 新特性(二) ECMAScript 6 新特性(一) ECMAScript 6 新特性(二)(本文) ECMAScript 7~10 新特性 1. 生成器 生成器函数是 ES6 提供的一种解决异步编程方案,一…...
SpringBoot接口覆盖上一次调用的实现方案
调用springboot接口时,如何实现覆盖上一次调用 Spring Boot 接口覆盖上一次调用的实现方案 以下是多种实现覆盖上一次接口调用的方案,适用于不同场景。 方案一:同步锁控制(单机环境) 适用场景:单实例…...
Spring 的 IoC 和 DI 详解:从零开始理解与实践
Spring 的 IoC和 DI 详解:从零开始理解与实践 一、IoC(控制反转) 1、什么是 IoC? IoC 是一种设计思想,它的核心是将对象的创建和管理权从开发者手中转移到外部容器(如 Spring 容器)。通过这种…...
Python Cookbook-5.12 检查序列的成员
任务 你需要对一个列表执行很频繁的成员资格检査。而in操作符的 O(n)时间复杂度对性能的影响很大,你也不能将序列转化为一个字典或者集合,因为你还需要保留原序列的元素顺序。 解决方案 假设需要给列表添加一个在该列表中不存在的元素。一个可行的方法…...
签名过期怎么办?
1无论是证书到期还是被封停,只需要找到签名服务商,重新签名就可以了,但签名经常性过期会造成app用户流失,所以我们在选择签名时需要注意,在资金充足的情况下,优先选择独立、稳定签名,接下来我们…...
ZYNQ笔记(四):AXI GPIO
版本:Vivado2020.2(Vitis) 任务:使用 AXI GPIO IP 核实现按键 KEY 控制 LED 亮灭(两个都在PL端) 一、介绍 AXI GPIO (Advanced eXtensible Interface General Purpose Input/Output) 是 Xilinx 提供的一个可…...
实操(环境变量)Linux
环境变量概念 我们用语言写的文件编好后变成了程序,./ 运行的时候他就会变成一个进程被操作系统调度并运行,运行完毕进程相关资源被释放,因为它是一个bash的子进程,所以它退出之后进入僵尸状态,bash回收他的退出结果&…...
【补题】P9423 [蓝桥杯 2023 国 B] 数三角
题意:小明在二维坐标系中放置了 n 个点,他想在其中选出一个包含三个点的子集,这三个点能组成三角形。然而这样的方案太多了,他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形ÿ…...
Word / WPS 页面顶部标题 段前间距 失效 / 不起作用 / 不显示,标题紧贴页眉 问题及解决
问题描述: 在 Word 或者 WPS 里面,如果不是新的一节,而是位于新的一页首行时,不管怎么设置段前间距,始终是失效的,实际段前间距一直是零。 解决方案: 查询了很多方案均无法解决问题ÿ…...
Mysql自动增长数据的操作(修改增长最大值)
在MySQL中,如果你想要修改一个表的自增长(auto-increment)属性的起始值,可以使用ALTER TABLE语句。这对于初始化新环境或修复损坏的自增长计数器特别有用。下面是如何操作的一些步骤: 查看当前自增长值 首先ÿ…...
Linux自行实现的一个Shell(15)
文章目录 前言一、头文件和全局变量头文件全局变量 二、辅助函数获取用户名获取主机名获取当前工作目录获取最后一级目录名生成命令行提示符打印命令行提示符 三、命令处理获取用户输入解析命令行执行外部命令 四、内建命令添加环境变量检查和执行内建命令 五、初始化初始化环境…...
在 Q3D 中提取汇流条电感
汇流条排简介和设计注意事项 汇流条排是用于配电的金属导体,在许多应用中与传统布线相比具有设计优势。在设计母线排时,必须考虑几个重要的因素: 低电感:高频开关内容会导致无功损耗,从而降低效率电容:管…...
MySQL:事务的理解
一、CURD不加控制,会有什么问题 (1)因为,MySQL里面存的是数据,所以很有可能会被多个客户访问,所以mysqld可能一次会接受到多个关于CURD的请求。(2)且mysql内部是采用多线程来完成数…...
[raspberrypi 0w and respeaker 2mic]实时音频波形
0. 环境 ubuntu22主机, 192.168.8.162, raspberry 0w, 192.168.8.220 路由器 1. 树莓派 # rpi - send.py # 或者命令行:arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…...
python 基础:句子缩写
n int(input()) for _ in range(n):words input().split()result ""for word in words:result word[0].upper()print(result)知识点讲解 input()函数 用于从标准输入(通常是键盘)读取用户输入的内容。它返回的是字符串类型。例如在代码中…...
Ruoyi-vue plus 5.2.2 flowble 结束节点异常错误
因业务要求, 我在结束节点的结束事件中,制作了一个归档的事件,来执行一个业务。 始终都会报错, 错误信息 ${archivTemplateListener} did not resolve to an implementation of interface org.flowable.engine.delegate.Execution…...
Sublime Text使用教程(用Sublime Text编写C语言程序)
Sublime Text 是一款当下非常流行的文本编辑器,其功能强大(提供有众多的插件)、界面简洁、还支持跨平台使用(包括 Mac OS X、Linux 和 Windows)。 在程序员眼中,Sublime Text 不仅仅是一个文本编辑器&…...
【1】k8s集群管理系列--包应用管理器之helm
一、helm概述 Helm核心是模板,即模板化K8s YAML文件。 通过模板实现Chart高效复用,当部署多个应用时,可以将差异化的字段进行模板化,在部署时使用-f或 者–set动态覆盖默认值,从而适配多个应用 helm工作流程…...
【书籍】DeepSeek谈《持续交付2.0》
目录 一、深入理解1. 核心理念升级:从"自动化"到"双环模型"2. 数字化转型的五大核心能力3. 关键实践与案例4. 组织与文化变革5. 与其它框架的关系6. 实际应用建议 二、对于开发实习生的帮助1. 立刻提升你的代码交付质量(技术验证环实…...
Mysql表的操作(2)
1.去重 select distinct 列名 from 表名 2.查询时排序 select 列名 from 表名 order by 列名 asc/desc; 不影响数据库里面的数据 错误样例 : 但结果却有点出乎意料了~为什么会失败呢? 其实这是因为书写的形式不对,如果带了引号,…...
智能物联网网关策略部署
实训背景 某智慧工厂需部署物联网网关,实现以下工业级安全管控需求: 设备准入控制:仅允许注册MAC地址的传感器接入(白名单:AA:BB:CC:DD:EE:FF)。协议合规性:禁止非Modbus TCP(端口…...
神经网络语言模型与统计语言模型的比较
神经网络语言模型(Neural Language Models, NLMs)与统计语言模型(Statistical Language Models, SLMs)是自然语言处理(NLP)中两类核心的语言建模方法,其核心差异体现在建模方式、表示能力、数据…...
Java学习总结-线程池
线程池是什么? 线程池就是一个可以复用线程的技术。 假若不用线程池的问题:创建新线程开销很大,不能来一个任务就就创建一个新线程。 如何创建线程池对象? 方法一:使用ExecutorService的实现类ThreadPoolExecutor创…...
Android 中绕过hwbinder 实现跨模块对audio 的HAL调用
需求 Audio 模块中专门为 TV 产品添加了一些代码,需要在 hdmi 的 HAL 代码中进行调用以完成某些功能。 解决方法 首先将 hdmi HAL 要调用的 audio 接口函数所在的 .so 链接到最基本的 lib.primay.amlogic.so 中(其它平台上这个 .so 文件的名字也可能是…...
【DB2】事务日志满/归档占用较大问题处理记录
某DB2环境经常报错The active log is full and is held by...,并且归档磁盘占用较大 事务日志满 事务日志满可以理解为Oracle的redo追尾,即业务写入量大于redo刷盘速度,这时候其他SQL会陷入等待,容易造成性能问题 一般由两方面原…...
