如何自动每周删除 k8s 命名空间

81次阅读
没有评论

问题描述

在我们公司中,多个利益相关者在 Kubernetes 中创建测试系统,然后忘记将其删除。我们的目标是自动删除那些存在超过一周的命名空间。是否有某种操作者(operator)可以实现这个功能?

解决方案

请注意以下操作可能因版本差异而有所不同,务必做好备份。

方案1

建议在用于测试的命名空间上添加一个过期日期的标签或注释。然后,您可以使用一个Job来清理过期的命名空间。以下是步骤:

  1. 在命名空间上添加过期日期的标签或注释。您可以使用kubectl命令或者在YAML文件中进行定义。

  2. 创建一个清理作业(Job)的YAML文件。以下是一个示例文件:

yaml
apiVersion: batch/v1
kind: Job
metadata:
name: namespace-cleanup
spec:
template:
spec:
containers:
- name: cleanup
image: your_cleanup_image:latest
command: ["sh", "-c"]
args:
- kubectl delete namespace -l your_label_selector
restartPolicy: Never

请将your_cleanup_image替换为您的清理工具镜像,your_label_selector替换为您用于标识过期命名空间的标签选择器。

  1. 使用kubectl创建作业:

kubectl create -f your_job_yaml_file.yaml
这将启动一个作业来删除带有过期日期标签或注释的命名空间。

方案2

以下是使用Bash命令行进行操作的方法,请注意测试并确保选择正确的命名空间。

虽然我不知道直接允许此操作的任何操作者,但您可以使用一个简单的Bash命令行来实现,借助于awkxargssed和gnu的date命令。我从这个帖子中获取了这个方法,并进行了修改以适用于命名空间,并且不会删除defaultkube-*命名空间。

以下是用于命名空间清理的Bash命令行:

kubectl get namespaces -o go-template --template '{{range .items}}{{.metadata.name}} {{.metadata.creationTimestamp}}{{"\n"}}{{end}}' | awk '$2 <= "'$(date -d '1 week ago' -Ins --utc | sed 's/+0000/Z/')'" && $1 !~ /(default|kube.*)/ { print $1 }' | xargs --no-run-if-empty kubectl delete namespace

请注意,这个方法需要在合适的时间和环境中测试,以确保它选择了您感兴趣的命名空间。

总结

无论您选择哪种方法,自动清理过期的 Kubernetes 命名空间都是可行的。方案1使用 Kubernetes Job 来管理清理,更加符合 Kubernetes 的原生操作方式。而方案2则使用 Bash 脚本来处理,可能会对命令行熟悉的用户更为友好。根据您的实际情况选择适合您的方法吧。

正文完