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