メインコンテンツまでスキップ

Gravitonノードの作成

この演習では、Gravitonベースのインスタンスを持つ別のマネージドノードグループをプロビジョニングし、それにTaintを適用します。

まず、クラスター内で利用可能なノードの現在の状態を確認しましょう:

~$kubectl get nodes -L kubernetes.io/arch
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 create-nodegroup \
--cluster-name $EKS_CLUSTER_NAME \
--nodegroup-name graviton \
--node-role $GRAVITON_NODE_ROLE \
--subnets $PRIMARY_SUBNET_1 $PRIMARY_SUBNET_2 $PRIMARY_SUBNET_3 \
--instance-types t4g.medium \
--ami-type AL2023_ARM_64_STANDARD \
--scaling-config minSize=1,maxSize=3,desiredSize=1 \
--disk-size 20
ヒント

aws eks wait nodegroup-active コマンドを使用して、特定のEKSノードグループがアクティブになり使用可能になるまで待つことができます。このコマンドはAWS CLIの一部であり、指定されたノードグループが正常に作成され、関連するすべてのインスタンスが実行中で準備完了していることを確認するために使用できます。

~$aws eks wait nodegroup-active \
--cluster-name $EKS_CLUSTER_NAME \
--nodegroup-name graviton

新しいマネージドノードグループがActiveになったら、次のコマンドを実行します:

~$kubectl get nodes \
--label-columns eks.amazonaws.com/nodegroup,kubernetes.io/arch
 
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プロセッサで実行されていることが示されています。

ノードの現在の構成を確認しましょう。以下のコマンドは、マネージドノードグループに属するすべてのノードの詳細を表示します。

~$kubectl describe nodes \
--selector eks.amazonaws.com/nodegroup=graviton
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>
[...]

いくつか注目すべき点があります:

  1. EKSは、OSタイプ、マネージドノードグループ名、インスタンスタイプなど、フィルタリングを容易にするために特定のラベルを自動的に追加します。EKSにはデフォルトで特定のラベルが提供されていますが、AWSではマネージドノードグループレベルで独自のカスタムラベルセットを設定できます。これにより、ノードグループ内のすべてのノードに一貫したラベルが付けられます。kubernetes.io/archラベルは、ARM64 CPUアーキテクチャを持つEC2インスタンスを実行していることを示しています。
  2. 現在、Taints: <none>の部分に示されているように、探索されたノードには構成されたTaintはありません。

マネージドノードグループのTaint設定

ここで説明されているように、kubectl CLIを使用してノードにTaintを適用するのは簡単ですが、基礎となるノードグループがスケールアップまたはスケールダウンするたびに、管理者がこの変更を行う必要があります。この課題を克服するために、AWSはマネージドノードグループにlabelstaintsの両方を追加することをサポートしており、MNG内のすべてのノードに関連するラベルとTaintが自動的に設定されます。

それでは、事前に構成されたマネージドノードグループgravitonにTaintを追加しましょう。このTaintにはkey=frontendvalue=trueeffect=NO_EXECUTEが設定されます。これにより、一致するTolerationを持たないTaintされたマネージドノードグループ上で既に実行されているPodは排除され、また適切なTolerationなしでは新しいPodはこのマネージドノードグループにスケジュールされません。

まず、以下のaws cliコマンドを使用してマネージドノードグループにtaintを追加しましょう:

~$aws eks update-nodegroup-config \
--cluster-name $EKS_CLUSTER_NAME --nodegroup-name graviton \
--taints "addOrUpdateTaints=[{key=frontend, value=true, effect=NO_EXECUTE}]"
{
    "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": []
    }
}

ノードグループがアクティブになるのを待つために、次のコマンドを実行します。

~$aws eks wait nodegroup-active --cluster-name $EKS_CLUSTER_NAME \
--nodegroup-name graviton

Taintの追加、削除、置換は、aws eks update-nodegroup-config CLIコマンドを使用してマネージドノードグループの構成を更新することで実行できます。これは、--taintsコマンドフラグにaddOrUpdateTaintsまたはremoveTaintsとTaintのリストを渡すことで行います。

ヒント

eksctl CLIを使用してマネージドノードグループにTaintを設定することもできます。詳細についてはドキュメントを参照してください。

Taintの設定ではeffect=NO_EXECUTEを使用しました。マネージドノードグループは現在、Taintのeffectに対して以下の値をサポートしています:

  • NO_SCHEDULE - これはKubernetesのNoSchedule Taint効果に対応します。一致するTolerationを持たないすべてのPodを拒絶するTaintでマネージドノードグループを構成します。実行中のすべてのPodはマネージドノードグループのノードから排除されません
  • NO_EXECUTE - これはKubernetesのNoExecute Taint効果に対応します。このTaintで構成されたノードが、新しくスケジュールされたPodを拒絶するだけでなく、一致するTolerationのない実行中のPodも排除することを許可します。
  • PREFER_NO_SCHEDULE - これはKubernetesのPreferNoSchedule Taint効果に対応します。可能であれば、EKSはこのTaintを許容しないPodをノードにスケジュールしないようにします。

以下のコマンドを使用して、マネージドノードグループのTaintが正しく設定されているか確認できます:

~$aws eks describe-nodegroup --cluster-name $EKS_CLUSTER_NAME \
--nodegroup-name graviton \
| jq .nodegroup.taints
[
  {
    "key": "frontend",
    "value": "true",
    "effect": "NO_EXECUTE"
  }
]
備考

マネージドノードグループの更新とラベルとTaintの伝播には通常数分かかります。Taintが設定されていないか、null値が表示される場合は、上記のコマンドを再試行する前に数分待ってください。

kubectl cliコマンドで確認すると、Taintが関連ノードに正しく伝播されていることも確認できます:

~$kubectl describe nodes \
--selector eks.amazonaws.com/nodegroup=graviton | grep Taints
Taints:             frontend=true:NoExecute