Windows サポート - Amazon EKS

Windows サポート

このトピックでは、Windows サポートを Amazon EKS クラスターに追加する方法について説明します。

Considerations

Windows ノードをデプロイする前に、以下の考慮事項を確認してください。

  • Amazon EC2 インスタンスタイプ C3、C4、D2、I2、M4 (m4.16xlarge を除く)、および R3 のインスタンスは、Windows ワークロードではサポートされていません。

  • ホストネットワーキングモードは、Windows ワークロードではサポートされていません。

  • Linux にのみ対応しているコアシステムポッドを実行するには、Amazon EKS クラスターに 1 つ以上の Linux ノード (coredns や VPC リソースコントローラーなど) が含まれている必要があります。

  • kubelet および kube-proxy イベントログは EKS Windows Event Log にリダイレクトされ、200 MB の制限に設定されます。

  • ポッドのセキュリティグループを、Windows ノードで実行するポッドで使用することはできません。

  • Windows ノードは、ノードごとに 1 つの Elastic Network Interface をサポートします。Windows ノードごとに実行できるポッドの数は、ノードのインスタンスタイプの Elastic Network Interface ごとに使用できる IP アドレスの数から、1 を引いた数に等しくなります。詳細については、Linux インスタンス用の Amazon EC2 ユーザーガイドの「各インスタンスタイプのネットワークインターフェイスごとの IP アドレス」を参照してください。

  • Windows ポッドおよびコンテナ向けのグループマネージド型サービスアカウント (GMSA) は、Amazon EKS バージョン 1.16 より前のバージョンではサポートされていません。Kubernetes ドキュメントの手順に従って、1.16 より前のクラスターでこのアルファ機能を有効化しテストできます。

  • Amazon EKS クラスターでは、ロードバランサーを備えた単一のサービスが、最大 64 個までのバックエンドポッドをサポートできます。各ポッドには固有の IP アドレスがあります。これは、Amazon EC2 ノード上の Windows OS での制約事項です。

  • ユーザーは、Windows 管理のノードまたは Fargate ノードをデプロイすることはできません。ユーザーは、セルフマネージド型の Windows ノードのみ作成が可能です。詳細については、「」を参照してくださいセルフマネージド型の Windows ノードの起動

Windows サポートの有効化

以下の手順で、Amazon EKS クラスターのために Windows サポートを有効化する方法を示します。ユーザーは eksctl、Windows クライアント、または macOS もしくは Linux のクライアントを使用して、クラスター用に Windows サポートを有効化することができます。

eksctl

eksctl を使用してクラスターに対して Windows サポートを有効にするには

Prerequisite

この手順には、eksctl バージョン 0.54.0 以降が必要です。お使いのバージョンは、以下のコマンドを使用して確認できます。

eksctl version

eksctl のインストールまたはアップグレードの詳細については、eksctl のインストールまたはアップグレード を参照してください。

  1. 以下の eksctl コマンドを使用して、Amazon EKS クラスター用に Windows サポートを有効にします。my-cluster の部分は、自分のクラスターの名前に置き換えます。このコマンドは、Windows ワークロードを実行するために Amazon EKS クラスターが必要とする、VPC リソースコントローラーと VPC アドミッションコントローラーのウェブフックをデプロイします。

    eksctl utils install-vpc-controllers --cluster my-cluster --approve
    重要

    VPC アドミッションコントローラーのウェブフックは、発行日から 1 年後に有効期限が切れる証明書で署名されます。ダウンタイムを回避するには、有効期限が切れる前に証明書を更新してください。詳細については、「」を参照してくださいVPC アドミッションウェブフック証明書の更新

  2. Windows サポートを有効にした後、Windows ノードグループをクラスターに起動できます。詳細については、「」を参照してくださいセルフマネージド型の Windows ノードの起動

クラスターに Windows サポートを追加した後、アプリケーションのノードセレクタを指定して、ポッドが適切なオペレーティングシステムのノードに到達するようにしてください。Linux ポッドの場合は、マニフェストで以下のノードセレクタテキストを使用します。

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

Windows ポッドの場合は、マニフェストで以下のノードセレクタテキストを使用します。

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

Windows クライアントでクラスターに対して Windows サポートを有効にするには

以下の手順では、us-west-2 と を、クラスターが置かれているリージョンに置き換えます。

  1. VPC リソースコントローラーをクラスターにデプロイします。

    kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. VPC アドミッションコントローラーウェブフックをクラスターにデプロイします。

    1. 必要なスクリプトとデプロイファイルをダウンロードします。

      curl -o vpc-admission-webhook-deployment.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-admission-webhook/latest/vpc-admission-webhook-deployment.yaml; curl -o Setup-VPCAdmissionWebhook.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-admission-webhook/latest/Setup-VPCAdmissionWebhook.ps1; curl -o webhook-create-signed-cert.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-admission-webhook/latest/webhook-create-signed-cert.ps1; curl -o webhook-patch-ca-bundle.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-admission-webhook/latest/webhook-patch-ca-bundle.ps1;
    2. OpenSSLjq をインストールします。

    3. VPC アドミッションウェブフックを設定してデプロイします。

      ./Setup-VPCAdmissionWebhook.ps1 -DeploymentTemplate ".\vpc-admission-webhook-deployment.yaml"
      重要

      VPC アドミッションコントローラーのウェブフックは、発行日から 1 年後に有効期限が切れる証明書で署名されます。ダウンタイムを回避するには、有効期限が切れる前に証明書を更新してください。詳細については、「」を参照してくださいVPC アドミッションウェブフック証明書の更新

  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 ノードの起動

