Windows 지원 - Amazon EKS

Windows 지원

Windows 노드를 배포하기 전에 다음 사항을 고려해야 합니다.

고려 사항

  • Amazon EC2 인스턴스 유형 C3, C4, D2, I2, M4(m4.16xlarge 제외), M6a.x 및 R3 인스턴스는 Windows 워크로드에서 지원되지 않습니다.

  • 호스트 네트워킹 모드는 Windows 워크로드에서 지원되지 않습니다.

  • Amazon EKS 클러스터에는 CoreDNS와 같이 Linux에서만 실행되는 코어 시스템 포드를 실행하기 위한 Linux 또는 Fargate 노드가 하나 이상 있어야 합니다.

  • kubeletkube-proxy 이벤트 로그는 EKS Windows 이벤트 로그로 리디렉션되며 200MB 제한으로 설정됩니다.

  • Windows 노드에서 실행되는 포드에 포드의 보안 그룹를 사용할 수 없습니다.

  • Windows 노드에서는 사용자 정의 네트워킹을 사용할 수 없습니다.

  • Windows 노드에서는 IP 접두사를 사용할 수 없습니다. 이것은 IPv6 사용을 위한 요구 사항이므로 Windows 노드에서도 IPv6를 사용할 수 없습니다.

  • Windows 노드는 노드당 하나의 탄력적 네트워크 인터페이스를 지원합니다. Windows 노드당 실행할 수 있는 포드 수는 노드의 인스턴스 유형에 대해 탄력적 네트워크 인터페이스당 사용 가능한 IP 주소 수에서 1을 뺀 값과 같습니다. 자세한 내용은 Windows 인스턴스용 Amazon EC2 사용 설명서인스턴스 유형별 네트워크 인터페이스당 IP 주소를 참조하세요.

  • Amazon EKS 클러스터에서 로드 밸런서가 있는 단일 서비스는 최대 64개의 백엔드 포드를 지원할 수 있습니다. 각 포드에는 고유한 IP 주소가 있습니다. 이는 Amazon EC2 노드에 있는 Windows 운영 체제의 제한 사항입니다.

  • Windows 관리형 노드 또는 Fargate 노드를 배포할 수 없습니다. 자체 관리형 Windows 노드만 생성할 수 있습니다. 자세한 정보는 자체 관리형 Windows 노드 시작을 참조하십시오.

  • vpc-resource-controller 포드에서 로그를 검색할 수 없습니다. 이전에는 컨트롤러를 데이터 영역에 배포할 때 가능했습니다.

  • IPv4 주소가 새 포드에 할당되기 전에 휴지 기간이 있습니다. 이렇게 하면 오래된 kube-proxy 규칙으로 인해 동일한 IPv4 주소를 사용하는 이전 포드로 트래픽이 흐르는 것을 방지할 수 있습니다.

  • 컨트롤러의 소스는 GitHub에서 관리됩니다. 컨트롤러에 기여하거나 컨트롤러에 대한 문제를 제기하려면 GitHub의 project를 방문하세요.

사전 조건

  • 기존 클러스터가 있어야 합니다. 클러스터는 다음 표에 나열된 Kubernetes 버전 및 플랫폼 버전 중 하나를 실행해야 합니다. 나열된 것보다 이후의 모든 Kubernetes 및 플랫폼 버전이 지원됩니다. 클러스터 또는 플랫폼 버전이 다음 버전 중 하나보다 이전인 경우 클러스터의 데이터 영역에서 레거시 Windows 지원을 사용 설정해야 합니다. 클러스터가 다음 Kubernetes 및 플랫폼 버전 이상 중 하나에 있으면 레거시 Windows 지원을 제거하고 제어 영역에서 Windows 지원을 사용 설정할 수 있습니다.

    Kubernetes 버전 플랫폼 버전
    1.21 eks.3
    1.20 eks.3
    1.19 eks.7
    1.18 eks.9
    1.17 eks.10

    CoreDNS를 실행하려면 클러스터에 Linux 노드 또는 Fargate 포드가 1개 이상(최소 2개 권장) 있어야 합니다. 레거시 Windows 지원을 사용 설정하는 경우 Linux 노드(Fargate 포드 사용 불가)를 사용하여 CoreDNS를 실행해야 합니다.

  • 기존 Amazon EKS 클러스터 IAM 역할.

