【问题标题】:Kustomize stuck deleting StatefulSets that uses PersistentVolumesKustomize 卡住删除使用 PersistentVolumes 的 StatefulSets
【发布时间】:2021-10-11 11:18:14
【问题描述】:

我正在使用 Kustomize 来管理我的 Kubernetes 项目,它使用 StetefulSet 部署了一个包含三个 pod 的 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 在 StetefulSet 之前创建,该 StetefulSet 包含声明这些 PV 的声明的 volumeClaimTemplates

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

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

【问题讨论】:

  • 经过一番调查,我发现有状态删除不会删除 PVC,我理解。问题是 Kustomize 不应该在删除时调用 pv.yaml。有没有办法做到这一点?
  • 如果您不想删除包含 PVC 的目录,请避免执行 kubectl delete
  • PVC 不会被删除。 PV 是。为避免出现问题,我需要将 PV 移动到另一个文件夹,但这会添加另一个命令,以便在我部署应用程序时记住。我希望有像“删除时忽略 pv.yaml”这样的功能,但我认为它不存在。
  • 尝试使用动态卷配置器(如果在您的系统中可用) - 这样您就不必自己创建 PV。
  • 我知道,我的应用程序部署在 Vagrant/VirtualBox 上,我使用静态配置,然后使用 pv.yaml 文件。在 IBM Cloud 上,我使用动态配置,并且不存在此问题。

标签: kubernetes kustomize


【解决方案1】:

您遇到了一个关于 StatefulSet 和 PVC 删除的有趣问题。有discussion在删除对应的StatefulSet时是否应该删除StatefulSet创建的PVC。我们最近收到information,自动删除由 StatefulSet 创建的 PVC 的功能可能会在1.23 release 中提供。根据feature documentation,这将允许我们指定是否在删除其 StatefulSet 后删除 VolumeClaimTemplate PVC。 我怀疑使用此功能可以轻松删除 StatefulSet 以及 PVC 和 PV。

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

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


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

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

$ 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 是否按预期工作。首先,我们将应用生成的清单(它将创建 webStatefulSet 和 pv0003PersistentVolume):

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

【讨论】:

  • 请阅读您的解决方案。老实说,我只是将 StatefulSet 资源与 PV 资源分开,并在单独的文件中调用它们。当我删除它们时,我首先删除 StatefulSet,然后是 PVC,然后是 PV。我会更加仔细地分析你的建议。目前我投了赞成票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
相关资源
最近更新 更多