按标签 AGE 删除 kubernetes pvc 的自动化脚本

Automated script to delete kubernetes pvc by labels AGE

我总共有 2030 个 pvc,我想从中删除 2000 个 pvc 并保留 30 个。

我的 pvc 的一些例子:

NAME                            STATUS        VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-14353-postgresql-0         Bound         pvc-1a6   8Gi        RWO            gp2            2d15h
data-14354-postgresql-0         Bound         pvc-2d6   8Gi        RWO            gp2            16d
data-14358-postgresql-0         Bound         pvc-9dc   8Gi        RWO            gp2            127m
data-14367-postgresql-0         Bound         pvc-2eb   8Gi        RWO            gp2            65h
data-14370-postgresql-0         Bound         pvc-90d   8Gi        RWO            gp2            56d

现在你可以看到我有一个混合年龄标签。

可以使用以下方法删除它们:

kubectl delete pvc 

但这会删除所有..我不想删除所有!

仅使用 kubectl 命令没有简单的方法可以做到这一点,只有当您可以很好地使用 labels 时才容易操作.

但是您可以通过针对 Kubernetes API 服务器使用编程或脚本语言以编程方式执行此操作。

或许,在这种情况下,您可以手动为您要保留的30个PVC添加标签,然后删除没有此标签的PVC。

如果您已设法标记要保留的 PVC,则可以使用例如

 kubectl delete pvc -l !keep

详细了解如何使用 标签和选择器上的标签添加标签和 select 资源

TL:DR;

kubectl get pvc --sort-by=.metadata.creationTimestamp --no-headers | tac | cut -d ' ' -f 1 | sed -n 31,2000p | xargs kubectl delete pvc

我们分块来解释:

  • kubectl get pvc --sort-by=.metadata.creationTimestamp --no-headers:

    这部分按降序列出 PVC,没有 header 行

  • tac

    反转输出并产生升序

  • cut -d ' ' -f 1

    获取具有 PVC 名称的第一列

  • sed -n 31,2000p

    打印第 30 行之后的所有 PVC,其中包含 30 个不到 2 天的 PVC

    p - Print out the pattern space (to the standard output). This command is usually only used in conjunction with the -n command-line option.

    n - If auto-print is not disabled, print the pattern space, then, regardless, replace the pattern space with the next line of input. If there is no more input then sed exits without processing any more commands.

  • xargs kubectl delete pvc

删除您的 PVC。