Windows 지원 활성화

클러스터가 사전 조건에 나열된 Kubernetes 및 플랫폼 버전 중 하나 이상이 아니면 대신 레거시 Windows 지원을 사용 설정해야 합니다. 자세한 정보는 레거시 Windows 지원 사용을 참조하십시오.

클러스터에서 Windows 지원을 사용 설정한 적이 없다면 다음 단계로 건너뜁니다.

사전 조건에 나열된 Kubernetes 또는 플랫폼 버전보다 이전인 클러스터에서 Windows 지원을 사용 설정한 경우 먼저 데이터 영역에서 vpc-resource-controller 및 vpc-admission-webhook를 제거해야 합니다. 낙후되었으며 더 이상 필요하지 않습니다.

클러스터에 Windows 지원을 사용하려면

  1. 클러스터에 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" } ] }

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

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

    aws iam attach-role-policy \ --role-name eksClusterRole \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController
  3. 다음 내용이 포함된 vpc-resource-controller-configmap.yaml이라는 파일을 생성합니다.

    apiVersion: v1 kind: ConfigMap metadata: name: amazon-vpc-cni namespace: kube-system data: enable-windows-ipam: "true"
  4. 클러스터에 ConfigMap 적용

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

데이터 영역에서 레거시 Windows 지원 제거

사전 조건에 나열된 Kubernetes 또는 플랫폼 버전보다 이전인 클러스터에서 Windows 지원을 사용 설정한 경우 먼저 데이터 영역에서 vpc-resource-controllervpc-admission-webhook를 제거해야 합니다. 제공한 기능이 이제 제어 영역에서 사용 설정되기 때문에 낙후되어 더 이상 필요하지 않습니다.

  1. 다음 명령을 사용하여 vpc-resource-controller를 제거합니다. 원래 설치 시 사용한 도구에 관계없이 이 명령을 사용합니다. us-west-2(/manifests/ 뒤의 해당 텍스트 인스턴스만)을 클러스터가 있는 리전으로 바꿉니다.

    kubectl delete -f https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. 설치 시 사용한 도구에 대한 지침을 사용하여 vpc-admission-webhook를 제거합니다.

    eksctl

    다음 명령을 실행합니다.

    kubectl delete deployment -n kube-system vpc-admission-webhook kubectl delete service -n kube-system vpc-admission-webhook kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io vpc-admission-webhook-cfg
    kubectl on macOS or Windows

    다음 명령을 실행합니다. us-west-2(/manifests/ 뒤의 해당 텍스트 인스턴스만)을 클러스터가 있는 리전으로 바꿉니다.

    kubectl delete -f https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml
  3. 제어 영역에서 클러스터에 대한 Windows 지원을 사용 설정합니다.

Windows 지원 사용 중지

클러스터에서 Windows 지원을 사용 중지하려면

  1. 클러스터에 Amazon Linux 노드가 포함되어 있고 포드에 보안 그룹을 함께 사용하는 경우 이 단계를 건너뜁니다.

    클러스터 역할에서 AmazonVPCResourceController 관리형 IAM 정책을 제거합니다. eksClusterRole을 클러스터 역할 이름으로 바꾸고 111122223333을 계정 ID로 바꿉니다.

    aws iam detach-role-policy \ --role-name eksClusterRole \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController
  2. amazon-vpc-cni ConfigMap에서 Windows IPAM을 사용 중지합니다.

    kubectl patch configmap/amazon-vpc-cni \-n kube-system \--type merge \-p '{"data":{"enable-windows-ipam":"false"}}'

