セルフマネージド Bottlerocket ノードを作成する - Amazon EKS

このページの改善にご協力ください

本ユーザーガイドの改善にご協力いただけませんか? このページの下部までスクロールし、[GitHub でこのページの編集] を選択します。皆さまにご協力いただくことで、あらゆる人々に使いやすいユーザーガイドになります。

セルフマネージド Bottlerocket ノードを作成する

注記

マネージド型ノードグループでは、ユースケースにいくつかの利点がある場合があります。詳細については、「マネージドノードグループを使用してノードライフサイクルを簡素化する」を参照してください。

このトピックでは、Amazon EKS クラスターに登録している Bottlerocket ノードの Auto Scaling グループを起動する方法について説明します。Bottlerocket は、仮想マシンやベアメタルホスト上でコンテナの実行に使用できる、AWS による Linux ベースのオープンソースオペレーティングシステムです。ノードがクラスターに参加したら、それらのノードに Kubernetes アプリケーションをデプロイ可能になります。Bottlerocket の詳細については、「GitHub」の「Amazon EKS での Bottlerocket AMI の使用」および「eksctl ドキュメント」の「カスタム AMI のサポート」を参照してください。

インプレース アップグレードの詳細については、「GitHub」の「Bottlerocket Update Operator」を参照してください。

重要
  • Amazon EKS ノードは標準の Amazon EC2 インスタンスであり、通常の Amazon EC2 インスタンス価格に基づいて請求されます。詳細については、「Amazon EC2 料金」を参照してください。

  • AWS Outposts 上の Amazon EKS 拡張クラスターで Bottlerocket ノードを起動できますが、AWS Outposts 上のローカルクラスターでは起動できません。詳細については、「AWS Outposts を使用して Amazon EKS をオンプレミスにデプロイする」を参照してください。

  • x86 または Arm プロセッサを使用して Amazon EC2 インスタンスにデプロイできます。ただし、Inferentia チップがあるインスタンスにはデプロイできません。

  • Bottlerocket は AWS CloudFormation と互換性があります。ただし、Amazon EKS のBottlerocket ノードをデプロイするためにコピーできる公式の CloudFormation テンプレートはありません。

  • Bottlerocket のイメージには、SSH サーバーやシェルは付属していません。SSH で管理者コンテナを有効にし、ユーザーデータとともにブートストラップの設定ステップを渡すために、帯域外のアクセス方式を使用できます。詳細については、「GitHub」の「bottlerocket README.md」のセクションを参照してください。

eksctl を使用して Bottlerocket ノードを起動するには

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

eksctl version

eksctl のインストールまたはアップグレードの手順については、eksctl ドキュメントの「インストール」を参照してください。

注記

この手順は、eksctl で作成されたクラスターに対してのみ機能します。

  1. 次のコンテンツをデバイスにコピーします。my-cluster を自分のクラスター名に置き換えます。この名前には、英数字 (大文字と小文字が区別されます) とハイフンのみを使用できます。先頭の文字は英数字である必要があります。また、100 文字より長くすることはできません。名前は、クラスターを作成する AWS リージョン および AWS アカウント 内で一意である必要があります。ng-bottlerocket をノードグループの名前に置き換えます。ノードグループ名は 63 文字以下である必要があります。先頭は文字または数字でなければなりませんが、残りの文字にはハイフンおよびアンダースコアを含めることもできます。Arm インスタンスにデプロイするには、m5.large を Arm インスタンスタイプに置き換えます。my-ec2-keypair-name を、起動後に、SSH を使用してノードに接続するときに使用できる Amazon EC2 SSH キーペアの名前に置き換えます。Amazon EC2 キーペアをまだ持っていない場合は、AWS Management Console で作成できます。詳細については、「Amazon EC2 ユーザーガイド」の「Amazon EC2 キーペア」を参照してください。残りすべての example values を独自の値に置き換えてください。置き換えが完了したら、変更したコマンドを実行して bottlerocket.yaml ファイルを作成します。

    Arm Amazon EC2 インスタンスタイプを指定する場合は、デプロイする前に Amazon EKS 最適化 Arm Amazon Linux AMI の考慮事項を確認してください。カスタム AMI を使用したデプロイの手順については、「GitHub」の「Bottlerocket の構築」と、「eksctl ドキュメント」の「カスタム AMI のサポート」を参照してください。マネージド型ノードグループをデプロイするには、起動テンプレートを使用してカスタム AMI をデプロイします。詳細については、「起動テンプレートを使用してマネージドノードをカスタマイズする」を参照してください。

    重要

    ノードグループを AWS Outposts、AWS Wavelength、または AWS Local Zones サブネットにデプロイする場合、クラスターの作成時に AWS Outposts、AWS Wavelength、または AWS Local Zone のサブネットを渡さないでください。次の例では、サブネットを指定する必要があります。詳細については、eksctl ドキュメントの「設定ファイルからノードグループを作成する」と「Config ファイルのスキーマ」を参照してください。region-code をクラスターのある AWS リージョン に置き換えます。

    cat >bottlerocket.yaml <<EOF --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: '1.31' iam: withOIDC: true nodeGroups: - name: ng-bottlerocket instanceType: m5.large desiredCapacity: 3 amiFamily: Bottlerocket ami: auto-ssm iam: attachPolicyARNs: - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy ssh: allow: true publicKeyName: my-ec2-keypair-name EOF
  2. 次のコマンドでノードをデプロイします。

    eksctl create nodegroup --config-file=bottlerocket.yaml

    出力例は次のとおりです。

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

    [✔] created 1 nodegroup(s) in cluster "my-cluster"
  3. (オプション) Amazon EBS CSI プラグインを使用して、Bottlerocket ノード上に Kubernetes の永続ボリュームを作成します。デフォルトの Amazon EBS ドライバーは、Bottlerocket に含まれていないファイルシステムツールに依存します。ドライバーを使用してストレージクラスを作成する方法の詳細については、「Amazon EBS を利用して Kubernetes ボリュームを保存する」を参照してください。

  4. (オプション) kube-proxy では、デフォルトで、最初に Bottlerocket がブート時に設定するものとは異なるデフォルト値に nf_conntrack_max カーネルパラメータが設定されています。Bottlerocket のデフォルト設定を保持するには、次のコマンドを使用して kube-proxy 設定を編集します。

    kubectl edit -n kube-system daemonset kube-proxy

    次の例にある kube-proxy 引数に、--conntrack-max-per-core--conntrack-min を追加します。0 の設定は、変更がないことを意味します。

    containers: - command: - kube-proxy - --v=2 - --config=/var/lib/kube-proxy-config/config - --conntrack-max-per-core=0 - --conntrack-min=0
  5. (オプション) サンプルアプリケーションをデプロイして Bottlerocket ノードをテストします。

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

    • すべての Kubernetes サービスアカウントに IAM ロールを割り当てて、Pods が必要最小限のアクセス許可のみを持つように計画しています。

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

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