혼합 OS Kubernetes 클러스터에서 사용할 애플리케이션 조정

적용 대상: Azure Stack HCI 22H2의 AKS, Windows Server의 AKS

Azure Arc에서 사용하도록 설정된 AKS를 사용하면 Linux 및 Windows 노드 모두에서 Kubernetes 클러스터를 실행할 수 있지만 이러한 혼합 OS 클러스터에서 사용하기 위해 앱을 약간 편집해야 합니다. 이 방법 가이드에서는 노드 선택기 또는 taint 및 tolerations를 사용하여 애플리케이션이 올바른 호스트 OS에서 예약되도록 하는 방법을 알아봅니다.

이 문서에서는 Kubernetes 개념에 대한 기본 지식이 있다고 가정합니다. 자세한 내용은 AKS 하이브리드에 대한 Kubernetes 핵심 개념을 참조하세요.

노드 선택기

노드 선택기는 Pod 사양 YAML의 간단한 필드로, Pod가 운영 체제와 일치하는 정상 노드로만 예약되도록 제한합니다. Pod 사양 YAML에서 다음 예제와 같이 Windows 또는 Linux를 지정 nodeSelector합니다.

kubernetes.io/os = Windows

또는

kubernetes.io/os = Linux

nodeSelectors에 대한 자세한 내용은 노드 선택기를 참조하세요.

테인트 및 톨러레이션

Taint 및toleration은 함께 작동하여 Pod가 의도치 않게 노드에서 예약되지 않도록 합니다. 노드는 Pod 사양 YAML의 "허용"을 통해 명시적으로 taint를 용납하지 않는 Pod를 거부하기 위해 "tainted"될 수 있습니다.

AKS Arc의 Windows OS 노드는 New-AksHciNodePool 또는 New-AksHciCluster 명령을 사용하여 만들 때 오염될 수 있습니다. 이러한 명령을 사용하여 Linux OS 노드를 오염할 수도 있습니다. 다음 예제에서는 Windows 노드를 오염합니다.

새 클러스터에 taint 적용

또한 새 클러스터를 만드는 경우 다음 명령을 실행하여 taint가 있는 Windows 노드 풀을 만듭니다. taint를 사용하여 노드 풀을 추가하려는 기존 클러스터가 있는 경우 명령을 사용하는 다음 예제를 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에 대한 toleration 지정

Pod 사양 YAML에서 Pod에 대한 toleration을 지정할 수 있습니다. 다음 내화는 이전 예제에 표시된 taint 선에 의해 kubectl 생성된 taint를 "일치"합니다. 그 결과 톨러레이션이 있는 Pod가 오염된 노드로 예약할 수 있습니다.

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

배포하는 Pod 사양을 제어하는 경우 이 섹션의 단계가 잘 작동합니다. 그러나 경우에 따라 사용자에게는 Linux 컨테이너에 대한 기존의 많은 수의 배포와 커뮤니티 Helm 차트와 같은 일반적인 구성의 에코시스템이 있습니다. 차트를 다운로드하고 편집하려는 경우가 아니면 Pod 사양에 액세스할 수 없습니다.

Linux 및 Windows 작업자 노드가 모두 있는 혼합 클러스터 환경에 이러한 Helm 차트를 배포하면 "ImagePullBackOff" 오류와 함께 애플리케이션 Pod가 실패합니다. 예를 들면 다음과 같습니다.

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

이 instance taint를 사용하여 도움을 줄 수 있습니다. Windows Server 노드는 키-값 쌍 node.kubernetes.io/os=windows:NoSchedule으로 오염될 수 있습니다.

taint 및 tolerations에 대한 자세한 내용은 Taints 및 Tolerations를 참조하세요.

다음 단계

이 방법 가이드에서는 kubectl을 사용하여 Kubernetes 클러스터에 노드 선택기 또는 테인트 및 톨러레이션을 추가하는 방법을 알아보았습니다. 다음으로, 다음을 수행할 수 있습니다.