Why Choose Karpenter Over Cluster Auto Scaler?

·

11 min read

What is Karpenter?

Karpenter is an open-source, flexible, high-performance Kubernetes cluster autoscaler built with AWS. It helps improve your application availability and cluster efficiency by rapidly launching right-sized compute resources in response to changing application load.

Karpenter also provides just-in-time compute resources to meet your application’s needs and will soon automatically optimize a cluster’s compute resource footprint to reduce costs and improve performance.

Karpenter and Cluster Autoscaler are both tools used to manage the scaling of nodes in Kubernetes clusters, but they are designed with different approaches that affect their performance and scaling speed.

Karpenter là một công cụ tự động mở rộng cụm Kubernetes (Kubernetes cluster autoscaler) mã nguồn mở, linh hoạt, hiệu năng cao được xây dựng trên nền tảng AWS. Nó giúp cải thiện tính sẵn sàng của ứng dụng và hiệu quả cụm bằng cách nhanh chóng khởi chạy các tài nguyên máy tính có kích thước phù hợp để đáp ứng với sự thay đổi về tải của ứng dụng.

Karpenter cũng cung cấp tài nguyên máy tính just-in-time để đáp ứng nhu cầu của ứng dụng và sắp tới sẽ tự động tối ưu hóa chi phí sử dụng tài nguyên máy tính của cụm để giảm chi phí và cải thiện hiệu suất.

Karpenter và Cluster Autoscaler đều là các công cụ được sử dụng để quản lý việc mở rộng các node trong cụm Kubernetes, nhưng chúng được thiết kế với các cách tiếp cận khác nhau ảnh hưởng đến hiệu suất và tốc độ mở rộng của chúng.

Key Differences That Make Karpenter Faster:

Proactive Scaling:

  • Karpenter: It is designed to be more proactive in its scaling decisions. Instead of waiting for pods to remain unscheduled, Karpenter can anticipate future resource requirements based on pod specifications and start provisioning nodes in advance. This can lead to faster scaling because nodes are ready by the time they are needed.

  • Cluster Autoscaler: Typically reactive, it scales up only after it detects that pods cannot be scheduled due to a lack of resources. This can introduce delays since new nodes are provisioned only after a need is identified.

  • Karpenter: Được thiết kế để chủ động hơn trong các quyết định mở rộng. Thay vì chờ đợi các pod không được lên lịch, Karpenter có thể dự đoán trước nhu cầu tài nguyên tương lai dựa trên thông số kỹ thuật của pod và bắt đầu cung cấp sẵn các node. Điều này có thể dẫn đến việc mở rộng nhanh hơn vì các node đã sẵn sàng vào thời điểm cần thiết.

  • Cluster Autoscaler: Thường là thụ động, nó chỉ mở rộng lên sau khi phát hiện các pod không thể lên lịch do thiếu tài nguyên. Điều này có thể gây ra sự chậm trễ vì các node mới chỉ được cung cấp sau khi nhu cầu được xác định.

Scalability and Efficiency:

  • Karpenter: Uses a straightforward and efficient algorithm that makes decisions quickly and can handle a larger number of nodes and pods more effectively. It’s designed to optimize for cost and performance by choosing the most appropriate instance types and sizes.

  • Cluster Autoscaler: Often has to interact with cloud provider APIs to make scaling decisions, which can introduce latency. Its decision-making process is generally more conservative and can be slower, especially in large clusters.

  • Karpenter: Sử dụng một thuật toán đơn giản và hiệu quả, cho phép đưa ra quyết định nhanh chóng và xử lý hiệu quả hơn với số lượng lớn các node và pod. Nó được thiết kế để tối ưu hóa chi phí và hiệu suất bằng cách chọn các loại và kích cỡ instance phù hợp nhất.

  • Cluster Autoscaler: Thường phải tương tác với các API của nhà cung cấp cloud để đưa ra quyết định mở rộng, điều này có thể gây ra độ trễ. Quá trình ra quyết định của nó thường "bảo thủ" hơn và có thể chậm hơn, đặc biệt là trong các cluster lớn

