Gravitonノードの作成
この演習では、Gravitonベースのインスタンスを持つ別のマネージドノードグループをプロビジョニングし、それにTaintを適用します。
まず、クラスター内で利用可能なノードの現在の状態を確認しましょう:
NAME STATUS ROLES AGE VERSION ARCH
ip-192-168-102-2.us-west-2.compute.internal Ready <none> 6h56m v1.33-eks-036c24b amd64
ip-192-168-137-20.us-west-2.compute.internal Ready <none> 6h56m v1.33-eks-036c24b amd64
ip-192-168-19-31.us-west-2.compute.internal Ready <none> 6h56m v1.33-eks-036c24b amd64
この出力には、各ノードのCPUアーキテクチャを示す列があります。現在はすべてamd64ノードを使用しています。
この段階ではまだTaintを設定しません。これは後ほど行います。
次のコマンドでGravitonノードグループを作成します:
aws eks wait nodegroup-active コマンドを使用して、特定のEKSノードグループがアクティブになり使用可能になるまで待つことができます。このコマンドはAWS CLIの一部であり、指定されたノードグループが正常に作成され、関連するすべてのインスタンスが実行中で準備完了していることを確認するために使用できます。
新しいマネージドノードグループがActiveになったら、次のコマンドを実行します:
NAME STATUS ROLES AGE VERSION NODEGROUP ARCH
ip-192-168-102-2.us-west-2.compute.internal Ready <none> 6h56m v1.33-eks-036c24b default amd64
ip-192-168-137-20.us-west-2.compute.internal Ready <none> 6h56m v1.33-eks-036c24b default amd64
ip-192-168-19-31.us-west-2.compute.internal Ready <none> 6h56m v1.33-eks-036c24b default amd64
ip-10-42-172-231.us-west-2.compute.internal Ready <none> 2m5s v1.33-eks-036c24b graviton arm64
以下のコマンドは、--selectorフラグを使用して、マネージドノードグループ名gravitonと一致するeks.amazonaws.com/nodegroupラベルを持つすべてのノードを照会します。--label-columnsフラグを使うと、eks.amazonaws.com/nodegroupラベルの値とプロセッサアーキテクチャを出力に表示できます。ARCH列には、TaintされたノードグループがGraviton arm64プロセッサで実行されていることが示されています。
ノードの現在の構成を確認しましょう。以下のコマンドは、マネージドノードグループに属するすべてのノードの詳細を表示します。
Name: ip-10-42-12-233.us-west-2.compute.internal
Roles: <none>
Labels: beta.kubernetes.io/instance-type=t4g.medium
beta.kubernetes.io/os=linux
eks.amazonaws.com/capacityType=ON_DEMAND
eks.amazonaws.com/nodegroup=graviton
eks.amazonaws.com/nodegroup-image=ami-0b55230f107a87100
eks.amazonaws.com/sourceLaunchTemplateId=lt-07afc97c4940b6622
kubernetes.io/arch=arm64
[...]
CreationTimestamp: Wed, 09 Nov 2022 10:36:26 +0000
Taints: <none>
[...]
いくつか注目すべき点があります:
- EKSは、OSタイプ、マネージドノードグループ名、インスタンスタイプなど、フィルタリングを容易にするために特定のラベルを自動的に追加します。EKSにはデフォルトで特定のラベルが提供されていますが、AWSではマネージドノードグループレベルで独自のカスタムラベルセットを設定できます。これにより、ノードグループ内のすべてのノードに一貫したラベルが付けられます。
kubernetes.io/archラベルは、ARM64 CPUアーキテクチャを持つEC2インスタンスを実行していることを示しています。 - 現在、
Taints: <none>の部分に示されているように、探索されたノードには構成されたTaintはありません。
マネージドノードグループのTaint設定
ここで説明されているように、kubectl CLIを使用してノードにTaintを適用するのは簡単ですが、基礎となるノードグループがスケールアップまたはスケールダウンするたびに、管理者がこの変更を行う必要があります。この課題を克服するために、AWSはマネージドノードグループにlabelsとtaintsの両方を追加することをサポート しており、MNG内のすべてのノードに関連するラベルとTaintが自動的に設定されます。
それでは、事前に構成されたマネージドノードグループgravitonにTaintを追加しましょう。このTaintにはkey=frontend、value=true、effect=NO_EXECUTEが設定されます。これにより、一致するTolerationを持たないTaintされたマネージドノードグループ上で既に実行されているPodは排除され、また適切なTolerationなしでは新しいPodはこのマネージドノードグループにスケジュールされません。
まず、以下のaws cliコマンドを使用してマネージドノードグループにtaintを追加しましょう:
{ "update": {"id": "488a2b7d-9194-3032-974e-2f1056ef9a1b",
"status": "InProgress",
"type": "ConfigUpdate",
"params": [
{"type": "TaintsToAdd",
"value": "[{\"effect\":\"NO_EXECUTE\",\"value\":\"true\",\"key\":\"frontend\"}]"}
],
"createdAt": "2022-11-09T15:20:10.519000+00:00",
"errors": []
}
}
ノードグループがアクティブになるのを待つために、次のコマンドを実行します。
Taintの追加、削除、置換は、aws eks update-nodegroup-config CLIコマンドを使用してマネージドノードグループの構成を更新することで実行できます。これは、--taintsコマンドフラグにaddOrUpdateTaintsまたはremoveTaintsとTaintのリストを渡すことで行います。
eksctl CLIを使用してマネージドノードグループにTaintを設定することもできます。詳細についてはドキュメントを参照してください。
Taintの設定ではeffect=NO_EXECUTEを使用しました。マネージドノードグループは現在、Taintのeffectに対して以下の値をサポートしています:
NO_SCHEDULE- これはKubernetesのNoScheduleTaint効果に対応します。一致するTolerationを持たないすべてのPodを拒絶するTaintでマネージドノードグループを構成します。実行中のすべてのPodはマネージドノードグループのノードから排除されません。NO_EXECUTE- これはKubernetesのNoExecuteTaint効果に対応します。このTaintで構成されたノードが、新しくスケジュールされたPodを拒絶するだけでなく、一致するTolerationのない実行中のPodも排除することを許可します。PREFER_NO_SCHEDULE- これはKubernetesのPreferNoScheduleTaint効果に対応します。可能であれば、EKSはこのTaintを許容しないPodをノードにスケジュールしないようにします。
以下のコマンドを使用して、マネージドノードグループのTaintが正しく設定されているか確認で きます:
[
{"key": "frontend",
"value": "true",
"effect": "NO_EXECUTE"
}
]
マネージドノードグループの更新とラベルとTaintの伝播には通常数分かかります。Taintが設定されていないか、null値が表示される場合は、上記のコマンドを再試行する前に数分待ってください。
kubectl cliコマンドで確認すると、Taintが関連ノードに正しく伝播されていることも確認できます:
Taints: frontend=true:NoExecute