Предотвратите автоматическое масштабирование кластера от уничтожения модуля

#amazon-web-services #kubernetes #amazon-ec2 #amazon-eks #kubernetes-cronjob

Вопрос:

У меня есть настройка AWS EKS K8s с группой автоматического масштабирования, которая использует спотовые экземпляры.

Раз в день по расписанию выполняется кронджоб K8s, который уменьшает количество развертываний , запускает сценарий в модуле в течение 15 минут, а затем выполняет резервное копирование развертываний.

Проблема в том, что после масштабирования развертываний сценарий запускается, и автоматическое масштабирование кластера запускает триггеры для удаления некоторых узлов примерно через 10 минут, что убивает модуль сценария и перемещает его на другой узел.

Этого не может произойти, как мне настроить модуль скрипта cronjob так, чтобы он никогда не был уничтожен автомасштабером?

Спасибо!

Ответ №1:

Этого не может произойти, как мне настроить модуль скрипта cronjob так, чтобы он никогда не был уничтожен автомасштабером?

Вы можете использовать сходство узла или модуля для планирования модуля на определенном узле, чтобы cronjob не запускал модули на спотовых экземплярах, только ваша рабочая нагрузка без состояния будет выполняться на спотовом экземпляре, о котором вы не очень заботитесь.

 apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: test
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - web-store
                topologyKey: "kubernetes.io/hostname"
          containers:
            - name: hello
              image: bash
              command: ["echo",  "Hello world"]
          restartPolicy: OnFailure
 

Вы также можете использовать селектор узлов для планирования модуля для определенного типа группы узлов, которая не масштабируется вверх и вниз.

Пример сходства узлов

 affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - e2e-az1
            - e2e-az2
 

Используя сходство, вы можете спланировать, на каком узле запланировать свои модули.

Подробнее читайте по адресу : https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/

Комментарии:

1. Спасибо за идею. К сожалению, для нашей установки на данный момент существуют только спотовые экземпляры. Модуль, который я не хочу убивать, работает всего 15 минут, я нашел решение добавить этот флаг в определение модуля, которое должно предотвратить его уничтожение автомасштабером, протестировав его сейчас. "cluster-autoscaler.kubernetes.io/safe-to-evict": "false"

2. Да, это будет работать там также опция для PDB, у которой есть несколько ограничений, лучше только для этой аннотации