使用helm将(Deployment+PVC)升级到Statefulset



我们已经意识到,对于我们的有状态应用程序,使用带有PVC的部署而不是使用Statefulset是错误的。我想知道升级会如何进行。如何使用新的statefulset指向旧数据?我猜旧的PVC不能被卷ClaimTemplate使用?我还没有通过谷歌找到任何与我的搜索能力有关的东西。

其他人经历过这个阶段吗?如果你有,你遵循的过程是什么?

谢谢。

添加有关设置的更多详细信息。

  1. 目前它是一个简单的部署,没有副本。只有1个部署和1个吊舱
  2. PV+PVC用于在我们写入所有数据的地方安装一个持久卷
  3. 在Helm升级中,我们添加了一个预升级挂钩,它将相同的PV+PVC安装到升级容器中并升级数据(修改XML文件等(

这很简单,但舵图有点太复杂了,还有很多其他噪音,但基本上应用程序可以认为如上所述很简单。

现在,我在下一次升级中寻找的是一个过程,在这个过程中,我可以将上述部署作为一个状态集,并使所有数据仍然可供Pod使用。

下面是我所做的。首先,让我简要介绍一下我的测试设置:

  1. 运行一组部署,这些部署具有自己的PVC+PV以实现持久性
  2. 新版本将所有这些部署转换为状态集,因此具有不同的PVC

问题:

  1. 您不能使用早期部署的PV,因为PV绑定到单个PVC。您可以仅使用该PVC来参考PV。

  2. 所以另一个问题是,为什么你不能用PVC把旧的PV安装到新的吊舱上并复制它?好吧,我们不能这样做,因为当新的吊舱启动时,旧的吊舱被释放,从而释放出相关的PVC和PV。在我的情况下,我可以看到PVC进入"终止"状态。这可能可以通过某种回收政策来解决,但我不确定。

解决方案:

  1. 手动创建PV及其PVC并应用它们。PVC名称应该与statefulset将创建的名称相匹配,这是非常直接的。状态集的PVC名称匹配非常重要,它希望它是可以在网上找到的特定格式。

  2. 在新的Helm图表中,创建一个升级前的kubernetes作业。这是Helm的预升级挂钩,它在Helm发布的实际升级之前运行。因此,在这里创建一个容器,并安装新旧PV(使用手动创建的PVC(。

  3. 现在,这个容器必须运行正确的东西才能复制数据?是的,为此,我创建了一个新的配置映射,并在其中放入一个脚本,该脚本只需将数据从旧PV复制到新PV。这个配置映射被安装在容器中,并且使容器执行该命令。

  4. 运行helm upgrade命令并查看其运行情况。

K8s预升级作业的一个粗略示例:

apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-pre-upgrade-job
namespace: {{ .Values.namespace.name }}
annotations:
"helm.sh/hook": pre-upgrade
spec:
template:
spec:
containers:
- name: upgrade82-copy
image: <your-image>
command: ["/bin/bash"]
args: ["-c", "/scripts/upgrade82.sh"]
volumeMounts:
- name: old-data
mountPath: /usr/old
readOnly: false
- name: new-data
mountPath: /usr/new
readOnly: false
- name: scripts
mountPath: /scripts
readOnly: false
restartPolicy: Never
volumes:
- name: old-data
persistentVolumeClaim:
claimName: old-claim << Needs to be hardcoded to what is running
- name: new-data
persistentVolumeClaim:
claimName: new-data-namespace-app-0 << There is a specific format for statefulset PVC
- name: scripts
configMap:
name: upgrade
defaultMode: 0755
backoffLimit: 4
#activeDeadlineSeconds: 200
ttlSecondsAfterFinished : 100

并且";升级";上面是另一个带有复制脚本的配置映射。

出于某种原因,我们在预阶段为此类Statefulset pod创建pv/pvc。在升级过程中,我们删除了旧的pv/pvc,并使用新的、删除旧的部署和创建headless服务,还保留了一些旧的服务用于负载平衡。因为pv/pvc只结合一次,所以必须创建新的pv。

最新更新