Instance Diversification and Flexibility:

  • Karpenter: Has the capability to use a diverse set of instance types from the cloud providers. It selects the most appropriate instance based on the current workload requirements, potentially using instances that offer better cost or performance benefits for the specific workloads.

  • Cluster Autoscaler: Focuses on increasing or decreasing the count of nodes within the existing node groups or managing multiple groups predefined by the user. This can limit flexibility if the available node types are not optimal for the workload.

  • Karpenter: Có khả năng sử dụng nhiều loại instance khác nhau từ các nhà cung cấp cloud. Nó chọn instance phù hợp nhất dựa trên yêu cầu của khối lượng công việc hiện tại, có thể sử dụng các instance cung cấp chi phí tốt hơn hoặc lợi ích về hiệu suất cho các khối lượng công việc cụ thể.

  • Cluster Autoscaler: Chỉ tập trung vào việc tăng hoặc giảm số lượng node trong các nhóm node hiện có hoặc quản lý nhiều nhóm do người dùng định sẵn. Điều này có thể hạn chế tính linh hoạt nếu các loại node khả dụng không tối ưu cho khối lượng công việc.

Integration with Cloud-native Features:

  • Karpenter: Designed to be tightly integrated with AWS (though it can work with other clouds), taking advantage of specific cloud capabilities such as spot instances and mixed instances to optimize resource allocation and cost.

  • Cluster Autoscaler: While it supports multiple cloud providers, it might not leverage the newest or most cost-effective cloud features as efficiently as Karpenter.

  • Karpenter: Được thiết kế để tích hợp chặt chẽ với AWS (mặc dù nó có thể hoạt động với các cloud khác), tận dụng các khả năng cụ thể của cloud như instance giá thấp (spot instances) và instance "hỗn hợp" (mixed instances) để tối ưu phân bổ tài nguyên và chi phí.

  • Cluster Autoscaler: Mặc dù hỗ trợ nhiều nhà cung cấp cloud, nhưng nó có thể không tận dụng hiệu quả các tính cloud mới nhất hoặc tiết kiệm chi phí nhất như Karpenter.

Scheduling and Launch Time:

  • Karpenter: It improves scheduling efficiency by batching and launching nodes based on actual demand. This batching can significantly reduce the overall time from node creation to node readiness, as it optimizes the provisioning process.

  • Cluster Autoscaler: It may individually scale nodes based on specific pod requirements, which can sometimes lead to longer wait times for node provisioning and readiness as each scale-up action is treated independently.

  • Karpenter: Cải thiện hiệu quả lên lịch bằng cách gom nhóm và khởi chạy các node dựa trên nhu cầu thực tế. Việc gom nhóm này có thể giúp giảm đáng kể tổng thời gian từ khi tạo node đến khi node sẵn sàng, vì nó tối ưu hóa quá trình cung cấp.

  • Cluster Autoscaler: Có thể mở rộng từng node riêng lẻ dựa trên yêu cầu của pod cụ thể, điều này đôi khi có thể dẫn đến thời gian chờ đợi lâu hơn để cung cấp và sẵn sàng node vì mỗi hành động mở rộng được xử lý độc lập

Simplicity in Configuration and Management:

  • Karpenter: Generally offers a simpler setup with fewer parameters to configure, which can lead to quicker deployment and easier management over time. This simplicity also reduces the risk of misconfiguration, which can affect scaling speed and reliability.

  • Cluster Autoscaler: Requires more detailed configuration and tuning to manage various types of node groups and their scaling policies effectively. This complexity can slow the scaling process, especially in large or heterogeneous environments.

  • Karpenter: Thường cung cấp thiết lập đơn giản hơn với ít thông số cần cấu hình hơn, điều này có thể giúp triển khai nhanh hơn và quản lý dễ dàng hơn theo thời gian. Sự đơn giản này cũng giảm thiểu nguy cơ cấu hình sai, có thể ảnh hưởng đến tốc độ mở rộng và độ tin cậy.

  • Cluster Autoscaler: Yêu cầu cấu hình và điều chỉnh chi tiết hơn để quản lý hiệu quả các loại nhóm node khác nhau và chính sách mở rộng của chúng. Sự phức tạp này có thể làm chậm quá trình mở rộng, đặc biệt là trong các môi trường lớn hoặc không đồng nhất.

