Kustomize 卡住删除使用 PersistentVolumes 的 StatefulSet

Kustomize stuck deleting StatefulSets that uses PersistentVolumes

我正在使用 Kustomize 通过 StetefulSet 管理我的 Kubernetes 项目,该项目部署了一个包含三个 pods 的 PostgreSQL 集群。我正在研究 Vagrant/VirtualBox,因此不存在 PV 的动态配置。出于这个原因,我有自己的 pv.yaml,其中包含用于部署这 3 个 PV 的清单。

然后我有一个这样的 kustomization.yaml 文件:

namespace: ibm-cfdb

bases:
- ../../bases

resources:
- pv.yaml

文件夹 ../../bases 包含用于部署 StatefulSet 的文件。当我 运行: kubectl apply -k kustomize/ 一切都已正确部署。 PV 在包含 volumeClaimTemplates 声明这些 PV 的 Claim 的 StetefulSet 之前创建。

问题是当我尝试使用以下命令删除部署时: kubectl delete -k kustomize/ 执行了 PV 的删除(看来我无法控制顺序)。我想这些 PV 不能被删除,因为 Claims 使用它们。然后 StatefulSet 移除卡住了。

使用 Kustomize 管理 PV 静态配置的最佳方法是什么?

您遇到了一个关于 StatefulSet 和 PVC 删除的有趣问题。有一个 discussion whether PVCs created by the StatefulSet should be deleted when deleting the corresponding StatefulSet. We recently received information that the feature to autodelete the PVCs created by StatefulSet will probably be available in the 1.23 release. According to the feature documentation,这将允许我们指定在删除 StatefulSet 后是否删除 VolumeClaimTemplate PVC。 我怀疑使用此功能可以轻松删除 StatefulSet 以及 PVC 和 PV。

目前可以考虑将带有PV的文件移动到其他目录下单独管理。 但是,我会提出另一种解决方案,这是一种解决方法,但您可能会感兴趣。

基本上,我们可以在kustomize build命令中使用-o标志。这会为每个资源创建一个文件,使我们能够更好地控制资源创建。


我会给你一个例子来说明这是如何工作的。

假设我和你有相似的环境:

$ tree
.
├── base
│   ├── kustomization.yaml
│   └── statefulset.yaml
└── overlays
    └── dev
        ├── kustomization.yaml
        └── pv.yaml

$ cat overlays/dev/kustomization.yaml
bases:
  - ../../base

resources:
- pv.yaml

现在让我们创建一个目录,用于存储 kustomize 生成的清单文件:

$ mkdir generated_manifests

然后我们可以检查命令kustomize build overlays/dev -o generated_manifests是否按预期工作。首先,我们将应用生成的清单(它将创建 web StatefulSet 和 pv0003 PersistentVolume):

$ kustomize build overlays/dev -o generated_manifests && kubectl apply -Rf generated_manifests/
statefulset.apps/web created
persistentvolume/pv0003 created

如您所见,已在 generated_manifests 目录中创建相应的清单文件:

$ ls generated_manifests/
apps_v1_statefulset_web.yaml  v1_persistentvolume_pv0003.yaml

最后,我们可以尝试只删除 web StatefulSet:

$ kustomize build overlays/dev -o generated_manifests && kubectl delete -f generated_manifests/apps_v1_statefulset_web.yaml
statefulset.apps "web" deleted

我还想提一下 kustomize 具有类似“忽略 pv.yaml” 的功能,但它也会在创建资源时使用,而不仅仅是在删除时使用。这被称为删除补丁,可以找到一个很好的例子