如何在OpenShift中更改StatefulSet

92次阅读
没有评论

问题描述

想知道在OpenShift中更改StatefulSet的最佳方法,例如修改环境变量参数或修改PVCs。使用oc edit statefulset xyz命令只允许更改扩展规模,而不能进行其他更改。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在OpenShift中,修改StatefulSet的唯一方法是删除它,并使用新的值重新创建它。这是设计上的限制。
执行这个操作不会删除或停止Pod或PVCs,它们将重新连接到稍后创建的新StatefulSet上,因此您不会丢失任何数据。请注意,您可以删除Pods,但PVCs将保留。当属于此StatefulSet的Pod重新启动时,它们将重新连接到PVCs上。
在OpenShift/Kubernetes的任务跟踪器中有一次讨论(我无法找到了),解释了这个设计的原因:与无状态的部署不同,OpenShift可以简单地扩展新的Pod集,然后缩减旧的Pod集,同时将流量路由到新的Pod集。但是,对于有状态的StatefulSet来说,情况并不容易,因为它们有持久的PVCs,所以通常有一个非常明确的Pod数量可以/应该同时运行。
因此,如果OpenShift在编辑后为您执行升级,它需要决定如何执行(并行生成新的Pod需要生成PVCs,这可能会破坏您的配额;如果您的Pod需要相互通信进行同步,则在原地替换可能会造成混乱)。因此,他们要求您自己执行此操作。例如,您可以决定删除并重新创建StatefulSet,然后逐个删除Pod;它们将立即自动重新创建,就像往常一样。然后,您可以等待下一个Pod达到与其他Pod同步的状态(以您的软件的任何方式进行同步),然后删除下一个Pod,依此类推,直到升级完成。

方案2

使用脚本或工具来管理StatefulSet的更改可能会增加复杂性,并且需要确保Pod和PVC之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制StatefulSet的更改。您可以使用oc delete statefulset xyz命令删除StatefulSet,然后使用新的配置重新创建它。这将确保Pod和PVC之间的依赖关系正确设置。
以下是一个简单的bash脚本示例,可以在删除StatefulSet后重新创建它:

#!/bin/bash
# 删除StatefulSet
oc delete statefulset xyz
# 等待StatefulSet完全删除
while oc get statefulset xyz >/dev/null 2>&1; do
  sleep 1
done
# 重新创建StatefulSet
oc create -f statefulset.yaml

在这个示例中,我们首先使用oc delete statefulset xyz命令删除StatefulSet。然后,使用一个循环来等待StatefulSet完全删除(通过检查是否还存在来测试)。一旦StatefulSet被删除,我们再使用oc create -f statefulset.yaml命令重新创建StatefulSet,其中statefulset.yaml是包含新配置的YAML文件。
请注意,使用脚本或工具来管理StatefulSet的更改可能会增加复杂性,并且需要确保Pod和PVC之间的依赖关系正确设置。因此,在执行此操作之前,请确保您了解所有相关的配置和依赖关系。
以上是在OpenShift中更改StatefulSet的两种解决方案。根据您的需求和环境,选择适合您的方法。

正文完