1. 为什么你需要掌握Rancher节点的动态扩缩容如果你正在用Rancher管理Kubernetes集群那你肯定遇到过这样的场景业务高峰期来了应用负载飙升现有的节点资源捉襟见肘用户开始抱怨响应慢或者促销活动结束了流量回归常态一堆闲置的节点空转着烧钱。这时候手动去云平台开机器、装系统、配环境再一个个加入集群不仅慢还容易出错。而Rancher最核心的价值之一就是让这种集群规模的弹性调整变得像点几下鼠标、敲几条命令一样简单。我自己在管理多个生产集群时就深刻体会到“快速扩缩容”不是锦上添花而是生存必备技能。它直接关系到你的成本控制能力和业务响应速度。想象一下你能在几分钟内为集群注入新的计算能力或者在业务低谷时快速回收资源这种灵活性在云原生时代就是核心竞争力。这篇文章我就以一个老运维的身份带你走一遍在Rancher里给集群“加人”和“减员”的完整实战流程。我们不只讲界面上的点击更会深入到每一台待加入的Node节点也就是工作主机上把从系统准备、Docker安装到最终被Rancher纳管的每一步都掰开揉碎讲清楚。即使是刚接触Rancher和Kubernetes的新手跟着做下来也能独立完成节点的动态管理。好了咱们直接开始动手。2. 扩容第一步为新Node节点做好“入职体检”扩容说白了就是给集群增加新的工作节点。但在Rancher的界面上点击“添加节点”之前我们必须先让这台新服务器本身达到“入职标准”。这就像新员工入职前需要准备好电脑和工位一样。这一步主要在待加入的Linux服务器上操作我以最常用的CentOS 7/8或Rocky Linux为例。2.1 主机名与网络给节点一个清晰的“工牌”首先给节点设置一个唯一且有意义的主机名非常重要。在Kubernetes集群里节点名是它的标识符混乱的命名比如localhost.localdomain会让后续的监控、日志排查和故障定位变得异常痛苦。# 使用hostnamectl命令永久修改主机名比如我们想命名为node-worker-01 sudo hostnamectl set-hostname node-worker-01 # 修改后立即生效需要重新登录shell或者执行 bash # 验证主机名是否修改成功 hostname修改主机名后我强烈建议你同时更新/etc/hosts文件确保本机能够通过主机名解析到自己。虽然这不是Kubernetes的强制要求但能避免很多因DNS解析问题导致的诡异故障。# 编辑hosts文件 sudo vi /etc/hosts # 在文件末尾添加一行将本机IP例如192.168.1.100与主机名绑定 192.168.1.100 node-worker-01接下来是防火墙。Kubernetes的各个组件如kubelet、kube-proxy以及Pod之间的网络通信需要特定的端口畅通无阻。对于内部测试或受信任的内网环境最省事的做法是直接关闭防火墙。但在生产环境我建议你改为配置精确的防火墙规则开放必要的端口如6443, 10250, 30000-32767等。为了教程的简洁和通用性这里先演示关闭防火墙的操作# 停止当前运行的防火墙如果使用的是firewalld sudo systemctl stop firewalld # 禁止防火墙开机自启 sudo systemctl disable firewalld # 如果你使用的是iptables服务也需要停止并禁用 sudo systemctl stop iptables sudo systemctl disable iptables注意在公有云环境如AWS、阿里云除了操作系统本身的防火墙还需要在云平台的安全组Security Group中放行Kubernetes所需的端口这一步千万不能遗漏。2.2 安装容器引擎为节点装上“心脏”Node节点是干活的它运行的容器是承载应用的最小单元。因此一个稳定可靠的容器运行时是必须的。Docker虽然不再是Kubernetes唯一的选择但它依然是最成熟、兼容性最好的选择之一Rancher对其的支持也最为完善。安装Docker有很多方法用系统包管理器yum/apt安装很方便但版本可能不是最新的。我更喜欢用Docker官方提供的便捷安装脚本它能自动识别系统并安装合适的稳定版本。# 下载并执行Docker官方安装脚本 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh脚本运行完成后Docker服务会自动启动。但我们还需要做一些优化配置让Docker更好地适配Kubernetes。# 启动Docker服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 创建一个Docker的配置文件调整一些关键参数 sudo tee /etc/docker/daemon.json -EOF { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m }, storage-driver: overlay2, registry-mirrors: [https://your-mirror.mirror.aliyuncs.com] # 建议替换为国内加速器地址 } EOF # 重新加载配置并重启Docker sudo systemctl daemon-reload sudo systemctl restart docker # 验证Docker安装和运行状态 sudo docker run hello-world看到“Hello from Docker!”的输出说明Docker已经安装成功并可以正常运行容器了。这里我解释一下daemon.json里的cgroupdriver设置为systemd的重要性Kubernetes默认使用systemd来管理cgroup如果Docker的驱动不一致会导致kubelet服务启动失败这是新手常踩的一个大坑。3. 在Rancher界面中完成节点扩容现在我们的新服务器已经准备好了有了清晰的主机名网络畅通无阻Docker引擎也健康运行。接下来就是让Rancher这位“集群管理员”认识并接纳这位新成员了。这个过程几乎全部在Rancher友好的Web UI中完成非常直观。3.1 获取节点加入命令登录到你的Rancher Server管理界面。在全局视图下选择你想要扩容的那个目标集群点击进入集群详情页。在左侧菜单栏找到并点击“主机”或“Nodes”选项卡。这里会列出当前集群的所有节点。在页面的右上方你会看到一个醒目的按钮“编辑集群”Edit Cluster。点击它。这会进入集群的配置页面。不要被各种高级选项吓到我们直接将页面滚动到最底部。在这里你会看到一个名为“节点命令”Node Command的区域。Rancher非常贴心地为我们生成了两条现成的命令一条用于添加控制平面/etcd节点角色更重另一条用于添加Worker节点纯计算节点。对于单纯的业务扩容我们几乎总是选择添加Worker节点。这个命令看起来很长类似这样sudo docker run -d --privileged --restartunless-stopped --nethost -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.3.8 --server https://你的Rancher服务器地址 --token 一串很长的令牌 --ca-checksum 校验和 --worker这条命令的本质是在新节点上运行一个Rancher Agent容器。这个容器就像是一个“特派员”它会自动联系Rancher Server完成节点的注册、证书下发以及Kubernetes核心组件如kubelet、kube-proxy的安装和配置。你完全不需要手动去安装复杂的Kubernetes。3.2 执行命令并验证复制那条用于添加Worker节点的完整命令。回到你的新Node节点的终端窗口以root权限或使用sudo粘贴并执行它。执行后你可以通过docker ps命令看到这个rancher-agent容器正在运行。此时切换回Rancher UI的“主机”页面耐心等待几分钟。你会看到一个新的节点条目正在“注册中”Provisioning其状态会经历从“注册”到“活动”Active的转变。提示如果节点长时间处于“注册中”或报错可以先检查新节点与Rancher Server之间的网络是否互通再通过docker logs -f rancher-agent容器ID查看Agent容器的日志通常能快速定位问题比如证书错误、镜像拉取失败等。当节点状态变为绿色的“活动”时恭喜你扩容成功了。这个新节点已经具备了运行Pod的能力。你可以立刻尝试部署一个测试应用或者将现有高负载应用的副本数调高Kubernetes的调度器会自动将新的Pod调度到这个新鲜的节点上运行。4. 安全、彻底地清理与删除节点有扩容就有缩容。当你需要下线一台节点比如机器老旧需要替换、或者云资源需要释放时目标就变成了安全地迁移走其上的所有工作负载并彻底清理节点使其可以从集群中干净地移除。粗暴地直接关机会导致Pod被意外终止可能引发服务中断。4.1 在Kubernetes层面驱逐工作负载首先我们需要告诉Kubernetes“请把这台Node上的所有Pod都优雅地迁移到其他节点上去。”这个操作叫做“驱逐”Cordon Drain。你可以通过Rancher UI操作在“主机”页面找到想要删除的节点点击右侧的菜单通常是三个点选择“停用”Cordon然后再选择“删除”Delete。Rancher会自动为你执行驱逐流程。但我更推荐在安装了kubectl命令行工具的管理机上操作这样更透明也便于处理复杂情况# 1. 首先将节点标记为不可调度Cordon阻止新Pod调度上来 kubectl cordon node-name # 2. 然后驱逐节点上所有的PodDrain。--ignore-daemonsets 会忽略DaemonSet管理的Pod如网络插件--delete-emptydir-data 会删除emptyDir类型的数据。 kubectl drain node-name --ignore-daemonsets --delete-emptydir-data执行drain命令后Kubernetes会尝试将该节点上所有非DaemonSet管理的Pod优雅终止发送SIGTERM信号等待优雅退出并在其他可用节点上重新创建它们。这个过程需要一定时间请耐心等待直到所有Pod都被迁移走。你可以用kubectl get pods -o wide | grep node-name来检查进度。4.2 在操作系统层面清理残留Pod都迁移走后这台节点就已经“停工”了。但它的硬盘上还残留着Docker的容器、镜像、卷以及Rancher Agent和Kubernetes组件留下的各种数据。为了能干净地重装系统或将机器另作他用必须进行深度清理。请务必谨慎这些命令会删除数据且不可逆。确保你已经备份了任何需要的数据并且确认该节点已不再需要。# 1. 停止并删除所有正在运行和已停止的Docker容器 sudo docker rm -f -v $(docker ps -aq) # 2. 删除所有Docker数据卷volume sudo docker volume rm $(docker volume ls -q) # 3. 停止并禁用Docker服务 sudo systemctl stop docker sudo systemctl disable docker # 4. 卸载Docker软件包根据你的安装方式 # 如果是通过脚本安装可能需要手动删除文件 sudo yum remove -y docker-ce docker-ce-cli containerd.io # CentOS/RHEL # 或 sudo apt-get purge -y docker-ce docker-ce-cli containerd.io # Ubuntu/Debian # 5. 最关键的一步删除Rancher Agent和Kubernetes遗留的数据目录 sudo rm -rf /var/lib/rancher sudo rm -rf /etc/kubernetes sudo rm -rf /var/lib/kubelet sudo rm -rf /opt/cni # 6. 可选但建议清理iptables规则和IPVS连接 sudo iptables -F sudo iptables -t nat -F sudo iptables -t mangle -F sudo iptables -X sudo ipvsadm --clear # 7. 重置主机名如果需要恢复初始状态 sudo hostnamectl set-hostname localhost.localdomain执行完这一系列清理命令后这台服务器就几乎恢复到了加入集群之前的状态。此时你可以在Rancher UI的“主机”页面正式点击“删除”这个节点。由于节点上的Agent和数据已被清理删除操作会立刻完成该节点将从集群列表中消失。5. 进阶实战规模化管理的技巧与避坑指南掌握了单节点的增删你已经能应对大部分日常需求。但要管理一个几十上百节点、业务复杂的中大型集群还需要一些更高效、更自动化的方法和避坑经验。5.1 使用配置管理工具实现自动化手动登录每一台新服务器执行脚本在规模面前是不可行的。我现在的做法是将我们前面所有的“入职体检”步骤改主机名、关防火墙、装Docker、调配置编写成一个Ansible Playbook或一个Shell脚本。新机器只要启动并拿到IP通过Ansible一条命令就能完成全部初始化。例如一个简化的Ansible Playbook (bootstrap-node.yaml) 核心部分可能是这样的- hosts: new_nodes become: yes tasks: - name: Set hostname hostname: name: {{ inventory_hostname }} - name: Disable firewalld systemd: name: firewalld state: stopped enabled: no - name: Install Docker via official script shell: | curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh args: creates: /usr/bin/docker # 如果docker已存在则跳过 - name: Configure Docker daemon copy: content: | { exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: {max-size: 100m}, storage-driver: overlay2 } dest: /etc/docker/daemon.json notify: restart docker handlers: - name: restart docker systemd: name: docker state: restarted然后将Rancher UI生成的节点加入命令保存在一个变量或文件中用Ansible的shell模块推送到新节点执行。这样从裸机到加入集群全程自动化。5.2 扩容缩容的监控与决策依据扩容不能凭感觉缩容更不能盲目。你需要建立监控告警体系让数据驱动决策。扩容信号关注集群级别的监控指标如Node的CPU/内存平均使用率持续高于70%-80%或者Pending状态的Pod数量持续增加表示没有足够资源被调度。很多团队会基于这些指标结合HPAHorizontal Pod Autoscaler甚至使用Cluster Autoscaler集群自动伸缩器来实现完全自动化的节点扩容。缩容信号在业务低峰期如深夜观察节点的资源利用率是否长期低于20%。同时在缩容前一定要检查该节点上是否有运行着独占资源或带有特定节点亲和性nodeAffinity的应用盲目驱逐可能会导致这些应用无法在其他节点上运行。5.3 我踩过的那些“坑”与解决方案坑节点状态一直“NotReady”。这可能是最常见的问题。别慌首先登录问题节点运行systemctl status kubelet查看kubelet服务状态。十有八九是证书问题或者cgroup驱动不一致。检查/var/lib/kubelet/kubeconfig文件是否存在且内容正确再核对Docker和kubelet的cgroup driver是否都是systemd。坑Pod无法调度到新节点。检查新节点的标签Labels和污点Taints。Rancher在添加节点时可以指定节点角色和标签。如果你的应用通过nodeSelector或nodeAffinity选择了特定标签的节点而新节点没有对应标签Pod就不会调度过去。同样如果新节点有污点Taint而Pod没有对应的容忍Toleration也无法调度。坑清理节点后Rancher UI显示节点一直“Disconnected”但删不掉。这通常是Rancher Server与节点Agent之间网络长连接断开后Server端还保留着缓存。可以尝试先在UI上尝试删除如果失败可以通过Rancher的集群API直接强制删除或者耐心等待一段时间通常不超过5分钟让Rancher自行清理。坑使用云主机时删除节点后云盘数据残留。在公有云上直接删除虚拟机实例时其挂载的云盘特别是作为Docker数据盘和Kubernetes数据盘可能不会自动删除。缩容前务必在云控制台确认并手动删除这些不再需要的云盘否则会持续产生费用。管理Rancher集群的节点就像带领一个团队既要有标准化的“入职”和“离职”流程也要有基于数据的理性决策和应对异常的经验。把这些流程固化下来变成脚本或自动化流水线你就能从重复劳动中解放出来更专注于架构和应用本身。