

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# EKS 클러스터에 Windows 노드 배포
<a name="windows-support"></a>

Amazon EKS 클러스터에 대한 Windows 지원을 활성화하고 관리하여 Linux 컨테이너와 함께 Windows 컨테이너를 실행하는 방법을 알아봅니다.

## 고려 사항
<a name="_considerations"></a>

Windows 노드를 배포하기 전에 다음 사항을 고려해야 합니다.
+ EKS Auto Mode는 Windows 노드를 지원하지 않습니다.
+ `HostProcess` 포드로 Windows 노드에서 호스트 네트워킹을 사용할 수 있습니다. 자세한 내용은 Kubernetes Documentation의 [Create a Windows HostProcessPod](https://kubernetes.io/docs/tasks/configure-pod-container/create-hostprocess-pod/)를 참조하세요.
+ Amazon EKS 클러스터에는 CoreDNS와 같이 Linux에서만 실행되는 코어 시스템 포드를 실행하기 위한 Linux 또는 Fargate 노드가 하나 이상 있어야 합니다.
+ `kubelet` 및 `kube-proxy` 이벤트 로그는 `EKS Windows` 이벤트 로그로 리디렉션되며 200MB 제한으로 설정됩니다.
+ Windows 노드에서 실행 중인 포드가 있는 [개별 포드에 보안 그룹 할당](security-groups-for-pods.md)을 사용할 수 없습니다.
+ Windows 노드에서는 [사용자 지정 네트워킹](cni-custom-network.md)을 사용할 수 없습니다.
+ Windows 노드에서는 `IPv6`를 사용할 수 없습니다.
+ Windows 노드는 노드당 하나의 탄력적 네트워크 인터페이스를 지원합니다. 기본적으로 Windows 노드당 실행할 수 있는 포드 수는 노드의 인스턴스 유형에 대해 탄력적 네트워크 인터페이스당 사용 가능한 IP 주소 수에서 1을 뺀 값과 같습니다. 자세한 내용은 Amazon EC2 사용 설명서의 [IP addresses per network interface per instance type](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-eni.html#AvailableIpPerENI)를 참조하세요.**
+ Amazon EKS 클러스터에서 로드 밸런서가 있는 단일 서비스는 최대 1,024개의 백엔드 포드를 지원할 수 있습니다. 각 포드에는 고유한 IP 주소가 있습니다. [OS 빌드 17763.2746](https://support.microsoft.com/en-us/topic/march-22-2022-kb5011551-os-build-17763-2746-preview-690a59cd-059e-40f4-87e8-e9139cc65de4)부터 [Windows Server 업데이트](https://github.com/microsoft/Windows-Containers/issues/93) 후 이전의 포드 64개 제한이 더 이상 적용되지 않습니다.
+ Windows 컨테이너는 Fargate의 Amazon EKS 포드에 대해 지원되지 않습니다.
+ Amazon EKS Hybrid Nodes를 Windows와 함께 호스트의 운영 체제로 사용할 수 없습니다.
+ `vpc-resource-controller` 포드에서 로그를 검색할 수 없습니다. 이전에는 컨트롤러를 데이터 영역에 배포할 때 가능했습니다.
+ `IPv4` 주소가 새 포드에 할당되기 전에 휴지 기간이 있습니다. 이렇게 하면 오래된 `kube-proxy` 규칙으로 인해 동일한 `IPv4` 주소를 사용하는 이전 포드로 트래픽이 흐르는 것을 방지할 수 있습니다.
+ 컨트롤러의 소스는 GitHub에서 관리됩니다. 컨트롤러에 기여하거나 컨트롤러에 대한 문제를 제기하려면 GitHub의 [project](https://github.com/aws/amazon-vpc-resource-controller-k8s)를 방문하세요.
+ Windows 관리형 노드 그룹에 사용자 지정 AMI ID를 지정할 때는 AWS IAM Authenticator 구성 맵에 `eks:kube-proxy-windows`를 추가합니다. 자세한 내용은 [AMI ID 지정 시 제한과 조건](launch-templates.md#mng-ami-id-conditions) 섹션을 참조하세요.
+ 사용 가능한 IPv4 주소를 유지하는 것이 서브넷에 중요한 경우 [EKS Best Practices Guide - Windows Networking IP Address Management](https://aws.github.io/aws-eks-best-practices/windows/docs/networking/#ip-address-management)를 참조하세요.
+ EKS 액세스 항목에 대한 고려 사항
  + Windows 노드와 함께 사용할 액세스 항목에는 `EC2_WINDOWS` 유형이 필요합니다. 자세한 내용은 [액세스 항목 생성](creating-access-entries.md) 섹션을 참조하세요.

    Windows 노드에 대한 액세스 항목을 생성하려면 다음을 수행하세요.

    ```
    aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/<role-name> --type EC2_Windows
    ```

## 사전 조건
<a name="_prerequisites"></a>
+ 기존 클러스터가 있어야 합니다.
+ CoreDNS를 실행하려면 클러스터에 Linux 노드 또는 Fargate 포드가 1개 이상(최소 2개 권장) 있어야 합니다. 레거시 Windows 지원을 사용 설정하는 경우 Linux 노드(Fargate 포드 사용 불가)를 사용하여 CoreDNS를 실행해야 합니다.
+ 기존 [Amazon EKS 클러스터 IAM 역할](cluster-iam-role.md).

## Windows 지원 사용
<a name="enable-windows-support"></a>

1. 클러스터에 Amazon Linux 노드가 없고 포드에 보안 그룹을 사용하는 경우 다음 단계로 건너뜁니다. 그렇지 않으면 `AmazonEKSVPCResourceController` 관리형 정책이 [클러스터 역할](cluster-iam-role.md)에 연결되어 있는지 확인합니다. *eksClusterRole*을 클러스터 역할 이름으로 바꿉니다.

   ```
   aws iam list-attached-role-policies --role-name eksClusterRole
   ```

   예제 출력은 다음과 같습니다.

   ```
   {
       "AttachedPolicies": [
           {
               "PolicyName": "AmazonEKSClusterPolicy",
               "PolicyArn": "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
           },
           {
               "PolicyName": "AmazonEKSVPCResourceController",
               "PolicyArn": "arn:aws:iam::aws:policy/AmazonEKSVPCResourceController"
           }
       ]
   }
   ```

   이전 출력에서와 같이 정책이 연결된 경우 다음 단계를 건너뜁니다.

1. ** [AmazonEKSVPCResourceController](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKSVPCResourceController.html) ** 관리형 정책을 [Amazon EKS 클러스터 IAM 역할 ](cluster-iam-role.md)에 연결합니다. *eksClusterRole*을 클러스터 역할 이름으로 바꿉니다.

   ```
   aws iam attach-role-policy \
     --role-name eksClusterRole \
     --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController
   ```

1. VPC CNI ConfigMap을 업데이트하여 Windows IPAM을 활성화합니다. 참고로, 헬름 차트를 사용하거나 Amazon EKS 추가 기능으로 클러스터에 VPC CNI를 설치한 경우 ConfigMap을 직접 수정하지 못할 수 있습니다. Amazon EKS 추가 기능 구성에 대한 자세한 내용은 [Amazon EKS 추가 기능에 대해 사용자 지정할 수 있는 필드 확인](kubernetes-field-management.md) 섹션을 참조하세요.

   1. 다음 내용이 포함된 *vpc-resource-controller-configmap.yaml*이라는 파일을 생성합니다.

      ```
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: amazon-vpc-cni
        namespace: kube-system
      data:
        enable-windows-ipam: "true"
      ```

   1. 클러스터에 `ConfigMap` 적용.

      ```
      kubectl apply -f vpc-resource-controller-configmap.yaml
      ```

1. 클러스터에 `aws-auth` configmap을 활성화하도록 인증 모드가 설정된 경우
   + `aws-auth` `ConfigMap`에 Windows 노드의 인스턴스 역할에 대한 매핑이 포함되어 `eks:kube-proxy-windows` RBAC 권한 그룹을 포함하는지 확인합니다. 다음 명령을 실행하여 확인할 수 있습니다.

     ```
     kubectl get configmap aws-auth -n kube-system -o yaml
     ```

     예제 출력은 다음과 같습니다.

     ```
     apiVersion: v1
     kind: ConfigMap
     metadata:
       name: aws-auth
       namespace: kube-system
     data:
       mapRoles: |
         - groups:
           - system:bootstrappers
           - system:nodes
           - eks:kube-proxy-windows # This group is required for Windows DNS resolution to work
           rolearn: arn:aws:iam::111122223333:role/eksNodeRole
           username: system:node:{{EC2PrivateDNSName}}
     [...]
     ```

     그룹 아래에 `eks:kube-proxy-windows`가 표시될 것입니다. 그룹이 지정되지 않은 경우 `ConfigMap`을 업데이트하거나 생성하여 필수 그룹을 포함해야 합니다. `aws-auth` `ConfigMap`에 대한 자세한 내용은 [클러스터에 `aws-auth` `ConfigMap` 적용](auth-configmap.md#aws-auth-configmap) 섹션을 참조하세요.

1. 클러스터에 `aws-auth` configmap을 비활성화하도록 인증 모드가 설정된 경우 EKS 액세스 항목을 사용할 수 있습니다. Windows 인스턴스와 함께 사용할 새 노드 역할을 생성하면 EKS가 `EC2_WINDOWS` 유형의 액세스 항목을 자동으로 생성합니다.

## Windows 포드 배포
<a name="windows-support-pod-deployment"></a>

클러스터에 포드를 배포할 때 노드 유형을 혼합하여 실행하는 경우 사용되는 운영 체제를 지정해야 합니다.

Linux 포드의 경우 매니페스트에서 다음 노드 선택기 텍스트를 사용합니다.

```
nodeSelector:
        kubernetes.io/os: linux
        kubernetes.io/arch: amd64
```

Windows 포드의 경우 매니페스트에서 다음 노드 선택기 텍스트를 사용합니다.

```
nodeSelector:
        kubernetes.io/os: windows
        kubernetes.io/arch: amd64
```

[샘플 애플리케이션](sample-deployment.md)을 배포하여 사용 중인 노드 선택기를 볼 수 있습니다.

## Windows 노드에서 더 높은 포드 밀도 지원
<a name="windows-support-pod-density"></a>

Amazon EKS에서 각 포드에는 VPC의 `IPv4` 주소가 할당됩니다. 이로 인해 노드에서 더 많은 포드를 실행하기에 충분한 리소스가 있더라도 노드에 배포할 수 있는 포드 수는 사용 가능한 IP 주소에 의해 제한됩니다. Windows 노드에서는 탄력적 네트워크 인터페이스를 하나만 지원하므로 기본적으로 Windows 노드에서 사용 가능한 최대 IP 주소 수는 다음과 같습니다.

```
Number of private IPv4 addresses for each interface on the node - 1
```

하나의 IP 주소는 네트워크 인터페이스의 기본 IP 주소로 사용되므로 포드에 할당할 수 없습니다.

IP 접두사 위임을 활성화하여 Windows 노드에서 더 높은 포드 밀도를 활성화할 수 있습니다. 이 기능을 사용하면 보조 `IPv4` 주소를 할당하는 대신 기본 네트워크 인터페이스에 `/28` `IPv4` 접두사를 할당할 수 있습니다. IP 접두사를 할당하면 노드에서 사용 가능한 최대 `IPv4` 주소가 다음으로 증가합니다.

```
(Number of private IPv4 addresses assigned to the interface attached to the node - 1) * 16
```

이렇게 사용 가능한 IP 주소의 수가 상당히 많기 때문에 사용 가능한 IP 주소가 노드의 포드 수를 확장하는 기능을 제한하지는 않습니다. 자세한 내용은 [접두사를 사용하여 Amazon EKS 노드에 추가 IP 주소 할당](cni-increase-ip-addresses.md) 섹션을 참조하세요.