AWS Outposts で Amazon Linux ノードを作成する - Amazon EKS

AWS Outposts で Amazon Linux ノードを作成する

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

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

  • 既存の Amazon EKS クラスター。AWS Cloud にクラスターをデプロイするには、「Amazon EKS クラスターを作成します。」を参照してください。Outpost にクラスターをデプロイするには、「高可用性を実現するために AWS Outposts でローカル Amazon EKS クラスターを作成する」を参照してください。

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

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

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

このページで説明されている以下のツールを使用して、ローカルクラスターを作成できます。

eksctl

eksctl を使用してセルフマネージド型の Linux ノードを起動するには`

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

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

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

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

    my-key を Amazon EC2 キーペアまたはパブリックキーの名前に置き換えます。このキーは、起動後のノードに SSH 接続するために使用されます。Amazon EC2 キーペアをまだ持っていない場合は、AWS Management Console で作成できます。詳細については、「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 Cloud 上にデプロイしている場合:

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

  4. (オプション) サンプルアプリケーション をデプロイして、クラスターと Linux ノードをテストします。

AWS Management Console

ステップ 1: AWS Management Console を使用してセルフマネージド型の Linux ノードを起動する`

  1. AWS CloudFormation テンプレートの最新バージョンをダウンロードします。

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

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

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

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

    • スタック名: AWS CloudFormation スタックのスタック名を選択します。例えば、al-nodes という名前にすることができます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョンおよび AWS アカウント内で一意である必要があります。

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

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

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

      1. Amazon EKS コンソールを開きます。

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

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

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

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

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

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

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

    • [NodeInstanceType]: ノードのインスタンスタイプを選択します。クラスターが AWS Cloud で動作している場合は、詳細については、「最適な 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 セキュリティセンターで追跡できます。そのためには、目的のバージョンのタブを選択します。該当する RSS フィードをサブスクライブすることもできます。セキュリティおよびプライバシーイベントには、問題の概要、影響を受けるパッケージ、および問題を修正するためにインスタンスを更新する方法などがあります。

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

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

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

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

      注記

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

    • [BootstrapArguments]: ノードに渡すことができるオプションの引数がいくつかあります。詳細については、「GitHub」の「ブートストラップスクリプトの使用状況」を参照してください。AWS Outposts の Amazon EKS ローカルクラスター (Kubernetes コントロールプレーンインスタンスが AWS Outposts で稼働) と入出力のインターネット接続がないクラスター (プライベートクラスターとも呼ばれる) にノードを追加する場合は、次のブートストラップ引数を (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/deployments/static/nvidia-device-plugin.yml

ステップ 3: その他のアクション

  1. (オプション) サンプルアプリケーションをデプロイして、クラスターと Linux ノードをテストします。

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