Сервис 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:

Другие вопросы по тегам