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

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

このトピックでは、Amazon EKS クラスターに登録する Linux ノードの Auto Scaling グループを起動する方法について説明します。ノードがクラスターに参加したら、それらのノードに Kubernetes アプリケーションをデプロイ可能になります。eksctl または AWS Management Console を使用して、セルフマネージド型の Amazon Linux 2 ノードを起動することもできます。

前提条件

  • 既存の Amazon EKS クラスター。デプロイするには、Amazon EKS クラスターの作成を参照してください。AWS Outposts、AWS Wavelength、または AWS Local Zones が有効になっている AWS リージョン にサブネットがある場合、それらのサブネットはクラスターの作成時に渡さないようにします。

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

  • Amazon EC2 インスタンスタイプを選択する」に記載されている考慮事項に関する知識。選択したインスタンスタイプによっては、クラスターと VPC に関する追加の前提条件がある場合もあります。

eksctl

前提条件

コンピューターまたは AWS CloudShell にインストールされている eksctl コマンドラインツールのバージョン 0.105.0 以降。eksctl をインストールまたは更新するには、「eksctl のインストールまたは更新」を参照してください。

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

  1. (オプション) AmazonEKS_CNI_Policy が管理する IAM ポリシーが Amazon EKS ノードの IAM ロール にアタッチされている場合は、代わりに Kubernetes aws-node サービスアカウントに関連付けた IAM ロールに割り当てることをお勧めします。詳細については、「サービスアカウントの IAM ロールを使用する Amazon VPC CNI plugin for Kubernetes の設定」を参照してください。

  2. 次のコマンドは、既存のクラスターにノードグループを作成します。example-value をすべて自分の値に置き換えてください。デフォルトでは、ノードはコントロールプレーンと同じ Kubernetes バージョンで作成されます。

    --node-type の値を選択する前に、「Amazon EC2 インスタンスタイプを選択する」を確認してください。

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

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

    重要

    ノードグループを AWS Outposts、Wavelength、または Local Zones サブネットにデプロイする場合、追加の考慮事項があります。

    eksctl create nodegroup \ --cluster my-cluster \ --name al-nodes \ --node-type t3.medium \ --nodes 3 \ --nodes-min 1 \ --nodes-max 4 \ --ssh-access \ --managed=false \ --ssh-public-key my-key

    大量の IP アドレスを pods に割り当てることをインスタンスに許可するノードグループをデプロイするには、インスタンスのポッドではなく、異なる CIDR ブロックからの pods に IP アドレスを割り当てます。詳細については、「Amazon EC2 ノードで使用可能な IP アドレスの量を増やす」および「チュートリアル: カスタムネットワーキング」を参照してください。containerd ランタイムを有効にするには、設定ファイルを使用してノードグループをデプロイする必要があります。詳細については、「containerd ランタイムブートストラップフラグを有効にする」を参照してください。アウトバウンドのインターネットアクセスを持たないプライベートノードグループをデプロイする手順については、「プライベートクラスターの要件」を参照してください。すべての使用可能なオプションとデフォルト値の一覧を表示するには、次のコマンドを入力します。

    eksctl create nodegroup --help

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

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

    [✔] created 1 nodegroup(s) in cluster "my-cluster"
  3. 次の条件が true の場合、IMDS へのポッドアクセスをブロックすることをお勧めします。

    • ポッドが必要最小限の権限のみを持つように、すべての Kubernetes サービスアカウントに IAM ロールを割り当てることを計画しています。

    • クラスター内のポッドが、現在の AWS リージョン の取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

    詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。

