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

标签 postgresql docker kubernetes database-migration

我有一个基于 Kubernetes 的应用程序,由多个使用 helm chart 管理的服务(和 pod)组成。

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

当应用程序升级到较新版本时,我正在通过 initContainers 运行数据库迁移脚本。

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

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

Tnx

最佳答案

Ideal solution would be to stop all pods, run the migration and recreate them. But I am not sure how to achieve it properly with Kubernetes.

我从您使用 Helm 的评论中看到,因此我想提出一个利用 Helm Hook 的解决方案:

Helm provides a hook mechanism to allow chart developers to intervene at certain points in a release's life cycle. For example, you can use hooks to:

  • Load a ConfigMap or Secret during install before any other charts are loaded.

  • Execute a Job to back up a database before installing a new chart, and then execute a second job after the upgrade in order to restore data.

  • Run a Job before deleting a release to gracefully take a service out of rotation before removing it.

https://helm.sh/docs/topics/charts_hooks/

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

要在运行迁移之前删除部署,请创建第二个预安装/升级前 Hook ,使用较低的 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"]

较低的 Hook 权重将确保此作业在迁移作业之前运行。这将确保以下一系列事件:

  1. 你运行 helm upgrade
  2. 具有最低 hook-weight 的 helm hook 运行并删除相关部署
  3. 第二个钩子(Hook)运行并运行您的迁移
  4. 您的 Chart 将安装新的 Deployment、Pod 等。

只需确保将所有相关部署保存在同一个图表中即可。

关于postgresql - 管理 Kubernetes 集群上的数据库迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50218376/

相关文章:

ruby-on-rails-3 - 神秘的 SELECT COUNT(*) 出现在我的 Controller 中,用于 has_many 关系

docker - 混杂模式下的 GCP 计算实例 NIC

mongodb - 将数据容器的卷映射到卷

kubernetes 入口控制 CrashLoopBackOff - 找不到名称为 kube-system/default-http-backend 的服务

sql - 查询关系模型

sql - 每天为每个值选择一行

node.js - 异步查询到nodeJS中的数据库

azure - 运行由 VS2019 创建的 Azure Docker 容器注册表

kubernetes - 如何从命令行使用显示名称更新 GKE 集群的授权网络?

amazon-web-services - AWS 上的 Kubernetes 1.4 SSL 终止