포드 배포

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

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

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

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

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

샘플 애플리케이션을 배포하여 사용 중인 노드 선택기를 볼 수 있습니다.

레거시 Windows 지원 사용

클러스터가 사전 조건에 나열된 Kubernetes 및 플랫폼 버전 중 하나 이상인 경우 대신 제어 영역에서 Windows 지원을 사용 설정하는 것이 좋습니다. 자세한 정보는 Windows 지원 활성화을 참조하십시오.

클러스터 또는 플랫폼 버전이 사전 조건에 나열된 버전보다 이전인 경우 다음 단계에 따라 Amazon EKS 클러스터의 데이터 영역에 대한 레거시 Windows 지원을 사용 설정할 수 있습니다. 클러스터 및 플랫폼 버전이 사전 조건에 나열된 버전 이상인 경우 레거시 Windows 지원을 제거하고 제어 영역에 대해 사용 설정하는 것이 좋습니다.

eksctl, Windows 클라이언트, macOS 또는 Linux 클라이언트를 사용하여 클러스터에 대해 레거시 Windows 지원을 사용할 수 있습니다.

eksctl

eksctl로 클러스터에 대한 레거시 Windows 지원을 사용하려면

사전 조건

이 절차에는 eksctl 버전 0.84.0 이상이 필요합니다. 버전은 다음 명령을 통해 확인할 수 있습니다.

eksctl version

eksctl 설치 또는 업그레이드에 대한 자세한 내용은 eksctl 설치 또는 업그레이드 단원을 참조하십시오.

  1. 다음 eksctl 명령을 사용하여 Amazon EKS 클러스터에 대한 Windows 지원을 활성화합니다. my-cluster를 해당 클러스터의 이름으로 바꿉니다. 이 명령은 Amazon EKS 클러스터에서 Windows 워크로드를 실행하는 데 필요한 VPC 리소스 컨트롤러 및 VPC 승인 컨트롤러 웹훅을 배포합니다.

    eksctl utils install-vpc-controllers --cluster my-cluster --approve
    중요

    VPC 승인 컨트롤러 Webhook는 발급일로부터 1년 후에 만료되는 인증서로 서명됩니다. 가동 중지 시간을 방지하려면 인증서가 만료되기 전에 인증서를 갱신해야 합니다. 자세한 정보는 VPC 승인 Webhook 인증서 갱신을 참조하십시오.

  2. Windows 지원을 활성화한 후 클러스터에서 Windows 노드 그룹을 시작할 수 있습니다. 자세한 정보는 자체 관리형 Windows 노드 시작을 참조하십시오.

Windows

Windows 클라이언트로 클러스터에 대해 레거시 Windows 지원을 사용하려면

