如何使用临时帮助数据库运行kubernetes作业

时间:2018-10-17 09:26:07

标签: kubernetes

我正在创建一个Kubernetes作业,该作业需要一个临时数据库来处理其任务。我有2个docker映像。 1是作业,1是一个mysql数据库,其中已经包含该数据库和该作业所需的数据

我想做这样的事情:

apiVersion: batch/v1
kind: Job
metadata:
  name: afmigration
spec:
  backoffLimit: 3
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: afmigration
        image: migrate-job:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: POSTGRES_USER
          valueFrom:
            secretKeyRef:
              name: postgres-credentials
              key: user

        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: postgres-credentials
              key: password

        - name: POSTGRES_HOST
          value: postgres-service
        - name: MYSQL_ROOT_PASSWORD
          value: root
        - name: MYSQL_DATABASE
          value: tmpdb
      - name: migration-test-data
        image: migration-test-data:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: root
        - name: MYSQL_DATABASE
          value: tmpdb

这里的问题是首先没有启动数据库。另外,我可能需要定义一个服务才能从作业中访问数据库。但是我最大的问题是,作业完成后如何停止数据库?

这是迁移测试数据的dockerfile:

FROM mysql:8.0
COPY ./*.sql /docker-entrypoint-initdb.d/

这是用于迁移的dockerfile,即工作:

FROM frolvlad/alpine-oraclejdk8:slim

ARG JAR_FILE

COPY target/${JAR_FILE} /app/afmigration.jar

WORKDIR /app

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/afmigration.jar"]

1 个答案:

答案 0 :(得分:1)

MySQL数据库应正常启动,因此您的docker映像中可能存在一些问题。由于您位于同一POD中,因此您可以使用localhost访问MySQL,因为同一POD中的所有容器都共享同一网络堆栈。

因此在Kubernetes中现在不支持在作业中制作Sidecar容器,如本期所示:https://github.com/kubernetes/kubernetes/issues/25908

但是我建议看一下此评论中指出的bash魔术: https://github.com/kubernetes/kubernetes/issues/25908#issuecomment-308569672

containers:
  - name: main
    image: gcr.io/some/image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
    trap "touch /tmp/pod/main-terminated" EXIT
    /my-batch-job/bin/main --config=/config/my-job-config.yaml
    volumeMounts:
      - mountPath: /tmp/pod
    name: tmp-pod
  - name: envoy
    image: gcr.io/our-envoy-plus-bash-image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
    /usr/local/bin/envoy --config-path=/my-batch-job/etc/envoy.json &
    CHILD_PID=$!
    (while true; do if [[ -f "/tmp/pod/main-terminated" ]]; then kill $CHILD_PID; fi; sleep 1; done) &
    wait $CHILD_PID
    if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; fi
    volumeMounts:
      - mountPath: /tmp/pod
    name: tmp-pod
    readOnly: true
volumes:
  - name: tmp-pod
    emptyDir: {}

因此,它仅在后台运行非结束程序(此示例为使节),并查看共享目录,批处理作业将在该目录中写入已结束的信息。因此Sidecar将对这些信息做出反应并杀死无止境的流程。