

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 執行異質工作負載
<a name="windows-scheduling"></a>

Kubernetes 支援異質叢集，您可以在相同叢集中混合使用 Linux 和 Windows 節點。在該叢集中，您可以混合使用在 Linux 上執行的 Pod 和在 Windows 上執行的 Pod。您甚至可以在同一個叢集中執行多個版本的 Windows。不過，在做出此決策時，需要考慮幾個因素 （如下所述）。

## 將 PODs 指派給節點最佳實務
<a name="_assigning_pods_to_nodes_best_practices"></a>

為了將 Linux 和 Windows 工作負載保留在其各自的作業系統特定節點上，您需要使用節點選取器和污點/容錯的一些組合。在異質環境中排程工作負載的主要目標是避免中斷現有 Linux 工作負載的相容性。

## 確保作業系統特定的工作負載登陸適當的容器主機
<a name="_ensuring_os_specific_workloads_land_on_the_appropriate_container_host"></a>

使用者可以確保使用 nodeSelectors 在適當的主機上排程 Windows 容器。目前所有 Kubernetes 節點都有下列預設標籤：

```
kubernetes.io/os = [windows|linux]
kubernetes.io/arch = [amd64|arm64|...]
```

如果 Pod 規格不包含如 的 nodeSelector`"kubernetes.io/os": windows`，則可以在任何主機、Windows 或 Linux 上排程 Pod。這可能會有問題，因為 Windows 容器只能在 Windows 上執行，Linux 容器只能在 Linux 上執行。

在企業環境中，針對 Linux 容器擁有大量預先存在的部署，以及 Helm Chart 等off-the-shelf組態的生態系統並不罕見。在這些情況下，您可能會對部署的 nodeSelectors 進行變更感到遲疑。**另一種方法是使用 Taints**。

例如：`--register-with-taints='os=windows:NoSchedule'`

如果您使用的是 EKS，eksctl 提供透過 clusterConfig 套用污點的方法：

```
NodeGroups:
  - name: windows-ng
    amiFamily: WindowsServer2022FullContainer
    ...
    labels:
      nodeclass: windows2022
    taints:
      os: "windows:NoSchedule"
```

將污點新增至所有 Windows 節點，排程器不會在這些節點上排程 Pod，除非它們能容忍污點。Pod 資訊清單範例：

```
nodeSelector:
    kubernetes.io/os: windows
tolerations:
    - key: "os"
      operator: "Equal"
      value: "windows"
      effect: "NoSchedule"
```

## 處理相同叢集中的多個 Windows 組建
<a name="_handling_multiple_windows_build_in_the_same_cluster"></a>

每個 Pod 使用的 Windows 容器基礎映像必須符合與節點相同的核心建置版本。如果您想要在相同叢集中使用多個 Windows Server 組建，則應設定其他節點標籤、nodeSelectors 或利用稱為 **windows-build** 的標籤。

Kubernetes 1.17 會自動新增標籤 **node.kubernetes.io/windows-build**，以簡化相同叢集中多個 Windows 組建的管理。如果您執行的是較舊的版本，建議您手動將此標籤新增至 Windows 節點。

此標籤反映需要符合相容性的 Windows 主要、次要和建置編號。以下是目前用於每個 Windows Server 版本的值。

請務必注意，Windows Server 正在移至長期服務頻道 (LTSC) 做為主要發行頻道。Windows Server 半年頻道 (SAC) 已於 2022 年 8 月 9 日淘汰。Windows Server 未來不會有 SAC 版本。


| 產品名稱 | 組建編號 (s) | 
| --- | --- | 
|  伺服器完整 2022 LTSC  |  20348 年 10 月 0 日  | 
|  伺服器核心 2019 LTSC  |  10.0.17763  | 

您可以透過下列命令檢查作業系統建置版本：

```
kubectl get nodes -o wide
```

KERNEL-VERSION 輸出符合 Windows 作業系統建置版本。

