利用 KubeKey 实现 Kubernetes 集群节点的动态扩展与收缩

张开发
2026/6/5 20:41:00 15 分钟阅读
利用 KubeKey 实现 Kubernetes 集群节点的动态扩展与收缩
1. 为什么需要动态调整Kubernetes集群节点当你的业务流量像过山车一样忽高忽低时固定数量的集群节点就像穿着不合脚的鞋子——高峰期挤得难受低谷期又浪费资源。我去年负责的一个电商项目就遇到过这种情况大促期间CPU使用率直接飙到90%而平时连30%都不到。这时候KubeKey就像个智能伸缩鞋带能帮我们随时调整集群的尺码。传统手动调整节点的方式有多麻烦首先得准备新服务器然后像拼乐高一样一步步安装组件、修改配置整个过程至少耗费半天。而用KubeKey只需要两条命令我在测试环境实测从添加节点到Pod正常调度最快7分钟就能完成。这个工具最厉害的地方在于它把Kubernetes集群当成乐高积木增删节点就像搭积木一样简单。2. 准备工作搭建可扩展的集群地基2.1 环境配置标准化在给集群装伸缩弹簧之前得先打好地基。所有节点都需要统一配置就像盖楼前要确保每块砖尺寸相同。这是我踩过坑后总结的必备检查清单# 所有节点都需要执行的初始化操作 yum install -y curl wget openssl socat conntrack sudo swapoff -a sudo sed -i /swap/d /etc/fstab cat EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables 1 net.ipv4.ip_forward 1 EOF sudo sysctl --system特别注意如果节点有GPU等特殊硬件记得提前安装驱动。有次我忘记装NVIDIA驱动结果GPU节点加进来完全没用上被运维同事吐槽了一周。2.2 集群配置文件详解KubeKey的魔法都藏在配置文件里这个文件就像集群的DNA图谱。我建议先用现有集群生成模板./kk create config --from-cluster -f config-sample.yaml打开生成的yaml文件你会看到类似这样的结构apiVersion: kubekey.kubesphere.io/v1alpha2 kind: Cluster metadata: name: sample spec: hosts: - {name: node1, address: 192.168.1.101, user: root, password: 123456} roleGroups: etcd: [node1] control-plane: [node1] worker: [node1]关键技巧把密码字段替换为SSH密钥更安全。我在生产环境吃过亏某次日志泄露导致密码暴露连夜重装所有节点。3. 动态扩展给集群注入新鲜血液3.1 添加工作节点实战当监控告警显示CPU持续高于80%就该召唤新节点了。假设我们要添加node2和node3hosts: - {name: node2, address: 192.168.1.102, user: root, privateKeyPath: ~/.ssh/id_rsa} - {name: node3, address: 192.168.1.103, user: root, privateKeyPath: ~/.ssh/id_rsa} roleGroups: worker: [node1, node2, node3]执行扩容命令时建议加上--debug参数这样能实时看到安装进度./kk add nodes -f config-sample.yaml --debug避坑指南有次我批量添加10个节点结果网络带宽被占满导致超时。后来学会用--batch参数控制并发数像这样./kk add nodes -f config-sample.yaml --batch 23.2 节点就绪检查扩容完成后别急着庆祝先运行这些检查命令# 查看节点状态 kubectl get nodes -o wide # 检查调度情况 kubectl describe node node2 | grep -A 10 Allocatable # 验证网络插件 kubectl -n kube-system get pod -l appcalico-node有个经典问题新节点状态显示NotReady。90%的情况是网络插件没装好试试重新打标签kubectl label node node2 node-role.kubernetes.io/workerworker4. 智能收缩优雅地告别闲置节点4.1 安全驱逐节点流程删除节点比安装更需要小心就像拆弹要先剪对电线。完整流程应该是先标记节点不可调度kubectl cordon node3驱逐所有Pod注意有DisruptionBudget的Podkubectl drain node3 --ignore-daemonsets --delete-emptydir-data最后执行删除./kk delete node node3 -f config-sample.yaml血泪教训曾经有次直接删除节点导致运行中的MySQL实例猝死。现在我的检查清单里一定会先确认kubectl get pod --all-namespaces -o wide | grep node34.2 特殊节点处理技巧如果删除的是master节点需要额外三步从kube-apiserver证书SAN列表移除IP更新其他节点的/etc/hosts文件修改controlPlaneEndpoint配置etcd节点更要小心必须确保集群剩余节点数是奇数。我通常用这个命令检查etcd健康状态kubectl -n kube-system exec etcd-node1 -- etcdctl endpoint health5. 实战场景弹性应对流量洪峰去年双十一我们用这套方案实现了自动扩缩容。具体实现是这样的部署Prometheus监控集群指标设置HPA自动扩缩工作负载用这个脚本根据节点负载自动触发KK命令#!/bin/bash LOAD$(kubectl get nodes -o json | jq .items[].status.conditions[] | select(.typeReady)) if [ $LOAD -gt 80 ]; then ./kk add nodes -f config-sample.yaml elif [ $LOAD -lt 30 ]; then kubectl get nodes | awk /worker/ {print $1} | tail -n 1 | xargs ./kk delete node -f config-sample.yaml fi效果对比传统固定集群在大促期间需要提前两周准备资源现在只需要在监控看板上设置好阈值系统就会像智能空调一样自动调节节点数量。6. 常见故障排查手册遇到问题别慌这是我整理的急救包节点添加失败检查/var/log/messages中的错误信息确认SSH连接通畅ssh -i key.pem rootnodeIP hostname查看kubelet日志journalctl -u kubelet -fPod无法调度到新节点检查节点标签kubectl describe node node2验证网络插件ping podIP从其他节点查看资源配额kubectl describe node node2 | grep -A 10 Allocatable有次遇到特别诡异的情况新节点始终无法加入集群。最后发现是时间不同步现在我的部署脚本开头都会加timedatectl set-ntp true7. 性能优化与进阶技巧想让集群伸缩更丝滑试试这些配置预装镜像加速registry: registryMirrors: - https://registry.cn-hangzhou.aliyuncs.com自定义kubelet参数kubernetes: kubeletConfiguration: maxPods: 150 kubeReserved: cpu: 500m memory: 1Gi混合架构支持hosts: - {name: arm-node, arch: arm64, address: 192.168.1.104}对于生产环境我强烈建议开启证书自动续期kubernetes: autoRenewCerts: true记得有次证书过期导致集群瘫痪凌晨三点被叫起来处理。现在所有集群都配了这个选项。

更多文章