当前位置: 首页 > 知识库问答 >
问题:

库伯内特斯 - 使用飞行路径作业对后遗症数据库执行迁移 - 连接问题

颜文康
2023-03-14

飞行路线作业错误

我目前正在尝试使用flyway在postgres中执行迁移。我觉得基于此错误消息找不到init脚本。不太确定我缺少什么,因为init脚本在使用docker容器时是有效的。

如果能为解决这个问题提供任何帮助,我们将不胜感激。

    < li >到目前为止,我已经尝试在作业中使用连接字符串,看看是否是连接问题。 < li >然后,我尝试使用内部带有init sql脚本的配置映射,希望该脚本对于迁移可见。这种方法运气不太好。我附上了我为这种方法找到的例子。使用init sql脚本的ConfigMap进行迁移

我发现了一些更多的研究链接,但它们不太适合或与我的问题一起工作,并且不那么值得注意或过时。

  1. 使用飞行视频在库伯内特斯中迁移数据库
  2. 带飞行通道的连续数据库配置

以下是我当前的设置:

旁注:我使用kind在本地提取我的docker图像并创建我的集群,我将在最后附上我的docker合成和docker文件。

我在库伯内特斯有一份工作,结构如下:

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,我创建了一个部署以使用:

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 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 compose文件,我用它来构建我的映像:Side not——在我开始添加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:

FROM postgres:13

ENV POSTGRES_DB wallet
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

这是我唯一的迁移脚本,它在移动到库伯内特斯之前就已经工作了。

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

任何帮助将不胜感激,我有一种感觉,这可能是我错过的小东西。

如果还需要其他信息,请告诉我。

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

谢谢。

共有1个答案

蒲德曜
2023-03-14

我怀疑你调用命令的方式是问题所在。它需要命令:["flyway","-url=jdbc: postgresql://postgres-master: 5432/钱包","-user=test_user","-密码=testuser1234","-ConnectRetries=60迁移"]

另外,我认为您不需要使用命令。您可以使用args代替,因为您也使用图像入口点中指定的命令。args:["-url=jdbc: postgresql://postgres-master: 5432/钱包","-user=test_user","-密码=testuser1234","-ConnectRetries=60迁移"]

无论如何,两者都应该有效

 类似资料:
  • flyway可以在迁移之前对数据库进行验证检查吗? 场景1 例如:我试图在现有的数据库上执行flyway。我已经在db_users表中插入了一些用户。 但是我的sql脚本有db_users表的create语句和所有用户的插入语句,包括那些已经插入的用户。 我可以在创建表之前做IFNOT_EXISTS检查,但很难在每次插入之前做检查。 情景2 我已经在数据库中迁移了脚本V1、V2和V3。我修改了脚本

  • 据我所知,作业对象应该在一定时间后收获豆荚。但是在我的GKE集群(库伯内特斯1.1.8)上,“kubectl get pods-a”似乎可以列出几天前的豆荚。 所有这些都是使用乔布斯API创建的。 我确实注意到在使用 kubectl 删除作业后,pod 也被删除了。 我在这里主要担心的是,我将在批量作业中在集群上运行成千上万个pod,并且不想让内部待办系统过载。

  • 我试图设置一个带有前端pod(cup fe)和后端pod的GKE环境,用于在登录时对用户进行身份验证(cup auth),但我无法让我的入口正常工作。 以下是运行nginx的前端吊舱(cup fe),带有角度应用程序。我还创建了一个静态IP地址,由“cup.xxx.it”和“cup-auth.xxx.it”dns解析: 然后是认证盒(cup auth): 然后,我创建了两个节点报告来公开上述POD

  • 我想使用CronJob在Kubernetes内部运行一个shell脚本,下面是我的CronJon.yaml文件: CronJob已被创建(kubectl apply -f CronJob.yaml)当我获得CronJob的列表时,我可以看到cron job ( kubectl get cj ),当我运行“kubectl get pods”时,我可以看到pod正在被创建,但是pod崩溃了。谁能帮我学

  • 欢迎任何输入或反馈。

  • 我有一个朋友允许我访问他的kube集群(托管在IBM云上)。 我可以通过IBM云控制台登录 但是,当我试图通过kubectl访问它们时:kubectl get节点 结果显示一条错误消息: 服务器错误(禁止):节点被禁止:用户https://iam.ng.bluemix.net/kubernetes#无法在群集范围内列出节点。 为什么控制台和CLI之间的访问(RBAC)会有所不同?