Outpost 上のセルフマネージド型の Amazon Linux ノードの起動 - Amazon EKS

Outpost 上のセルフマネージド型の Amazon Linux ノードの起動

このトピックは、Amazon EKS クラスターに登録されている Outpost 上の Amazon Linux ノードの Auto Scaling グループを起動する方法を説明します。クラスターは、AWS クラウド または Outpost に置くことができます。

前提条件
  • 既存の Outpost。詳細については、「AWS Outposts とは」を参照してください。

  • 既存の Amazon EKS クラスター。AWS クラウド にクラスターをデプロイするには、「Amazon EKS クラスターの作成」を参照してください。Outpost にクラスターをデプロイするには、「AWS Outposts の Amazon EKS のローカルクラスター」を参照してください。

  • AWS クラウド のクラスターにノードを作成しており、AWS Outposts、AWS Wavelength、または AWS Local Zones が有効になっている AWS リージョン にサブネットがあるとします。この場合、クラスターを作成したときに、これらのサブネットが渡されていない必要があります。Outpost 上のクラスターにノードを作成する場合は、クラスターの作成時に Outpost サブネットを渡しておく必要があります。

  • (AWS クラウド 上のクラスターに推奨) 必要な IAM ポリシーがアタッチされた独自の IAM ロールで設定された Amazon VPC CNI plugin for Kubernetes アドオン。詳細については、「サービスアカウントの IAM ロールを使用する Amazon VPC CNI plugin for Kubernetes の設定」を参照してください。ローカルクラスターは、サービスアカウントの IAM ロールをサポートしていません。

eksctl または AWS Management Console (AWS CloudFormation テンプレートを使用) で、セルフマネージド型の Amazon Linux ノードグループを作成できます。Terraform を使用することもできます。

eksctl
前提条件

デバイスまたは AWS CloudShell にインストールされている eksctl コマンドラインツールのバージョン 0.172.0 以降。eksctl をインストールまたはアップグレードするには、eksctl ドキュメントの「インストール」を参照してください。

eksctl を使用してセルフマネージド型の Linux ノードを起動する
  1. クラスターが AWS クラウド にあり、[AmazonEKS_CNI_Policy] マネージド IAM ポリシーが Amazon EKS ノードの IAM ロール へアタッチされている場合は、代わりに Kubernetes aws-node サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「サービスアカウントの IAM ロールを使用する Amazon VPC CNI plugin for Kubernetes の設定」を参照してください。クラスターが Outpost にある場合は、ポリシーをノードロールにアタッチする必要があります。

  2. 次のコマンドは、既存のクラスターにノードグループを作成します。クラスターは、eksctl を使用して作成されている必要があります。al-nodes をノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。my-cluster を自分のクラスター名に置き換えます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字はアルファベット文字である必要があります。また、100 文字より長くすることはできません。クラスターが Outpost に存在する場合は、id を Outpost サブネットの ID に置き換えます。AWS クラウド にクラスターが存在する場合、id をクラスターの作成時に指定しなかったサブネットの ID に置き換えます。instance-type を、Outpost でサポートされているインスタンスタイプに置き換えます。残りの example values を独自の値に置き換えてください。デフォルトでは、ノードはコントロールプレーンと同じ Kubernetes バージョンで作成されます。

    instance-type を、Outpost で使用可能なインスタンスタイプに置き換えます。

    my-key を Amazon EC2 キーペアまたはパブリックキーの名前に置き換えます。このキーは、起動後のノードに SSH 接続するために使用されます。Amazon EC2 キーペアをまだ持っていない場合は、AWS Management Console で作成できます。詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイド」の「Amazon EC2 キーペア」を参照してください。

    次のコマンドを使用して、ノードグループを作成します。

    eksctl create nodegroup --cluster my-cluster --name al-nodes --node-type instance-type \ --nodes 3 --nodes-min 1 --nodes-max 4 --managed=false --node-volume-type gp2 --subnet-ids subnet-id

    クラスターを AWS クラウド 上にデプロイしている場合:

    • デプロイするノードグループには、インスタンスのブロックとは異なる CIDR ブロックから IPv4 アドレスを Pods に割り当てることができます。詳細については、「ポッド用のカスタムネットワーク」を参照してください。

    • デプロイするノードグループは、アウトバウンドインターネットアクセスを必要としません。詳細については、「プライベートクラスターの要件」を参照してください。

    利用できるすべてのオプションとデフォルトの詳細なリストについては、eksctl ドキュメントの「AWS Outposts サポート」を参照してください。

    ノードがクラスターに参加できない場合は、Amazon EKS のトラブルシューティングノードをクラスターに結合できませんAWS Outposts での Amazon EKS のローカルクラスターのトラブルシューティングノードをクラスターに結合できません を参照してください。

    出力例は次のとおりです。ノードの作成中に、複数の行が出力されます。出力の最後の行は、次のサンプル行が表示されます。

    [✔]  created 1 nodegroup(s) in cluster "my-cluster"
  3. (オプション) サンプルアプリケーション をデプロイして、クラスターと Linux ノードをテストします。

