我正在创建一个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"]
答案 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将对这些信息做出反应并杀死无止境的流程。