Сервис AWS EKS K8s и один узел CronJob/Jon
У меня есть развертывание k8s, которое состоит из задания cron (выполняется ежечасно), службы (запускает службу http) и класса хранения (pvc для хранения данных с использованием gp2).
Проблема, которую я вижу, заключается в том, что gp2 доступен только для чтения и записи.
Я замечаю, когда задание cron создает задание, и оно попадает на тот же узел, что и служба, которую можно смонтировать нормально.
Могу ли я что-то сделать в yaml службы, развертывания или задания cron, чтобы задание и служба cron всегда находились на одном и том же узле? Это может быть любой узел, но при условии, что задание cron отправляется на тот же узел, что и служба.
Это не проблема в моей нижней среде, поскольку у нас очень мало узлов, но в нашей производственной среде, где у нас больше узлов, это проблема.
Короче говоря, я хочу получить свое задание cron, которое создает задание, а затем модуль для запуска модуля на том же узле, что и мой модуль служб.
Я знаю, что это не лучшая практика, но наш веб-сервис считывает данные с ПВХ и обслуживает их. Задание cron извлекает новые данные из других источников и оставляет их для веб-сервера.
Рад за другие идеи / способы.
Спасибо
1 ответ
Акцент только на части:
Как я могу запланировать рабочую нагрузку (,,) на определенный набор
Nodes
Вы можете создать свой /
Job
либо с:
- это простейшая рекомендуемая форма ограничения выбора узла. это поле PodSpec. Он определяет карту пар ключ-значение. Чтобы модуль имел право работать на узле, узел должен иметь каждую из указанных пар ключ-значение в качестве меток (он также может иметь дополнительные метки). Чаще всего используется одна пара "ключ-значение".
- Kubernetes.io: Документы: Концепции: Планирование выселения: Назначить узел модуля: Селектор узла
Примером этого может быть следующий (при условии, что у вашего узла есть конкретная метка, на которую есть ссылка):
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
nodeSelector: # <-- IMPORTANT
schedule: "here" # <-- IMPORTANT
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
Выполнение вышеуказанного манифеста позволит запланировать
Pod
(
Cronjob
) на узле, имеющем
schedule=here
метка:
-
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-1616323740-mqdmq 0/1 Completed 0 2m33s 10.4.2.67 node-ffb5 <none> <none>
hello-1616323800-wv98r 0/1 Completed 0 93s 10.4.2.68 node-ffb5 <none> <none>
hello-1616323860-66vfj 0/1 Completed 0 32s 10.4.2.69 node-ffb5 <none> <none>
nodeAffinity
Сходство узла концептуально похоже на
nodeSelector
- он позволяет вам ограничивать, для каких узлов ваш модуль может быть запланирован, на основе меток на узле.В настоящее время существует два типа привязки узлов, которые называются
requiredDuringSchedulingIgnoredDuringExecution
иpreferredDuringSchedulingIgnoredDuringExecution
. Вы можете думать о них как о «жестких» и «мягких» соответственно в том смысле, что первый определяет правила, которые должны соблюдаться для того, чтобы модуль был запланирован на узел (точно так же, как nodeSelector, но с использованием более выразительного синтаксиса), в то время как первый последний определяет предпочтения, которые планировщик попытается применить, но не гарантирует.- Kubernetes.io: Документы: Концепции: Планирование выселения: Назначить узел модуля: Сходство узла
Примером этого может быть следующий (при условии, что у вашего узла есть конкретная метка, на которую есть ссылка в
.spec.jobTemplate.spec.template.spec.nodeSelector
):
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
# --- nodeAffinity part
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: schedule
operator: In
values:
- here
# --- nodeAffinity part
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
-
$ kubectl get pods
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-1616325840-5zkbk 0/1 Completed 0 2m14s 10.4.2.102 node-ffb5 <none> <none>
hello-1616325900-lwndf 0/1 Completed 0 74s 10.4.2.103 node-ffb5 <none> <none>
hello-1616325960-j9kz9 0/1 Completed 0 14s 10.4.2.104 node-ffb5 <none> <none>
Дополнительные ресурсы:
Я полагаю, вы также можете взглянуть на этот ответ StackOverflow: