EKS 클러스터에 Windows 노드 배포하기

EKS 클러스터에 Windows 노드 배포하기

Linux 컨테이너와 함께 Windows 컨테이너를 실행하도록 Amazon EKS 클러스터의 Windows 지원을 활성화하고 관리하는 방법을 알아봐요.

출처: 문서

본문

고려 사항 (Considerations)

Windows 노드를 배포하기 전에 다음 고려 사항을 인지해 주세요.

  • EKS Auto Mode는 Windows 노드를 지원하지 않아요.
  • HostProcess Pod를 사용해 Windows 노드에서 호스트 네트워킹을 사용할 수 있어요. 자세한 내용은 Kubernetes 문서의 Create a Windows HostProcess Pod 참고.
  • Amazon EKS 클러스터에는 CoreDNS 같은 Linux에서만 실행되는 핵심 시스템 파드를 실행하려면 하나 이상의 Linux 또는 Fargate 노드가 있어야 해요.
  • kubelet과 kube-proxy 이벤트 로그는 EKS Windows 이벤트 로그로 리다이렉션되며 200 MB 한도로 설정돼요.
  • Windows 노드에서 실행되는 파드에는 Assign security groups to individual pods를 사용할 수 없어요.
  • Windows 노드에서는 사용자 지정 네트워킹을 사용할 수 없어요.
  • Windows 노드에서는 IPv6을 사용할 수 없어요.
  • Windows 노드는 노드당 하나의 탄력적 네트워크 인터페이스를 지원해요. 기본적으로 Windows 노드당 실행할 수 있는 파드 수는 노드 인스턴스 유형의 네트워크 인터페이스당 사용 가능한 IP 주소 수 - 1과 같아요. 자세한 내용은 Amazon EC2 사용자 안내서의 IP addresses per network interface per instance type 참고.
  • Amazon EKS 클러스터에서 로드 밸런서가 있는 단일 서비스는 최대 1024개의 백엔드 파드를 지원할 수 있어요. 각 파드는 고유한 IP 주소를 가져요. 이전 64 Pod 제한은 OS Build 17763.2746부터 시작하는 Windows Server 업데이트 이후 더 이상 적용되지 않아요.
  • Amazon EKS Pods on Fargate에서는 Windows 컨테이너가 지원되지 않아요.
  • 호스트 운영체제로 Windows를 사용하는 Amazon EKS Hybrid Nodes는 사용할 수 없어요.
  • vpc-resource-controller Pod에서 로그를 검색할 수 없어요. 이전에 컨트롤러를 데이터 플레인에 배포했다면 가능했어요.
  • 새 Pod에 IPv4 주소가 할당되기 전에 쿨다운 기간이 있어요. 이는 오래된 kube-proxy 규칙 때문에 같은 IPv4 주소를 가진 이전 Pod로 트래픽이 흐르는 것을 방지해요.
  • 컨트롤러의 소스는 GitHub에서 관리돼요. 컨트롤러에 기여하거나 이슈를 제기하려면 GitHub 프로젝트를 방문해 주세요.
  • Windows 관리형 노드 그룹에 사용자 지정 AMI ID를 지정할 때 AWS IAM Authenticator 구성 맵에 eks:kube-proxy-windows를 추가해 주세요. 자세한 내용은 Limits and conditions when specifying an AMI ID 참고.
  • 서브넷의 사용 가능한 IPv4 주소를 보존하는 것이 중요하다면 EKS 모범 사례 가이드의 Windows Networking IP Address Management를 참고해 주세요.

EKS Access Entries를 위한 고려 사항 (Considerations for EKS Access Entries)

Windows 노드와 함께 사용하는 Access Entries에는 EC2_WINDOWS 유형이 필요해요. 자세한 내용은 Create access entries 참고.

Windows 노드의 access entry를 만들려면:

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

사전 조건 (Prerequisites)

  • 기존 클러스터.
  • 클러스터에는 CoreDNS를 실행하려면 최소 하나(두 개 이상 권장)의 Linux 노드 또는 Fargate 파드가 있어야 해요. 레거시 Windows 지원을 활성화하면 CoreDNS를 실행하려면 Linux 노드를 사용해야 해요(Fargate 파드는 사용할 수 없어요).
  • 기존 Amazon EKS 클러스터 IAM 역할.

Windows 지원 활성화하기 (Enable Windows support)

클러스터에 Amazon Linux 노드가 없고 파드에 보안 그룹을 사용한다면 다음 단계로 건너뜁니다. 그렇지 않으면 AmazonEKSVPCResourceController 관리형 정책이 클러스터 역할에 연결되어 있는지 확인합니다. 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"
        }
    ]
}

정책이 연결되어 있다면(이전 출력처럼) 다음 단계를 건너뜁니다.

AmazonEKSVPCResourceController 관리형 정책을 Amazon EKS 클러스터 IAM 역할에 연결합니다. eksClusterRole을 클러스터 역할 이름으로 바꿉니다.

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

VPC CNI ConfigMap을 업데이트해 Windows IPAM을 활성화합니다. VPC CNI가 Helm 차트나 Amazon EKS Add-on으로 설치된 경우 ConfigMap을 직접 수정하지 못할 수 있어요. Amazon EKS Add-ons 구성에 대한 자세한 내용은 Determine fields you can customize for Amazon EKS add-ons 참고.

vpc-resource-controller-configmap.yaml이라는 파일을 다음 내용으로 만듭니다.

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

ConfigMap을 클러스터에 적용합니다.

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

클러스터의 인증 모드가 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}}
[...]

groups 아래에 eks:kube-proxy-windows가 나열되어야 해요. 그룹이 지정되지 않았다면 ConfigMap을 업데이트하거나 만들고 필요한 그룹을 포함해야 해요. aws-auth ConfigMap에 대한 자세한 내용은 Apply the aws-auth ConfigMap to your cluster 참고.

클러스터의 인증 모드가 aws-auth configmap을 비활성화하도록 설정된 경우 EKS Access Entries를 사용할 수 있어요. Windows 인스턴스와 함께 사용할 새 노드 역할을 만들면 EKS가 EC2_WINDOWS 유형의 access entry를 자동으로 만들어요.

Windows 파드 배포하기 (Deploy Windows Pods)

클러스터에 파드를 배포할 때 노드 유형을 섞어 실행한다면 파드가 사용하는 운영체제를 지정해야 해요.

Linux 파드의 경우 매니페스트에 다음 node selector 텍스트를 사용합니다.

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

Windows 파드의 경우 매니페스트에 다음 node selector 텍스트를 사용합니다.

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

샘플 애플리케이션을 배포해 node selector가 사용되는 것을 볼 수 있어요.

Windows 노드에서 더 높은 파드 밀도 지원하기 (Support higher Pod density on Windows nodes)

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

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

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

IP prefix 위임을 활성화해 Windows 노드에서 더 높은 파드 밀도를 활성화할 수 있어요. 이 기능을 사용하면 보조 IPv4 주소를 할당하는 대신 기본 네트워크 인터페이스에 /28 IPv4 prefix를 할당할 수 있어요. IP prefix를 할당하면 노드의 사용 가능한 최대 IPv4 주소가 다음으로 늘어나요:

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

사용 가능한 IP 주소 수가 훨씬 많아지므로 노드의 파드 수를 확장하는 데 IP 주소가 제한되지 않아요. 자세한 내용은 Assign more IP addresses to Amazon EKS nodes with prefixes 참고.

더 알아보기 (Learn more)