首页 > 解决方案 > 在 Kubernetes 中使用完整的声明式方法

问题描述

我们可以使用声明式的方法来创建和更新 kubernetes 资源kubectl apply -f,但我们如何才能这样做来回收不再需要的资源。

我用过kubectl delete ,但这看起来像是命令式的,有时我们需要按正确的顺序删除东西。

有没有办法始终使用kubectl apply它,它会自行确定要保留哪些资源以及删除哪些资源。就像在Terraform.

或者我们应该得出结论,目前声明性方法仅适用于资源创建和更新。

用例:

例如,我们决定不向最终用户提供 K8S API,而是为他们提供一个存储库,他们可以在其中保存和更新他们的 yaml 文件,当合并拉取请求时,机器人可以在每次更新时将其应用于集群。所以我们也需要这个声明性的删除,这样我们就不必在用户之后清理东西。Terraformprovider 可能是解决方案,但在这种情况下,事情将锁定到 terraform,用户将需要学习另一种工具,而不是使用本机 k8s 格式。

标签: kubernetesinfrastructure-as-code

解决方案


事实证明,他们添加了一种声明性方法来修剪 yaml 清单中不再存在的资源:

kubectl apply -f <directory/> --prune -l your=label

虽然有太多的警告。

作为 kubectl delete 的替代方法,您可以使用 kubectl apply 来识别要在其配置文件从目录中删除后删除的对象。Apply with --prune 查询 API 服务器以查找与一组标签匹配的所有对象,并尝试将返回的活动对象配置与对象配置文件进行匹配。如果一个对象与查询匹配,并且它在目录中没有配置文件,并且它有一个 last-applied-configuration 注释,则将其删除。


推荐阅读