偶尔,我需要对StatefulSet中的所有Pod执行滚动替换,以便从头开始重新创建所有PV。这样做的原因是为了摆脱使用旧版本加密密钥的所有底层硬盘驱动器。此操作不应与常规滚动升级混淆,对于后者,我仍然希望卷在Pod终止后仍然存在。到目前为止,我认为最好的例程如下:
1.删除PV。
1.删除PVC。
1.删除Pod。
1.等待所有删除操作完成。
1.手动重新创建在步骤2中删除的PVC。
1.等待新Pod完成StatefulSet中其他Pod的数据流传输。
1.从步骤1开始重复。下一个Pod
我不喜欢第五步。我希望StatefulSet为我重新创建了PVC,但不幸的是它没有。我必须自己做,否则Pod创建失败,并出现以下错误:
Warning FailedScheduling 3s (x15 over 15m) default-scheduler persistentvolumeclaim "foo-bar-0" not found
字符串
有更好的办法吗?
4条答案
按热度按时间sg2wtvxw1#
我只是最近不得不这样做。以下为我工作:
字符串
xvw2m8pv2#
这在https://github.com/kubernetes/kubernetes/issues/89910中描述。这里提出的解决方法是删除挂起的新Pod,第二次替换时会创建一个新的PVC。它被标记为https://github.com/kubernetes/kubernetes/issues/74374的重复,并在1.20中报告为潜在固定。
hgncfbus3#
我尝试了上面的步骤,但实际上删除PVC失败,或者在我注意到之前自动重新创建。无论如何,也许在现代kubernetes上(我使用的是GKE autopilot 1.25.9),以下步骤就足够了:
1.删除pv
1.删除pod
至少对我来说,这导致了底层磁盘被替换,而不需要手动重新创建PVC。
我需要这样做来恢复一个磁盘已满并拒绝启动的elasticsearch节点(
fatal exception while booting Elasticsearch java.io.UncheckedIOException: Failed to load persistent cache
.我不想像许多指南所描述的那样扩展磁盘大小,因为问题是集群中的数据清理被破坏了,所以实际上不需要更多的空间。3wabscal4#
看起来你用了一个错误的方式“持久”卷。它的设计目的是在推出之间保留数据,而不是删除它。还有其他不同的方法来更新密钥。可以使用k8s
Secret
和ConfigMap
将密钥装入Pod。然后,您只需在滚动更新期间重新创建Secret