#kubernetes #hook #kubernetes-helm
Вопрос:
Я пытаюсь перенести наши таблицы cassandra для использования liquibase
. В принципе, идея тривиальна, есть pre-install
pre-upgrade
задание и, которое будет запускать некоторые liquibase
сценарии и управлять обновлением нашей базы данных.
Для этой цели я создал пользовательский образ докера, который будет иметь фактическое liquibase cli
значение, а затем я смогу вызвать его из задания. Например:
apiVersion: batch/v1
kind: Job
metadata:
name: "{{ .Release.Name }}-update-job"
namespace: spring-k8s
labels:
app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
annotations:
# This is what defines this resource as a hook. Without this line, the
# job is considered part of the release.
"helm.sh/hook": pre-install, pre-upgrade
"helm.sh/hook-weight": "5"
"helm.sh/hook-delete-policy": before-hook-creation
spec:
template:
metadata:
name: "{{ .Release.Name }}-cassandra-update-job"
namespace: spring-k8s
labels:
app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
spec:
restartPolicy: Never
containers:
- name: pre-install-upgrade-job
image: "lq/liquibase-cassandra:1.0.0"
command: ["/bin/bash"]
args:
- "-c"
- "./liquibase-cassandra.sh --username {{ .Values.liquibase.username }} --password {{ .Values.liquibase.username }} --url {{ .Values.liquibase.url | squote }} --file {{ .Values.liquibase.file }}"
Где .Values.liquibase.file
== databaseChangelog.json
.
Таким образом, в этом изображении lq/liquibase-cassandra:1.0.0
в основном есть скрипт liquibase-cassandra.sh
, который при передаче некоторых аргументов может творить чудеса и обновлять схему БД (не буду вдаваться в подробности).
Проблема в том, что последний аргумент: --file {{ .Values.liquibase.file }}
. Очевидно, что этот файл находится не в изображении, а в каждом репозитории микроуслуг.
Мне нужен способ «скопировать» этот файл в изображение, чтобы я мог его вызвать. Одним из способов было бы создавать это lq/liquibase-cassandra
все время (с одинаковым жизненным циклом самого проекта) и копировать файл в него, но это займет время и кажется, по крайней мере, громоздким. Что я упускаю?
Ответ №1:
Оказывается, helm
крючки можно использовать и для других целей, а не только для работы. Как таковой, я могу смонтировать этот файл в a еще ConfigMap
до того, как задание даже начнется (файл, о котором я забочусь, находится в resources/databaseChangelog.json
нем ):
apiVersion: v1
kind: ConfigMap
metadata:
name: "liquibase-changelog-config-map"
namespace: spring-k8s
annotations:
helm.sh/hook: pre-install, pre-upgrade
helm.sh/hook-delete-policy: hook-succeeded
helm.sh/hook-weight: "1"
data:
{{ (.Files.Glob "resources/*").AsConfig | indent 2 }}
А затем просто укажите это в задании:
.....
spec:
restartPolicy: Never
volumes:
- name: liquibase-changelog-config-map
configMap:
name: liquibase-changelog-config-map
defaultMode: 0755
containers:
- name: pre-install-upgrade-job
volumeMounts:
- name: liquibase-changelog-config-map
mountPath: /liquibase-changelog-file
image: "lq/liquibase-cassandra:1.0.0"
command: ["/bin/bash"]
args:
- "-c"
- "./liquibase-cassandra.sh --username {{ .Values.liquibase.username }} --password {{ .Values.liquibase.username }} --url {{ .Values.liquibase.url | squote }} --file {{ printf "/liquibase-changelog-file/%s" .Values.liquibase.file }}"