管理Kubernetes集群上的数据库迁移

Mir*_*iro 7 postgresql database-migration docker kubernetes

我有一个基于Kubernetes的应用程序,由多个服务(和pod)管理,带有掌舵图.

Postgres用作所有服务的数据库.

当应用程序升级到更新版本时,我正在运行db迁移脚本initContainers.

当迁移脚本需要对DB的独占访问(应终止所有其他连接)时,会出现此问题,否则将阻止脚本.

理想的解决方案是停止所有pod,运行迁移并重新创建它们.但我不确定如何使用Kubernetes正确实现它.

TNX

ers*_*les 9

理想的解决方案是停止所有pod,运行迁移并重新创建它们.但我不确定如何使用Kubernetes正确实现它.

我从其中一条评论中看到你使用Helm,所以我想提出一个利用Helm钩子的解决方案:

Helm提供了一种钩子机制,允许图表开发人员在发布的生命周期中的某些点进行干预.例如,您可以使用钩子:

  • 在加载任何其他图表之前,在安装期间加载ConfigMap或Secret.

  • 在安装新图表之前执行作业以备份数据库,然后在升级后执行第二个作业以恢复数据.

  • 在删除版本之前运行作业,以便在删除服务之前正常地使服务停止旋转.

https://github.com/kubernetes/helm/blob/master/docs/charts_hooks.md

您可以将迁移打包为k8s Job并利用pre-installor pre-upgradehook来运行作业.这些钩子在渲染模板后运行,但在Kubernetes中创建任何新资源之前运行.因此,您的迁移将在部署Pod之前运行.

要在运行迁移之前删除部署,请创建第二个预安装/升级前挂钩,其中较低的挂钩helm.sh/hook-weight会删除目标部署:

apiVersion: batch/v1
kind: Job
metadata:
  name: "pre-upgrade-hook1"
  annotations:
    "helm.sh/hook": pre-upgrade
    "helm.sh/hook-weight": "-1"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    metadata:
      name: "pre-upgrade-hook1"
    spec:
      restartPolicy: Never
      serviceAccountName: "<an SA with delete RBAC permissions>"
      containers:
      - name: kubectl
        image: "lachlanevenson/k8s-kubectl:latest"
        command: ["delete","deployment","deploy1","deploy2"]
Run Code Online (Sandbox Code Playgroud)

较低的钩子重量将确保此作业在迁移作业之前运行.这将确保以下一系列事件:

  1. 你跑 helm upgrade
  2. 具有最低挂钩权重的helm挂钩运行并删除相关部署
  3. 第二个钩子运行并运行您的迁移
  4. 您的图表将安装新的Deployments,Pods等.

只需确保将所有相关的部署保留在同一个图表中.