Миграция БД с помощью helm

#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 }}"