如何检测Kubernetes集群中特定Namespace的活动状态以优化集群成本?
检查核心资源状态:重点排查Namespace内的Deployment、StatefulSet、DaemonSet等工作负载控制器,以及PVC、ConfigMap、Secret等关联资源。如果资源要么不存在,要么控制器无就绪Pod、PVC无绑定PV,可初步判定为空闲。
命令示例:kubectl get deployments,statefulsets,daemonsets,pv,pvc,configmaps,secrets -n <目标Namespace>分析长期资源使用率:借助metrics-server或Prometheus监控Namespace的CPU、内存、存储使用率。若连续7天以上CPU使用率低于5%、内存使用率低于10%,且无新Pod调度记录,说明无有效业务负载。
命令示例(metrics-server):kubectl top namespace
需结合时间维度的趋势统计,避免误判临时闲置的Namespace。通过标签/注释筛选废弃Namespace:很多团队会用标签(如
env=archived、status=deprecated)或注释标记不再使用的Namespace。直接筛选这类资源:kubectl get namespaces --show-labels | grep "deprecated\|archived"
同时可排查创建时间过久且无更新记录的Namespace:kubectl get namespaces -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.metadata.creationTimestamp}{"\n"}{end}' | sort -k2关联RBAC与审计日志判断活跃度:查看Namespace对应的RBAC角色/绑定是否还有活跃用户使用,通过审计日志检查是否有针对该Namespace的API请求。若连续30天无任何API操作记录,基本可认定为空闲。
审计日志查询示例:kubectl logs -n kube-system <审计组件Pod名称> | grep "<目标Namespace>"自动化生命周期管理:部署自定义CronJob或专用清理工具,定期扫描符合条件的空闲Namespace(无运行Pod、无活跃资源、创建超指定天数),发送确认通知后自动删除。
简易脚本示例:#!/bin/bash IDLE_THRESHOLD=30 # 空闲天数阈值 for ns in $(kubectl get namespaces -o name | cut -d'/' -f2); do # 检查是否有运行中Pod running_pods=$(kubectl get pods -n $ns --field-selector=status.phase=Running --no-headers | wc -l) # 检查是否有活跃工作负载控制器 active_workloads=$(kubectl get deployments,statefulsets,daemonsets -n $ns --no-headers | wc -l) # 获取创建天数 create_time=$(kubectl get namespace $ns -o jsonpath='{.metadata.creationTimestamp}') create_days=$(( ( $(date +%s) - $(date -d "$create_time" +%s) ) / 86400 )) if [ $running_pods -eq 0 ] && [ $active_workloads -eq 0 ] && [ $create_days -gt $IDLE_THRESHOLD ]; then echo "标记空闲Namespace:$ns(创建已$create_days天)" # 此处可添加通知逻辑(如邮件、Slack),确认后执行删除:kubectl delete namespace $ns fi done
内容的提问来源于stack exchange,提问作者Amar