다음 단계에서 us-west-2을 클러스터가 상주하는 리전으로 바꿉니다.

  1. VPC 리소스 컨트롤러를 클러스터에 배포합니다.

    kubectl apply -f https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. VPC 승인 컨트롤러 Webhook을 클러스터에 배포합니다.

    1. 필요한 스크립트 및 배포 파일을 다운로드합니다.

      curl -o vpc-admission-webhook-deployment.yaml https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -o Setup-VPCAdmissionWebhook.ps1 https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; curl -o webhook-create-signed-cert.ps1 https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1; curl -o webhook-patch-ca-bundle.ps1 https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/webhook-patch-ca-bundle.ps1;
    2. OpenSSLjq를 설치합니다.

    3. VPC 승인 Webhook을 설정하고 배포합니다.

      ./Setup-VPCAdmissionWebhook.ps1 -DeploymentTemplate ".\vpc-admission-webhook-deployment.yaml"
      중요

      VPC 승인 컨트롤러 Webhook는 발급일로부터 1년 후에 만료되는 인증서로 서명됩니다. 가동 중지 시간을 방지하려면 인증서가 만료되기 전에 인증서를 갱신해야 합니다. 자세한 정보는 VPC 승인 Webhook 인증서 갱신을 참조하십시오.

  3. 클러스터에 필요한 클러스터 역할 바인딩이 있는지 확인합니다.

    kubectl get clusterrolebinding eks:kube-proxy-windows

    다음 예제 출력과 유사한 출력이 반환되면 클러스터에 필요한 역할 바인딩이 있습니다.

    NAME                      AGE
    eks:kube-proxy-windows    10d

    출력에 Error from server (NotFound)가 포함되어 있으면 클러스터에 필요한 클러스터 역할 바인딩이 없습니다. 다음 내용으로 eks-kube-proxy-windows-crb.yaml 파일을 생성하여 바인딩을 추가합니다.

    kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: eks:kube-proxy-windows labels: k8s-app: kube-proxy eks.amazonaws.com/component: kube-proxy subjects: - kind: Group name: "eks:kube-proxy-windows" roleRef: kind: ClusterRole name: system:node-proxier apiGroup: rbac.authorization.k8s.io

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

    kubectl apply -f eks-kube-proxy-windows-crb.yaml
  4. Windows 지원을 활성화한 후 클러스터에서 Windows 노드 그룹을 시작할 수 있습니다. 자세한 정보는 자체 관리형 Windows 노드 시작을 참조하십시오.

macOS and Linux

macOS 또는 Linux 클라이언트를 사용하여 클러스터에 대해 레거시 Windows 지원을 사용 설정하려면

이 절차를 수행하려면 클라이언트 시스템에 openssl 라이브러리 및 jq JSON 프로세서가 설치되어 있어야 합니다.

다음 단계에서 region-code를 클러스터가 있는 리전으로 바꿉니다.

  1. VPC 리소스 컨트롤러를 클러스터에 배포합니다.

    kubectl apply -f https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. 클러스터에 대한 VPC 승인 컨트롤러 Webhook 매니페스트를 생성합니다.

    1. 필요한 스크립트 및 배포 파일을 다운로드합니다.

      curl -o webhook-create-signed-cert.sh https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/webhook-create-signed-cert.sh curl -o webhook-patch-ca-bundle.sh https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh curl -o vpc-admission-webhook-deployment.yaml https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml
    2. 셸 스크립트를 실행할 수 있도록 셸 스크립트에 권한을 추가합니다.

      chmod +x webhook-create-signed-cert.sh webhook-patch-ca-bundle.sh
    3. 보안 통신을 위한 보안 암호를 생성합니다.

      ./webhook-create-signed-cert.sh
    4. 보안 암호를 확인합니다.

      kubectl get secret -n kube-system vpc-admission-webhook-certs
    5. Webhook을 구성하고 배치 파일을 생성합니다.

      cat ./vpc-admission-webhook-deployment.yaml | ./webhook-patch-ca-bundle.sh > vpc-admission-webhook.yaml
  3. VPC 승인 Webhook을 배포합니다.

    kubectl apply -f vpc-admission-webhook.yaml
    중요

    VPC 승인 컨트롤러 Webhook는 발급일로부터 1년 후에 만료되는 인증서로 서명됩니다. 가동 중지 시간을 방지하려면 인증서가 만료되기 전에 인증서를 갱신해야 합니다. 자세한 정보는 VPC 승인 Webhook 인증서 갱신을 참조하십시오.

  4. 클러스터에 필요한 클러스터 역할 바인딩이 있는지 확인합니다.

    kubectl get clusterrolebinding eks:kube-proxy-windows

    다음 예제 출력과 유사한 출력이 반환되면 클러스터에 필요한 역할 바인딩이 있습니다.

    NAME                     ROLE                              AGE
    eks:kube-proxy-windows   ClusterRole/system:node-proxier   19h

    출력에 Error from server (NotFound)가 포함되어 있으면 클러스터에 필요한 클러스터 역할 바인딩이 없습니다. 다음 내용으로 eks-kube-proxy-windows-crb.yaml 파일을 생성하여 바인딩을 추가합니다.

    kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: eks:kube-proxy-windows labels: k8s-app: kube-proxy eks.amazonaws.com/component: kube-proxy subjects: - kind: Group name: "eks:kube-proxy-windows" roleRef: kind: ClusterRole name: system:node-proxier apiGroup: rbac.authorization.k8s.io

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

    kubectl apply -f eks-kube-proxy-windows-crb.yaml
  5. Windows 지원을 활성화한 후 클러스터에서 Windows 노드 그룹을 시작할 수 있습니다. 자세한 정보는 자체 관리형 Windows 노드 시작을 참조하십시오.

