K8s集群证书有效期巡检脚本实操
技术栈:Kubernetes v1.32.13 + Rocky Linux 8.6 + Shell/Python/Ansible + K8s Python Client v29.x
操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案
K8s集群证书有效期巡检脚本实操
操作环境
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. K8s 集群巡检脚本
cat > /opt/k8s-ops/cluster-inspect.sh << 'EOF' #!/bin/bash set -euo pipefail source /opt/k8s-ops/common.sh REPORT="/backup/inspect-report-$(date +%Y%m%d).txt" exec > >(tee -a ${REPORT}) 2>&1 log_info "========== K8s 集群巡检报告 ==========" log_info "巡检时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "" # 节点状态 log_info "【1. 节点状态】" kubectl get nodes -o wide NOT_READY=$(kubectl get nodes --no-headers | awk '$2!="Ready"' | wc -l) [ ${NOT_READY} -eq 0 ] && log_info "所有节点 Ready" || log_warn "有 ${NOT_READY} 个节点非 Ready" echo "" # 系统组件 log_info "【2. 系统组件 Pod】" kubectl get pods -n kube-system -o wide echo "" # 异常 Pod log_info "【3. 异常 Pod(非 Running)】" kubectl get pods -A --no-headers | awk '$4!="Running"' | head -20 echo "" # 资源使用 log_info "【4. 节点资源使用】" kubectl top nodes echo "" # 证书有效期 log_info "【5. 证书有效期】" kubeadm certs check-expiration 2>/dev/null || echo "非 Master 节点跳过" echo "" # 磁盘空间 log_info "【6. 节点磁盘空间】" for node in $(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'); do echo "--- ${node} ---" kubectl node-shell ${node} -- df -h 2>/dev/null | grep -E 'Filesystem|/var|/data' || echo "无法连接" done echo "" log_info "========== 巡检完成 ==========" log_info "报告已保存: ${REPORT}" EOF chmod +x /opt/k8s-ops/cluster-inspect.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 依赖),节点名称解析是否正常,检查各命令返回值