July 31, 2023
Unlocking Full Potential of AWS with Karpenter-1
6 min read
Managing dynamic workloads cost-effectively can be challenging in a large-scale production environment. It can be very difficult to achieve optimization while the application is live and serving traffic. However, Karpenter solves this challenge by streamlining workloads, eliminating downtime, and quickly responding to resource demands. Additionally, it saves costs by utilizing spot instances and enhancing efficiency with time-slicing GPU nodes.
In this blog, you will discover how Karpenter optimizes resources and boosts workload efficiency. Prepare to unlock a new level of Kubernetes efficiency with Karpenter.
What is Karpenter?
Karpenter is an open-source project that aims to simplify, scale, and optimize Kubernetes workloads. Adding/removing the Kubernetes nodes as needed makes it easier to pay only for the used resources, not for the unused ones when the system scales down. This feature is particularly beneficial for handling unpredictable workloads like batch tasks or microservices.
Empowering Kubernetes Workload Control: Harnessing the Power of Karpenter!
Karpenter seamlessly operates within a Kubernetes cluster(both Managed Kubernetes and on Premises), establishing direct communication with the cloud provider and benefiting from its deep integration with Kubernetes capabilities. Here’s a breakdown of how it works:
Dynamic Resource Management: Karpenter identifies new pods and actively assesses scheduling constraints to provision nodes accordingly. This intelligent approach ensures that nodes allocate resources based on specific requirements, effectively optimizing the utilization of resources.
Efficient Pod Scheduling: Karpenter excels at efficiently scheduling pods on the newly provisioned nodes, minimizing delays and optimizing infrastructure costs.
Through its automated process of removing redundant nodes, it takes active measures to reduce scheduling latencies and drive down infrastructure costs. This optimization not only streamlines operations but also contributes to a more cost-effective and efficient system.
Karpenter in your Production Environment
Key Component of Karpenter -> Provisioner
Karpenter leverages the Provisioner, a custom resource actively configuring node provisioning setups with specific limitations that impact node properties. It empowers rapid and low-latency scaling through efficient scheduling of node creation. The flexible Provisioner API enables deploying diverse workloads on Karpenter provisioned nodes, actively meeting unique requirements and optimizing resource allocation to enhance cluster performance.
Explore the operations for Karpenter node provisioning here:
Taints : Taints are special label assigned to new nodes. If a pod lacks the corresponding “toleration” for a taint, it can lead to specific effects, like preventing scheduling on the node (NoSchedule), preferring not to schedule on the node (PreferNoSchedule), or terminating the pod (NoExecute). For more details, check out Kubernetes Taints and Tolerations: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
Labels : Labels allow you to attach custom key-value pairs to nodes, which can later be used to match with pods. They provide a flexible way to categorize and identify nodes in the cluster.
Requirements : With requirements, you can define the acceptable and unacceptable values for node provisioning, considering various factors like Kubernetes and Karpenter settings, based on Well-Known Labels and cloud-specific configurations. These factors may include instance types, availability zones, computer architecture, and even capacity type (like AWS spot or on-demand instances).
Limits By actively setting limits on the total CPU and Memory that the cluster can use, you seize control of node provisioning the moment those predefined limits are reached. This ensures vigilant management of resource consumption, keeping it in check and optimizing the cluster’s scalability proactively.
Also Provisioner can perform these Operations:
Provisioner plays a crucial role in governing the characteristics of nodes created by Karpenter and determines which pods are eligible to run on those nodes. It offers a range of configuration options that allow you to customize its behavior:
Taints Specification: You can specify taints that restrict the pods that can run on nodes created by Karpenter.
Startup Taints: It is also possible to define startup taints, which initially taint the node but with the understanding that the taint is temporary.
Node Creation Restrictions: You have the ability to restrict node creation to specific zones, instance types, and computer architectures.
Node Expiration Defaults: Default settings can be established to determine how long nodes should be active before they expire.
In the Provider definition, we can refer to an AwsNodeTemplate custom resource using spec.providerRef. This pattern allows us to specify important details like the latest Bottlerocket OS AMI, a larger root disk, additional tags, and custom userData settings for Karpenter to implement when launching nodes.
By configuring these settings within the Provisioner, you can precisely tailor Karpenter’s behavior to meet your specific requirements and align with your preferences.
Note: Typically there is a lot of Advantage that comes when you have a Provisioner in your Kubernetes cluster, that is, Provisioners offer superior flexibility compared to EKS-managed node groups. For example, while instance types are immutable in managed node groups, Provisioners allow customization and greater control over resource allocation. -> Modifying or adding additional Provisioners to Karpenter offers flexibility in its configuration.
Here are important details to consider before Adopting Karpenter:
At least one Provisioner must be configured for Karpenter to perform any actions.
Karpenter iterates through each configured Provisioner in a loop.
When a Provisioner contains a taint that a Pod does not tolerate, Karpenter will actively exclude it from provisioning the Pod.
If a Provisioner includes a startup taint, Karpenter applies it to provisioned nodes.
However, Pods do not need to tolerate this taint actively. Karpenter assumes the taint is temporary and expects another system to actively remove it.
Note: Create mutually exclusive Provisioners to prevent Pod matches with multiple Provisioners. When multiple matches occur, Karpenter actively prioritizes the Provisioner with the highest weight.
By gaining a clear understanding of these aspects, you can proficiently configure Provisioners within Karpenter, thereby tailoring them to meet your specific workload provisioning requirements. This meticulous configuration process enables you to ensure smooth and efficient operations within your environment.
References:
Learn how Karpenter drives EKS scaling: Link to the Article
Effortlessly manage worker nodes based on resource needs with Autoscaling: Link to the Article
Quick and easy setup instructions for Provisioner : Link to the Article
Example: EKS Karpenter Provisioners -> Real-life scenario showcasing Karpenter in action: Link to the Article