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

ノードプールの設定

Karpenterの設定はNodePool CRD(Custom Resource Definition)の形式で提供されます。単一のKarpenter NodePoolは、さまざまな形状のポッドを処理することができます。Karpenterは、ラベルやアフィニティなどのポッド属性に基づいてスケジューリングとプロビジョニングの決定を行います。クラスターには複数のNodePoolを設定できますが、ここではまず基本的なものを宣言します。

Karpenterの主な目的の一つは、キャパシティ管理を簡素化することです。他の自動スケーリングソリューションに慣れている方は、Karpenterがグループレス自動スケーリングと呼ばれる異なるアプローチを取っていることに気づくかもしれません。従来の他のソリューションでは、ノードグループの概念を制御要素として使用し、提供されるキャパシティの特性(オンデマンド、EC2スポット、GPUノードなど)を定義し、クラスター内のグループの希望するスケールを制御していました。AWSでは、ノードグループの実装はAuto Scalingグループに対応しています。Karpenterを使用すると、異なる計算ニーズを持つ複数のタイプのアプリケーションを管理する際に発生する複雑さを回避することができます。

まずはKarpenterが使用するカスタムリソースを適用することから始めましょう。最初に、一般的なキャパシティ要件を定義するNodePoolを作成します:

~/environment/eks-workshop/modules/autoscaling/compute/karpenter/nodepool/nodepool.yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
template:
metadata:
labels:
type: karpenter
spec:
requirements:
- key: "karpenter.sh/capacity-type"
operator: In
values: ["on-demand"]
- key: "node.kubernetes.io/instance-type"
operator: In
values: ["c5.large", "m5.large", "r5.large", "m5.xlarge"]
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: default
expireAfter: 72h
limits:
cpu: "1000"
memory: 1000Gi
disruption:
consolidationPolicy: WhenEmptyOrUnderutilized
consolidateAfter: 1m
A

NodePoolに、すべての新しいノードにtype: karpenterというKubernetesラベルを付けるよう指示しています。これにより、デモンストレーションの目的でKarpenterノードを特定のポッドでターゲットにすることができます。

B

NodePool CRDは、インスタンスタイプやゾーンなどのノードプロパティを定義することをサポートしています。この例では、karpenter.sh/capacity-typeを設定して、Karpenterがオンデマンドインスタンスのプロビジョニングに限定するとともに、node.kubernetes.io/instance-typeで特定のインスタンスタイプのサブセットに限定しています。どのようなプロパティが利用可能かについてはこちらで詳しく学ぶことができます。ワークショップ中にさらにいくつか取り組む予定です。

C

NodePoolは、それによって管理されるCPUとメモリの量に制限を定義することができます。この制限に達すると、Karpenterはその特定のNodePoolに関連する追加のキャパシティをプロビジョニングしなくなり、総計算リソースに上限を設けます。

また、AWSに適用される特定の設定を提供するEC2NodeClassも必要です:

~/environment/eks-workshop/modules/autoscaling/compute/karpenter/nodepool/nodeclass.yaml
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: default
spec:
amiFamily: AL2023
amiSelectorTerms:
- alias: al2023@latest
role: "${KARPENTER_ROLE}"
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: $EKS_CLUSTER_NAME
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: $EKS_CLUSTER_NAME
tags:
app.kubernetes.io/created-by: eks-workshop
A

KarpenterによってプロビジョニングされるEC2インスタンスに適用されるIAMロールを割り当てます

B

subnetSelectorTermsを使用して、KarpenterがEC2インスタンスを起動するサブネットを検索できます。これらのタグは、ワークショップ用に提供されている関連するAWSインフラストラクチャに自動的に設定されています。securityGroupSelectorTermsは、EC2インスタンスにアタッチされるセキュリティグループに対して同様の機能を果たします。

C

作成されるEC2インスタンスに適用されるタグのセットを定義し、会計とガバナンスを可能にします。

これで、Karpenterにクラスターの容量のプロビジョニングを開始するために必要な基本的な要件を提供しました。

次のコマンドでNodePoolEC2NodeClassを適用します:

~$kubectl kustomize ~/environment/eks-workshop/modules/autoscaling/compute/karpenter/nodepool \
| envsubst | kubectl apply -f-

ワークショップを通じて、以下のコマンドでKarpenterのログを調査し、その動作を理解することができます:

~$kubectl logs -l app.kubernetes.io/instance=karpenter -n karpenter | jq '.'