```
NAME                          STATUS   ROLES    AGE   VERSION                INTERNAL-IP   EXTERNAL-IP     OS-IMAGE                         KERNEL-VERSION                  CONTAINER-RUNTIME
ip-10-10-2-235.ec2.internal   Ready    <none>   23m   v1.24.7-eks-fb459a0    10.10.2.235   3.236.30.157    Windows Server 2022 Datacenter   10.0.20348.1607                 containerd://1.6.6
ip-10-10-31-27.ec2.internal   Ready    <none>   23m   v1.24.7-eks-fb459a0    10.10.31.27   44.204.218.24   Windows Server 2019 Datacenter   10.0.17763.4131                 containerd://1.6.6
ip-10-10-7-54.ec2.internal    Ready    <none>   31m   v1.24.11-eks-a59e1f0   10.10.7.54    3.227.8.172     Amazon Linux 2                   5.10.173-154.642.amzn2.x86_64   containerd://1.6.19
```

以下範例會將額外的 nodeSelector 套用至 Pod 資訊清單，以便在執行不同的 Windows 節點群組作業系統版本時符合正確的 Windows 建置版本。

```
nodeSelector:
    kubernetes.io/os: windows
    node.kubernetes.io/windows-build: '10.0.20348'
tolerations:
    - key: "os"
    operator: "Equal"
    value: "windows"
    effect: "NoSchedule"
```

## 使用 RuntimeClass 簡化 Pod 資訊清單中的 NodeSelector 和公差
<a name="_simplifying_nodeselector_and_toleration_in_pod_manifests_using_runtimeclass"></a>

您也可以使用 RuntimeClass 來簡化使用污點和容錯的程序。這可以透過建立用於封裝這些污點和容錯的 RuntimeClass 物件來完成。

透過執行下列資訊清單來建立 RuntimeClass：

```
apiVersion: node.k8s.io/v1beta1
kind: RuntimeClass
metadata:
  name: windows-2022
handler: 'docker'
scheduling:
  nodeSelector:
    kubernetes.io/os: 'windows'
    kubernetes.io/arch: 'amd64'
    node.kubernetes.io/windows-build: '10.0.20348'
  tolerations:
  - effect: NoSchedule
    key: os
    operator: Equal
    value: "windows"
```

建立 Runtimeclass 之後，請使用 做為 Pod 資訊清單上的規格來指派：

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis-2022
  labels:
    app: iis-2022
spec:
  replicas: 1
  template:
    metadata:
      name: iis-2022
      labels:
        app: iis-2022
    spec:
      runtimeClassName: windows-2022
      containers:
      - name: iis
```

## 受管節點群組支援
<a name="_managed_node_group_support"></a>

為了協助客戶以更簡化的方式執行 Windows 應用程式，AWS 於 2022 年 12 月 15 日啟動對 [Windows 容器的 Amazon EKS 受管節點群組 (MNG) 支援](https://aws.amazon.com/about-aws/whats-new/2022/12/amazon-eks-automated-provisioning-lifecycle-management-windows-containers/)。為了協助協調營運團隊，[Windows MNGs](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html)會使用與 [Linux MNGs](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html) 相同的工作流程和工具來啟用。支援 Windows Server 2019 和 2022 的完整和核心 AMI (Amazon Machine Image) 系列版本。

受管節點群組 (MNG) 支援下列 AMI 系列。


| AMI 系列 | 
| --- | 
|  WINDOWS\$1CORE\$12019\$1x86\$164  | 
|  WINDOWS\$1FULL\$12019\$1x86\$164  | 
|  WINDOWS\$1CORE\$12022\$1x86\$164  | 
|  WINDOWS\$1FULL\$12022\$1x86\$164  | 

## 其他文件
<a name="_additional_documentations"></a>

AWS 官方文件：https：//https://docs.aws.amazon.com/eks/latest/userguide/windows-support.html

若要進一步了解 Pod Networking (CNI) 的運作方式，請查看以下連結：https：//https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html

部署適用於 Windows on EKS 的受管節點群組的 AWS 部落格：https：//https://aws.amazon.com/blogs/containers/deploying-amazon-eks-windows-managed-node-groups/