VPC 승인 Webhook 인증서 갱신

VPC 승인 Webhook에 사용되는 인증서는 발행 후 1년이 지나면 만료됩니다. 가동 중지 시간을 방지하려면 만료되기 전에 인증서를 갱신하는 것이 중요합니다. 다음 명령을 사용하여 현재 인증서의 만료 날짜를 확인할 수 있습니다.

kubectl get secret \ -n kube-system \ vpc-admission-webhook-certs -o json | \ jq -r '.data."cert.pem"' | \ base64 -decode | \ openssl x509 \ -noout \ -enddate | \ cut -d= -f2

결과

May 28 14:23:00 2022 GMT

eksctl, Windows 또는 Linux/macOS 컴퓨터를 사용하여 인증서를 갱신 할 수 있습니다. VPC 승인 Webhook를 설치하는 데 처음 사용했던 도구에 대한 지침을 따릅니다. 예를 들어 eksctl을 사용하여 VPC 승인 Webhook를 처음 설치한 경우 eksctl 탭의 지침에 따라 인증서를 갱신해야 합니다.

eksctl
  1. 인증서 재설치 <cluster-name>(<> 포함)을 클러스터의 이름으로 바꿉니다.

    eksctl utils install-vpc-controllers -cluster <cluster-name> -approve
  2. 다음 출력이 표시되는지 확인합니다.

    2021/05/28 05:24:59 [INFO] generate received request 2021/05/28 05:24:59 [INFO] received CSR 2021/05/28 05:24:59 [INFO] generating key: rsa-2048 2021/05/28 05:24:59 [INFO] encoded CSR
  3. Webhook 배포를 다시 시작합니다.

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook
  4. 갱신한 인증서가 만료되어 Windows 포드가 Container creating 상태인 경우 해당 포드를 삭제하고 다시 배포해야 합니다.

Windows
  1. 새 인증서를 생성하는 스크립트를 가져옵니다.

    curl -o webhook-create-signed-cert.ps1 https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1;
  2. 스크립트에 대한 파라미터를 준비합니다.

    ./webhook-create-signed-cert.ps1 -ServiceName vpc-admission-webhook-svc -SecretName vpc-admission-webhook-certs -Namespace kube-system
  3. Webhook 배포를 다시 시작합니다.

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
  4. 갱신한 인증서가 만료되어 Windows 포드가 Container creating 상태인 경우 해당 포드를 삭제하고 다시 배포해야 합니다.

Linux and macOS

사전 조건

컴퓨터에 OpenSSL 및 jq가 설치되어 있어야 합니다.

  1. 새 인증서를 생성하는 스크립트를 가져옵니다.

    curl -o webhook-create-signed-cert.sh \ https://amazon-eks.s3.us-west-2.amazonaws.com/manifests/us-west-2/vpc-admission-webhook/latest/webhook-create-signed-cert.sh
  2. 권한을 변경합니다.

    chmod +x webhook-create-signed-cert.sh
  3. 스크립트를 실행합니다.

    ./webhook-create-signed-cert.sh
  4. Webhook를 다시 시작합니다.

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
  5. 갱신한 인증서가 만료되어 Windows 포드가 Container creating 상태인 경우 해당 포드를 삭제하고 다시 배포해야 합니다.