Karpenter
対応バージョン: Karpenter 1.6 - 1.14、Kubernetes 1.29+(v1.14 時点) 最終更新: August 24, 2026
目次
- 概要
- アーキテクチャ
- インストールと設定
- Provisioner (English)
- Node Templates (English)
- 中断処理
- 統合
- Amazon EKS との統合
- ベストプラクティス
- トラブルシューティング
- まとめ
概要
Karpenter は、Kubernetes クラスターの Node プロビジョニングを自動化するオープンソースのクラスターオートスケーラーです。Karpenter はワークロード要件に基づいて適切なコンピューティングリソースを動的にプロビジョニングし、アプリケーションの可用性を確保するとともにクラスターの効率を最適化します。
Karpenter の主な利点
- 高速スケーリング: ワークロード要件に基づき、数秒以内に Node をプロビジョニング
- コスト最適化: ワークロードに最適なインスタンスタイプを選択
- シンプルな設定: 宣言的 API による容易な設定
- ワークロード中心の設計: Pod 要件に基づく Node プロビジョニング
- クラウド統合: クラウドプロバイダーの機能を活用
- 効率的な Bin Packing: リソース使用率を最適化
- 柔軟な Node 管理: Node ライフサイクル管理と統合された中断処理
既存のオートスケーラーとの比較
| 機能 | Karpenter | Cluster Autoscaler | クラウドプロバイダー管理 Node Groups |
|---|---|---|---|
| スケーリング速度 | 非常に高速(秒) | 中程度(分) | 低速(分) |
| インスタンスタイプの選択 | 動的 | Node group ベース | Node group ベース |
| Bin Packing の効率 | 高 | 中 | 低 |
| 設定の複雑さ | 低 | 中 | 低 |
| クラウド統合 | ネイティブ | 制限あり | ネイティブ |
| Node Group 管理 | 不要 | 必要 | 必要 |
| 中断処理 | 統合済み | 制限あり | 制限あり |
注記: Karpenter ではなく従来の EKS Managed Node Groups と Cluster Autoscaler を使用し続ける場合、EC2 Auto Scaling Warm Pools(2026 年 4 月以降利用可能)により、コールドスタートなしでスケールアウトできるよう初期化済みインスタンスを待機状態に維持できます。Stopped 状態(低コスト)または Running 状態(より高速な移行)を選択でき、Cluster Autoscaler と自動的に統合されます。ただし、これは Managed Node Group の機能であり、Karpenter が使用するものではありません。
アーキテクチャ
Karpenter は Kubernetes controller として動作し、スケジュール不能な Pod を検出して適切な Node をプロビジョニングします。
Karpenter のワークフロー
次の図は、EKS クラスターで Karpenter がどのように動作するかを示しています。
主要コンポーネント
- Karpenter Controller: スケジュール不能な Pod を検出し、Node プロビジョニングを管理
- Karpenter Webhook: Karpenter リソースを検証
- Provisioner CRD: Node プロビジョニングポリシーを定義
- NodeTemplate CRD: プロビジョニングする Node の設定を定義
- Cloud Provider Integration: クラウドプロバイダー API と統合してコンピューティングリソースを管理
仕組み
- Karpenter Controller がスケジュール不能な Pod を検出します
- Pod 要件(リソース、Node selector、toleration など)を分析します
- Provisioner と Node template の設定に基づいて適切な Node タイプを決定します
- クラウドプロバイダー API を呼び出して Node をプロビジョニングします
- Node がクラスターに参加した後に Pod をスケジュールします
- 不要になった Node は、統合された中断処理によって削除します
インストールと設定
前提条件
- Kubernetes クラスター(v1.19 以降)
- kubectl が設定済みであること
- クラウドプロバイダーの認証情報と権限
- Helm(任意)
AWS EKS へのインストール
1. IAM Role と Policy の設定
# IRSA setup using eksctl
eksctl create iamserviceaccount \
--cluster=my-cluster \
--name=karpenter \
--namespace=karpenter \
--attach-policy-arn=arn:aws:iam::aws:policy/AmazonEKSClusterPolicy \
--attach-policy-arn=arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \
--approve
# Create instance profile
aws iam create-instance-profile --instance-profile-name KarpenterNodeInstanceProfile
# Create node role
aws iam create-role --role-name KarpenterNodeRole --assume-role-policy-document file://node-trust-policy.json
# Attach policies to node role
aws iam attach-role-policy --role-name KarpenterNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
aws iam attach-role-policy --role-name KarpenterNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
aws iam attach-role-policy --role-name KarpenterNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
aws iam attach-role-policy --role-name KarpenterNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name KarpenterNodeInstanceProfile --role-name KarpenterNodeRole2. Helm を使用したインストール
# Add Helm repository
helm repo add karpenter https://charts.karpenter.sh
helm repo update
# Install Karpenter
helm install karpenter karpenter/karpenter \
--namespace karpenter \
--create-namespace \
--set serviceAccount.annotations."eks\.amazonaws\.com/role-arn"=arn:aws:iam::${ACCOUNT_ID}:role/KarpenterControllerRole \
--set clusterName=${CLUSTER_NAME} \
--set clusterEndpoint=${CLUSTER_ENDPOINT} \
--set aws.defaultInstanceProfile=KarpenterNodeInstanceProfile3. インストールの確認
kubectl get pods -n karpenter想定される出力:
NAME READY STATUS RESTARTS AGE
karpenter-6f4f46d855-5lqx7 1/1 Running 0 1m基本的な Provisioner 設定
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
limits:
cpu: 1000
memory: 1000Gi
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: node.kubernetes.io/instance-type
operator: In
values: ["m5.large", "m5.xlarge", "m5.2xlarge"]
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: default
---
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: default
spec:
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: "true"
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: "true"
tags:
karpenter.sh/discovery: "true"
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 100Gi
volumeType: gp3
deleteOnTermination: trueNodePool
NodePool は、Karpenter が Node をどのようにプロビジョニングするかを定義する Kubernetes custom resource です。以前の Provisioner を置き換えるものです。
基本的な NodePool 設定
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
# Node requirements
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: node.kubernetes.io/instance-type
operator: In
values: ["m5.large", "m5.xlarge", "m5.2xlarge"]
# Resource limits
limits:
cpu: 1000
memory: 1000Gi
# Node class reference
template:
spec:
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: default
# Node expiration settings
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
expireAfter: 720h # 30 days
# Taints and labels
template:
spec:
taints:
- key: example.com/special-taint
value: "true"
effect: NoSchedule
labels:
environment: production
app: web
# Startup template
template:
spec:
startupTaints:
- key: node.kubernetes.io/not-ready
effect: NoScheduleRequirements の設定
Requirements は、Karpenter がプロビジョニングする Node の特性を定義します。
template:
spec:
requirements:
# Capacity type (on-demand or spot)
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand", "spot"]
# Architecture
- key: kubernetes.io/arch
operator: In
values: ["amd64", "arm64"]
# Instance types
- key: node.kubernetes.io/instance-type
operator: In
values: ["m5.large", "m5.xlarge", "c5.large"]
# Availability zones
- key: topology.kubernetes.io/zone
operator: In
values: ["us-west-2a", "us-west-2b", "us-west-2c"]
# Operating system
- key: kubernetes.io/os
operator: In
values: ["linux"]Limits の設定
Limits は、Karpenter がプロビジョニングできるリソースの最大量を定義します。
limits:
cpu: 1000
memory: 1000Gi
nvidia.com/gpu: 10Dynamic Resource Allocation (DRA) サポート(v1.13)
Karpenter v1.13(2026 年 6 月リリース)以降、Karpenter は Kubernetes Dynamic Resource Allocation(DRA)に基づくデバイス割り当ての追跡をサポートしています。Karpenter は GPU や特殊なアクセラレーターなどの claim ベースのリソースを認識してプロビジョニングの判断に反映できるようになり、nvidia.com/gpu のような拡張リソースだけでなく、DRA の ResourceClaim/DeviceClass オブジェクトを使用する AI/HPC ワークロードに対しても正確なスケーリングを実現します。DRA ベースの追跡には Kubernetes 1.29 以降が必要です。
Node 有効期限の設定
Node 有効期限の設定では、Karpenter が Node を削除するタイミングを定義します。
disruption:
# Consolidate (remove) when node is empty
consolidationPolicy: WhenEmpty
# Time until consolidation (removal) after node becomes empty
consolidateAfter: 30s
# Maximum time before removing node after creation
expireAfter: 720h # 30 daysNodeReadinessController による初期化 Taint の自動無視(v1.13)
Karpenter v1.13 で追加された NodeReadinessController は、不要なスケジューリングのブロックを減らすため、readiness 関連の Taint(Node の初期化中に適用されるものなど)を自動的に無視します。これにより、以前は startupTaints による手動処理が必要だった初期化遅延の問題が緩和され、新しい Node が Ready になる間のスケジューリングの安定性とプロビジョニングの信頼性が向上します。
2026 年 7 月の更新: v1.14 リリース
2026 年 7 月 11 日にリリースされた Karpenter v1.14 には、次の内容が含まれます。
- CapacityBuffers API のサポート: 突発的なスケールアウトの急増を吸収するための余剰キャパシティを宣言的に予約
- Preview インスタンスタイプのサポート: まだ一般提供されていないインスタンスタイプをプロビジョニングに選択可能
- Nitro Enclaves のサポート: launch template に
EnclaveOptions.Enabledを設定可能。機密コンピューティングワークロードに有用 - バグ修正: secondary ENI の primary IP の考慮、Zonal Shift cache の確実な hydration、AWS SDK client timeout の operator config への接続など
詳細は v1.14.0 release notes を参照してください。
続いて 2026 年 7 月 17 日には、保守されているすべての minor line を対象に、協調した patch release(v1.3.8 から v1.11.3)がリリースされ、それぞれで upstream の sigs.k8s.io/karpenter バージョンが更新されました。古い line を使用している場合は、その line の最新 patch への更新を推奨します(release list)。
2026 年 7 月 22 日、AWS はさらに、Karpenter(および EKS Auto Mode)の Node pool 向けに Elastic Fabric Adapter(EFA)network device 設定と EC2 placement group のサポートを発表しました。EFA 対応インスタンスの network interface は、VPC IP address を消費しない EFA-only、または標準 ENI に設定できます。また、cluster/spread/partition の placement strategy を Node pool 設定で直接指定できます。これは分散トレーニングおよび推論ワークロードに有用です。発表 を参照してください。
2026 年 8 月の更新: v1.14.1 Patch Release
v1.14 line で最初の patch である v1.14.1 は、2026 年 8 月 21 日に公開されました。これは upstream の sigs.k8s.io/karpenter バージョンを更新し、v1.14.0 以降に作成された修正を cherry-pick するメンテナンスリリースです。
Node Classes
Node class は、Karpenter がプロビジョニングする Node の設定を定義します。AWS では、EC2NodeClass CRD を使用します。
AWS EC2NodeClass の設定
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: default
spec:
# Subnet selection
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: "true"
# Security group selection
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: "true"
# Instance tags
tags:
karpenter.sh/discovery: "true"
environment: production
# Block device mappings
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 100Gi
volumeType: gp3
deleteOnTermination: true
encrypted: true
# Detailed instance configuration
role: KarpenterNodeRole
amiFamily: AL2
userData: |
#!/bin/bash
echo "Hello from Karpenter node!"
# Metadata options
metadataOptions:
httpEndpoint: enabled
httpProtocolIPv6: disabled
httpPutResponseHopLimit: 2
httpTokens: requiredSubnet と Security Group の選択
Subnet と Security Group は label selector を使用して選択できます。
# Subnet selection
subnetSelector:
karpenter.sh/discovery: "true"
Name: "private-*"
# Security group selection
securityGroupSelector:
karpenter.sh/discovery: "true"
aws:eks:cluster-name: "my-cluster"AMI の設定
Karpenter はさまざまな AMI family をサポートしています。
# Amazon Linux 2
amiFamily: AL2
# Bottlerocket
amiFamily: Bottlerocket
# Ubuntu
amiFamily: Ubuntu
# Custom AMI
amiSelector:
aws:ec2:image:id: "ami-0123456789abcdef0"Block Device の設定
Node のストレージ設定を定義できます。
blockDeviceMappings:
# Root volume
- deviceName: /dev/xvda
ebs:
volumeSize: 100Gi
volumeType: gp3
iops: 3000
throughput: 125
deleteOnTermination: true
encrypted: true
kmsKeyID: "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
# Additional volume
- deviceName: /dev/xvdb
ebs:
volumeSize: 500Gi
volumeType: gp3
deleteOnTermination: trueUser Data の設定
Node 起動時に実行する user data script を定義できます。
userData: |
#!/bin/bash
echo "Hello from Karpenter node!"
# System configuration
sysctl -w vm.max_map_count=262144
# Package installation
yum update -y
yum install -y amazon-cloudwatch-agent
# Start CloudWatch agent
systemctl enable amazon-cloudwatch-agent
systemctl start amazon-cloudwatch-agentNode Consolidation プロセス
次の図は、Karpenter の Node consolidation プロセスを示しています。この機能は、クラスター効率の最適化とコスト削減に重要です。
中断処理
Karpenter は、ワークロードの可用性を確保するために Node の中断を自動的に処理します。
統合された中断処理
Karpenter は次の中断イベントを処理します。
- Spot Instance の中断: AWS Spot instance の中断通知を処理
- Node の有効期限: TTL ベースの Node 置換
- スケールダウン: 不要になった Node を削除
- Node Consolidation: より効率的な Node 構成に統合
中断処理の設定
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
# Other configuration...
# Node expiration settings
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
expireAfter: 720h # 30 daysDraining の設定
Karpenter は Node を削除する前に、Pod を安全に drain します。
apiVersion: v1
kind: ConfigMap
metadata:
name: karpenter-global-settings
namespace: karpenter
data:
aws:
enablePodENI: "true"
batchMaxDuration: "10s"
batchIdleDuration: "1s"
featureGates:
driftEnabled: "true"
nodePool:
disruptionBudget:
maxUnavailablePercentage: "30"
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
expireAfter: 720hPDB(PodDisruptionBudget)との統合
Karpenter は、アプリケーションの可用性を確保するために PDB を尊重します。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: app-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: my-app統合
Karpenter は、さまざまな Kubernetes およびクラウドサービスと統合されます。
Kubernetes との統合
1. Pod Topology Spread Constraints
Karpenter は、Node をプロビジョニングする際に Pod Topology Spread Constraints を考慮します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 10
template:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: web-server2. Pod Affinity/Anti-Affinity
Karpenter は、Pod Affinity および Anti-Affinity ルールを考慮します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 10
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-server
topologyKey: "kubernetes.io/hostname"3. Taints と Tolerations
Karpenter は、Node をプロビジョニングする際に Taint と Toleration を考慮します。
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: gpu
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: ["g4dn.xlarge", "g4dn.2xlarge"]
taints:
- key: nvidia.com/gpu
value: "true"
effect: NoSchedule
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gpu-app
spec:
replicas: 3
template:
spec:
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
nodeSelector:
karpenter.sh/provisioner-name: gpuAWS との統合
1. EC2 Spot Instances
Karpenter は、コストを最適化するために EC2 Spot instances をサポートしています。
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: spot
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot"]
providerRef:
name: spot
---
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: spot
spec:
subnetSelector:
karpenter.sh/discovery: "true"
securityGroupSelector:
karpenter.sh/discovery: "true"2. EC2 Instance Profiles
Karpenter は、Node に IAM 権限を付与するために EC2 instance profile を使用します。
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: default
spec:
instanceProfile: KarpenterNodeInstanceProfile3. Launch Templates
Karpenter は EC2 launch template をサポートしています。
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: custom-launch-template
spec:
launchTemplate:
name: my-launch-template
version: "1"Amazon EKS との統合
Karpenter は Amazon EKS とシームレスに統合され、クラスターオートスケーリングを提供します。
EKS クラスターの準備
1. クラスター Tag の設定
Karpenter がクラスターリソースを識別できるよう、Tag を設定します。
# Set cluster name
CLUSTER_NAME="my-cluster"
# VPC tag setup
aws ec2 create-tags \
--resources $(aws eks describe-cluster \
--name ${CLUSTER_NAME} \
--query "cluster.resourcesVpcConfig.vpcId" \
--output text) \
--tags Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}
# Subnet tag setup
for SUBNET in $(aws eks describe-cluster \
--name ${CLUSTER_NAME} \
--query "cluster.resourcesVpcConfig.subnetIds[]" \
--output text); do
aws ec2 create-tags \
--resources ${SUBNET} \
--tags Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}
done
# Security group tag setup
aws ec2 create-tags \
--resources $(aws eks describe-cluster \
--name ${CLUSTER_NAME} \
--query "cluster.resourcesVpcConfig.clusterSecurityGroupId" \
--output text) \
--tags Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}2. IAM Role の設定
Karpenter Controller と Node に必要な IAM Role を設定します。
# Create controller role
cat <<EOF > controller-trust-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"${OIDC_PROVIDER}:sub": "system:serviceaccount:karpenter:karpenter",
"${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
}
}
}
]
}
EOF
aws iam create-role \
--role-name KarpenterControllerRole-${CLUSTER_NAME} \
--assume-role-policy-document file://controller-trust-policy.json
# Create controller policy
cat <<EOF > controller-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateLaunchTemplate",
"ec2:CreateFleet",
"ec2:RunInstances",
"ec2:CreateTags",
"ec2:TerminateInstances",
"ec2:DescribeLaunchTemplates",
"ec2:DescribeInstances",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSubnets",
"ec2:DescribeInstanceTypes",
"ec2:DescribeInstanceTypeOfferings",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeSpotPriceHistory",
"pricing:GetProducts",
"ssm:GetParameter"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resources": "arn:aws:iam::${ACCOUNT_ID}:role/KarpenterNodeRole-${CLUSTER_NAME}",
"Condition": {
"StringEquals": {
"iam:PassedToService": "ec2.amazonaws.com"
}
}
}
]
}
EOF
aws iam put-role-policy \
--role-name KarpenterControllerRole-${CLUSTER_NAME} \
--policy-name KarpenterControllerPolicy-${CLUSTER_NAME} \
--policy-document file://controller-policy.jsonEKS クラスターへの Karpenter のインストール
# Installation using Helm
helm install karpenter karpenter/karpenter \
--namespace karpenter \
--create-namespace \
--set serviceAccount.annotations."eks\.amazonaws\.com/role-arn"=arn:aws:iam::${ACCOUNT_ID}:role/KarpenterControllerRole-${CLUSTER_NAME} \
--set clusterName=${CLUSTER_NAME} \
--set clusterEndpoint=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.endpoint" --output text) \
--set aws.defaultInstanceProfile=KarpenterNodeInstanceProfile-${CLUSTER_NAME}EKS Managed Node Groups との併用
Karpenter は EKS Managed Node Groups と併用できます。
# Provisioner for EKS Managed Node Groups
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: managed-ng
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
- key: node.kubernetes.io/instance-type
operator: In
values: ["m5.large", "m5.xlarge"]
labels:
managed-by: karpenter
taints:
- key: managed-by
value: karpenter
effect: NoSchedule
providerRef:
name: managed-ng
ttlSecondsAfterEmpty: 30
---
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: managed-ng
spec:
subnetSelector:
karpenter.sh/discovery: "${CLUSTER_NAME}"
securityGroupSelector:
karpenter.sh/discovery: "${CLUSTER_NAME}"
tags:
karpenter.sh/discovery: "${CLUSTER_NAME}"EKS Fargate との併用
Karpenter は EKS Fargate と併用して、ハイブリッドクラスターを構成できます。
# Create Fargate profile
aws eks create-fargate-profile \
--cluster-name ${CLUSTER_NAME} \
--fargate-profile-name fp-default \
--pod-execution-role-arn arn:aws:iam::${ACCOUNT_ID}:role/AmazonEKSFargatePodExecutionRole \
--selectors namespace=default,namespace=kube-system
# Karpenter NodePool configuration
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: ec2
spec:
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: ec2
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
---
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: ec2
spec:
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: "${CLUSTER_NAME}"
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: "${CLUSTER_NAME}"AZ 障害への対応: Amazon ARC Zonal Shift 統合(2026 年 5 月)
Karpenter は Amazon ARC(Application Recovery Controller)の Zonal Shift をサポートしています。Availability Zone(AZ)で障害が発生すると、Karpenter はその AZ での新しい Node のプロビジョニングを自動的に停止し、代わりに正常な AZ にワークロードをスケジュールします。AWS が AZ の正常性を自動検出し、トラフィックシフトと復旧を処理する Zonal Autoshift もサポートされています。
障害が検出されると、Karpenter は outage 中の不要な Node 置換によってクラスターがさらに不安定になることを防ぐため、任意の disruption(consolidation、drift handling など)も自動的に停止します。これは既存の EKS ARC リソースを直接使用するもので、custom resource は不要です。また、ENABLE_ZONAL_SHIFT option で有効化します。
EKS のコスト最適化
Karpenter を使用して、EKS クラスターのコストを最適化できます。
1. Spot Instances の使用
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: spot
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot"]
- key: kubernetes.io/arch
operator: In
values: ["amd64", "arm64"]
providerRef:
name: spot
ttlSecondsAfterEmpty: 30
---
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: spot
spec:
subnetSelector:
karpenter.sh/discovery: "${CLUSTER_NAME}"
securityGroupSelector:
karpenter.sh/discovery: "${CLUSTER_NAME}"2. 多様なインスタンスタイプの使用
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: flexible
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand", "spot"]
- key: kubernetes.io/arch
operator: In
values: ["amd64", "arm64"]
- key: node.kubernetes.io/instance-type
operator: In
values: [
"m5.large", "m5.xlarge", "m5.2xlarge",
"m6g.large", "m6g.xlarge", "m6g.2xlarge",
"c5.large", "c5.xlarge", "c5.2xlarge",
"c6g.large", "c6g.xlarge", "c6g.2xlarge",
"r5.large", "r5.xlarge", "r5.2xlarge",
"r6g.large", "r6g.xlarge", "r6g.2xlarge"
]
providerRef:
name: flexible
ttlSecondsAfterEmpty: 303. Node Consolidation の有効化
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: default
spec:
consolidation:
enabled: true
# Other configuration...ベストプラクティス
パフォーマンス最適化
- 適切なインスタンスタイプを選択: ワークロードに適したインスタンスタイプを選択
- 多様なインスタンスタイプを許可: 可用性とコスト最適化のために、さまざまなインスタンスタイプを許可
- 適切な TTL を設定: ワークロードパターンに一致する TTL を設定
- Node Consolidation を有効化: リソース使用率を最適化するために Node consolidation を有効化
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: optimized
spec:
# Allow diverse instance types
template:
spec:
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: [
"m5.large", "m5.xlarge", "m5.2xlarge",
"c5.large", "c5.xlarge", "c5.2xlarge",
"r5.large", "r5.xlarge", "r5.2xlarge"
]
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: optimized
# Set appropriate TTL
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
expireAfter: 720h # 30 daysコスト最適化
- Spot Instances を活用: コスト削減のために Spot instances を使用
- 適切なインスタンスサイズを選択: ワークロードに適したインスタンスサイズを選択
- ゼロスケーリングを活用: アクティビティがない場合は Node 数を 0 に削減
- Node の有効期限を設定: 定期的な Node 置換により最新のインスタンスタイプを活用
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: cost-optimized
spec:
# Use Spot instances
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot"]
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: cost-optimized
# Zero scaling and node expiration settings
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 30s
expireAfter: 168h # 7 days可用性の向上
- 複数の Availability Zone を使用: 複数の Availability Zone に Node をデプロイ
- On-demand と Spot Instances を混在: 可用性とコストのバランスを確保
- 適切な PDB を設定: アプリケーションの可用性を確保
- 中断処理を最適化: Node 中断時のワークロード可用性を確保
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: high-availability
spec:
# Use multiple availability zones
template:
spec:
requirements:
- key: topology.kubernetes.io/zone
operator: In
values: ["us-west-2a", "us-west-2b", "us-west-2c"]
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand", "spot"]
nodeClassRef:
name: high-availability
# Optimize interruption handling
disruption:
consolidationPolicy: WhenEmpty
consolidateAfter: 60s
ttlSecondsUntilExpired: 2592000 # 30 days
# Node consolidation settings
consolidation:
enabled: trueトラブルシューティング
一般的な問題
1. Node プロビジョニングの失敗
症状: Pod が Pending 状態のままで、Node がプロビジョニングされない
解決策:
- Karpenter のログを確認
- IAM 権限を検証
- Provisioner 設定を確認
# Check Karpenter logs
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter -c controller
# Check provisioner status
kubectl describe provisioner <name>
# Check pod events
kubectl describe pod <name>2. Node 削除の問題
症状: Node が想定どおりに削除されない
解決策:
- TTL 設定を確認
- Node consolidation 設定を検証
- Pod draining の状態を確認
# Check node status
kubectl describe node <name>
# Check node labels
kubectl get node <name> --show-labels
# Check Karpenter logs
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter -c controller | grep "node termination"3. インスタンスタイプ選択の問題
症状: 想定外のインスタンスタイプがプロビジョニングされる
解決策:
- Provisioner requirements を確認
- Pod resource request を検証
- Availability Zone の制約を確認
# Check provisioner requirements
kubectl get provisioner <name> -o yaml
# Check pod resource requests
kubectl describe pod <name>
# Check node information
kubectl describe node <name>デバッグツール
# Check Karpenter version
kubectl get deployment -n karpenter karpenter -o jsonpath="{.spec.template.spec.containers[0].image}"
# Check Karpenter logs
kubectl logs -n karpenter -l app.kubernetes.io/name=karpenter -c controller
# Check provisioner list
kubectl get provisioners
# Check node template list
kubectl get awsnodetemplates
# Check events
kubectl get events --sort-by='.lastTimestamp'
# Enable debug logs
kubectl patch configmap -n karpenter karpenter-global-settings --type merge -p '{"data":{"logLevel":"debug"}}'まとめ
Karpenter は、Kubernetes クラスターの Node プロビジョニングを自動化する強力なオートスケーラーです。ワークロード要件に基づいて適切なコンピューティングリソースを動的にプロビジョニングし、アプリケーションの可用性を確保するとともにクラスターの効率を最適化します。
このドキュメントでは、Karpenter の基本概念、インストール方法、Provisioner と Node template の設定、中断処理、さまざまな統合、Amazon EKS との統合、ベストプラクティス、トラブルシューティングについて説明しました。
Karpenter を使用すると、クラスター管理を簡素化し、リソース使用率を最適化して、コストを削減できます。特に Amazon EKS のようなクラウド管理 Kubernetes 環境では、Karpenter の利点を最大限に活用できます。
次のステップ
- Karpenter を使用してコスト最適化戦略を実装する
- さまざまなワークロードタイプ向けに Provisioner を設定する
- ハイブリッドクラスターアーキテクチャを設計する
- Karpenter を他の Kubernetes ツールと統合する
- 高度な Node ライフサイクル管理戦略を開発する
参考資料
- Karpenter 公式ドキュメント
- Karpenter GitHub リポジトリ
- Amazon EKS Workshop - Karpenter
- AWS Blog - Karpenter
- Karpenter ベストプラクティス
- Karpenter GitHub Releases
- AWS What's New - Karpenter ARC Zonal Shift サポート
- AWS What's New - Amazon EKS Managed Node Group Warm Pool サポート
クイズ
この章で学んだ内容を確認するには、トピッククイズ を試してください。