Skip to content

Karpenter ​

対応バージョン: Karpenter 1.6 - 1.14、Kubernetes 1.29+(v1.14 時点) 最終更新: August 24, 2026

目次 ​

概要 ​

Karpenter は、Kubernetes クラスターの Node プロビジョニングを自動化するオープンソースのクラスターオートスケーラーです。Karpenter はワークロード要件に基づいて適切なコンピューティングリソースを動的にプロビジョニングし、アプリケーションの可用性を確保するとともにクラスターの効率を最適化します。

Karpenter の主な利点 ​

  1. 高速スケーリング: ワークロード要件に基づき、数秒以内に Node をプロビジョニング
  2. コスト最適化: ワークロードに最適なインスタンスタイプを選択
  3. シンプルな設定: 宣言的 API による容易な設定
  4. ワークロード中心の設計: Pod 要件に基づく Node プロビジョニング
  5. クラウド統合: クラウドプロバイダーの機能を活用
  6. 効率的な Bin Packing: リソース使用率を最適化
  7. 柔軟な Node 管理: Node ライフサイクル管理と統合された中断処理

既存のオートスケーラーとの比較 ​

機能KarpenterCluster 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 がどのように動作するかを示しています。

主要コンポーネント ​

  1. Karpenter Controller: スケジュール不能な Pod を検出し、Node プロビジョニングを管理
  2. Karpenter Webhook: Karpenter リソースを検証
  3. Provisioner CRD: Node プロビジョニングポリシーを定義
  4. NodeTemplate CRD: プロビジョニングする Node の設定を定義
  5. Cloud Provider Integration: クラウドプロバイダー API と統合してコンピューティングリソースを管理

仕組み ​

  1. Karpenter Controller がスケジュール不能な Pod を検出します
  2. Pod 要件(リソース、Node selector、toleration など)を分析します
  3. Provisioner と Node template の設定に基づいて適切な Node タイプを決定します
  4. クラウドプロバイダー API を呼び出して Node をプロビジョニングします
  5. Node がクラスターに参加した後に Pod をスケジュールします
  6. 不要になった Node は、統合された中断処理によって削除します

インストールと設定 ​

前提条件 ​

  • Kubernetes クラスター(v1.19 以降)
  • kubectl が設定済みであること
  • クラウドプロバイダーの認証情報と権限
  • Helm(任意)

AWS EKS へのインストール ​

1. IAM Role と Policy の設定 ​

bash
# 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 KarpenterNodeRole

2. Helm を使用したインストール ​

bash
# 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=KarpenterNodeInstanceProfile

3. インストールの確認 ​

bash
kubectl get pods -n karpenter

想定される出力:

NAME                         READY   STATUS    RESTARTS   AGE
karpenter-6f4f46d855-5lqx7   1/1     Running   0          1m

基本的な Provisioner 設定 ​

yaml
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: true

NodePool ​

NodePool は、Karpenter が Node をどのようにプロビジョニングするかを定義する Kubernetes custom resource です。以前の Provisioner を置き換えるものです。

基本的な NodePool 設定 ​

yaml
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: NoSchedule

Requirements の設定 ​

Requirements は、Karpenter がプロビジョニングする Node の特性を定義します。

yaml
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 がプロビジョニングできるリソースの最大量を定義します。

yaml
limits:
  cpu: 1000
  memory: 1000Gi
  nvidia.com/gpu: 10

Dynamic 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 を削除するタイミングを定義します。

yaml
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 days

NodeReadinessController による初期化 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 の設定 ​

yaml
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: required

Subnet と Security Group の選択 ​

Subnet と Security Group は label selector を使用して選択できます。

yaml
# 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 をサポートしています。

yaml
# Amazon Linux 2
amiFamily: AL2

# Bottlerocket
amiFamily: Bottlerocket

# Ubuntu
amiFamily: Ubuntu

# Custom AMI
amiSelector:
  aws:ec2:image:id: "ami-0123456789abcdef0"

Block Device の設定 ​

Node のストレージ設定を定義できます。

yaml
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: true

User Data の設定 ​