AWS Management Console

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

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

    curl -o amazon-eks-nodegroup.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
  2. クラスターステータスが ACTIVE と表示されるまで待ちます。クラスターがアクティブになる前にノードを起動した場合、ノードはクラスターへの登録に失敗し、再起動する必要があります。

  3. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

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

  5. [Specify template] (テンプレートの指定) で、[Upload a template file] (テンプレートファイルのアップロード) を選択し、[Choose file] (ファイルを選択) を選択します。ステップ 2 でダウンロードした amazon-eks-nodegroup.yaml ファイルを選択し、[次へ] を選択します。

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

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

    • [ClusterName]: Amazon EKS クラスターの作成時に使用した名前を入力します。この名前は、クラスター名と同じにする必要があります。同じでない場合、ノードはクラスターに参加できません。

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

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

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

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

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

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

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

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

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

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

    • [NodeInstanceType]: ノードのインスタンスタイプを選択します。詳細については、「Amazon EC2 インスタンスタイプを選択する」を参照してください。

    • [NodeImageIdSSMParam]: 最新の Amazon EKS 最適化 Amazon Linux AMI ID の Amazon EC2 Systems Manager のパラメータが、Kubernetes バージョン用に事前設定されています。Amazon EKS でサポートされている別の Kubernetes マイナーバージョンを使用するには、1.x を別のサポートされているバージョンに置き換えます。クラスターと同じ 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 2 に基づいています。Amazon Linux セキュリティセンターで Amazon Linux 2 のセキュリティもしくはプライバシーに関するイベントを追跡したり、関連する RSS フィードをサブスクライブできます。セキュリティおよびプライバシーイベントには、問題の概要、影響を受けるパッケージ、および問題を修正するためにインスタンスを更新する方法などがあります。

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

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

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

      注記

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

    • [BootstrapArguments]: kubelet の追加引数など、ノードブートストラップスクリプトに渡すオプションの引数を指定します。詳細については、「GitHub」の「bootstrap script usage information」(ブートストラップスクリプトの使用状況) を参照してください。大量の IP アドレスを pods に割り当てることをインスタンスに許可するノードグループをデプロイするには、インスタンスのポッドではなく、異なる CIDR ブロックからの pods に IP アドレスを割り当てます。その後 containerd ランタイムを有効にするか、アウトバウンドのインターネットアクセスがないプライベートクラスターをデプロイします。追加する引数の詳細については「Amazon EC2 ノードで使用可能な IP アドレスの量を増やす」、「チュートリアル: カスタムネットワーキング」、「containerd ランタイムブートストラップフラグを有効にする」、および「プライベートクラスターの要件」を参照してください。

    • [DisableIMDSv1]: 各ノードは、デフォルトでインスタンスメタデータサービスバージョン 1 (IMDSv1) および IMDSv2 をサポートします。IMDSv1 は無効にできます。以後、ノードグループのノードおよび pods が MDSv1 を使用しないようにするには、DisableIMDsv1true に設定します。IDMS の詳細については、「インスタンスメタデータサービスの設定」を参照してください。ノードでのそれへのアクセス制限について詳しくは、ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限するを参照してください。

    • [VpcId]: 作成した VPC の ID を入力します。

    • [Subnets]: VPC 用に作成したサブネットを選択します。Amazon EKS クラスター VPC の作成 で説明されている手順で VPC を作成した場合は、起動するノードの VPC 内のプライベートサブネットのみを指定します。クラスターの [Networking] (ネットワーキング) タブから、各サブネットリンクを開き、プライベートのサブネットを確認できます。

      重要
      • いずれかのサブネットがパブリックサブネットである場合は、パブリック IP アドレスの自動割り当て設定を有効にする必要があります。この設定がパブリックサブネットに対して有効になっていない場合、そのパブリックサブネットにデプロイするノードにはパブリック IP アドレスが割り当てられず、クラスターやその他の AWS のサービスと通信できなくなります。2020 年 3 月 26 日以前に、Amazon EKS AWS CloudFormation VPC テンプレートを使用して、または eksctl を使用してサブネットがデプロイされた場合、パブリックサブネットではパブリック IP アドレスの自動割り当てが無効になります。サブネットのパブリック IP アドレスの割り当てを有効にする方法については、「Modifying the public IPv4 addressing attribute for your subnet」(サブネットのパブリック IPv4 アドレス属性の変更) を参照してください。ノードがプライベートサブネットにデプロイされている場合、NAT ゲートウェイを介してクラスターや他の AWS のサービスと通信できます。

      • サブネットにインターネットアクセスがない場合は、プライベートクラスターの要件の考慮事項と追加の手順を確認してください

      • ノードを 1.18 以前のクラスターにデプロイしている場合は、選択したサブネットにクラスター名がタグ付けされていることを確認してください。my-cluster を自分のクラスター名に置き換えます。次に、次のコマンドを実行して、現在クラスターの名前でタグ付けされているサブネットのリストを表示します。

        aws ec2 describe-subnets --filters Name=tag:kubernetes.io/cluster/my-cluster,Values=shared | grep SubnetId

        前のコマンドの出力で、選択したいサブネットが返されなかった場合は、サブネットにタグを手動で追加します。詳細については、「サブネットの要件と考慮事項」を参照してください。

      • AWS Outposts、Wavelength、または Local Zones サブネット を選択した場合、クラスターの作成時にサブネットが渡されないようにします。

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

  8. [I acknowledge that AWS CloudFormation might create IAM resources] (AWS CloudFormation が IAM リソースを作成する可能性を認識しています) の左にあるチェックボックスを選択して、[Create stack] (スタックの作成) を選択します。

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

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

ステップ 2: ノードを有効にしてクラスターに参加させるには

注記

アウトバウンドのインターネットアクセスのないプライベート VPC でノードを起動する場合は、ノードが VPC 内からクラスターに参加できるようにしてください。

  1. AWS IAM オーセンティケーター設定マップをダウンロード、編集、適用します。

    1. 次のコマンドを使用して、設定マップをダウンロードします。

      curl -o aws-auth-cm.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. aws-auth-cm.yaml ファイルで、rolearn を前の手順で記録した値に指定します。これを行うには、テキストエディタを使用するか、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
      注記

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

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

  2. ノードのステータスを監視し、Ready ステータスになるまで待機します。

    kubectl get nodes --watch

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

  3. (GPU ノードのみ) GPU インスタンスタイプと Amazon EKS 最適化アクセラレーション AMI を選択した場合は、次のコマンドを使用して、クラスター上の DaemonSet として Kubernetes 用の NVIDIA デバイスプラグイン を適用する必要があります。

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

  5. (オプション) AmazonEKS_CNI_Policy マネージド IAM ポリシー (IPv4 クラスターがある場合)、または(IPv6 クラスターがある場合に、ユーザー自身が作成した) AmazonEKS_CNI_IPv6_PolicyAmazon EKS ノードの IAM ロール に添付されている場合、代わりに Kubernetes aws-node サービスアカウントに関連付けている IAM ロールに割り当てることをお勧めします。詳細については、「サービスアカウントの IAM ロールを使用する Amazon VPC CNI plugin for Kubernetes の設定」を参照してください。

  6. 次の条件が true の場合、IMDS へのポッドアクセスをブロックすることをお勧めします。

    • ポッドが必要最小限の権限のみを持つように、すべての Kubernetes サービスアカウントに IAM ロールを割り当てることを計画しています。

    • クラスター内のポッドが、現在の AWS リージョン の取得など、その他の理由で Amazon EC2 インスタンスメタデータサービス (IMDS) へのアクセスを必要としていない。

    詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。