クラスターに Windows サポートを追加した後、アプリケーションのノードセレクタを指定して、ポッドが適切なオペレーティングシステムのノードに到達するようにしてください。Linux ポッドの場合は、マニフェストで以下のノードセレクタテキストを使用します。

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

Windows ポッドの場合は、マニフェストで以下のノードセレクタテキストを使用します。

nodeSelector: kubernetes.io/os: windows kubernetes.io/arch: amd64
macOS and Linux

macOS または Linux クライアントでクラスターに対して Windows サポートを有効にするには

この手順では、クライアントシステムに openssl ライブラリと jq JSON プロセッサがインストールされている必要があります。

以下の手順では、<region-code> をクラスターが置かれているリージョンに置き換えます。

  1. VPC リソースコントローラーをクラスターにデプロイします。

    kubectl apply -f https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-resource-controller/latest/vpc-resource-controller.yaml
  2. クラスターの VPC アドミッションコントローラーウェブフックのマニフェストを作成します。

    1. 必要なスクリプトとデプロイファイルをダウンロードします。

      curl -o webhook-create-signed-cert.sh https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-admission-webhook/latest/webhook-create-signed-cert.sh curl -o webhook-patch-ca-bundle.sh https://s3.us-west-2.amazonaws.com/amazon-eks/manifests/us-west-2/vpc-admission-webhook/latest/webhook-patch-ca-bundle.sh curl -o vpc-admission-webhook-deployment.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/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. ウェブフックを設定し、デプロイファイルを作成します。

      cat ./vpc-admission-webhook-deployment.yaml | ./webhook-patch-ca-bundle.sh > vpc-admission-webhook.yaml
  3. VPC アドミッションウェブフックをデプロイします。

    kubectl apply -f vpc-admission-webhook.yaml
    重要

    VPC アドミッションコントローラーのウェブフックは、発行日から 1 年後に有効期限が切れる証明書で署名されます。ダウンタイムを回避するには、有効期限が切れる前に証明書を更新してください。詳細については、「」を参照してくださいVPC アドミッションウェブフック証明書の更新

  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 ノードの起動

クラスターに Windows サポートを追加した後、アプリケーションのノードセレクタを指定して、ポッドが適切なオペレーティングシステムのノードに到達するようにしてください。Linux ポッドの場合は、マニフェストで以下のノードセレクタテキストを使用します。

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

Windows ポッドの場合は、マニフェストで以下のノードセレクタテキストを使用します。

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

VPC アドミッションウェブフック証明書の更新

VPC アドミッションウェブフックで使用される証明書は、発行後 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 アドミッションウェブフックのインストールに使用した当初のツールの指示に従ってください。たとえば、最初に eksctl で VPC アドミッションウェブフックをインストールした場合、eksctl の指示に従って証明書を更新する必要があります。

eksctl
  1. 証明書を再インストールします。Replace <cluster-name> (including <>) with the name of your cluster.

    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. ウェブフックデプロイメントを再起動します。

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook
  4. 更新した証明書の有効期限が切れていて、Windows ポッドが Container creating 状態にある場合は、ポッドを削除して再デプロイする必要があります。

Windows
  1. 新しい証明書を生成するスクリプトを取得します。

    curl -o webhook-create-signed-cert.ps1 https://s3.us-west-2.amazonaws.com/amazon-eks/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. ウェブフックデプロイメントを再起動します。

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
  4. 更新した証明書の有効期限が切れていて、Windows ポッドが Container creating 状態にある場合は、ポッドを削除して再デプロイする必要があります。

Linux and macOS

Prerequisite

コンピュータに OpenSSL と jq がインストールされている必要があります。

  1. 新しい証明書を生成するスクリプトを取得します。

    curl -o webhook-create-signed-cert.sh \ https://s3.us-west-2.amazonaws.com/amazon-eks/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. ウェブフックを再起動します。

    kubectl rollout restart deployment -n kube-system vpc-admission-webhook-deployment
  5. 更新した証明書の有効期限が切れていて、Windows ポッドが Container creating 状態にある場合は、ポッドを削除して再デプロイする必要があります。

Windows サンプルアプリケーションをデプロイする

Windows サンプルアプリケーションをデプロイするには

  1. windows-server-iis.yaml という名前でファイルを作成し、次の内容を記述します。

    apiVersion: apps/v1 kind: Deployment metadata: name: windows-server-iis spec: selector: matchLabels: app: windows-server-iis tier: backend track: stable replicas: 1 template: metadata: labels: app: windows-server-iis tier: backend track: stable spec: containers: - name: windows-server-iis image: mcr.microsoft.com/windows/servercore:1809 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent command: - powershell.exe - -command - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; " nodeSelector: kubernetes.io/os: windows --- apiVersion: v1 kind: Service metadata: name: windows-server-iis-service namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: windows-server-iis tier: backend track: stable sessionAffinity: None type: LoadBalancer
  2. アプリケーションをクラスターにデプロイします。

    kubectl apply -f windows-server-iis.yaml
  3. ポッドのステータスを取得します。

    kubectl get pods -o wide --watch

    ポッドが Running 状態になるまで待ちます。

  4. クラスターのサービスをクエリし、 サービスの [External IPwindows-server-iis-service] 列が自動入力されるまで待機します。

    注記

    IP アドレスが使用可能になるまでに数分かかる場合があります。

    kubectl get services -o wide
  5. 外部 IP アドレスが使用可能になったら、ウェブブラウザでそのアドレスを指定して、IIS ホームページを表示します。

    注記

    DNS が伝播され、サンプルアプリケーションがウェブブラウザにロードされるまでに数分かかる場合があります。