Адаптация приложений для использования в кластерах Kubernetes смешанной ОС

Область применения: AKS в Azure Stack HCI 22H2, AKS на Windows Server

AKS с поддержкой Arc позволяет запускать кластеры Kubernetes как с узлами Linux, так и с Windows, но для использования в этих кластерах смешанной ОС необходимо внести небольшие изменения. В этом руководстве описывается, как убедиться, что приложение будет запланировано на правильной ОС узла с помощью селекторов узлов или селекторов узлов, а также отметок и толерации.

В этой статье предполагается базовое понимание концепций Kubernetes. Дополнительные сведения см. в основных понятиях Kubernetes для AKS, включенных Arc.

Селекторы узлов

Селектор узлов — это простое поле в спецификации POD YAML, которое ограничивает выполнение модулей pod только на здоровые узлы, соответствующие операционной системе. В спецификации pod YAML укажите nodeSelector значение Windows или Linux, как показано в следующих примерах:

kubernetes.io/os = Windows

или

kubernetes.io/os = Linux

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

Ограничения и допуски

Ограничения и терпимые элементы работают вместе, чтобы обеспечить непреднамеренное планирование модулей pod на узлах. Узел можно "запятнать", чтобы отклонить модули pod, которые явно не допускают его тон через "терпимую" спецификацию pod YAML.

Узлы ОС Windows в AKS Arc можно запятнать при создании с помощью команд New-AksHciNodePool или New-AksHciCluster . Эти команды также можно использовать для запятой узлов ОС Linux. В следующем примере показано, как запятнать узлы Windows.

Применение отметок к новому кластеру

Если вы также создаете новый кластер, выполните следующую команду, чтобы создать пул узлов Windows с запятой. Если у вас есть существующий кластер, в который требуется добавить пул узлов с запятой, см. следующий пример, в котором используется New-AksHciNodePool команда.

New-AksHciCluster -name mycluster -nodePoolName taintnp -nodeCount 1 -osType Windows -osSku Windows2022 -taints sku=Windows:NoSchedule

Добавление запятнаного пула узлов в существующий кластер

Чтобы добавить незащищенный пул узлов в существующий кластер, выполните следующую команду:

New-AksHciNodePool -clusterName <cluster-name> -nodePoolNAme taintnp -count 1 -osType Windows -osSku Windows2022 -taints sku=Windows:NoSchedule

Чтобы убедиться, что пул узлов успешно развернут с помощью фрагмента, выполните следующую команду:

Get-AksHciNodePool -clusterName <cluster-name> -name taintnp

Пример результата:

Status       : {Phase, Details}
ClusterName  : mycluster
NodePoolName : taintnp
Version      : v1.20.7-kvapkg.1
OsType       : Windows
NodeCount    : 0
VmSize       : Standard_K8S3_v1
Phase        : Deployed
Taints       : {sku=Windows:NoSchedule}

Указание толерации для pod

Вы можете указать терпимое значение для модуля pod в спецификации pod YAML. Следующая терпимость "соответствует" таиту, созданному строкой kubectl талинта, показанной в предыдущем примере. Результатом является то, что модуль pod с переносом может запланировать на запятнаемые узлы.

tolerations:
- key: node.kubernetes.io/os
  operator: Equal
  value: Windows
  effect: NoSchedule

Действия, описанные в этом разделе, хорошо работают, если вы управляете спецификацией pod, которую вы развертываете. Однако в некоторых случаях у пользователей уже есть большое количество развертываний для контейнеров Linux, а также экосистема общих конфигураций, таких как диаграммы Helm сообщества. У вас нет доступа к спецификации pod, если вы не хотите скачать и изменить диаграмму.

При развертывании этих диаграмм Helm в смешанной среде кластера с рабочими узлами Linux и Windows модули pod приложения завершаются ошибкой ImagePullBackOff. Например:

kubectl get pods
NAMESPACE              NAME                                                    READY   STATUS              RESTARTS   AGE
default                nginx-deployment-558fc78868-795dp                       0/1     ImagePullBackOff    0          6m24s
default                nginx-deployment-6b474476c4-gpb77                       0/1     ImagePullBackOff    0          11m

В этом экземпляре можно использовать тоны , чтобы помочь в этом. Узлы Windows Server можно запятнать парой node.kubernetes.io/os=windows:NoSchedule"ключ-значение".

Дополнительные сведения об обнажениях и терпимостях см. в разделе "Таинты" и "Толерации".

Следующие шаги

В этом руководстве вы узнали, как добавлять селекторы узлов или селекторы и творить в кластеры Kubernetes с помощью kubectl. Далее вы можете выполнить такую задачу: