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” 的功能,但它也会在创建资源时使用,而不仅仅是在删除时使用。这被称为删除补丁,可以找到一个很好的例子 。
我正在使用 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” 的功能,但它也会在创建资源时使用,而不仅仅是在删除时使用。这被称为删除补丁,可以找到一个很好的例子