AWS Management Console
ステップ 1: AWS Management Console を使用してセルフマネージド型の Amazon Linux ノードを起動します
  1. AWS CloudFormation テンプレートの最新バージョンをダウンロードする

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
  2. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

  3. [スタックの作成] を選択し、[新しいリソースを使用 (標準)] を選択します。

  4. [テンプレートの指定] で、[テンプレートファイルのアップロード] を選択し、[ファイルを選択] を選択します。前の手順でダウンロードした amazon-eks-nodegroup.yaml ファイルを選択し、[次へ] を選択します。

  5. [スタックの詳細の指定] ページで、必要に応じて次のパラメータを入力し、[次へ] を選択します。

    • [スタック名]: AWS CloudFormation スタックのスタック名を選択します。例えば、al-nodes という名前にすることができます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字はアルファベット文字である必要があります。また、100 文字より長くすることはできません。

    • [ClusterName]: クラスターの名前を入力します。この名前が、クラスター名と一致しない場合、ノードはクラスターに参加できません。

    • [ClusterControlPlaneSecurityGroup]: VPC の作成時に生成した AWS CloudFormation 出力の [SecurityGroups] 値を選択します。

      次のステップでは、該当するグループを取得する 1 つのオペレーションを説明します。

      1. Amazon EKS コンソール (https://console.aws.amazon.com/eks/home#/clusters) を開きます。

      2. クラスターの名前を選択します。

      3. [ネットワーキング] タブを選択します。

      4. [ClusterControlPlaneSecurityGroup] ドロップダウンリストから選択する場合は、[追加のセキュリティグループ] の値をリファレンスとして使用します。

    • [NodeGroupName]: ノードグループの名前を入力します。この名前は、ノードに対して作成される Auto Scaling ノードグループを識別するために後で使用できます。

    • [NodeAutoScalingGroupMinSize]: ノードの Auto Scaling グループがスケールインできる最小ノード数を入力します。

    • NodeAutoScalingGroupDesiredCapacity: スタック作成時にスケーリングする必要のあるノード数を入力します。

    • [NodeAutoScalingGroupMaxSize]: ノードの Auto Scaling グループがスケールアウトできる最大ノード数を入力します。

    • [NodeInstanceType]: ノードのインスタンスタイプを選択します。クラスターが AWS クラウド で動作している場合は、詳細については、「Amazon EC2 インスタンスタイプを選択する」を参照してください。クラスターが Outpost で実行されている場合、Outpost で使用できるインスタンスタイプのみを選択できます。

    • [NodeImageIdSSMParam]: 最新の Amazon EKS 最適化 AMI の Amazon EC2 Systems Manager のパラメータが、可変 Kubernetes バージョン用に事前設定されています。Amazon EKS でサポートされている別の Kubernetes マイナーバージョンを使用するには、1.XX を別のサポートされているバージョンに置き換えます。クラスターと同じ Kubernetes バージョンを指定することをお勧めします。

      Amazon EKS 最適化高速 AMI を使用するには、amazon-linux-2amazon-linux-2-gpu に置き換えます。Amazon EKS 最適化 Arm AMI を使用するには、amazon-linux-2amazon-linux-2-arm64 に置き換えます。

      注記

      Amazon EKS ノード AMI は Amazon Linux をベースとしています。Amazon Linux セキュリティセンターで Amazon Linux 2 のセキュリティもしくはプライバシーに関するイベントを追跡したり、関連する RSS フィードをサブスクライブできます。セキュリティおよびプライバシーイベントには、問題の概要、影響を受けるパッケージ、および問題を修正するためにインスタンスを更新する方法などがあります。

    • [NodeImageId]: (オプション) (Amazon EKS 最適化 AMI の代わりに) 独自のカスタム AMI を使用している場合は、AWS リージョン のノード AMI ID を入力します。ここで値を指定すると、[NodeImageIdSSMParam] フィールドの値はすべて上書きされます。

    • [NodeVolumeSize]: ノードのルートボリュームのサイズを GiB 単位で指定します。

    • [NodeVolumeType]: ノードのルートボリュームタイプを指定します。

    • [KeyName]: 起動後に、SSH を使用してノードに接続するときに使用できる Amazon EC2 SSH キーペアの名前を入力します。Amazon EC2 キーペアをまだ持っていない場合は、AWS Management Console で作成できます。詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイド」の「Amazon EC2 キーペア」を参照してください。

      注記

      ここでキーペアを指定しないと、AWS CloudFormation スタックの作成は失敗します。

    • [BootstrapArguments]: ノードに渡すことができるオプションの引数がいくつかあります。詳細については、「GitHub」の「ブートストラップスクリプトの使用状況」を参照してください。入出力のインターネット接続がないクラスター (プライベートクラスターとも呼ばれる) にノードを追加する場合は、次のブートストラップ引数を (1 行で) 指定する必要があります。

      --b64-cluster-ca ${CLUSTER_CA} --apiserver-endpoint https://${APISERVER_ENDPOINT} --enable-local-outpost true --cluster-id ${CLUSTER_ID}
    • [DisableIMDSv1]: 各ノードは、デフォルトでインスタンスメタデータサービスバージョン 1 (IMDSv1) および IMDSv2 をサポートします。IMDSv1 は無効にできます。ノードグループ内の将来のノードおよび Pods が MDSv1 を使用しないようにするには、[DisableIMDsv1][true] に設定します。IDMS の詳細については、「インスタンスメタデータサービスの設定」を参照してください。ノードでのそれへのアクセス制限について詳しくは、ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限するを参照してください。

    • [VpcId]: 作成した VPC の ID を入力します。VPC を選択する前に、VPC の要件と考慮事項 を確認します。

    • [サブネット]: クラスターが Outpost にある場合、VPC 内で少なくとも 1 つのプライベートサブネットを選択します。サブネットを選択する前に、「サブネットの要件と考慮事項」を確認してください。クラスターの [ネットワーキング] タブから、各サブネットリンクを開き、プライベートのサブネットを確認できます。

  6. [スタックオプションの設定] ページで、希望する設定を選択し、[次へ] を選択します。

  7. [AWS CloudFormation が IAM リソースを作成する可能性を認識しています] の左にあるチェックボックスを選択して、[スタックの作成] を選択します。

  8. スタックの作成が完了したら、コンソールで選択し、[出力] を選択します。

  9. 作成されたノードグループの [NodeInstanceRole] を記録します。これは、Amazon EKS ノードを設定する際、必要になります。

ステップ 2: ノードを有効にしてクラスターに参加させるには
  1. aws-auth ConfigMap がすでにあるかどうかを確認します。

    kubectl describe configmap -n kube-system aws-auth
  2. aws-auth ConfigMap が表示されている場合は、必要に応じて更新してください。

    1. 編集する ConfigMap を開きます。

      kubectl edit -n kube-system configmap/aws-auth
    2. 必要に応じて新しい mapRoles エントリを追加します。rolearn 値を、前の手順で記録した [NodeInstanceRole] 値に設定します。

      [...] data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes [...]
    3. ファイルを保存し、テキストエディタを終了します。

  3. Error from server (NotFound): configmaps "aws-auth" not found」というエラーが表示されたら、ストック ConfigMap を適用してください。

    1. 設定マップをダウンロードします。

      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. aws-auth-cm.yaml ファイルで、rolearn を前の手順で記録した [NodeInstanceRole] 値に設定します。これを行うには、テキストエディタを使用するか、my-node-instance-role を置き換えて次のコマンドを実行します。

      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
    3. 設定を適用します。このコマンドが完了するまで数分かかることがあります。

      kubectl apply -f aws-auth-cm.yaml
  4. ノードのステータスを監視し、Ready ステータスになるまで待機します。

    kubectl get nodes --watch

    Ctrl+C を入力して、シェルプロンプトに戻ります。

    注記

    認証またはリソースタイプのエラーが発生した場合は、トラブルシューティングトピックの「許可されていないか、アクセスが拒否されました (kubectl)」を参照してください。

    ノードがクラスターに参加できない場合は、Amazon EKS のトラブルシューティングノードをクラスターに結合できませんAWS Outposts での Amazon EKS のローカルクラスターのトラブルシューティングノードをクラスターに結合できません を参照してください。

  5. Amazon EBS CSI ドライバーをインストールします。詳細については、GitHub の Installation を参照してください。[ドライバーのアクセス許可を設定] セクションでは、[IAM インスタンスプロファイルの使用] オプションの指示に従うことを確認します。gp2 ストレージクラスを使用する必要があります。gp3 ストレージクラスは、サポートされていません。

    クラスターの gp2 ストレージクラスを作成するには、以下のステップを実行します。

    1. 次のコマンドを実行して、gp2-storage-class.yaml ファイルを作成します。

      cat >gp2-storage-class.yaml <<EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "true" name: ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer parameters: type: gp2 encrypted: "true" allowVolumeExpansion: true EOF
    2. マニフェストをクラスターに適用します。

      kubectl apply -f gp2-storage-class.yaml
  6. (GPU ノードのみ) GPU インスタンスタイプと Amazon EKS 最適化アクセラレーション AMI を選択した場合は、クラスター上の DaemonSet として Kubernetes 用の NVIDIA デバイスプラグインを適用する必要があります。次のコマンドを実行する前に、vX.X.X を必要となる NVIDIA/k8s-device-plugin バージョンに置き換えます。

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/nvidia-device-plugin.yml
ステップ 3: その他のアクション
  1. (オプション) サンプルアプリケーションをデプロイして、クラスターと Linux ノードをテストします。

  2. クラスターが Outpost にデプロイされている場合は、このステップをスキップしてください。クラスターが AWS クラウド にデプロイされている場合、次の情報はオプションです。[AmazonEKS_CNI_Policy] マネージド IAM ポリシーが Amazon EKS ノードの IAM ロール にアタッチされている場合は、代わりに Kubernetes aws-node サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「サービスアカウントの IAM ロールを使用する Amazon VPC CNI plugin for Kubernetes の設定」を参照してください。