Adaptive Algorithms:

  • Karpenter: Utilizes more adaptive algorithms that can learn and predict resource requirements better over time. This learning capability allows Karpenter to fine-tune its scaling decisions, potentially improving speed and efficiency as the system adapts to the workload patterns.

  • Cluster Autoscaler: Follows more static rules based on thresholds and metrics, which may not adapt as quickly to changes in workload patterns or sudden spikes in demand.

  • Karpenter: Sử dụng các thuật toán thích nghi hơn, có thể học hỏi và dự đoán nhu cầu tài nguyên tốt hơn theo thời gian. Khả năng học hỏi này cho phép Karpenter tinh chỉnh các quyết định mở rộng, có khả năng cải thiện tốc độ và hiệu quả khi hệ thống thích ứng với các mẫu khối lượng công việc.

  • Cluster Autoscaler: Thực hiện theo các quy tắc tĩnh hơn dựa trên ngưỡng và số liệu, có thể không thích ứng nhanh chóng với những thay đổi về mẫu khối lượng công việc hoặc các đột biến đột ngột về nhu cầu

Resource Optimization:

  • Karpenter: Capable of making more granular decisions about the type and size of instances to use, optimizing for both performance and cost. This includes using spot instances more aggressively, which can not only save costs but also accelerate provisioning times in some cases.

  • Cluster Autoscaler: While it can utilize spot instances, its approach may be more conservative, prioritizing stability over cost or provisioning speed, which can lead to underutilization of cheaper and possibly faster-to-provision resources.

  • Karpenter: Có khả năng đưa ra các quyết định chi tiết hơn về loại và kích thước của instance để sử dụng, tối ưu hóa cho cả hiệu suất và chi phí. Điều này bao gồm việc sử dụng instance giá thấp (spot instances) tích cực hơn, không chỉ giúp tiết kiệm chi phí mà còn có thể tăng tốc thời gian cung cấp trong một số trường hợp.

  • Cluster Autoscaler: Mặc dù nó có thể sử dụng instance giá thấp, nhưng cách tiếp cận của nó có thể bảo thủ hơn, ưu tiên tính ổn định hơn chi phí hoặc tốc độ cung cấp, điều này có thể dẫn đến việc sử dụng không đủ các tài nguyên rẻ hơn và có thể cung cấp nhanh hơn.

Integration with Modern Cloud Architectures:

  • Karpenter: Specifically built with modern cloud-native architectures in mind, it integrates more deeply with cloud services and their APIs, which can streamline operations and enhance performance.

  • Cluster Autoscaler: While effective, it can be somewhat slower to integrate new cloud features or services into its scaling logic, potentially missing out on optimizations that newer technologies could offer.

  • Karpenter: Được xây dựng riêng biệt với các kiến trúc cloud-native hiện đại, nó tích hợp sâu hơn với các dịch vụ cloud và API của chúng, giúp đơn giản hóa hoạt động và nâng cao hiệu suất.

  • Cluster Autoscaler: Mặc dù hiệu quả, nó có thể chậm hơn một chút trong việc tích hợp các tính năng hoặc dịch vụ cloud mới vào logic mở rộng của nó, có khả năng bỏ lỡ các tối ưu hóa mà các công nghệ mới hơn có thể cung cấp.

These points underscore the efficiency and adaptability of Karpenter compared to the Cluster Autoscaler, particularly in dynamic and variable workload environments where speed and cost efficiency are crucial.

The requirements for setting up Karpenter could be divided into below subsets.

  1. IAM permissions and roles required by Karpenter, so that Karpenter has permission to interact with EC2 and EKS services.

  2. Tags to the EKS private subnets and security group, so that Karpenter knows which subnets and security group to use to create the new nodes.

  3. Adding Node IAM role to aws-auth configmap and deploying Karpenter provisioner and AWSNodeTemplate CRDs, deploying Karpenter using helm chart and deploying provisioners to control the auto-scaling behavior.

export CLUSTER_NAME=your_cluster_name
export KARPENTER_VERSION=your_required_version
export CLUSTER_ENDPOINT="$(aws eks describe-cluster --name ${CLUSTER_NAME} --query \"cluster.endpoint\" --output text)"
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

Create policy : node-trust-policy.json