Node 起動時に実行する user data script を定義できます。

yaml
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-agent

Node Consolidation プロセス ​

次の図は、Karpenter の Node consolidation プロセスを示しています。この機能は、クラスター効率の最適化とコスト削減に重要です。

中断処理 ​

Karpenter は、ワークロードの可用性を確保するために Node の中断を自動的に処理します。

統合された中断処理 ​

Karpenter は次の中断イベントを処理します。

  1. Spot Instance の中断: AWS Spot instance の中断通知を処理
  2. Node の有効期限: TTL ベースの Node 置換
  3. スケールダウン: 不要になった Node を削除
  4. Node Consolidation: より効率的な Node 構成に統合

中断処理の設定 ​

yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  # Other configuration...

  # Node expiration settings
  disruption:
    consolidationPolicy: WhenEmpty
    consolidateAfter: 30s
    expireAfter: 720h  # 30 days

Draining の設定 ​

Karpenter は Node を削除する前に、Pod を安全に drain します。

yaml
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: 720h

PDB(PodDisruptionBudget)との統合 ​

Karpenter は、アプリケーションの可用性を確保するために PDB を尊重します。

yaml
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 を考慮します。

yaml
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-server

2. Pod Affinity/Anti-Affinity ​

Karpenter は、Pod Affinity および Anti-Affinity ルールを考慮します。

yaml
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 を考慮します。

yaml
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: gpu

AWS との統合 ​

1. EC2 Spot Instances ​

Karpenter は、コストを最適化するために EC2 Spot instances をサポートしています。

yaml
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 を使用します。

yaml
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
  name: default
spec:
  instanceProfile: KarpenterNodeInstanceProfile

3. Launch Templates ​

Karpenter は EC2 launch template をサポートしています。

yaml
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 を設定します。

bash
# 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 を設定します。

bash
# 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.json

EKS クラスターへの Karpenter のインストール ​

bash
# 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 と併用できます。

yaml
# 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 と併用して、ハイブリッドクラスターを構成できます。

yaml
# 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 の使用 ​

yaml
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. 多様なインスタンスタイプの使用 ​

yaml
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: 30

3. Node Consolidation の有効化 ​

yaml
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
  name: default
spec:
  consolidation:
    enabled: true
  # Other configuration...

ベストプラクティス ​

パフォーマンス最適化 ​

  1. 適切なインスタンスタイプを選択: ワークロードに適したインスタンスタイプを選択
  2. 多様なインスタンスタイプを許可: 可用性とコスト最適化のために、さまざまなインスタンスタイプを許可
  3. 適切な TTL を設定: ワークロードパターンに一致する TTL を設定
  4. Node Consolidation を有効化: リソース使用率を最適化するために Node consolidation を有効化
yaml
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

コスト最適化 ​

  1. Spot Instances を活用: コスト削減のために Spot instances を使用
  2. 適切なインスタンスサイズを選択: ワークロードに適したインスタンスサイズを選択
  3. ゼロスケーリングを活用: アクティビティがない場合は Node 数を 0 に削減
  4. Node の有効期限を設定: 定期的な Node 置換により最新のインスタンスタイプを活用
yaml
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

可用性の向上 ​

  1. 複数の Availability Zone を使用: 複数の Availability Zone に Node をデプロイ
  2. On-demand と Spot Instances を混在: 可用性とコストのバランスを確保
  3. 適切な PDB を設定: アプリケーションの可用性を確保
  4. 中断処理を最適化: Node 中断時のワークロード可用性を確保
yaml
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 設定を確認
bash
# 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 の状態を確認
bash
# 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 の制約を確認
bash
# Check provisioner requirements
kubectl get provisioner <name> -o yaml

# Check pod resource requests
kubectl describe pod <name>

# Check node information
kubectl describe node <name>

デバッグツール ​

bash
# 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 ライフサイクル管理戦略を開発する

参考資料 ​

クイズ ​

この章で学んだ内容を確認するには、トピッククイズ を試してください。

ドキュメントに質問する

Enter で送信、Shift+Enter で改行します。