Amazon Elastic Kubernetes Service (Amazon EKS) クラスター用にスポットキャパシティを使用してマネージドノードグループを作成し、問題をトラブルシューティングしたいと考えています。
解決方法
1. eksctl をインストールします。
重要: 使用する前に必ずすべての AWS コマンドラインインターフェイス (AWS CLI) コマンドを確認し、サンプル文字列のインスタンスを自分の値に置き換えてください。例えば、example_cluster を自分のクラスター名に置き換えます。
2. 次のコマンドを実行して、既存のクラスターにスポット容量を持つマネージドノードグループを作成します。
#eksctl create nodegroup --cluster=<example_cluster> --spot --instance-types=<Comma-separated list of instance types> --region <EKS cluster AWS region. Defaults to the value set in your AWS config (~/.aws/config)>
例:
#eksctl create nodegroup --cluster=demo --spot --instance-types=c3.large,c4.large,c5.large --region us-east-1
注: --name、--nodes、--nodes-min、--nodes-max など、スポットマネージドノードグループの作成中に設定できるフラグは他にもあります。次のコマンドを実行して、使用可能なすべてのフラグのリストをすべて取得します。
#eksctl create nodegroup --help
3. クラスターの eksctl ClusterConfig 構成ファイルを管理している場合は、そのファイルを使用してスポット管理ノードグループを作成することもできます。以下のコマンドを実行して、spot-cluster.yaml 構成ファイルを使用してマネージドノードグループを使用したスポットインスタンスを作成します。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: <example_cluster>
region: <example_region>
managedNodeGroups:
- name: spot
instanceTypes: ["c3.large","c4.large","c5.large","c5d.large","c5n.large","c5a.large"]
spot: true
4. 以下のコマンドを実行しながら、構成ファイルを使用してノードグループを作成します。
# eksctl create nodegroup -f spot-cluster.yaml
Amazon EKS のスポットインスタンスに関連する問題のトラブルシューティング
以下のように eksctl または Amazon EKS コンソールを使用して、マネージドノードグループの状態を確認します。
$ eksctl utils nodegroup-health --name=<example_nodegroup> --cluster=<example_cluster>
使用済みインスタンスタイプのスポットキャパシティが不足しているため、スポットマネージドノードグループの状態はエラーによって低下する場合があります。次のエラー例をご参照ください。
AsgInstanceLaunchFailures Could not launch Spot Instances. UnfulfillableCapacity - Unable to fulfill capacity due to your request configuration. Please adjust your request and try again. Launching EC2 instance failed.
注: スポットインスタンスを首尾よく導入するには、スポットマネージドノードグループ構成の一部としてスポットインスタンスの分散化を実施するのがベストプラクティスです。スポットインスタンスの分散化により、複数のスポットインスタンスプールから容量を引き出すことができます。これだけの容量が得られれば、スポットインスタンスをスケールアップしたり、スポットインスタンスの終了通知を受ける可能性のあるスポットインスタンスを交換することができます。
クラスターのスポットノードグループを 1 vCPU: 4 GB の RAM 比率に準拠するインスタンスタイプでプロビジョニングする必要がある場合は、スポットインスタンスプールを分散します。次のいずれかの戦略を使用して、インスタンスプールを分散します。
- それぞれサイズが異なる複数のノードグループを作成します。例えば、サイズが 4 vCPU と 16 GB の RAM のノードグループと、8 vCPU と 32 GB の RAM で構成される別のノードグループがあるとします。
- ノードグループ内でインスタンスの分散化を実施します。そのためには、同じ vCPU とメモリ基準を満たすさまざまなスポットインスタンスプールからインスタンスタイプとファミリーを組み合わせて選択します。
amazon-ec2-instance-selector を使用して、次のコマンドを実行して、十分な数の vCPU と RAM を備えた関連するインスタンスタイプとファミリーを選択します。
curl -Lo ec2-instance-selector https://github.com/aws/amazon-ec2-instance-selector/releases/download/v2.0.3/ec2-instance-selector-`uname | tr '[:upper:]' '[:lower:]'`-amd64 && chmod +x ec2-instance-selector
sudo mv ec2-instance-selector /usr/local/bin/
ec2-instance-selector --version
例:
ec2-instance-selector --vcpus 4 --memory 16 --gpus 0 --current-generation -a x86_64 --deny-list '.*[ni].*'
上記のコマンドは、次のようなリストを表示します。これらのインスタンスをノードグループの一部として使用します。
- m4.xlarge
- m5.xlarge
- m5a.xlarge
- m5ad.xlarge
- m5d.xlarge
- t2.xlarge
- t3.xlarge
- t3a.xlarge
注: 既存のノードグループのインスタンスタイプは、Amazon EKS API を使用して変更することはできません。希望のインスタンスタイプで新しいスポットノードグループを作成するのがベストプラクティスです。eksctl の create nodegroup コマンドに以下を入力します。ノードグループがスポットインスタンスを実行していることを示す新しい eksctl フラグ --spot に注意してください。
$eksctl create nodegroup --cluster=<example_cluster> --spot --instance-types m5.xlarge,m4.xlarge,m5a.xlarge,m5d.xlarge,m5n.xlarge,m5ad.xlarge --region <example_region>