Kubernetes - 使用 flyway 作业在 postgres 数据库上执行迁移 - 连接问题

Posted

技术标签:

【中文标题】Kubernetes - 使用 flyway 作业在 postgres 数据库上执行迁移 - 连接问题【英文标题】:Kubernetes - Use flyway job to perform migrations on postgres database - Connection problems 【发布时间】:2021-11-08 04:08:39 【问题描述】:

问题

错误照片

Flyway Job Error

我目前正在尝试使用 flyway 在 postgres 中执行迁移。根据此错误消息,我感觉无法找到初始化脚本。 不太确定我缺少什么,因为在使用 docker 容器时初始化脚本有效。

对于解决此问题的任何帮助将不胜感激。

我尝试过的:

    到目前为止,我已经尝试在作业中使用连接字符串,看看是否是连接问题。 然后我尝试使用一个配置映射,其中包含 init sql 脚本,希望该脚本对迁移可见。这种方法没有太多运气。 我附上了我为这种方法找到的示例。 Migrations with ConfigMap for init sql scripts

我发现了更多研究链接,但它们不太适合或解决我的问题,并且不那么值得注意或已过时。

    Database migrations in Kubernetes with flyway video Continuous Database configuration with flyway

代码/Kubernetes 设置

以下是我当前的设置:

旁注:我正在使用 kind 将我的 docker 镜像拉到本地并创建我的集群,我将在最后附上我的 docker compose 和 docker 文件。

飞行路线设置

我在具有这种结构的 Kubernetes 中将 Flyway 作为工作:

Flyway 作业文件

apiVersion: batch/v1
kind: Job
metadata:
  name: flyway-migration-job
spec:
  template:
    spec:
      containers:
      - name: flyway
        image: flyway/flyway:6.3.1
        command: ["flyway -url=jdbc:postgresql://postgres-master:5432/wallet -user=test_user -password=testuser1234  -connectRetries=60 migrate"]
      restartPolicy: Never
  backoffLimit: 1

Postgres 设置

Postgres 部署文件:

这项工作使用的是 postgres,我已经创建了一个部署来使用:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-master
  labels:
    app: postgres-master
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-master
  template:
    metadata:
      labels:
        app: postgres-master
    spec:
      containers:
        - name: postgres-master
          image: postgres:12
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: wallet
            - name: POSTGRES_USER
              value: test_user
            - name: POSTGRES_PASSWORD
              value: testuser1234

Postgres 服务文件

然后我使用这个 Postgres 服务公开了 Postgres pod:

apiVersion: v1
kind: Service
metadata:
  name: postgres-master
  labels: 
    app: postgres-master
spec: 
  type: NodePort
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
  selector: 
    app: postgres-master

节点设置

我还有一个连接到数据库 pod 的节点部署,并且我已经确认我已经能够使用主机名 postgres-master(pod 名称)、上述登录详细信息和端口 5432 连接到数据库。

节点部署文件

为了完整起见,我附上了节点部署文件,但它可以工作。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-deployment
  labels:
    app: node-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: node-deployment
  template:
    metadata:
      labels:
        app: node-deployment
    spec:
      containers:
        - name: node
          image: wallet-api-20_web:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
          env:
            - name: PG_HOST
              value: "postgres-master.default"

Docker 设置

Docker 编写

然后我有我的 docker compose 文件,我用它来构建我的图像: 不是 - 在我开始添加 Kubernetes 之前,所有 docker 镜像都可以协同工作,包括迁移。

version: '3.5'
services:
  web:
    build:
      dockerfile: ./Dockerfile
    container_name: wallet-api-web
    depends_on: 
      - flyway
    ports: 
      - "8080:8080"
  postgres-db:
    build:
      dockerfile: ./utils/db.Dockerfile
    container_name: postgres-db
    environment:
      POSTGRES_PASSWORD: testuser1234
      POSTGRES_USER: test_user
      POSTGRES_DB: wallet
    image: postgres:12
    ports:
      - "5432:5432"
    restart: always

  flyway:
    command: -url=jdbc:postgresql://db:5432/wallet -user=test_user -password=testuser1234  -connectRetries=60 migrate
    container_name: flyway-migrations
    depends_on:
      - db
    image: flyway/flyway:6.3.1
    volumes:
      - $PWD/migrations/sql:/flyway/sql

Postgres Dockerfile

这是我用于 postgres 的 dockerfile:

FROM postgres:13

ENV POSTGRES_DB wallet

节点 dockerfile

FROM node:15
ENV NODE_ENV=production

WORKDIR /app

# Copying the package json first enables caching.
COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --production

COPY . . 

RUN npm run build

ENTRYPOINT npm run start

Flyway 迁移脚本

这是我拥有的唯一迁移脚本,它在迁移到 Kubernetes 之前一直在工作。

CREATE TABLE transaction_events (
    transaction_version int,
    transaction_type VARCHAR(200),
    coins int,
    transaction_id VARCHAR(500),
    wallet_id VARCHAR(500)
)

任何帮助将不胜感激,我觉得这可能是我缺少的一些小东西。

如果需要更多信息,请告诉我。

如有任何问题,请随时添加,我会尽我所能提供进一步的背景信息。

谢谢。

【问题讨论】:

请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

我怀疑你打电话给command 的方式是问题所在。必须是command: ["flyway", "-url=jdbc:postgresql://postgres-master:5432/wallet", "-user=test_user", "-password=testuser1234", "-connectRetries=60 migrate"]

另外,我认为您不需要使用command。您可以改用args,因为您还使用了图像入口点中指定的命令。 args: ["-url=jdbc:postgresql://postgres-master:5432/wallet", "-user=test_user", "-password=testuser1234", "-connectRetries=60 migrate"]

两者都应该工作

【讨论】:

谢谢,在每个命令参数之间添加“”已经有效,如果我检查作业描述,作业现在被标记为已完成。唯一的问题是,当我尝试对表执行查询时,它说表事务事件不存在。我目前正在登录 pod 以查看表格,但有些东西不起作用。 我认为这可能是另一种情况,但"-connectRetries=60 migrate"应该是"-connectRetries=60", "migrate"

以上是关于Kubernetes - 使用 flyway 作业在 postgres 数据库上执行迁移 - 连接问题的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 使用 CronJob 运行作业

使用工作队列的 Kubernetes 作业调度

Kubernetes 作业清理

Kubernetes 动态作业扩展

Kubernetes - 作业调度 API

通过詹金斯上的 Maven 作业导致的飞路迁移错误