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

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

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

eksctl

Prerequisites

  • eksctl を使用して作成された、既存の Amazon EKS クラスター。

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

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

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

  2. 次のコマンドは、既存のクラスターにノードグループを作成します。<example values> (<>を含む) を自分の値に置き換えます。デフォルトでは、ノードはコントロールプレーンと同じ Kubernetes バージョンで作成されます。

    Amazon EC2 Arm インスタンスにデプロイする場合、t3.medium を Arm インスタンスタイプに置き換えます。Arm Amazon EC2 インスタンスタイプを指定する場合は、デプロイする前に Amazon EKS 最適化 Arm Amazon Linux AMI の考慮事項を確認してください。サポートされている --node-type の値の完全なリストについては、GitHub で amazon-eks-nodegroup.yaml のリストをご覧ください。

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

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

    重要

    ノードグループを AWS Outposts、AWS Wavelength、または AWS Local Zones サブネットにデプロイする場合、AWS Outposts、AWS Wavelength、または AWS Local Zones のサブネットは、クラスターの作成時に渡されるべきではありません。AWS Outposts、AWS Wavelength、または AWS Local Zones サブネットを指定した設定ファイルを使用して、ノードグループを作成する必要があります。詳細については、eksctl ドキュメントの「設定ファイルからノードグループを作成する」と「設定ファイルのスキーマ」を参照してください。

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

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

    eksctl create nodegroup --help

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

    出力:

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

    [✔] created 1 nodegroup(s) in cluster "<my-cluster>"
  3. (オプション) ポッドには必要最低限のアクセス許可のみを与えるように、すべての Kubernetes サービスアカウントに IAM ロールを割当て、クラスター内のポッドが現在のリージョンを取得するなどの理由から Amazon EC2 のインスタンスメタデータサービス (IMDS) へのアクセス許可を必要としないようにしたい場合は、IMDS へのポッドのアクセスをブロックすることをお勧めします。詳細については、「サービスアカウントの IAM ロール」および「IMDS および Amazon EC2 インスタンスプロファイルの認証情報に対するアクセスの制限」を参照してください。

AWS Management Console

Prerequisites

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

  1. クラスターステータスが ACTIVE と表示されるまで待ちます。クラスターがアクティブである前にノードを起動した場合、ノードはクラスターへの登録に失敗し、再起動する必要があります。

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

    curl -o amazon-eks-nodegroup.yaml https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/amazon-eks-nodegroup.yaml
  3. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

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

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

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

    • Stack name: AWS CloudFormation スタックのスタック名を選択します。For example, you can call it cluster-name-nodes.

    • [ClusterName]: Amazon EKS クラスター用に作成した際に使用した名前を入力します。

      重要

      この名前は、「ステップ 1: Amazon EKS クラスターを作成する」で使用した名前と完全一致する必要があります。それ以外の場合、ノードにクラスターを結合できません。

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

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

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

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

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

    • [NodeInstanceType]: ノードのインスタンスタイプを選択します。また GitHub の amazon-eks-nodegroup.yaml ファイルで、リストを確認することができます。Arm インスタンスタイプを選択する前に、Amazon EKS 最適化 Arm Amazon Linux AMI に記載されている考慮事項を確認してください。

      注記

      最新バージョンの Amazon VPC CNI Plugin for Kubernetes でサポートされているインスタンスタイプをこちらに示します。サポートされている最新のインスタンスタイプを利用するには、CNI のバージョンを更新する必要があります。詳細については、「Amazon VPC CNI のセルフマネージド型アドオンを更新する」を参照してください。

      重要

      リージョンによっては利用できないインスタンスタイプがあります。

    • [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]: (オプション) (Amazon EKS 最適化 AMI の代わりに) 独自のカスタム AMI を使用している場合は、リージョンのノード 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 アドレスを割り当てることをインスタンスに許可する、ノードグループをデプロイするには、インスタンスのポッドではなく CIDR ブロックからのポッドに IP アドレスを割り当て、containerd ランタイムを有効にします。あるいは、アウトバウンドのインターネットアクセスを持たないプライベートクラスターをデプロイします。このために追加する引数については 「Amazon EC2 ノードで使用可能な IP アドレスの量を増やす」、「CNI カスタムネットワーク」、「containerd ランタイムブートストラップフラグを有効にする」、および「プライベートクラスター」を参照してください。

    • [DisableIMDSv1]: 各ノードは、デフォルトでインスタンスメタデータサービスバージョン 1 (IMDSv1) および IMDSv2 をサポートしますが、IMDSv1 を無効にできます。ノードグループ内のノードや、ノードグループ内のノードでスケジュールされたポッドで IMDSv1 を使用しない場合は、[true] を選択します。IDMS の詳細については、「インスタンスメタデータサービスの設定」を参照してください。ノードのアクセス制限の詳細については、「IMDS および Amazon EC2 インスタンスプロファイルの認証情報に対するアクセスの制限」を参照してください。

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

    • [Subnets]: VPC 用に作成したサブネットを選択します。Amazon EKS クラスター VPC の作成 で説明されている手順を使用して VPC を作成した場合は、ノードの VPC 内で、起動するプライベートサブネットのみを指定します。

      重要
      • いずれかのサブネットがパブリックサブネットである場合は、パブリック IP アドレスの自動割り当て設定を有効にする必要があります。この設定がパブリックサブネットに対して有効になっていない場合、そのパブリックサブネットにデプロイするノードにはパブリック IP アドレスが割り当てられず、クラスターやその他の AWS のサービスと通信できなくなります。2020 年 3 月 26 日以前に、Amazon EKS AWS CloudFormation VPC テンプレートを使用して、または eksctl を使用してサブネットがデプロイされた場合、パブリックサブネットではパブリック IP アドレスの自動割り当てが無効になります。サブネットのパブリック IP アドレス割り当てを有効にする方法については、「サブネットのパブリック 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、AWS Wavelength、または AWS Local Zones サブネット を選択した場合は、クラスターの作成時にサブネットが渡されるべきではありません。

  7. スタックが IAM リソースを作成する可能性があることを確認し、[スタックの作成] を選択します。

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

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

クラスターに参加させるためにノードを有効にするには

注記

ノードをアウトバウンドインターネットアクセスのないプライベート 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. テキストエディタでファイルを開きます。<ARN of instance role (not instance profile)> スニペットを、前の手順で記録した [NodeInstanceRole] 値に置き換え、ファイルを保存します。

      重要

      このファイルの他の行は変更しないでください。

      apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
    3. 設定を適用します。このコマンドが完了するまで数分かかることがあります。

      kubectl apply -f aws-auth-cm.yaml
      注記

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

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

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

    kubectl get nodes --watch
  3. (GPU ノードのみ) GPU インスタンスタイプと Amazon EKS 最適化高速 AMI を選択した場合は、NVIDIA device plugin for Kubernetes を、次のコマンドを使ってクラスターに設定されたデーモンセットとして適用しなければなりません。

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

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

  6. (オプション) ポッドには必要最低限のアクセス許可のみを与えるように、すべての Kubernetes サービスアカウントに IAM ロールを割当て、クラスター内のポッドが現在のリージョンを取得するなどの理由から Amazon EC2 のインスタンスメタデータサービス (IMDS) へのアクセス許可を必要としないようにしたい場合は、IMDS へのポッドのアクセスをブロックすることをお勧めします。詳細については、「サービスアカウントの IAM ロール」および「IMDS および Amazon EC2 インスタンスプロファイルの認証情報に対するアクセスの制限」を参照してください。