使用新的 PersistentVolume 重新创建由 StatefulSet 管理的 Pod
Recreate Pod managed by a StatefulSet with a fresh PersistentVolume
偶尔我需要对我的 StatefulSet 中的所有 Pods 执行滚动替换,以便所有 PV 也从头开始重新创建。这样做的原因是摆脱所有使用旧版本加密密钥的底层硬盘驱动器。此操作不应与常规滚动升级相混淆,为此我仍然希望卷在 Pod 终止后仍然存在。到目前为止,我认为最好的做法如下:
- 删除PV。
- 删除 PVC。
- 删除 Pod。
- 等到所有删除完成。
- 手动重新创建步骤 2 中删除的 PVC。
- 等待新 Pod 从 StatefulSet 中的其他 Pods 流式传输数据。
- 为下一个 Pod 从第 1 步开始重复。
我对第 5 步不满意。我希望 StatefulSet 为我重新创建 PVC,但不幸的是它没有。我必须自己做,否则 Pod 创建会失败并出现以下错误:
Warning FailedScheduling 3s (x15 over 15m) default-scheduler persistentvolumeclaim "foo-bar-0" not found
有更好的方法吗?
您似乎以错误的方式使用了 "Persistent" 卷。它旨在在推出之间保留数据,而不是将其删除。还有其他不同的方式来更新密钥。可以使用 k8s Secret
和 ConfigMap
将密钥挂载到 Pod 中。然后你只需要在滚动更新
期间重新创建一个Secret
我最近不得不这样做。以下对我有用:
# 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>
https://github.com/kubernetes/kubernetes/issues/89910. The workaround proposed there, of deleting the new Pod which is stuck pending, works and the second time it gets replaced a new PVC is created. It was marked as a duplicate of https://github.com/kubernetes/kubernetes/issues/74374 中对此进行了描述,并报告为可能已在 1.20 中修复。
偶尔我需要对我的 StatefulSet 中的所有 Pods 执行滚动替换,以便所有 PV 也从头开始重新创建。这样做的原因是摆脱所有使用旧版本加密密钥的底层硬盘驱动器。此操作不应与常规滚动升级相混淆,为此我仍然希望卷在 Pod 终止后仍然存在。到目前为止,我认为最好的做法如下:
- 删除PV。
- 删除 PVC。
- 删除 Pod。
- 等到所有删除完成。
- 手动重新创建步骤 2 中删除的 PVC。
- 等待新 Pod 从 StatefulSet 中的其他 Pods 流式传输数据。
- 为下一个 Pod 从第 1 步开始重复。
我对第 5 步不满意。我希望 StatefulSet 为我重新创建 PVC,但不幸的是它没有。我必须自己做,否则 Pod 创建会失败并出现以下错误:
Warning FailedScheduling 3s (x15 over 15m) default-scheduler persistentvolumeclaim "foo-bar-0" not found
有更好的方法吗?
您似乎以错误的方式使用了 "Persistent" 卷。它旨在在推出之间保留数据,而不是将其删除。还有其他不同的方式来更新密钥。可以使用 k8s Secret
和 ConfigMap
将密钥挂载到 Pod 中。然后你只需要在滚动更新
Secret
我最近不得不这样做。以下对我有用:
# 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>
https://github.com/kubernetes/kubernetes/issues/89910. The workaround proposed there, of deleting the new Pod which is stuck pending, works and the second time it gets replaced a new PVC is created. It was marked as a duplicate of https://github.com/kubernetes/kubernetes/issues/74374 中对此进行了描述,并报告为可能已在 1.20 中修复。