Kubernetes: возможно ли монтировать тома в контейнер, работающий как CronJob?

Я пытаюсь создать Kubernetes CronJob для запуска приложения каждую минуту.

Обязательным условием является то, что мне нужно поместить код моего приложения в контейнер, который выполняется внутри CronJob. Я полагаю, что лучший способ сделать это - использовать постоянный том, pvclaim, а затем определить объем и прикрепить его к контейнеру. Я сделал это успешно с контейнерами, работающими в Pod, но это кажется невозможным в CronJob? Вот моя попытка конфигурации:

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: update_db
spec:
  volumes:
  - name: application-code
    persistentVolumeClaim:
      claimName: application-code-pv-claim
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: update-fingerprints
            image: python:3.6.2-slim
            command: ["/bin/bash"]
            args: ["-c", "python /client/test.py"]
          restartPolicy: OnFailure

Соответствующая ошибка:

ошибка: ошибка проверки "cron-Applications.yaml": ошибка проверки данных: найдены неверные тома полей для v2alpha1.CronJobSpec; если вы решите игнорировать эти ошибки, отключите проверку с помощью --validate=false

Я не могу найти никаких ресурсов, которые показывают, что это возможно. Итак, если это невозможно, как решить проблему с получением кода приложения в работающем CronJob?

3 ответа

CronJob использует PodTemplate как все остальное, основанное на модулях, и может использовать тома. Вы поместили свою спецификацию Volume непосредственно в CronJobSpec вместо PodSpec, используйте ее следующим образом:

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: update_db
spec:
schedule: "*/1 * * * *"
jobTemplate:
    spec:
    template:
        spec:
        containers:
        - name: update-fingerprints
            image: python:3.6.2-slim
            command: ["/bin/bash"]
            args: ["-c", "python /client/test.py"]
            restartPolicy: OnFailure
            volumeMounts:
            - name: application-code
            mountPath: /where/ever
        volumes:
        - name: application-code
            persistentVolumeClaim:
            claimName: application-code-pv-claim

Что касается другого вопроса: «Как решить проблему добавления кода приложения в работающий CronJob?»

Вы создаете свой собственный образ, содержащий код. Вот как это обычно делается.

      FROM python:3.6.2-slim
ADD test.py /client/test.py

CMD ['python','-c','/client/test.py']

Сборка и отправка в реестр докеров.

      docker build -t myorg/updatefingerprints
docker push myorg/updatefingerprints

Используйте это изображение в дескрипторе.

      apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: update_db
spec:
  volumes:
  - name: application-code
    persistentVolumeClaim:
      claimName: application-code-pv-claim
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: update-fingerprints
            image: myorg/update-fingerprints
            imagePullPolicy: Always
          restartPolicy: OnFailure

Это требует совсем другого подхода к управлению конфигурацией и контролю версий.

теперь есть эфемерный. доступно с 1.21

https://kubernetes.io/docs/concepts/storage/ephemeral-volumes/#generic-ephemeral-volumes

      kind: Pod
apiVersion: v1
metadata:
  name: my-app
spec:
  containers:
    - name: my-frontend
      image: busybox:1.28
      volumeMounts:
      - mountPath: "/scratch"
        name: scratch-volume
      command: [ "sleep", "1000000" ]
  volumes:
    - name: scratch-volume
      ephemeral:
        volumeClaimTemplate:
          spec:
            accessModes: [ "ReadWriteOnce" ]
            resources:
              requests:
                storage: 1Gi
Другие вопросы по тегам