缩小规模后从 Statefulset 中删除 Kubernetes 持久卷

tot*_*oto 7 containers kubernetes persistent-volumes persistent-volume-claims

我将有状态集扩展到 4,当缩小到 1 时,我发现仍然有 4 个持久卷,索引从 0 到 3。

我还看到它们的状态都是Bound 我想这是因为我将它用作有状态集,所以它不会在缩小规模后删除卷。

我尝试手动删除其中之一(索引为 2 的那个),因为我确信它会释放我的卷,所以我使用了:

kubectl delete persistentvolume <volume>
Run Code Online (Sandbox Code Playgroud)

好吧,这没有帮助,它只是让这个卷永远处于终止状态......:/

我现在不知道如何删除这个和所有其他未使用的卷。

这是有状态集 yaml 中的卷配置。

  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: "default"
        resources:
          requests:
            storage: 7Gi
Run Code Online (Sandbox Code Playgroud)

如果我跑

kubectl get pvc --all-namespaces
Run Code Online (Sandbox Code Playgroud)

我明白了

NAMESPACE    NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
default      data-0         Bound    pvc-23af1aec-e385-4778-b0b0-56f1d1dfdfee   7Gi        RWO            default        4h5m
default      data-1         Bound    pvc-34625107-1352-4715-b12c-2fc6ff22ed08   7Gi        RWO            default        4h4m
default      data-2         Bound    pvc-15dbdb53-d951-465d-b9c3-ebadfcc3c725   7Gi        RWO            default        4h3m
default      data-3         Bound    pvc-d317657f-194a-4f4f-8c5f-dff2843b693f   7Gi        RWO            default        4h3m
Run Code Online (Sandbox Code Playgroud)

如果我跑

kubectl get --no-headers persistentvolumes
Run Code Online (Sandbox Code Playgroud)

我明白了:

pvc-15dbdb53-d951-465d-b9c3-ebadfcc3c725   7Gi   RWO   Delete   Terminating   default/data-2            default         4h4m
pvc-23af1aec-e385-4778-b0b0-56f1d1dfdfee   7Gi   RWO   Delete   Bound         default/data-0            default         4h6m
pvc-34625107-1352-4715-b12c-2fc6ff22ed08   7Gi   RWO   Delete   Bound         default/data-1            default         4h5m
pvc-d317657f-194a-4f4f-8c5f-dff2843b693f   7Gi   RWO   Delete   Bound         default/data-3            default         4h3m
Run Code Online (Sandbox Code Playgroud)

Emo*_*n46 8

在 StatefulSet 中,K8s 不会在 pod 终止后自动删除PV或自行删除,这是为了避免进一步的复杂化和数据安全。PVC这就是为什么在缩小规模后,我们需要手动进行。在PVCPod 终止后删除将根据存储类别和回收策略触发相应持久卷的删除。

请尝试删除persistent volume claimPVC代替persistent volume。如果删除pvc它会自动删除相应的pv.

只需在 bash 中运行此命令:

kubectl delete pvc data-3

参考文献

  • 我相信删除 PVC 的结果可能还取决于 PV 的“persistentVolumeReclaimPolicy”是否设置为“retain”或“delete”。有关更多信息,请参阅 https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/ (2认同)

sha*_*359 5

k8s v1.23 [alpha] 中引入了一个新功能来满足这一确切要求。在 STS 中查找PVC 保留策略

删除时

配置删除 StatefulSet 时应用的卷保留行为

缩放时

配置当 StatefulSet 的副本数量减少时应用的卷保留行为;例如,缩小集合时。

对于您可以配置的每个策略,您可以将值设置为“删除”或“保留”。

像下面这样的东西对你有用。

  • STS 删除时 - PVC、PV、云卷将被保留。
  • 在 STS 缩小时 - PVC、PV、云卷将被删除。

以下来自 k8s 文档的片段:

apiVersion: apps/v1
kind: StatefulSet
...
spec:
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Delete
...
Run Code Online (Sandbox Code Playgroud)

除此之外,不要忘记设置要删除的PV 回收策略。这将确保一旦 PVC 被删除,甚至 PV 和支持卷也会被删除。

请参阅此以更好地理解这一点。