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 数据库上执行迁移 - 连接问题的主要内容,如果未能解决你的问题,请参考以下文章