4

偶尔我需要对我的 StatefulSet 中的所有 Pod 执行滚动替换,以便所有 PV 也从头开始重新创建。这样做的原因是摆脱所有使用旧版本加密密钥的底层硬盘驱动器。此操作不应与常规滚动升级相混淆,我仍然希望卷能够在 Pod 终止后继续存在。到目前为止,我认为最好的例程如下:

  1. 删除 PV。
  2. 删除 PVC。
  3. 删除 Pod。
  4. 等到所有删除完成。
  5. 手动重新创建在步骤 2 中删除的 PVC。
  6. 等待新 Pod 完成来自 StatefulSet 中其他 Pod 的流数据。
  7. 从第 1 步开始重复下一个 Pod。

我对第 5 步不满意。我希望 StatefulSet 为我重新创建 PVC,但不幸的是它没有。我必须自己做,否则 Pod 创建失败并出现以下错误:

Warning  FailedScheduling   3s (x15 over 15m)  default-scheduler   persistentvolumeclaim "foo-bar-0" not found

有没有更好的方法来做到这一点?

4

3 回答 3

4

我最近不得不这样做。以下对我有用:

# Delete the PVC
$ kubectl delete pvc <pvc_name>

# Delete the underlying statefulset WITHOUT deleting the pods
$ kubectl delete statefulset <statefulset_name> --cascade=false 

# Delete the pod with the PVC you don't want
$ kubectl delete pod <pod_name>

# Apply the statefulset manifest to re-create the StatefulSet, 
# which will also recreate the deleted pod with a new PVC
$ kubectl apply -f <statefulset_yaml>

于 2020-09-29T17:59:50.133 回答
2

这在https://github.com/kubernetes/kubernetes/issues/89910中有描述。那里提出的解决方法是删除被卡住的新 Pod,它是有效的,并且在第二次被替换时会创建一个新的 PVC。它被标记为https://github.com/kubernetes/kubernetes/issues/74374的副本,并报告为可能在 1.20 中修复。

于 2021-07-10T22:41:07.073 回答
-1

似乎您以错误的方式使用“持久”卷。它旨在在推出之间保留数据,而不是删除它。还有其他不同的方式来更新密钥。可以使用 k8sSecret并将ConfigMap密钥安装到 Pod 中。然后你只需要Secret在滚动更新期间重新创建

于 2020-03-26T12:56:57.497 回答