“Version”: “2012–10–17”,
“Statement”: [
    {
    “Effect”: “Allow”,
    “Principal”: {
    “Service”: “ec2.amazonaws.com”    
    },
    “Action”: “sts:AssumeRole”
    }
]

Create roles

# AmazonEKSWorkerNodePolicy
# AmazonEKS_CNI_Policy
# AmazonEC2ContainerRegistryReadOnly
# AmazonSSMManagedInstanceCore  
# AmazonSSMManagedInstanceCore

aws iam create-role  role-name “KarpenterNodeRole-${CLUSTER_NAME}” \
 assume-role-policy-document file://node-trust-policy.json

aws iam attach-role-policy  role-name “KarpenterNodeRole-${CLUSTER_NAME}” \
 policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy

aws iam attach-role-policy  role-name “KarpenterNodeRole-${CLUSTER_NAME}” \
 policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy

aws iam attach-role-policy  role-name “KarpenterNodeRole-${CLUSTER_NAME}” \
 policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly

aws iam attach-role-policy  role-name “KarpenterNodeRole-${CLUSTER_NAME}” \
 policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

aws iam create-instance-profile \
 instance-profile-name “KarpenterNodeInstanceProfile-${CLUSTER_NAME}”

aws iam add-role-to-instance-profile \
 instance-profile-name “KarpenterNodeInstanceProfile-${CLUSTER_NAME}” \
 role-name “KarpenterNodeRole-${CLUSTER_NAME}”

Configure the IAM role for the Karpenter controller: Create an IAM role for KarpenterControllerRole. The Karpenter controller uses the IAM roles for Service Accounts (IRSA). Create a controller-policy.json document with the following permissions:

controller-policy.json

{
    "Statement": [
        {
            "Action": [
                "ssm:GetParameter",
                "iam:PassRole",
                "ec2:DescribeImages",
                "ec2:RunInstances",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeLaunchTemplates",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeInstanceTypeOfferings",
                "ec2:DescribeAvailabilityZones",
                "ec2:DeleteLaunchTemplate",
                "ec2:CreateTags",
                "ec2:CreateLaunchTemplate",
                "ec2:CreateFleet",
                "ec2:DescribeSpotPriceHistory",
                "pricing:GetProducts"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": "Karpenter"
        },
        {
            "Action": "ec2:TerminateInstances",
            "Condition": {
                "StringLike": {
                    "ec2:ResourceTag/Name": "*karpenter*"
                }
            },
            "Effect": "Allow",
            "Resource": "*",
            "Sid": "ConditionalEC2Termination"
        }
    ],
    "Version": "2012-10-17"
}

controller-trust-policy.json

{
“Version”: “20121017”,
“Statement”: [
    {
    “Effect”: “Allow”,
    “Principal”: {
    “Federated”: “arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_ENDPOINT#*//}”
    },
    “Action”: “sts:AssumeRoleWithWebIdentity”,
    “Condition”: {
        “StringEquals”: {
        “${OIDC_ENDPOINT#*//}:aud”: “sts.amazonaws.com”,
        “${OIDC_ENDPOINT#*//}:sub”: “system:serviceaccount:karpenter:karpenter”
            }
        }
    }
    ]
}
aws iam put-role-policy — role-name KarpenterControllerRole-${CLUSTER_NAME} \
— policy-name KarpenterControllerPolicy-${CLUSTER_NAME} \
— policy-document file://controller-policy.json

Deploy Karpenter: Finally, deploy Karpenter in your Amazon EKS cluster using the following command:

helm upgrade --install karpenter karpenter/karpenter \
--namespace karpenter \
--version $KARPENTER_VERSION \
--set clusterName=$CLUSTER_NAME \
--set aws.region=$(aws configure get region) \
--set controller.image.tag=$KARPENTER_VERSION \
--set controller.image.repository=public.ecr.aws/aws-controllers-k8s/karpenter-controller \
--set controller.image.pullPolicy=IfNotPresent \
--set controller.serviceAccount.annotations."eks\.amazonaws\.com/role-arn"="arn:aws:iam::$AWS_ACCOUNT_ID:role/KarpenterControllerRole" \
--set controller.serviceAccount.name=karpenter-controller \
--set nodeSelector.karpenter.io/enabled=true \
--set nodeSelector.karpenter.io/instance-types=*