K8s批量节点Swap分区关闭脚本实操
技术栈:Kubernetes v1.32.13 + Rocky Linux 8.6 + Shell/Python/Ansible + K8s Python Client v29.x
操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案
K8s批量节点Swap分区关闭脚本实操
操作环境
K8s 集群版本 v1.32.13,多节点部署,已配置 kubeconfig
管理节点 Rocky Linux 8.6,Python 3.12,Ansible 2.16,kubectl v1.32.13
节点间已配置 SSH 免密登录,统一用户 ops
已安装 kubernetes Python 客户端库 v29.x
备份存储目录 /backup,脚本目录 /opt/k8s-ops
对接原理
K8s 运维自动化通过 Shell 脚本、Python 脚本和 Ansible Playbook 实现批量节点管理、集群初始化、备份恢复、巡检监控、故障排查等重复性工作。Shell 脚本适合系统级操作和命令编排;Python 通过官方客户端库(kubernetes)调用 K8s API,实现资源的增删改查和事件监听;Ansible 通过 Inventory 管理节点清单,使用 Playbook 和 Role 实现声明式批量配置,支持幂等操作、变量模板、条件判断和错误处理。三者结合可覆盖从系统初始化到集群运维的全流程自动化。
详细步骤
1. 批量节点 SSH 免密和基础配置
cat > /opt/k8s-ops/batch-node-init.sh << 'EOF' #!/bin/bash set -euo pipefail source /opt/k8s-ops/common.sh NODES=("192.168.1.101" "192.168.1.102" "192.168.1.103") USER="root" # 生成 SSH 密钥 [ -f ~/.ssh/id_rsa ] || ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa # 分发公钥 for node in "${NODES[@]}"; do log_info "配置 $node SSH 免密" ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no ${USER}@${node} done # 批量执行命令 for node in "${NODES[@]}"; do log_info "配置 $node 主机名" ssh ${USER}@${node} "hostnamectl set-hostname k8s-node-${node##*.}" log_info "配置 $node 时间同步" ssh ${USER}@${node} "timedatectl set-timezone Asia/Shanghai && systemctl enable --now chronyd" done log_info "批量配置完成" EOF chmod +x /opt/k8s-ops/batch-node-init.sh bash /opt/k8s-ops/batch-node-init.sh验证流程
# 1. 验证脚本语法 bash -n /opt/k8s-ops/script.sh # 无输出表示语法正确 # 2. 验证脚本执行权限 ls -la /opt/k8s-ops/script.sh # 应有 x 执行权限 # 3. 验证 Shell 脚本执行 bash /opt/k8s-ops/script.sh # 脚本正常执行,输出预期结果 # 4. 验证 Python 脚本 python3 -m py_compile /opt/k8s-ops/script.py python3 /opt/k8s-ops/script.py # 无语法错误,正常输出 # 5. 验证 Ansible Playbook ansible-playbook -i hosts.ini playbook.yml --syntax-check ansible-playbook -i hosts.ini playbook.yml --check # 语法检查通过,dry-run 无错误 # 6. 验证定时任务 crontab -l # 定时任务已配置,执行时间正确 # 7. 验证备份文件 ls -lh /backup/etcd/ # 备份文件存在,大小正常
排错方案
Shell 脚本报错:使用 bash -x script.sh 调试,检查 set -e 导致的提前退出,确认变量是否正确赋值(set -u 会检测未定义变量)
SSH 批量执行失败:检查 SSH 免密是否配置,节点网络是否可达,目标主机 SSH 端口是否开放,使用 ssh -v 调试连接
Ansible Playbook 失败:使用 -vvv 查看详细输出,确认 Inventory 主机配置,检查模块参数,使用 --check 预演,查看目标主机 /var/log/messages
Python 客户端报错:检查 kubeconfig 路径和权限,确认 API 版本兼容,查看异常堆栈信息,使用 try/except 捕获并处理
etcd 备份失败:检查 etcdctl 版本和 API 版本(ETCDCTL_API=3),证书路径是否正确,etcd 2379 端口是否监听,磁盘空间是否充足
定时任务不执行:检查 crond 服务是否运行,脚本路径是否正确(使用绝对路径),脚本是否有执行权限,查看 /var/log/cron 日志
磁盘清理脚本无效:确认 crictl 命令可用,检查容器运行时类型(containerd/docker),日志目录路径是否正确,使用 find -delete 前先 -print 确认
集群巡检脚本输出异常:确认 kubectl 配置正确,Metrics Server 是否运行(kubectl top 依赖),节点名称解析是否正常,检查各命令返回值