Karpenter 設定の確認
EKS Auto Mode は、すぐに使える機能として完全マネージド型の Karpenter を提供します。Karpenter の設定は NodePool CRD (Custom Resource Definition) の形式で提供されます。単一の Karpenter NodePool は、さまざまな Pod 形状を処理できます。Karpenter は、ラベルやアフィニティなどの Pod 属性に基づいてスケジューリングとプロビジョニングの決定を行います。クラスターには複数の NodePool を持つことができますが、当面は Auto Mode がデフォルトで設定する NodePool を使用します。
Karpenter の主な目的の 1 つは、容量管理を簡素化することです。他の自動スケーリングソリューションに精通している場合、Karpenter が グループレス自動スケーリング と呼ばれる異なるアプローチを採用していることに気づいたかもしれません。他のソリューションでは、従来 ノードグループ という概念を制御要素として使用し、提供される容量の特性(つまり:オンデマンド、EC2 Spot、GPU ノードなど)を定義し、クラスター内のグループの望ましいスケールを制御していました。AWS では、ノードグループの実装は Auto Scaling グループ と一致します。Karpenter を使用すると、異なるコンピューティングニーズ を持つ複数のタイプのアプリケーションを管理する際に生じる複雑さを回避できます。
まず、Karpenter が使用する既存のリソースを確認することから始めましょう。まず、一般的な容量要件を定義するデフォルトの NodePool を確認します:
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
annotations:
karpenter.sh/nodepool-hash: "4012513481623584108"
karpenter.sh/nodepool-hash-version: v3
generation: 1
labels:
app.kubernetes.io/managed-by: eks
name: general-purpose
resourceVersion: "57384"
spec:
disruption:
budgets:
- nodes: 10%
consolidateAfter: 30s
consolidationPolicy: WhenEmptyOrUnderutilized
template:
metadata: {}spec:
expireAfter: 336h
nodeClassRef:
group: eks.amazonaws.com
kind: NodeClass
name: default
requirements:
- key: karpenter.sh/capacity-type
operator: In
values:
- on-demand
- key: eks.amazonaws.com/instance-category
operator: In
values:
- c
- m
- r
- key: eks.amazonaws.com/instance-generation
operator: Gt
values:
- "4"
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
terminationGracePeriod: 24h0m0s
このデフォルトの NodePool リソースに加えて、ワークロードに対する異なる分離要件やインフラストラクチャ要件を指定するために、カスタム NodePool リソースを作成することもできます。以下は、そのための主な考慮事項です。
NodePoolは、すべての新しいノードを Kubernetes ラベルtype: karpenterで起動するように設定されており、これにより、デモンストレーション目的で Pod を Karpenter ノードに特定してターゲットできるようになります。- NodePool CRD は、インスタンスタイプやゾーンなどのノードプロパティの定義をサポートしています。この設定では、
karpenter.sh/capacity-typeを設定して、最初は Karpenter をオンデマンドインスタンスのプロビジョニングに制限し、node.kubernetes.io/instance-typeを設定して特定のインスタンスタイプのサブセットに制限しています。他にどのようなプロパティが 利用可能かはこちら で確認できます。ワークショップ中にさらにいくつか取り組みます。 NodePoolは、それが管理する CPU とメモリの量に制限を定義できます。この制限に達すると、Karpenter はその特定のNodePoolに関連する追加容量をプロビジョニングせず、総コンピューティングに上限を提供します。
NodePool に加えて、Karpenter にはもう 1 つ重要なリソース、NodeClass があります。前の NodePool 設定の nodeClassRef の下で参照されている NodeClass を確認できます。この NodeClass も EKS Auto Mode によって事前にプロビジョニングされています。以下がその設定です。
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
annotations:
eks.amazonaws.com/nodeclass-hash: "495408067366721138"
eks.amazonaws.com/nodeclass-hash-version: v2
finalizers:
- eks.amazonaws.com/termination
generation: 1
labels:
app.kubernetes.io/managed-by: eks
name: default
resourceVersion: "304263"
spec:
ephemeralStorage:
iops: 3000
size: 80Gi
throughput: 125
networkPolicy: DefaultAllow
networkPolicyEventLogs: Disabled
role: eks-workshop-auto-auto-node
securityGroupSelectorTerms:
- id: sg-0c70efd097a74a4cf
snatPolicy: Random
subnetSelectorTerms:
- id: subnet-096bfe6623a87be3f
- id: subnet-09e84ab4eee5d16bb
- id: subnet-02a87ab5b226b952d
role属性は、Karpenter によってプロビジョニングされる EC2 インスタンスに適用される IAM role を割り当てますsubnetSelectorTermsは、Karpenter が EC2 インスタンスを起動するサブネットを検索するために使用できます。securityGroupSelectorTermsは、EC2 インスタンスにアタッチされるセキュリティグループに対して同じ機能を実現します。
これらのリソースがすべて EKS Auto Mode によって管理されているため、Karpenter はクラスターの容量のプロビジョニングを開始するために必要な基本要件を満たしています。
実際に動作を確認するために、ハンズオンを行いましょう。