Mir*_*iro 7 postgresql database-migration docker kubernetes
我有一个基于Kubernetes的应用程序,由多个服务(和pod)管理,带有掌舵图.
Postgres用作所有服务的数据库.
当应用程序升级到更新版本时,我正在运行db迁移脚本initContainers.
当迁移脚本需要对DB的独占访问(应终止所有其他连接)时,会出现此问题,否则将阻止脚本.
理想的解决方案是停止所有pod,运行迁移并重新创建它们.但我不确定如何使用Kubernetes正确实现它.
TNX
理想的解决方案是停止所有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)
较低的钩子重量将确保此作业在迁移作业之前运行.这将确保以下一系列事件:
helm upgrade只需确保将所有相关的部署保留在同一个图表中.
| 归档时间: |
|
| 查看次数: |
5652 次 |
| 最近记录: |