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

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

11 января 2023 г.

Taint и affinity в Kubernetes — это два механизма, которые позволяют пользователям указывать, как следует планировать модули pod на узлах в кластере. Селекторы узлов — это еще один механизм, который позволяет пользователям указывать, на какие узлы следует запланировать модуль. В этой статье мы объясним разницу между taint, affinity и селектором узлов в Kubernetes и как их можно использовать для управления планированием pod в кластере.

Порча

Different taints require different tolerations for pods to run

Taint — это функция в Kubernetes, которая позволяет пользователям помечать узел как «испорченный» с помощью определенного ключа и значения. Поды, которые не допускают заражения, не будут планироваться на зараженном узле. Taint можно использовать, чтобы пометить узлы как недоступные для определенных модулей, например, если узел находится на обслуживании или если у него есть определенная аппаратная или программная конфигурация, которая не подходит для определенных рабочих нагрузок.

Чтобы заразить узел, используйте команду kubectl taint. Например, чтобы испортить узел с ключом "disktype" и значением "ssd", используйте следующую команду:

kubectl taint nodes <node-name> disktype=ssd:NoSchedule

Чтобы допустить загрязнение, вы можете указать допуск в спецификации модуля. Например, следующая спецификация pod допускает пометку "disktype=ssd" с допустимым периодом 3600 секунд:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  tolerations:
  - key: "disktype"
    operator: "Equal"
    value: "ssd"
    effect: "NoSchedule"
    tolerationSeconds: 3600
  containers:
  - name: my-container
    image: nginx

==📋Важное примечание. Taints и Tolerations не гарантируют, что модули будут отдавать предпочтение только этим узлам. Таким образом, модули могут быть запланированы на других незапятнанных узлах.==

Близость

The difference between having something, and desiring something else :-)

Affinity в Kubernetes — это механизм, который позволяет пользователям указывать правила планирования подов на основе атрибутов узла. Существует два типа привязки: привязка к узлам и привязка к модулям.

Привязка узлов

Привязка к узлам позволяет пользователям указывать, какие узлы должны или не должны быть запланированы для модуля на основе меток узлов. Например, вы можете использовать привязку узлов, чтобы указать, что модуль должен быть запланирован на узле с определенной меткой, такой как disktype=ssd.

Чтобы указать сходство узлов в спецификации модуля, используйте поле affinity и задайте в поле nodeAffinity нужные правила сходства узлов. Например, следующая спецификация модуля указывает, что модуль должен быть запланирован на узле с меткой disktype=ssd:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd
  containers:
  - name: my-container
    image: nginx

==📋Важное примечание: ** Сопоставление узлов само по себе не гарантирует, что другие модули также не запланированы на тех же узлах.==

Сходство подов

Сопоставление модулей позволяет пользователям указывать, какие модули должны или не должны быть запланированы для модуля на основе ярлыков. Например, вы можете использовать привязку модулей, чтобы указать, что модуль должен быть запланирован на том же узле, что и другие модули с определенной меткой, например app=database.

Чтобы указать привязку pod в спецификации pod, используйте поле affinity и задайте `podAffinity

Селектор узла

Choose which tainted node should run your pod

Селектор узлов — это функция в Kubernetes, которая позволяет пользователям указывать, какие узлы должны быть запланированы для модуля на основе меток узлов. Селектор узлов работает, добавляя метки к узлам, а затем указывая нужные метки узлов в спецификации модуля.

Чтобы добавить метки к узлу, используйте команду kubectl label. Например, чтобы добавить к узлу метку disktype=ssd, используйте следующую команду:

kubectl label nodes <node-name> disktype=ssd
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  nodeSelector:
    disktype: ssd
  containers:
  - name: my-container
    image: nginx

Селектор узлов аналогичен привязке узлов в том, что оба позволяют пользователям указывать, какие узлы должны быть запланированы для модуля на основе меток узлов. Однако селектор узлов — это более простой и примитивный механизм по сравнению с привязкой узлов, который обеспечивает более детальный контроль над планированием пакетов.

Подводя итог, можно сказать, что taint и affinity в Kubernetes позволяют пользователям задавать правила планирования модулей на основе атрибутов узлов, а средство выбора узлов позволяет пользователям указывать, на какие узлы должен быть запланирован модуль, на основе меток узлов. Все три механизма можно использовать для управления планированием модулей в кластере и обеспечения планирования модулей на соответствующих узлах в соответствии с требованиями рабочей нагрузки.

Рекомендации и рекомендации

Вот несколько рекомендаций по использованию taint, affinity и селектора узлов в Kubernetes:

  • Комбинация Taints & Правила допусков и соответствия узлов можно использовать вместе, чтобы полностью выделить узлы для конкретных модулей. Мы используем Taints & Допуски для предотвращения планирования других модулей на нужных узлах, а затем мы используем Node Affinity, чтобы наши модули были запланированы на нужных узлах.
  • Taint следует использовать, если вы хотите пометить узел как недоступный для определенных модулей. Например, вы можете использовать taint, чтобы пометить узел как "обслуживаемый" и предотвратить планирование модулей на узле, пока он находится на обслуживании.
  • Сходство узлов следует использовать, если вы хотите указать, какие узлы следует или не следует планировать для модуля на основе меток узлов. Привязка узлов обеспечивает более детальный контроль над планированием пакетов по сравнению с селектором узлов и позволяет указывать сложные правила для планирования пакетов на основе нескольких меток узлов.
  • Привязка модулей следует использовать, если вы хотите указать, какие модули должны или не должны быть запланированы для модуля на основе ярлыков. Сходство модулей можно использовать, чтобы убедиться, что определенные модули находятся на одном узле, или чтобы определенные модули были отделены друг от друга.
  • Селектор узлов следует использовать, если вы хотите указать, какие узлы следует запланировать для модуля, на основе меток узлов, но не требует детального контроля, обеспечиваемого привязкой узлов. Селектор узлов — это более простой и примитивный механизм по сравнению с привязкой узлов, и его достаточно для многих случаев использования.

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


Надеюсь, вам понравилась эта статья. Следите за новостями, связанными с DevOps 👾🦄

Дополнительные ресурсы:

:::информация Также опубликовано здесь.

:::


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE