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

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

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

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

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

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

kubernetes.io/os = Windows

или

kubernetes.io/os = Linux

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

Отметки и допуски

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

Узлы ОС 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

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

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 в YAML спецификации pod. Следующая терпимость "соответствует" отметке, созданной строкой 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"ключ-значение".

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

Дальнейшие действия

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