<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Karpenter – Upgrading</title><link>https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/</link><description>Recent content in Upgrading on Karpenter</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/index.xml" rel="self" type="application/rss+xml"/><item><title>V1.0: Upgrade Guide</title><link>https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/upgrade-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/upgrade-guide/</guid><description>
&lt;p>Karpenter is a controller that runs in your cluster, but it is not tied to a specific Kubernetes version, as the Cluster Autoscaler is.
Use your existing upgrade mechanisms to upgrade your core add-ons in Kubernetes and keep Karpenter up to date on bug fixes and new features.
This guide contains information needed to upgrade to the latest release of Karpenter, along with compatibility issues you need to be aware of when upgrading from earlier Karpenter versions.&lt;/p>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
With the release of Karpenter v1.0.0, the Karpenter team will be dropping support for karpenter versions v0.32 and below. We recommend upgrading to the latest version of Karpenter and keeping Karpenter up-to-date for bug fixes and new features.
&lt;/div>
&lt;p>When upgrading Karpenter in production environments, implementing a robust CI/CD pipeline approach is crucial. Improper upgrades can lead to significant disruptions including failed node provisioning, orphaned nodes, interrupted workloads, and potential cost implications from unmanaged scaling. Given Karpenter&amp;rsquo;s critical role in cluster scaling and workload management, untested upgrades could result in production outages or resource allocation issues that directly impact application availability and performance. Therefore, we recommend following these structured steps:&lt;/p>
&lt;h4 id="pre-upgrade-validation">Pre-upgrade Validation&lt;/h4>
&lt;ul>
&lt;li>Validate all required IAM permissions (node role, controller role)&lt;/li>
&lt;li>Check webhook configurations&lt;/li>
&lt;li>Back up existing NodePool and NodeClass configurations&lt;/li>
&lt;li>Document current version and settings&lt;/li>
&lt;/ul>
&lt;h4 id="staging-environment-setup">Staging Environment Setup&lt;/h4>
&lt;ul>
&lt;li>Create or verify staging environment&lt;/li>
&lt;li>Update version tags in Helm values or manifests&lt;/li>
&lt;li>Configure automated validation tests&lt;/li>
&lt;/ul>
&lt;h4 id="staging-deployment">Staging Deployment&lt;/h4>
&lt;ul>
&lt;li>Deploy to staging environment&lt;/li>
&lt;li>Run comprehensive tests including node provisioning&lt;/li>
&lt;li>Verify controller health&lt;/li>
&lt;li>Test NodePool and NodeClass functionality&lt;/li>
&lt;li>Monitor system behavior&lt;/li>
&lt;/ul>
&lt;h4 id="production-approval-and-deployment">Production Approval and Deployment&lt;/h4>
&lt;ul>
&lt;li>Require manual approval/review&lt;/li>
&lt;li>Schedule maintenance window if needed&lt;/li>
&lt;li>Execute production deployment&lt;/li>
&lt;li>Monitor deployment progress&lt;/li>
&lt;li>Verify all components are functioning&lt;/li>
&lt;/ul>
&lt;h4 id="post-deployment">Post-Deployment&lt;/h4>
&lt;ul>
&lt;li>Monitor system health&lt;/li>
&lt;li>Verify node provisioning&lt;/li>
&lt;li>Keep rollback configurations accessible&lt;/li>
&lt;li>Update documentation&lt;/li>
&lt;/ul>
&lt;p>Here are few recommended CI/CD Pipeline Options:&lt;/p>
&lt;ul>
&lt;li>GitHub Actions - Excellent for GitHub-hosted repositories with built-in Kubernetes support&lt;/li>
&lt;li>GitLab CI - Strong container-native pipeline with integrated Kubernetes functionality&lt;/li>
&lt;li>ArgoCD - Specialized for GitOps workflows with Kubernetes&lt;/li>
&lt;li>AWS CodePipeline - Native integration with EKS and AWS services&lt;/li>
&lt;li>Flux - Open-source GitOps tool for Kubernetes with automatic deployment capabilities&lt;/li>
&lt;/ul>
&lt;p>Each pipeline tool can be configured to handle the Karpenter upgrade workflow, but choose based on your existing infrastructure, team expertise, and specific requirements for automation and integration.&lt;/p>
&lt;h3 id="crd-upgrades">CRD Upgrades&lt;/h3>
&lt;p>Karpenter ships with a few Custom Resource Definitions (CRDs). These CRDs are published:&lt;/p>
&lt;ul>
&lt;li>As an independent Helm chart &lt;a href="https://gallery.ecr.aws/karpenter/karpenter-crd">karpenter-crd&lt;/a> (&lt;a href="https://github.com/aws/karpenter/blob/main/charts/karpenter-crd">source&lt;/a>) that can be used by Helm to manage the lifecycle of these CRDs. To upgrade or install &lt;code>karpenter-crd&lt;/code> run:
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>kube-system
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm upgrade --install karpenter-crd oci://public.ecr.aws/karpenter/karpenter-crd --version x.y.z --namespace &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --create-namespace
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>As part of the helm chart &lt;a href="https://gallery.ecr.aws/karpenter/karpenter">karpenter&lt;/a> (&lt;a href="https://github.com/aws/karpenter/blob/main/charts/karpenter/crds">source&lt;/a>).
Helm &lt;a href="https://helm.sh/docs/chart_best_practices/custom_resource_definitions/">does not manage the lifecycle of CRDs using this method&lt;/a> - the tool will only install the CRD during the first installation of the Helm chart.
Subsequent chart upgrades will not add or remove CRDs, even if the CRDs have changed.&lt;/li>
&lt;/ul>
&lt;p>CRDs are coupled to the version of Karpenter, and should be updated along with Karpenter.
For this reason, we recommend using the independent &lt;code>karpenter-crd&lt;/code> chart to manage CRDs.&lt;/p>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
If you get the error &lt;code>invalid ownership metadata; label validation error:&lt;/code> while installing the &lt;code>karpenter-crd&lt;/code> chart from an older version of Karpenter, follow the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/troubleshooting/#helm-error-when-installing-the-karpenter-crd-chart">Troubleshooting Guide&lt;/a> for details on how to resolve these errors.
&lt;/div>
&lt;!--
WHEN CREATING A NEW SECTION OF THE UPGRADE GUIDANCE FOR NEWER VERSIONS, ENSURE THAT YOU COPY THE BETA API ALERT SECTION FROM THE LAST RELEASE TO PROPERLY WARN USERS OF THE RISK OF UPGRADING WITHOUT GOING TO 0.32.x FIRST
-->
&lt;h3 id="upgrading-to-100">Upgrading to &lt;code>1.0.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
Karpenter &lt;code>1.0.0&lt;/code> introduces the &lt;code>v1&lt;/code> APIs and uses &lt;a href="https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning/#webhook-conversion">conversion webhooks&lt;/a> to support existing &lt;code>v1beta1&lt;/code> APIs.
&lt;strong>Do not&lt;/strong> upgrade to &lt;code>1.0.0&lt;/code>+ without following the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/v1-migration/">&lt;code>v1&lt;/code> Migration Guide&lt;/a>.
&lt;/div>
&lt;p>Refer to the &lt;code>v1&lt;/code> Migration Guide for the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/v1-migration/#changelog">full changelog&lt;/a>.&lt;/p>
&lt;h3 id="upgrading-to-0370">Upgrading to &lt;code>0.37.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;code>0.33.0&lt;/code>+ &lt;em>only&lt;/em> supports Karpenter v1beta1 APIs and will not work with existing Provisioner, AWSNodeTemplate or Machine alpha APIs. Do not upgrade to &lt;code>0.37.0&lt;/code>+ without first &lt;a href="#upgrading-to-0320">upgrading to &lt;code>0.32.x&lt;/code>&lt;/a>. This version supports both the alpha and beta APIs, allowing you to migrate all of your existing APIs to beta APIs without experiencing downtime.
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Webhooks have been re-enabled by default starting in &lt;code>0.37.3&lt;/code> to faciliate migration to &lt;code>v1.0&lt;/code>.
If your cluster has network policies that block Ingress then ports &lt;code>8000&lt;/code>, &lt;code>8001&lt;/code>, &lt;code>8081&lt;/code>, &lt;code>8443&lt;/code> will need to be allowlisted.
You may still choose to disable webhooks through the helm chart.
&lt;/div>
&lt;ul>
&lt;li>Karpenter now adds a readiness status condition to the EC2NodeClass. Make sure to upgrade your Custom Resource Definitions before proceeding with the upgrade. Failure to do so will result in Karpenter being unable to provision new nodes.&lt;/li>
&lt;li>Karpenter no longer updates the logger name when creating controller loggers. We now adhere to the controller-runtime standard, where the logger name will be set as &lt;code>&amp;quot;logger&amp;quot;: &amp;quot;controller&amp;quot;&lt;/code> always and the controller name will be stored in the structured value &lt;code>&amp;quot;controller&amp;quot;&lt;/code>&lt;/li>
&lt;li>Karpenter updated the NodeClass controller naming in the following way: &lt;code>nodeclass&lt;/code> -&amp;gt; &lt;code>nodeclass.status&lt;/code>, &lt;code>nodeclass.hash&lt;/code>, &lt;code>nodeclass.termination&lt;/code>&lt;/li>
&lt;li>Karpenter&amp;rsquo;s NodeClaim status conditions no longer include the &lt;code>severity&lt;/code> field&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0360">Upgrading to &lt;code>0.36.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;code>0.33.0&lt;/code>+ &lt;em>only&lt;/em> supports Karpenter v1beta1 APIs and will not work with existing Provisioner, AWSNodeTemplate or Machine alpha APIs. Do not upgrade to &lt;code>0.36.0&lt;/code>+ without first &lt;a href="#upgrading-to-0320">upgrading to &lt;code>0.32.x&lt;/code>&lt;/a>. This version supports both the alpha and beta APIs, allowing you to migrate all of your existing APIs to beta APIs without experiencing downtime.
&lt;/div>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
v0.36.x introduces update to drift that restricts rollback. When rolling back from &amp;gt;=v0.36.0, note that v0.32.9+, v0.33.4+, v0.34.5+, v0.35.4+ are the patch versions that support rollback. If Karpenter is rolled back to an older patch version, Karpenter can potentially drift all the nodes in the cluster.
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Webhooks have been re-enabled by default starting in &lt;code>0.36.5&lt;/code> to faciliate migration to &lt;code>v1.0&lt;/code>.
If your cluster has network policies that block Ingress then ports &lt;code>8000&lt;/code>, &lt;code>8001&lt;/code>, &lt;code>8081&lt;/code>, &lt;code>8443&lt;/code> will need to be allowlisted.
You may still choose to disable webhooks through the helm chart.
&lt;/div>
&lt;ul>
&lt;li>Karpenter changed the name of the &lt;code>karpenter_cloudprovider_instance_type_price_estimate&lt;/code> metric to &lt;code>karpenter_cloudprovider_instance_type_offering_price_estimate&lt;/code> to align with the new &lt;code>karpenter_cloudprovider_instance_type_offering_available&lt;/code> metric. The &lt;code>region&lt;/code> label was also dropped from the metric, since this can be inferred from the environment that Karpenter is running in.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0350">Upgrading to &lt;code>0.35.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;code>0.33.0&lt;/code>+ &lt;em>only&lt;/em> supports Karpenter v1beta1 APIs and will not work with existing Provisioner, AWSNodeTemplate or Machine alpha APIs. Do not upgrade to &lt;code>0.35.0&lt;/code>+ without first &lt;a href="#upgrading-to-0320">upgrading to &lt;code>0.32.x&lt;/code>&lt;/a>. This version supports both the alpha and beta APIs, allowing you to migrate all of your existing APIs to beta APIs without experiencing downtime.
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Webhooks have been re-enabled by default starting in &lt;code>0.35.8&lt;/code> to faciliate migration to &lt;code>v1.0&lt;/code>.
If your cluster has network policies that block Ingress then ports &lt;code>8000&lt;/code>, &lt;code>8001&lt;/code>, &lt;code>8081&lt;/code>, &lt;code>8443&lt;/code> will need to be allowlisted.
You may still choose to disable webhooks through the helm chart.
&lt;/div>
&lt;ul>
&lt;li>Karpenter OCI tags and Helm chart version are now valid semantic versions, meaning that the &lt;code>v&lt;/code> prefix from the git tag has been removed and they now follow the &lt;code>x.y.z&lt;/code> pattern.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0340">Upgrading to &lt;code>0.34.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;code>0.33.0&lt;/code>+ &lt;em>only&lt;/em> supports Karpenter v1beta1 APIs and will not work with existing Provisioner, AWSNodeTemplate or Machine alpha APIs. Do not upgrade to &lt;code>0.34.0&lt;/code>+ without first &lt;a href="#upgrading-to-0320">upgrading to &lt;code>0.32.x&lt;/code>&lt;/a>. This version supports both the alpha and beta APIs, allowing you to migrate all of your existing APIs to beta APIs without experiencing downtime.
&lt;/div>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
The Ubuntu EKS optimized AMI has moved from 20.04 to 22.04 for Kubernetes 1.29+. This new AMI version is &lt;strong>not currently&lt;/strong> supported for users relying on AMI auto-discovery with the Ubuntu AMI family. More details can be found in this &lt;a href="https://github.com/aws/karpenter-provider-aws/issues/5572">GitHub issue&lt;/a>. Please review this issue before upgrading to Kubernetes 1.29 if you are using the Ubuntu AMI family. Upgrading to 1.29 without making any changes to your EC2NodeClass will result in Karpenter being unable to create new nodes.
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Webhooks have been re-enabled by default starting in &lt;code>0.34.9&lt;/code> to faciliate migration to &lt;code>v1.0&lt;/code>.
If your cluster has network policies that block Ingress then ports &lt;code>8000&lt;/code>, &lt;code>8001&lt;/code>, &lt;code>8081&lt;/code>, &lt;code>8443&lt;/code> will need to be allowlisted.
You may still choose to disable webhooks through the helm chart.
&lt;/div>
&lt;ul>
&lt;li>Karpenter now supports &lt;code>nodepool.spec.disruption.budgets&lt;/code>, which allows users to control the speed of disruption in the cluster. Since this requires an update to the Custom Resource, before upgrading, you should re-apply the new updates to the CRDs. Check out &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/disruption/#disruption-budgets">Disruption Budgets&lt;/a> for more.&lt;/li>
&lt;li>With Disruption Budgets, Karpenter will disrupt multiple batches of nodes simultaneously, which can result in overall quicker scale-down of your cluster. Before &lt;code>0.34.0&lt;/code>, Karpenter had a hard-coded parallelism limit for each type of disruption. In &lt;code>0.34.0&lt;/code>+, Karpenter will now disrupt at most 10% of nodes for a given NodePool. There is no setting that will be perfectly equivalent with the behavior prior to &lt;code>0.34.0&lt;/code>. When considering how to configure your budgets, please refer to the following limits for versions prior to &lt;code>0.34.0&lt;/code>:
&lt;ul>
&lt;li>&lt;code>Empty Expiration / Empty Drift / Empty Consolidation&lt;/code>: infinite parallelism&lt;/li>
&lt;li>&lt;code>Non-Empty Expiration / Non-Empty Drift / Single-Node Consolidation&lt;/code>: one node at a time&lt;/li>
&lt;li>&lt;code>Multi-Node Consolidation&lt;/code>: max 100 nodes&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>To support Disruption Budgets, &lt;code>0.34.0&lt;/code>+ includes critical changes to Karpenter&amp;rsquo;s core controllers, which allows Karpenter to consider multiple batches of disrupting nodes simultaneously. This increases Karpenter&amp;rsquo;s performance with the potential downside of higher CPU and memory utilization from the Karpenter pod. While the magnitude of this difference varies on a case-by-case basis, when upgrading to Karpenter &lt;code>0.34.0&lt;/code>+, please note that you may need to increase the resources allocated to the Karpenter controller pods.&lt;/li>
&lt;li>Karpenter now adds a default &lt;code>podSecurityContext&lt;/code> that configures the &lt;code>fsgroup: 65536&lt;/code> of volumes in the pod. If you are using sidecar containers, you should review if this configuration is compatible for them. You can disable this default &lt;code>podSecurityContext&lt;/code> through helm by performing &lt;code>--set podSecurityContext=null&lt;/code> when installing/upgrading the chart.&lt;/li>
&lt;li>The &lt;code>dnsPolicy&lt;/code> for the Karpenter controller pod has been changed back to the Kubernetes cluster default of &lt;code>ClusterFirst&lt;/code>. Setting our &lt;code>dnsPolicy&lt;/code> to &lt;code>Default&lt;/code> (confusingly, this is not the Kubernetes cluster default) caused more confusion for any users running IPv6 clusters with dual-stack nodes or anyone running Karpenter with dependencies on cluster services (like clusters running service meshes). This change may be breaking for any users on Fargate or MNG who were allowing Karpenter to manage their in-cluster DNS service (&lt;code>core-dns&lt;/code> on most clusters). If you still want the old behavior here, you can change the &lt;code>dnsPolicy&lt;/code> to point to use &lt;code>Default&lt;/code> by setting the helm value on install/upgrade with &lt;code>--set dnsPolicy=Default&lt;/code>. More details on this issue can be found in the following Github issues: &lt;a href="https://github.com/aws/karpenter-provider-aws/issues/2186">#2186&lt;/a> and &lt;a href="https://github.com/aws/karpenter-provider-aws/issues/4947">#4947&lt;/a>.&lt;/li>
&lt;li>Karpenter now disallows &lt;code>nodepool.spec.template.spec.resources&lt;/code> to be set. The webhook validation never allowed &lt;code>nodepool.spec.template.spec.resources&lt;/code>. We are now ensuring that CEL validation also disallows &lt;code>nodepool.spec.template.spec.resources&lt;/code> to be set. If you were previously setting the resources field on your NodePool, ensure that you remove this field before upgrading to the newest version of Karpenter or else updates to the resource may fail on the new version.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0330">Upgrading to &lt;code>0.33.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;code>0.33.0&lt;/code>+ &lt;em>only&lt;/em> supports Karpenter v1beta1 APIs and will not work with existing Provisioner, AWSNodeTemplate or Machine alpha APIs. &lt;strong>Do not&lt;/strong> upgrade to &lt;code>0.33.0&lt;/code>+ without first &lt;a href="#upgrading-to-0320">upgrading to &lt;code>0.32.x&lt;/code>&lt;/a>. This version supports both the alpha and beta APIs, allowing you to migrate all of your existing APIs to beta APIs without experiencing downtime.
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Webhooks have been re-enabled by default starting in &lt;code>0.33.8&lt;/code> to faciliate migration to &lt;code>v1.0&lt;/code>.
If your cluster has network policies that block Ingress then ports &lt;code>8000&lt;/code>, &lt;code>8001&lt;/code>, &lt;code>8081&lt;/code>, &lt;code>8443&lt;/code> will need to be allowlisted.
You may still choose to disable webhooks through the helm chart.
&lt;/div>
&lt;ul>
&lt;li>Karpenter no longer supports using the &lt;code>karpenter.sh/provisioner-name&lt;/code> label in NodePool labels and requirements or in application node selectors, affinities, or topologySpreadConstraints. If you were previously using this label to target applications to specific Provisioners, you should update your applications to use the &lt;code>karpenter.sh/nodepool&lt;/code> label instead before upgrading. If you upgrade without changing these labels, you may begin to see pod scheduling failures for these applications.&lt;/li>
&lt;li>Karpenter now tags &lt;code>spot-instances-request&lt;/code> with the same tags that it tags instances, volumes, and primary ENIs. This means that you will now need to add &lt;code>ec2:CreateTags&lt;/code> permission for &lt;code>spot-instances-request&lt;/code>. You can also further scope your controller policy for the &lt;code>ec2:RunInstances&lt;/code> action to require that it launches the &lt;code>spot-instances-request&lt;/code> with these specific tags. You can view an example of scoping these actions in the &lt;a href="https://github.com/aws/karpenter/blob/v0.33.0/website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml#L61">Getting Started Guide&amp;rsquo;s default CloudFormation controller policy&lt;/a>.&lt;/li>
&lt;li>We now recommend that you set the installation namespace for your Karpenter controllers to &lt;code>kube-system&lt;/code> to denote Karpenter as a critical cluster component. This ensures that requests from the Karpenter controllers are treated with higher priority by assigning them to a different &lt;a href="https://kubernetes.io/docs/concepts/cluster-administration/flow-control/#prioritylevelconfiguration">PriorityLevelConfiguration&lt;/a> than generic requests from other namespaces. For more details on API Priority and Fairness, read the &lt;a href="https://kubernetes.io/docs/concepts/cluster-administration/flow-control/">Kubernetes API Priority and Fairness Conceptual Docs&lt;/a>. Note: Changing the namespace for your Karpenter release will cause the service account namespace to change. If you are using IRSA for authentication with AWS, you will need to change scoping set in the controller&amp;rsquo;s trust policy from &lt;code>karpenter:karpenter&lt;/code> to &lt;code>kube-system:karpenter&lt;/code>.&lt;/li>
&lt;li>&lt;del>&lt;code>0.33.0&lt;/code> disables mutating and validating webhooks by default in favor of using &lt;a href="https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#validation">Common Expression Language for CRD validation&lt;/a>. The Common Expression Language Validation Feature &lt;a href="https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#validation-rules">is enabled by default on EKS 1.25&lt;/a>. If you are using Kubernetes version &amp;gt;= 1.25, no further action is required. If you are using a Kubernetes version below 1.25, you now need to set &lt;code>DISABLE_WEBHOOK=false&lt;/code> in your container environment variables or &lt;code>--set webhook.enabled=true&lt;/code> if using Helm. View the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v0.32/upgrading/v1beta1-migration/#webhook-support-deprecated-in-favor-of-cel">Webhook Support Deprecated in Favor of CEL Section of the v1beta1 Migration Guide&lt;/a>.&lt;/del>&lt;/li>
&lt;li>&lt;code>0.33.0&lt;/code> drops support for passing settings through the &lt;code>karpenter-global-settings&lt;/code> ConfigMap. You should pass settings through the container environment variables in the Karpenter deployment manifest. View the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v0.32/upgrading/v1beta1-migration/#global-settings">Global Settings Section of the v1beta1 Migration Guide&lt;/a> for more details.&lt;/li>
&lt;li>&lt;code>0.33.0&lt;/code> enables &lt;code>Drift=true&lt;/code> by default in the &lt;code>FEATURE_GATES&lt;/code>. If you previously didn&amp;rsquo;t enable the feature gate, Karpenter will now check if there is a difference between the desired state of your nodes declared in your NodePool and the actual state of your nodes. View the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/disruption/#drift">Drift Section of Disruption Conceptual Docs&lt;/a> for more details.&lt;/li>
&lt;li>&lt;code>0.33.0&lt;/code> drops looking up the &lt;code>zap-logger-config&lt;/code> through ConfigMap discovery. Instead, Karpenter now expects the logging config to be mounted on the filesystem if you are using this to configure Zap logging. This is not enabled by default, but can be enabled through &lt;code>--set logConfig.enabled=true&lt;/code> in the Helm values. If you are setting any values in the &lt;code>logConfig&lt;/code> from the &lt;code>0.32.x&lt;/code> upgrade, such as &lt;code>logConfig.logEncoding&lt;/code>, note that you will have to explicitly set &lt;code>logConfig.enabled=true&lt;/code> alongside it. Also, note that setting the Zap logging config is a deprecated feature in beta and is planned to be dropped at v1. View the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v0.32/upgrading/v1beta1-migration/#logging-configuration-is-no-longer-dynamic">Logging Configuration Section of the v1beta1 Migration Guide&lt;/a> for more details.&lt;/li>
&lt;li>&lt;code>0.33.0&lt;/code> change the default &lt;code>LOG_LEVEL&lt;/code> from &lt;code>debug&lt;/code> to &lt;code>info&lt;/code> by default. If you are still enabling logging configuration through the &lt;code>zap-logger-config&lt;/code>, no action is required.&lt;/li>
&lt;li>&lt;code>0.33.0&lt;/code> drops support for comma delimited lists on tags for &lt;code>SubnetSelectorTerm&lt;/code>, &lt;code>SecurityGroupsSelectorTerm&lt;/code>, and &lt;code>AMISelectorTerm&lt;/code>. Karpenter now supports multiple terms for each of the selectors which means that we can specify a more explicit OR-based constraint through separate terms rather than a comma-delimited list of values.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0320">Upgrading to &lt;code>0.32.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;p>Karpenter &lt;code>0.32.0&lt;/code> introduces v1beta1 APIs, including &lt;em>significant&lt;/em> changes to the API and installation procedures for the Karpenter controllers. &lt;strong>Do not&lt;/strong> upgrade to &lt;code>0.32.0&lt;/code>+ without referencing the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v0.32/upgrading/v1beta1-migration/#upgrade-procedure">v1beta1 Migration Upgrade Procedure&lt;/a>.&lt;/p>
&lt;p>This version includes &lt;strong>dual support&lt;/strong> for both alpha and beta APIs to ensure that you can slowly migrate your existing Provisioner, AWSNodeTemplate, and Machine alpha APIs to the newer NodePool, EC2NodeClass, and NodeClaim beta APIs.&lt;/p>
&lt;p>Note that if you are rolling back after upgrading to &lt;code>0.32.0&lt;/code>, note that &lt;strong>only&lt;/strong> versions &lt;code>0.31.4&lt;/code> support handling rollback after you have deployed the v1beta1 APIs to your cluster.&lt;/p>
&lt;/div>
&lt;ul>
&lt;li>Karpenter now uses &lt;code>settings.InterruptionQueue&lt;/code> instead of &lt;code>settings.aws.InterruptionQueueName&lt;/code> in its helm chart. The CLI argument also changed to &lt;code>--interruption-queue&lt;/code>.&lt;/li>
&lt;li>Karpenter now serves the webhook prometheus metrics server on port &lt;code>8001&lt;/code>. If this port is already in-use on the pod or you are running in &lt;code>hostNetworking&lt;/code> mode, you may need to change this port value. You can configure this port value through the &lt;code>WEBHOOK_METRICS_PORT&lt;/code> environment variable or the &lt;code>webhook.metrics.port&lt;/code> value if installing via Helm.&lt;/li>
&lt;li>Karpenter now exposes the ability to disable webhooks through the &lt;code>webhook.enabled=false&lt;/code> value. This value will disable the webhook server and will prevent any permissions, mutating or validating webhook configurations from being deployed to the cluster.&lt;/li>
&lt;li>Karpenter now moves all logging configuration for the Zap logger into the &lt;code>logConfig&lt;/code> values block. Configuring Karpenter logging with this mechanism &lt;em>is&lt;/em> deprecated and will be dropped at v1. Karpenter now only surfaces logLevel through the &lt;code>logLevel&lt;/code> helm value. If you need more advanced configuration due to log parsing constraints, we recommend configuring your log parser to handle Karpenter&amp;rsquo;s Zap JSON logging.&lt;/li>
&lt;li>The default log encoding changed from &lt;code>console&lt;/code> to &lt;code>json&lt;/code>. If you were previously not setting the type of log encoding, this default will change with the Helm chart. If you were setting the value through &lt;code>logEncoding&lt;/code>, this value will continue to work until &lt;code>0.33.x&lt;/code> but it is deprecated in favor of &lt;code>logConfig.logEncoding&lt;/code>&lt;/li>
&lt;li>Karpenter now uses the &lt;code>karpenter.sh/disruption:NoSchedule=disrupting&lt;/code> taint instead of the upstream &lt;code>node.kubernetes.io/unschedulable&lt;/code> taint for nodes spawned with a NodePool to prevent pods from scheduling to nodes being disrupted. Pods that previously tolerated the &lt;code>node.kubernetes.io/unschedulable&lt;/code> taint that previously weren&amp;rsquo;t evicted during termination will now be evicted. This most notably affects DaemonSets, which have the &lt;code>node.kubernetes.io/unschedulable&lt;/code> toleration by default, where Karpenter will now remove these pods during termination. If you want your specific pods to not be evicted when nodes are scaled down, you should add a toleration to the pods with the following: &lt;code>Key=karpenter.sh/disruption, Effect=NoSchedule, Operator=Equals, Values=disrupting&lt;/code>.
&lt;ul>
&lt;li>Note: Karpenter will continue to use the old &lt;code>node.kubernetes.io/unschedulable&lt;/code> taint for nodes spawned with a Provisioner.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0310">Upgrading to &lt;code>0.31.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>Karpenter moved its &lt;code>securityContext&lt;/code> constraints from pod-wide to only applying to the Karpenter container exclusively. If you were previously relying on the pod-wide &lt;code>securityContext&lt;/code> for your sidecar containers, you will now need to set these values explicitly in your sidecar container configuration.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0300">Upgrading to &lt;code>0.30.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>Karpenter will now &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/disruption/#drift">statically drift&lt;/a> on both Provisioner and AWSNodeTemplate Fields. For Provisioner Static Drift, the &lt;code>karpenter.sh/provisioner-hash&lt;/code> annotation must be present on both the Provisioner and Machine. For AWSNodeTemplate drift, the &lt;code>karpenter.k8s.aws/nodetemplate-hash&lt;/code> annotation must be present on the AWSNodeTemplate and Machine. Karpenter will not add these annotations to pre-existing nodes, so each of these nodes will need to be recycled one time for the annotations to be added.&lt;/li>
&lt;li>Karpenter will now fail validation on AWSNodeTemplates and Provisioner &lt;code>spec.provider&lt;/code> that have &lt;code>amiSelectors&lt;/code>, &lt;code>subnetSelectors&lt;/code>, or &lt;code>securityGroupSelectors&lt;/code> set with a combination of id selectors (&lt;code>aws-ids&lt;/code>, &lt;code>aws::ids&lt;/code>) and other selectors.&lt;/li>
&lt;li>Karpenter now statically sets the &lt;code>securityContext&lt;/code> at both the pod and container-levels and doesn&amp;rsquo;t allow override values to be passed through the Helm chart. This change was made to adhere to &lt;a href="https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted">Restricted Pod Security Standard&lt;/a>, which follows pod hardening best practices.&lt;/li>
&lt;/ul>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
If you have sidecar containers configured to run alongside Karpenter that cannot tolerate the &lt;a href="https://github.com/aws/karpenter/blob/v0.30.0/charts/karpenter/templates/deployment.yaml#L40">pod-wide &lt;code>securityContext&lt;/code> constraints&lt;/a>, you will need to specify overrides to the sidecar &lt;code>securityContext&lt;/code> in your deployment.
&lt;/div>
&lt;h3 id="upgrading-to-0290">Upgrading to &lt;code>0.29.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
Karpenter &lt;code>0.29.1&lt;/code> contains a &lt;a href="https://github.com/aws/karpenter/issues/4296">file descriptor and memory leak bug&lt;/a> that leads to Karpenter getting OOMKilled and restarting at the point that it hits its memory or file descriptor limit. Karpenter &lt;code>0.29.2&lt;/code>+ fixes this leak.
&lt;/div>
&lt;ul>
&lt;li>
&lt;p>Karpenter has changed the default metrics service port from 8080 to 8000 and the default webhook service port from 443 to 8443. In &lt;code>0.28.0&lt;/code>, the Karpenter pod port was changed to 8000, but referenced the service by name, allowing users to scrape the service at port 8080 for metrics. &lt;code>0.29.0&lt;/code> aligns the two ports so that service and pod metrics ports are the same. These ports are set by the &lt;code>controller.metrics.port&lt;/code> and &lt;code>webhook.port&lt;/code> Helm chart values, so if you have previously set these to non-default values, you may need to update your Prometheus scraper to match these new values.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Karpenter will now reconcile nodes that are drifted due to their Security Groups or their Subnets. If your AWSNodeTemplate&amp;rsquo;s Security Groups differ from the Security Groups used for an instance, Karpenter will consider it drifted. If the Subnet used by an instance is not contained in the allowed list of Subnets for an AWSNodeTemplate, Karpenter will also consider it drifted.&lt;/p>
&lt;ul>
&lt;li>Since Karpenter uses tags for discovery of Subnets and SecurityGroups, check the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/threat-model/#threat-using-ec2-createtagdeletetag-permissions-to-orchestrate-machine-creationdeletion">Threat Model&lt;/a> to see how to manage this IAM Permission.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0280">Upgrading to &lt;code>0.28.0&lt;/code>+&lt;/h3>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
Karpenter &lt;code>0.28.0&lt;/code> is incompatible with Kubernetes version 1.26+, which can result in additional node scale outs when using &lt;code>--cloudprovider=external&lt;/code>, which is the default for the EKS Optimized AMI. See: &lt;a href="https://github.com/aws/karpenter-core/pull/375">https://github.com/aws/karpenter-core/pull/375&lt;/a>. Karpenter &lt;code>0.28.1&lt;/code>+ fixes this issue and is compatible with Kubernetes version 1.26+.
&lt;/div>
&lt;ul>
&lt;li>
&lt;p>The &lt;code>extraObjects&lt;/code> value is now removed from the Helm chart. Having this value in the chart proved to not work in the majority of Karpenter installs and often led to anti-patterns, where the Karpenter resources installed to manage Karpenter&amp;rsquo;s capacity were directly tied to the install of the Karpenter controller deployments. The Karpenter team recommends that, if you want to install Karpenter manifests alongside the Karpenter Helm chart, to do so by creating a separate chart for the manifests, creating a dependency on the controller chart.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The &lt;code>aws.nodeNameConvention&lt;/code> setting is now removed from the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/#configmap">&lt;code>karpenter-global-settings&lt;/code>&lt;/a> ConfigMap. Because Karpenter is now driving its orchestration of capacity through Machines, it no longer needs to know the node name, making this setting obsolete. Karpenter ignores configuration that it doesn&amp;rsquo;t recognize in the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/#configmap">&lt;code>karpenter-global-settings&lt;/code>&lt;/a> ConfigMap, so leaving the &lt;code>aws.nodeNameConvention&lt;/code> in the ConfigMap will simply cause this setting to be ignored.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Karpenter now defines a set of &amp;ldquo;restricted tags&amp;rdquo; which can&amp;rsquo;t be overridden with custom tagging in the AWSNodeTemplate or in the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/#configmap">&lt;code>karpenter-global-settings&lt;/code>&lt;/a> ConfigMap. If you are currently using any of these tag overrides when tagging your instances, webhook validation will now fail. These tags include:&lt;/p>
&lt;ul>
&lt;li>&lt;code>karpenter.sh/managed-by&lt;/code>&lt;/li>
&lt;li>&lt;code>karpenter.sh/provisioner-name&lt;/code>&lt;/li>
&lt;li>&lt;code>kubernetes.io/cluster/${CLUSTER_NAME}&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>The following metrics changed their meaning, based on the introduction of the Machine resource:&lt;/p>
&lt;ul>
&lt;li>&lt;code>karpenter_nodes_terminated&lt;/code>: Use &lt;code>karpenter_machines_terminated&lt;/code> if you are interested in the reason why a Karpenter machine was deleted. &lt;code>karpenter_nodes_terminated&lt;/code> now only tracks the count of terminated nodes without any additional labels.&lt;/li>
&lt;li>&lt;code>karpenter_nodes_created&lt;/code>: Use &lt;code>karpenter_machines_created&lt;/code> if you are interested in the reason why a Karpenter machine was created. &lt;code>karpenter_nodes_created&lt;/code> now only tracks the count of created nodes without any additional labels.&lt;/li>
&lt;li>&lt;code>karpenter_deprovisioning_replacement_node_initialized_seconds&lt;/code>: This metric has been replaced in favor of &lt;code>karpenter_deprovisioning_replacement_machine_initialized_seconds&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;code>0.28.0&lt;/code> introduces the Machine CustomResource into the &lt;code>karpenter.sh&lt;/code> API Group and requires this CustomResourceDefinition to run properly. Karpenter now orchestrates its CloudProvider capacity through these in-cluster Machine CustomResources. When performing a scheduling decision, Karpenter will create a Machine, resulting in launching CloudProvider capacity. The kubelet running on the new capacity will then register the node to the cluster shortly after launch.&lt;/p>
&lt;ul>
&lt;li>If you are using Helm to upgrade between versions of Karpenter, note that &lt;a href="https://helm.sh/docs/chart_best_practices/custom_resource_definitions/#some-caveats-and-explanations">Helm does not automate the process of upgrading or install the new CRDs into your cluster&lt;/a>. To install or upgrade the existing CRDs, follow the guidance under the &lt;a href="#custom-resource-definition-crd-upgrades">Custom Resource Definition (CRD) Upgrades&lt;/a> section of the upgrade guide.&lt;/li>
&lt;li>Karpenter will hydrate Machines on startup for existing capacity managed by Karpenter into the cluster. Existing capacity launched by an older version of Karpenter is discovered by finding CloudProvider capacity with the &lt;code>karpenter.sh/provisioner-name&lt;/code> tag or the &lt;code>karpenter.sh/provisioner-name&lt;/code> label on nodes.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>The metrics port for the Karpenter deployment was changed from 8080 to 8000. Users who scrape the pod directly for metrics rather than the service will need to adjust the commands they use to reference port 8000. Any users who scrape metrics from the service should be unaffected.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;p>Karpenter creates a mapping between CloudProvider machines and CustomResources in the cluster for capacity tracking. To ensure this mapping is consistent, Karpenter utilizes the following tag keys:&lt;/p>
&lt;ul>
&lt;li>&lt;code>karpenter.sh/managed-by&lt;/code>&lt;/li>
&lt;li>&lt;code>karpenter.sh/provisioner-name&lt;/code>&lt;/li>
&lt;li>&lt;code>kubernetes.io/cluster/${CLUSTER_NAME}&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Because Karpenter takes this dependency, any user that has the ability to Create/Delete these tags on CloudProvider machines will have the ability to orchestrate Karpenter to Create/Delete CloudProvider machines as a side effect. Check the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/threat-model/#threat-using-ec2-createtagdeletetag-permissions-to-orchestrate-machine-creationdeletion">Threat Model&lt;/a> to see how this might affect you, and ways to mitigate this.&lt;/p>
&lt;/div>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Rolling Back&lt;/h4>
&lt;p>If, after upgrading to &lt;code>0.28.0&lt;/code>+, a rollback to an older version of Karpenter needs to be performed, Karpenter will continue to function normally, though you will still have the Machine CustomResources on your cluster. You will need to manually delete the Machines and patch out the finalizers to fully complete the rollback.&lt;/p>
&lt;p>Karpenter marks CloudProvider capacity as &amp;ldquo;managed by&amp;rdquo; a Machine using the &lt;code>karpenter-sh/managed-by&lt;/code> tag on the CloudProvider machine. It uses this tag to ensure that the Machine CustomResources in the cluster match the CloudProvider capacity managed by Karpenter. If these states don&amp;rsquo;t match, Karpenter will garbage collect the capacity. Because of this, if performing an upgrade, followed by a rollback, followed by another upgrade to &lt;code>0.28.0&lt;/code>+, ensure you remove the &lt;code>karpenter.sh/managed-by&lt;/code> tags from existing capacity; otherwise, Karpenter will deprovision the capacity without a Machine CR counterpart.&lt;/p>
&lt;/div>
&lt;h3 id="upgrading-to-0273">Upgrading to &lt;code>0.27.3&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>The &lt;code>defaulting.webhook.karpenter.sh&lt;/code> mutating webhook was removed in &lt;code>0.27.3&lt;/code>. If you are coming from an older version of Karpenter where this webhook existed and the webhook was not managed by Helm, you may need to delete the stale webhook.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl delete mutatingwebhookconfigurations defaulting.webhook.karpenter.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="upgrading-to-0270">Upgrading to &lt;code>0.27.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>The Karpenter controller pods now deploy with &lt;code>kubernetes.io/hostname&lt;/code> self anti-affinity by default. If you are running Karpenter in HA (high-availability) mode and you do not have enough nodes to match the number of pod replicas you are deploying with, you will need to scale-out your nodes for Karpenter.&lt;/li>
&lt;li>The following controller metrics changed and moved under the &lt;code>controller_runtime&lt;/code> metrics namespace:
&lt;ul>
&lt;li>&lt;code>karpenter_metricscraper_...&lt;/code>&lt;/li>
&lt;li>&lt;code>karpenter_deprovisioning_...&lt;/code>&lt;/li>
&lt;li>&lt;code>karpenter_provisioner_...&lt;/code>&lt;/li>
&lt;li>&lt;code>karpenter_interruption_...&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The following controller metric names changed, affecting the &lt;code>controller&lt;/code> label value under &lt;code>controller_runtime_...&lt;/code> metrics. These metrics include:
&lt;ul>
&lt;li>&lt;code>podmetrics&lt;/code> -&amp;gt; &lt;code>pod_metrics&lt;/code>&lt;/li>
&lt;li>&lt;code>provisionermetrics&lt;/code> -&amp;gt; &lt;code>provisioner_metrics&lt;/code>&lt;/li>
&lt;li>&lt;code>metricscraper&lt;/code> -&amp;gt; &lt;code>metric_scraper&lt;/code>&lt;/li>
&lt;li>&lt;code>provisioning&lt;/code> -&amp;gt; &lt;code>provisioner_trigger&lt;/code>&lt;/li>
&lt;li>&lt;code>node-state&lt;/code> -&amp;gt; &lt;code>node_state&lt;/code>&lt;/li>
&lt;li>&lt;code>pod-state&lt;/code> -&amp;gt; &lt;code>pod_state&lt;/code>&lt;/li>
&lt;li>&lt;code>provisioner-state&lt;/code> -&amp;gt; &lt;code>provisioner_state&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The &lt;code>karpenter_allocation_controller_scheduling_duration_seconds&lt;/code> metric name changed to &lt;code>karpenter_provisioner_scheduling_duration_seconds&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0260">Upgrading to &lt;code>0.26.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>The &lt;code>karpenter.sh/do-not-evict&lt;/code> annotation no longer blocks node termination when running &lt;code>kubectl delete node&lt;/code>. This annotation on pods will only block automatic deprovisioning that is considered &amp;ldquo;voluntary,&amp;rdquo; that is, disruptions that can be avoided. Disruptions that Karpenter deems as &amp;ldquo;involuntary&amp;rdquo; and will ignore the &lt;code>karpenter.sh/do-not-evict&lt;/code> annotation include spot interruption and manual deletion of the node. See &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/disruption/#disabling-deprovisioning">Disabling Deprovisioning&lt;/a> for more details.&lt;/li>
&lt;li>Default resources &lt;code>requests&lt;/code> and &lt;code>limits&lt;/code> are removed from the Karpenter&amp;rsquo;s controller deployment through the Helm chart. If you have not set custom resource &lt;code>requests&lt;/code> or &lt;code>limits&lt;/code> in your Helm values and are using Karpenter&amp;rsquo;s defaults, you will now need to set these values in your Helm chart deployment.&lt;/li>
&lt;li>The &lt;code>controller.image&lt;/code> value in the Helm chart has been broken out to a map consisting of &lt;code>controller.image.repository&lt;/code>, &lt;code>controller.image.tag&lt;/code>, and &lt;code>controller.image.digest&lt;/code>. If manually overriding the &lt;code>controller.image&lt;/code>, you will need to update your values to the new design.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0250">Upgrading to &lt;code>0.25.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>Cluster Endpoint can now be automatically discovered. If you are using Amazon Elastic Kubernetes Service (EKS), you can now omit the &lt;code>clusterEndpoint&lt;/code> field in your configuration. In order to allow the resolving, you have to add the permission &lt;code>eks:DescribeCluster&lt;/code> to the Karpenter Controller IAM role.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0240">Upgrading to &lt;code>0.24.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>Settings are no longer updated dynamically while Karpenter is running. If you manually make a change to the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/#configmap">&lt;code>karpenter-global-settings&lt;/code>&lt;/a> ConfigMap, you will need to reload the containers by restarting the deployment with &lt;code>kubectl rollout restart -n karpenter deploy/karpenter&lt;/code>&lt;/li>
&lt;li>Karpenter no longer filters out instance types internally. Previously, &lt;code>g2&lt;/code> (not supported by the NVIDIA device plugin) and FPGA instance types were filtered. The only way to filter instance types now is to set requirements on your provisioner or pods using well-known node labels described &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/scheduling/#selecting-nodes">here&lt;/a>. If you are currently using overly broad requirements that allows all of the &lt;code>g&lt;/code> instance-category, you will want to tighten the requirement, or add an instance-generation requirement.&lt;/li>
&lt;li>&lt;code>aws.tags&lt;/code> in &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/#configmap">&lt;code>karpenter-global-settings&lt;/code>&lt;/a> ConfigMap is now a top-level field and expects the value associated with this key to be a JSON object of string to string. This is change from previous versions where keys were given implicitly by providing the key-value pair &lt;code>aws.tags.&amp;lt;key&amp;gt;: value&lt;/code> in the ConfigMap.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0220">Upgrading to &lt;code>0.22.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>Do not upgrade to this version unless you are on Kubernetes &amp;gt;= v1.21. Karpenter no longer supports Kubernetes v1.20, but now supports Kubernetes v1.25. This change is due to the v1 PDB API, which was introduced in K8s v1.20 and subsequent removal of the v1beta1 API in K8s v1.25.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0200">Upgrading to &lt;code>0.20.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>Prior to &lt;code>0.20.0&lt;/code>, Karpenter would prioritize certain instance type categories absent of any requirements in the Provisioner. &lt;code>0.20.0&lt;/code>+ removes prioritizing these instance type categories (&amp;ldquo;m&amp;rdquo;, &amp;ldquo;c&amp;rdquo;, &amp;ldquo;r&amp;rdquo;, &amp;ldquo;a&amp;rdquo;, &amp;ldquo;t&amp;rdquo;, &amp;ldquo;i&amp;rdquo;) in code. Bare Metal and GPU instance types are still deprioritized and only used if no other instance types are compatible with the node requirements. Since Karpenter does not prioritize any instance types, if you do not want exotic instance types and are not using the runtime Provisioner defaults, you will need to specify this in the Provisioner.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0190">Upgrading to &lt;code>0.19.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>The karpenter webhook and controller containers are combined into a single binary, which requires changes to the Helm chart. If your Karpenter installation (Helm or otherwise) currently customizes the karpenter webhook, your deployment tooling may require minor changes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Karpenter now supports native interruption handling. If you were previously using Node Termination Handler for spot interruption handling and health events, you will need to remove the component from your cluster before enabling &lt;code>aws.interruptionQueueName&lt;/code>. For more details on Karpenter&amp;rsquo;s interruption handling, see the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/disruption/#interruption">Interruption Handling Docs&lt;/a>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Instance category defaults are now explicitly persisted in the Provisioner, rather than handled implicitly in memory. By default, Provisioners will limit instance category to c,m,r. If any instance type constraints are applied, it will override this default. If you have created Provisioners in the past with unconstrained instance type, family, or category, Karpenter will now more flexibly use instance types than before. If you would like to apply these constraints, they must be included in the Provisioner CRD.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Karpenter CRD raw YAML URLs have migrated from &lt;code>https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.19.3/charts/karpenter/crds/...&lt;/code> to &lt;code>https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.19.3/pkg/apis/crds/...&lt;/code>. If you reference static Karpenter CRDs or rely on &lt;code>kubectl replace -f&lt;/code> to apply these CRDs from their remote location, you will need to migrate to the new location.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Pods without an ownerRef (also called &amp;ldquo;controllerless&amp;rdquo; or &amp;ldquo;naked&amp;rdquo; pods) will now be evicted by default during node termination and consolidation. Users can prevent controllerless pods from being voluntarily disrupted by applying the &lt;code>karpenter.sh/do-not-evict: &amp;quot;true&amp;quot;&lt;/code> annotation to the pods in question.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The following CLI options/environment variables are now removed and replaced in favor of pulling settings dynamically from the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/#configmap">&lt;code>karpenter-global-settings&lt;/code>&lt;/a> ConfigMap. See the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/#environment-variables--cli-flags">Settings docs&lt;/a> for more details on configuring the new values in the ConfigMap.&lt;/p>
&lt;ul>
&lt;li>&lt;code>CLUSTER_NAME&lt;/code> -&amp;gt; &lt;code>settings.aws.clusterName&lt;/code>&lt;/li>
&lt;li>&lt;code>CLUSTER_ENDPOINT&lt;/code> -&amp;gt; &lt;code>settings.aws.clusterEndpoint&lt;/code>&lt;/li>
&lt;li>&lt;code>AWS_DEFAULT_INSTANCE_PROFILE&lt;/code> -&amp;gt; &lt;code>settings.aws.defaultInstanceProfile&lt;/code>&lt;/li>
&lt;li>&lt;code>AWS_ENABLE_POD_ENI&lt;/code> -&amp;gt; &lt;code>settings.aws.enablePodENI&lt;/code>&lt;/li>
&lt;li>&lt;code>AWS_ENI_LIMITED_POD_DENSITY&lt;/code> -&amp;gt; &lt;code>settings.aws.enableENILimitedPodDensity&lt;/code>&lt;/li>
&lt;li>&lt;code>AWS_ISOLATED_VPC&lt;/code> -&amp;gt; &lt;code>settings.aws.isolatedVPC&lt;/code>&lt;/li>
&lt;li>&lt;code>AWS_NODE_NAME_CONVENTION&lt;/code> -&amp;gt; &lt;code>settings.aws.nodeNameConvention&lt;/code>&lt;/li>
&lt;li>&lt;code>VM_MEMORY_OVERHEAD&lt;/code> -&amp;gt; &lt;code>settings.aws.vmMemoryOverheadPercent&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0180">Upgrading to &lt;code>0.18.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>&lt;code>0.18.0&lt;/code> removes the &lt;code>karpenter_consolidation_nodes_created&lt;/code> and &lt;code>karpenter_consolidation_nodes_terminated&lt;/code> prometheus metrics in favor of the more generic &lt;code>karpenter_nodes_created&lt;/code> and &lt;code>karpenter_nodes_terminated&lt;/code> metrics. You can still see nodes created and terminated by consolidation by checking the &lt;code>reason&lt;/code> label on the metrics. Check out all the metrics published by Karpenter &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/metrics/">here&lt;/a>.&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0170">Upgrading to &lt;code>0.17.0&lt;/code>+&lt;/h3>
&lt;p>Karpenter&amp;rsquo;s Helm chart package is now stored in &lt;a href="https://gallery.ecr.aws/karpenter/karpenter">Karpenter&amp;rsquo;s OCI (Open Container Initiative) registry&lt;/a>. The Helm CLI supports the new format since &lt;a href="https://helm.sh/docs/topics/registries/">v3.8.0+&lt;/a>.
With this change &lt;a href="https://charts.karpenter.sh/">charts.karpenter.sh&lt;/a> is no longer updated but preserved to allow using older Karpenter versions. For examples on working with the Karpenter Helm charts look at &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/getting-started/getting-started-with-karpenter/#install-karpenter-helm-chart">Install Karpenter Helm Chart&lt;/a>.&lt;/p>
&lt;p>Users who have scripted the installation or upgrading of Karpenter need to adjust their scripts with the following changes:&lt;/p>
&lt;ol>
&lt;li>There is no longer a need to add the Karpenter Helm repo with &lt;code>helm repo add&lt;/code>&lt;/li>
&lt;li>The full URL of the Helm chart needs to be present when using the &lt;code>helm&lt;/code> CLI&lt;/li>
&lt;li>If you were not prepending a &lt;code>v&lt;/code> to the version (i.e. &lt;code>0.17.0&lt;/code>), you will need to do so with the OCI chart (i.e &lt;code>v0.17.0&lt;/code>).&lt;/li>
&lt;/ol>
&lt;h3 id="upgrading-to-0162">Upgrading to &lt;code>0.16.2&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>&lt;code>0.16.2&lt;/code> adds new kubeletConfiguration fields to the &lt;code>provisioners.karpenter.sh&lt;/code> v1alpha5 CRD. The CRD will need to be updated to use the new parameters:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl replace -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.16.2/charts/karpenter/crds/karpenter.sh_provisioners.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="upgrading-to-0160">Upgrading to &lt;code>0.16.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>&lt;code>0.16.0&lt;/code> adds a new weight field to the &lt;code>provisioners.karpenter.sh&lt;/code> v1alpha5 CRD. The CRD will need to be updated to use the new parameters:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl replace -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.16.0/charts/karpenter/crds/karpenter.sh_provisioners.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="upgrading-to-0150">Upgrading to &lt;code>0.15.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>&lt;code>0.15.0&lt;/code> adds a new consolidation field to the &lt;code>provisioners.karpenter.sh&lt;/code> v1alpha5 CRD. The CRD will need to be updated to use the new parameters:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl replace -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.15.0/charts/karpenter/crds/karpenter.sh_provisioners.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="upgrading-to-0140">Upgrading to &lt;code>0.14.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>&lt;code>0.14.0&lt;/code> adds new fields to the &lt;code>provisioners.karpenter.sh&lt;/code> v1alpha5 and &lt;code>awsnodetemplates.karpenter.k8s.aws&lt;/code> v1alpha1 CRDs. The CRDs will need to be updated to use the new parameters:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl replace -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.14.0/charts/karpenter/crds/karpenter.sh_provisioners.yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl replace -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.14.0/charts/karpenter/crds/karpenter.k8s.aws_awsnodetemplates.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>0.14.0&lt;/code> changes the way Karpenter discovers its dynamically generated AWS launch templates to use a tag rather than a Name scheme. The previous name scheme was &lt;code>Karpenter-${CLUSTER_NAME}-*&lt;/code> which could collide with user created launch templates that Karpenter should not manage. The new scheme uses a tag on the launch template &lt;code>karpenter.k8s.aws/cluster: ${CLUSTER_NAME}&lt;/code>. As a result, Karpenter will not clean-up dynamically generated launch templates using the old name scheme. You can manually clean these up with the following commands:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">## Find launch templates that match the naming pattern and you do not want to keep&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws ec2 describe-launch-templates --filters&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;Name=launch-template-name,Values=Karpenter-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic">## Delete launch template(s) that match the name but do not have the &amp;#34;karpenter.k8s.aws/cluster&amp;#34; tag&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws ec2 delete-launch-template --launch-template-id &amp;lt;LAUNCH_TEMPLATE_ID&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>0.14.0&lt;/code> introduces additional instance type filtering if there are no &lt;code>node.kubernetes.io/instance-type&lt;/code> or &lt;code>karpenter.k8s.aws/instance-family&lt;/code> or &lt;code>karpenter.k8s.aws/instance-category&lt;/code> requirements that restrict instance types specified on the provisioner. This prevents Karpenter from launching bare metal and some older non-current generation instance types unless the provisioner has been explicitly configured to allow them. If you specify an instance type or family requirement that supplies a list of instance-types or families, that list will be used regardless of filtering. The filtering can also be completely eliminated by adding an &lt;code>Exists&lt;/code> requirement for instance type or family.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">key&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">node.kubernetes.io/instance-type&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">operator&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Exists&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>&lt;code>0.14.0&lt;/code> introduces support for custom AMIs without the need for an entire launch template. You must add the &lt;code>ec2:DescribeImages&lt;/code> permission to the Karpenter Controller Role for this feature to work. This permission is needed for Karpenter to discover custom images specified. Read the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodepools/#spec-amiselector">Custom AMI documentation here&lt;/a> to get started&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>0.14.0&lt;/code> adds an an additional default toleration (CriticalAddonOnly=Exists) to the Karpenter Helm chart. This may cause Karpenter to run on nodes with that use this Taint which previously would not have been schedulable. This can be overridden by using &lt;code>--set tolerations[0]=null&lt;/code>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>0.14.0&lt;/code> deprecates the &lt;code>AWS_ENI_LIMITED_POD_DENSITY&lt;/code> environment variable in-favor of specifying &lt;code>spec.kubeletConfiguration.maxPods&lt;/code> on the Provisioner. &lt;code>AWS_ENI_LIMITED_POD_DENSITY&lt;/code> will continue to work when &lt;code>maxPods&lt;/code> is not set on the Provisioner. If &lt;code>maxPods&lt;/code> is set, it will override &lt;code>AWS_ENI_LIMITED_POD_DENSITY&lt;/code> on that specific Provisioner.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0130">Upgrading to &lt;code>0.13.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;code>0.13.0&lt;/code> introduces a new CRD named &lt;code>AWSNodeTemplate&lt;/code> which can be used to specify AWS Cloud Provider parameters. Everything that was previously specified under &lt;code>spec.provider&lt;/code> in the Provisioner resource, can now be specified in the spec of the new resource. The use of &lt;code>spec.provider&lt;/code> is deprecated but will continue to function to maintain backwards compatibility for the current API version (v1alpha5) of the Provisioner resource. &lt;code>0.13.0&lt;/code> also introduces support for custom user data that doesn&amp;rsquo;t require the use of a custom launch template. The user data can be specified in-line in the AWSNodeTemplate resource.&lt;/p>
&lt;p>If you are upgrading from &lt;code>0.10.1&lt;/code> - &lt;code>0.11.1&lt;/code>, a new CRD &lt;code>awsnodetemplate&lt;/code> was added. In &lt;code>0.12.0&lt;/code>, this crd was renamed to &lt;code>awsnodetemplates&lt;/code>. Since Helm does not manage the lifecycle of CRDs, you will need to perform a few manual steps for this CRD upgrade:&lt;/p>
&lt;ol>
&lt;li>Make sure any &lt;code>awsnodetemplate&lt;/code> manifests are saved somewhere so that they can be reapplied to the cluster.&lt;/li>
&lt;li>&lt;code>kubectl delete crd awsnodetemplate&lt;/code>&lt;/li>
&lt;li>&lt;code>kubectl apply -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.13.2/charts/karpenter/crds/karpenter.k8s.aws_awsnodetemplates.yaml&lt;/code>&lt;/li>
&lt;li>Perform the Karpenter upgrade to &lt;code>0.13.0&lt;/code>+, which will install the new &lt;code>awsnodetemplates&lt;/code> CRD.&lt;/li>
&lt;li>Reapply the &lt;code>awsnodetemplate&lt;/code> manifests you saved from step 1, if applicable.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>&lt;code>0.13.0&lt;/code> also adds EC2/spot price fetching to Karpenter to allow making more accurate decisions regarding node deployments. Our &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/getting-started/getting-started-with-karpenter/">getting started guide&lt;/a> documents this, but if you are upgrading Karpenter you will need to modify your Karpenter controller policy to add the &lt;code>pricing:GetProducts&lt;/code> and &lt;code>ec2:DescribeSpotPriceHistory&lt;/code> permissions.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0120">Upgrading to &lt;code>0.12.0&lt;/code>+&lt;/h3>
&lt;ul>
&lt;li>&lt;code>0.12.0&lt;/code> adds an OwnerReference to each Node created by a provisioner. Previously, deleting a provisioner would orphan nodes. Now, deleting a provisioner will cause Kubernetes &lt;a href="https://kubernetes.io/docs/concepts/architecture/garbage-collection/#cascading-deletion">cascading delete&lt;/a> logic to gracefully terminate the nodes using the Karpenter node finalizer. You may still orphan nodes by removing the owner reference.&lt;/li>
&lt;li>If you are upgrading from &lt;code>0.10.1&lt;/code> - &lt;code>0.11.1&lt;/code>, a new CRD &lt;code>awsnodetemplate&lt;/code> was added. In &lt;code>0.12.0&lt;/code>, this crd was renamed to &lt;code>awsnodetemplates&lt;/code>. Since Helm does not manage the lifecycle of CRDs, you will need to perform a few manual steps for this CRD upgrade:
&lt;ol>
&lt;li>Make sure any &lt;code>awsnodetemplate&lt;/code> manifests are saved somewhere so that they can be reapplied to the cluster.&lt;/li>
&lt;li>&lt;code>kubectl delete crd awsnodetemplate&lt;/code>&lt;/li>
&lt;li>&lt;code>kubectl apply -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.12.1/charts/karpenter/crds/karpenter.k8s.aws_awsnodetemplates.yaml&lt;/code>&lt;/li>
&lt;li>Perform the Karpenter upgrade to &lt;code>0.12.0&lt;/code>+, which will install the new &lt;code>awsnodetemplates&lt;/code> CRD.&lt;/li>
&lt;li>Reapply the &lt;code>awsnodetemplate&lt;/code> manifests you saved from step 1, if applicable.&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h3 id="upgrading-to-0110">Upgrading to &lt;code>0.11.0&lt;/code>+&lt;/h3>
&lt;p>&lt;code>0.11.0&lt;/code> changes the way that the &lt;code>vpc.amazonaws.com/pod-eni&lt;/code> resource is reported. Instead of being reported for all nodes that could support the resources regardless of if the cluster is configured to support it, it is now controlled by a command line flag or environment variable. The parameter defaults to false and must be set if your cluster uses &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/security-groups-for-pods.html">security groups for pods&lt;/a>. This can be enabled by setting the environment variable &lt;code>AWS_ENABLE_POD_ENI&lt;/code> to true via the helm value &lt;code>controller.env&lt;/code>.&lt;/p>
&lt;p>Other extended resources must be registered on nodes by their respective device plugins which are typically installed as DaemonSets (e.g. the &lt;code>nvidia.com/gpu&lt;/code> resource will be registered by the &lt;a href="https://github.com/NVIDIA/k8s-device-plugin">NVIDIA device plugin&lt;/a>. Previously, Karpenter would register these resources on nodes at creation and they would be zeroed out by &lt;code>kubelet&lt;/code> at startup. By allowing the device plugins to register the resources, pods will not bind to the nodes before any device plugin initialization has occurred.&lt;/p>
&lt;p>&lt;code>0.11.0&lt;/code> adds a &lt;code>providerRef&lt;/code> field in the Provisioner CRD. To use this new field you will need to replace the Provisioner CRD manually:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kubectl replace -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.11.0/charts/karpenter/crds/karpenter.sh_provisioners.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="upgrading-to-0100">Upgrading to &lt;code>0.10.0&lt;/code>+&lt;/h3>
&lt;p>&lt;code>0.10.0&lt;/code> adds a new field, &lt;code>startupTaints&lt;/code> to the provisioner spec. Standard Helm upgrades &lt;a href="https://helm.sh/docs/chart_best_practices/custom_resource_definitions/#some-caveats-and-explanations">do not upgrade CRDs&lt;/a> so the field will not be available unless the CRD is manually updated. This can be performed prior to the standard upgrade by applying the new CRD manually:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>kubectl replace -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/v0.10.0/charts/karpenter/crds/karpenter.sh_provisioners.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>📝 If you don&amp;rsquo;t perform this manual CRD update, Karpenter will work correctly except for rejecting the creation/update of provisioners that use &lt;code>startupTaints&lt;/code>.&lt;/p>
&lt;h3 id="upgrading-to-062">Upgrading to &lt;code>0.6.2&lt;/code>+&lt;/h3>
&lt;p>If using Helm, the variable names have changed for the cluster&amp;rsquo;s name and endpoint. You may need to update any configuration
that sets the old variable names.&lt;/p>
&lt;ul>
&lt;li>&lt;code>controller.clusterName&lt;/code> is now &lt;code>clusterName&lt;/code>&lt;/li>
&lt;li>&lt;code>controller.clusterEndpoint&lt;/code> is now &lt;code>clusterEndpoint&lt;/code>&lt;/li>
&lt;/ul></description></item><item><title>V1.0: Compatibility</title><link>https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/compatibility/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/compatibility/</guid><description>
&lt;h1 id="compatibility">Compatibility&lt;/h1>
&lt;p>To make upgrading easier we aim to minimize the introduction of breaking changes.
Before you begin upgrading Karpenter, consider Karpenter compatibility issues related to Kubernetes and the NodePool API (previously Provisioner).&lt;/p>
&lt;h2 id="compatibility-matrix">Compatibility Matrix&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>KUBERNETES&lt;/th>
&lt;th>1.25&lt;/th>
&lt;th>1.26&lt;/th>
&lt;th>1.27&lt;/th>
&lt;th>1.28&lt;/th>
&lt;th>1.29&lt;/th>
&lt;th>1.30&lt;/th>
&lt;th>1.31&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>karpenter&lt;/td>
&lt;td>&amp;gt;= 0.25&lt;/td>
&lt;td>&amp;gt;= 0.28&lt;/td>
&lt;td>&amp;gt;= 0.28&lt;/td>
&lt;td>&amp;gt;= 0.31&lt;/td>
&lt;td>&amp;gt;= 0.34&lt;/td>
&lt;td>&amp;gt;= 0.37&lt;/td>
&lt;td>&amp;gt;= 1.0.5&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;p>Karpenter currently does not support the following &lt;a href="https://kubernetes.io/blog/2023/04/17/fine-grained-pod-topology-spread-features-beta/">new &lt;code>topologySpreadConstraints&lt;/code> keys&lt;/a>, promoted to beta in Kubernetes 1.27:&lt;/p>
&lt;ul>
&lt;li>&lt;code>matchLabelKeys&lt;/code>&lt;/li>
&lt;li>&lt;code>nodeAffinityPolicy&lt;/code>&lt;/li>
&lt;li>&lt;code>nodeTaintsPolicy&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>For more information on Karpenter&amp;rsquo;s support for these keys, view &lt;a href="https://github.com/aws/karpenter-core/issues/430">this tracking issue&lt;/a>.&lt;/p>
&lt;/div>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Karpenter supports using &lt;a href="https://kubernetes.io/docs/reference/using-api/cel/">Kubernetes Common Expression Language&lt;/a> for validating its Custom Resource Definitions out-of-the-box; however, this feature is not supported on versions of Kubernetes &amp;lt; 1.25. If you are running an earlier version of Kubernetes, you will need to use the Karpenter admission webhooks for validation instead. You can enable these webhooks with &lt;code>--set webhook.enabled=true&lt;/code> when applying the Karpenter Helm chart.
&lt;/div>
&lt;h2 id="compatibility-issues">Compatibility issues&lt;/h2>
&lt;p>When we introduce a breaking change, we do so only as described in this document.&lt;/p>
&lt;p>Karpenter follows &lt;a href="https://semver.org/">Semantic Versioning 2.0.0&lt;/a> in its stable release versions, while in
major version zero (&lt;code>0.y.z&lt;/code>) &lt;a href="https://semver.org/#spec-item-4">anything may change at any time&lt;/a>.
However, to further protect users during this phase we will only introduce breaking changes in minor releases (releases that increment y in x.y.z).
Note this does not mean every minor upgrade has a breaking change as we will also increment the
minor version when we release a new feature.&lt;/p>
&lt;p>Users should therefore check to see if there is a breaking change every time they are upgrading to a new minor version.&lt;/p>
&lt;h3 id="how-do-we-break-incompatibility">How Do We Break Incompatibility?&lt;/h3>
&lt;p>When there is a breaking change we will:&lt;/p>
&lt;ul>
&lt;li>Increment the minor version when in major version 0&lt;/li>
&lt;li>Add a permanent separate section named &lt;code>upgrading to x.y.z+&lt;/code> under &lt;a href="#release-upgrade-notes">release upgrade notes&lt;/a>
clearly explaining the breaking change and what needs to be done on the user side to ensure a safe upgrade&lt;/li>
&lt;li>Add the sentence “This is a breaking change, please refer to the above link for upgrade instructions” to the top of the release notes and in all our announcements&lt;/li>
&lt;/ul>
&lt;h3 id="how-do-we-find-incompatibilities">How Do We Find Incompatibilities?&lt;/h3>
&lt;p>Besides the peer review process for all changes to the code base we also do the followings in order to find
incompatibilities:&lt;/p>
&lt;ul>
&lt;li>(To be implemented) To check the compatibility of the application, we will automate tests for installing, uninstalling, upgrading from an older version, and downgrading to an older version&lt;/li>
&lt;li>(To be implemented) To check the compatibility of the documentation with the application, we will turn the commands in our documentation into scripts that we can automatically run&lt;/li>
&lt;/ul>
&lt;h3 id="security-patches">Security Patches&lt;/h3>
&lt;p>While we are in major version 0 we will not release security patches to older versions.
Rather we provide the patches in the latest versions.
When at major version 1 we will have an EOL (end of life) policy where we provide security patches
for a subset of older versions and deprecate the others.&lt;/p>
&lt;h2 id="release-types">Release Types&lt;/h2>
&lt;p>Karpenter offers three types of releases. This section explains the purpose of each release type and how the images for each release type are tagged in our &lt;a href="https://gallery.ecr.aws/karpenter">public image repository&lt;/a>.&lt;/p>
&lt;h3 id="stable-releases">Stable Releases&lt;/h3>
&lt;p>Stable releases are the only recommended versions for production environments. Stable releases are tagged with a semantic version (e.g. &lt;code>0.35.0&lt;/code>). Note that stable releases prior to &lt;code>0.35.0&lt;/code> are prefixed with a &lt;code>v&lt;/code> (e.g. &lt;code>v0.34.0&lt;/code>).&lt;/p>
&lt;h3 id="release-candidates">Release Candidates&lt;/h3>
&lt;p>We consider having release candidates for major and important minor versions. Our release candidates are tagged like &lt;code>x.y.z-rc.0&lt;/code>, &lt;code>x.y.z-rc.1&lt;/code>. The release candidate will then graduate to &lt;code>x.y.z&lt;/code> as a stable release.
By adopting this practice we allow our users who are early adopters to test out new releases before they are available to the wider community, thereby providing us with early feedback resulting in more stable releases.
Note that, like the stable releases, release candidates prior to &lt;code>0.35.0&lt;/code> are prefixed with a &lt;code>v&lt;/code>.&lt;/p>
&lt;h3 id="snapshot-releases">Snapshot Releases&lt;/h3>
&lt;p>We release a snapshot release for every commit that gets merged into &lt;a href="https://www.github.com/aws/karpenter-provider-aws">&lt;code>aws/karpenter-provider-aws&lt;/code>&lt;/a>. This enables users to immediately try a new feature or fix right after it&amp;rsquo;s merged rather than waiting days or weeks for release.&lt;/p>
&lt;p>Snapshot releases are not made available in the same public ECR repository as other release types, they are instead published to a separate private ECR repository.
Helm charts are published to &lt;code>oci://021119463062.dkr.ecr.us-east-1.amazonaws.com/karpenter/snapshot/karpenter&lt;/code> and are tagged with the git commit hash prefixed by the Karpenter major version (e.g. &lt;code>0-fc17bfc89ebb30a3b102a86012b3e3992ec08adf&lt;/code>).
Anyone with an AWS account can pull from this repository, but must first authenticate:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>aws ecr get-login-password --region us-east-1 &lt;span style="color:#000;font-weight:bold">|&lt;/span> docker login --username AWS --password-stdin 021119463062.dkr.ecr.us-east-1.amazonaws.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Snapshot releases are suitable for testing, and troubleshooting but they should not be used in production environments. Snapshot releases are ephemeral and will be removed 90 days after they were published.
&lt;/div></description></item><item><title>V1.0: v1 Migration</title><link>https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/v1-migration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/v1-migration/</guid><description>
&lt;p>This migration guide is designed to help you migrate to Karpenter &lt;code>v1.0.x&lt;/code> from &lt;code>v0.33.x&lt;/code> through &lt;code>v0.37.x&lt;/code>.
Use this document as a reference to the changes that were introduced in this release and as a guide to how you need to update the manifests and other Karpenter objects you created in previous Karpenter releases.&lt;/p>
&lt;p>Before continuing with this guide, you should know that Karpenter &lt;code>v1.0.x&lt;/code> only supports Karpenter &lt;code>v1&lt;/code> and &lt;code>v1beta1&lt;/code> APIs.
Earlier &lt;code>Provisioner&lt;/code>, &lt;code>AWSNodeTemplate&lt;/code>, and &lt;code>Machine&lt;/code> APIs are not supported.
Do not upgrade to &lt;code>v1.0.x&lt;/code> without first &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/upgrade-guide/#upgrading-to-0320">upgrading to &lt;code>v0.32.x&lt;/code>&lt;/a> and then upgrading to &lt;code>v0.33+&lt;/code>.&lt;/p>
&lt;p>Additionaly, validate that you are running at least Kubernetes &lt;code>1.25&lt;/code>.
Use the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/upgrading/compatibility/#compatibility-matrix">compatibility matrix&lt;/a> to confirm you are on a supported Kubernetes version.&lt;/p>
&lt;h2 id="before-you-start">Before You Start&lt;/h2>
&lt;p>Karpenter &lt;code>v1.0&lt;/code> is a major release and contains a number of breaking changes.
The following section will highlight some of the major breaking changes, but you should review the full &lt;a href="#changelog">changelog&lt;/a> before proceeding with the upgrade.&lt;/p>
&lt;h4 id="forceful-expiration">Forceful Expiration&lt;/h4>
&lt;p>Previously, Karpenter would only begin draining an expired node after ensuring graceful disruption was possible and replacement capacity was provisioned. Now, NodeClaim expiration is forceful. Once a NodeClaim expires, Karpenter will immediately begin draining the corresponding Node without first provisioning a replacement Node. This forceful approach means that all expired NodeClaims that were previously blocked from disruption (due to Pod Disruption Budgets (PDBs), do-not-disrupt pods, or other constraints) will be expired. The scheduler will then attempt to provision new Nodes for the disrupted workloads as they are draining. This behavior may lead to an increased number of pods in the &amp;ldquo;Pending&amp;rdquo; state while replacement capacity is being provisioned. Before upgrading, users should check for expired NodeClaims and resolve any disruption blockers to ensure a smooth upgrade process.&lt;/p>
&lt;h4 id="deprecated-annotations-labels-and-tags-removed">Deprecated Annotations, Labels, and Tags Removed&lt;/h4>
&lt;p>The following annotations, labels, and tags have been removed in &lt;code>v1.0.0&lt;/code>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Key&lt;/th>
&lt;th>Type&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>karpenter.sh/do-not-consolidate&lt;/code>&lt;/td>
&lt;td>annotation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>karpenter.sh/do-not-evict&lt;/code>&lt;/td>
&lt;td>annotation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>karpenter.sh/managed-by&lt;/code>&lt;/td>
&lt;td>tag&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Both the &lt;code>karpenter.sh/do-not-consolidate&lt;/code> and the &lt;code>karpenter.sh/do-not-evict&lt;/code> annotations were &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v0.32/upgrading/v1beta1-migration/#annotations-labels-and-status-conditions">deprecated in &lt;code>v0.32.0&lt;/code>&lt;/a>.
They have now been dropped in-favor of their replacement, &lt;code>karpenter.sh/do-not-disrupt&lt;/code>.&lt;/p>
&lt;p>The &lt;code>karpenter.sh/managed-by&lt;/code>, which currently stores the cluster name in its value, is replaced by &lt;code>eks:eks-cluster-name&lt;/code>, to allow
for &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html">EKS Pod Identity ABAC policies&lt;/a>.&lt;/p>
&lt;h4 id="zap-logging-config-removed">Zap Logging Config Removed&lt;/h4>
&lt;p>Support for setting the Zap logging config was &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v0.32/upgrading/v1beta1-migration/#logging-configuration-is-no-longer-dynamic">deprecated in &lt;code>v0.32.0&lt;/code>&lt;/a> and has been been removed in &lt;code>v1.0.0&lt;/code>.
The following environment variables are now available to configure logging:&lt;/p>
&lt;ul>
&lt;li>&lt;code>LOG_LEVEL&lt;/code>&lt;/li>
&lt;li>&lt;code>LOG_OUTPUT_PATHS&lt;/code>&lt;/li>
&lt;li>&lt;code>LOG_ERROR_OUTPUT_PATHS&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>Refer to &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/reference/settings/">Settings&lt;/a> for more details.&lt;/p>
&lt;h4 id="new-metadataoptions-defaults">New MetadataOptions Defaults&lt;/h4>
&lt;p>The default value for &lt;code>httpPutResponseHopLimit&lt;/code> has been reduced from &lt;code>2&lt;/code> to &lt;code>1&lt;/code>.
This prevents pods that are not using &lt;code>hostNetworking&lt;/code> from accessing IMDS by default.
If you have pods which rely on access to IMDS, and are not using &lt;code>hostNetworking&lt;/code>, you will need to either update the pod&amp;rsquo;s networking config or configure &lt;code>httpPutResponseHopLimit&lt;/code> on your &lt;code>EC2NodeClass&lt;/code>.
This change aligns Karpenter&amp;rsquo;s defaults with &lt;a href="https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node">EKS&amp;rsquo; Best Practices&lt;/a>.&lt;/p>
&lt;h4 id="ubuntu-amifamily-removed">Ubuntu AMIFamily Removed&lt;/h4>
&lt;p>Support for automatic AMI selection and UserData generation for Ubuntu has been dropped in Karpenter &lt;code>v1.0.0&lt;/code>.
To continue using Ubuntu AMIs you will need to specify an AMI using &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodeclasses/#specamiselectorterms">&lt;code>amiSelectorTerms&lt;/code>&lt;/a>.&lt;/p>
&lt;p>UserData generation can be achieved using &lt;code>amiFamily: AL2&lt;/code>, which has an identical UserData format.
However, compatibility is not guaranteed long-term and changes to either AL2 or Ubuntu&amp;rsquo;s UserData format may introduce incompatibilities.
If this occurs, &lt;code>amiFamily: Custom&lt;/code> should be used for Ubuntu AMIs and UserData will need to be entirely maintained by the user.&lt;/p>
&lt;p>If you are upgrading to &lt;code>v1.0.x&lt;/code> and already have &lt;code>v1beta1&lt;/code> Ubuntu &lt;code>EC2NodeClasses&lt;/code>, all you need to do is specify &lt;code>amiSelectorTerms&lt;/code> and Karpenter will translate your &lt;code>EC2NodeClasses&lt;/code> to the &lt;code>v1&lt;/code> equivalent (as shown below).
Failure to specify &lt;code>amiSelectorTerms&lt;/code> will result in the &lt;code>EC2NodeClass&lt;/code> and all referencing &lt;code>NodePools&lt;/code> to become &lt;code>NotReady&lt;/code>.
These &lt;code>NodePools&lt;/code> and &lt;code>EC2NodeClasses&lt;/code> would then be ignored for provisioning and drift.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Original v1beta1 EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1beta1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">amiFamily&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Ubuntu&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">amiSelectorTerms&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">id&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">ami-foo&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#000">---&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#8f5902;font-style:italic"># Conversion Webhook Output&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">annotations&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">compatibility.karpenter.k8s.aws/v1beta1-ubuntu&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">amiFamily,blockDeviceMappings&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">amiFamily&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">AL2&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">amiSelectorTerms&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">id&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">ami-foo&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">blockDeviceMappings&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">deviceName&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#39;/dev/sda1&amp;#39;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">rootVolume&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">ebs&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">encrypted&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">true&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">volumeType&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">gp3&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">volumeSize&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">20Gi&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="new-registration-taint">New Registration Taint&lt;/h4>
&lt;p>&lt;code>EC2NodeClasses&lt;/code> using &lt;code>amiFamily: Custom&lt;/code> must configure the kubelet to register with the &lt;code>karpenter.sh/unregistered:NoExecute&lt;/code> taint.
For example, to achieve this with an AL2023 AMI you would use the following UserData:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1beta1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">amiFamily&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Custom&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">amiSelectorTerms&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">id&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">ami-custom-al2023-ami&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">userData&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000;font-weight:bold">|&lt;/span>&lt;span style="color:#8f5902;font-style:italic">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> apiVersion: node.eks.aws/v1alpha1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> kind: NodeConfig
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> # ...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> kubelet:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> config:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> # ...
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> registerWithTaints:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> - key: karpenter.sh/unregistered
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"> effect: NoExecute&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you are using one of Karpenter&amp;rsquo;s managed AMI families, this will be handled for you by Karpenter&amp;rsquo;s &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodeclasses/#specuserdata">generated UserData&lt;/a>.&lt;/p>
&lt;h2 id="upgrading">Upgrading&lt;/h2>
&lt;p>Before proceeding with the upgrade, be sure to review the &lt;a href="#changelog">changelog&lt;/a> and review the &lt;a href="#upgrade-procedure">upgrade procedure&lt;/a> in its entirety.
The procedure can be split into two sections:&lt;/p>
&lt;ul>
&lt;li>Steps 1 through 6 will upgrade you to the latest patch release on your current minor version.&lt;/li>
&lt;li>Steps 7 through 11 will then upgrade you to the latest &lt;code>v1.0&lt;/code> release.&lt;/li>
&lt;/ul>
&lt;p>While it is possible to upgrade directly from any patch version on versions &lt;code>v0.33&lt;/code> through &lt;code>v0.37&lt;/code>, rollback from &lt;code>v1.0.x&lt;/code> is only supported on the latest patch releases.
Upgrading directly may leave you unable to rollback.
For more information on the rollback procedure, refer to the &lt;a href="#downgrading">downgrading section&lt;/a>.&lt;/p>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
The examples provided in the &lt;a href="#upgrade-procedure">upgrade procedure&lt;/a> assume you&amp;rsquo;ve installed Karpenter following the &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/getting-started/getting-started-with-karpenter/">getting started guide&lt;/a>.
If you are using IaC / GitOps, you may need to adapt the procedure to fit your specific infrastructure solution.
You should still review the upgrade procedure; the sequence of operations remains the same regardless of the solution used to roll out the changes.
&lt;/div>
&lt;h4 id="upgrade-procedure">Upgrade Procedure&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>Configure environment variables for the cluster you&amp;rsquo;re upgrading:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">AWS_PARTITION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;aws&amp;#34;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># if you are not using standard partitions, you may need to configure to aws-cn / aws-us-gov&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">USER&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter-demo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">AWS_REGION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;us-west-2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>aws sts get-caller-identity --query Account --output text&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>kube-system
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">KARPENTER_IAM_ROLE_ARN&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;arn:&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">AWS_PARTITION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">:iam::&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">:role/&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Determine your current Karpenter version:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get deployment -A -l app.kubernetes.io/name&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>karpenter -ojsonpath&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;{.items[0].metadata.labels[&amp;#39;app\.kubernetes\.io/version&amp;#39;]}{&amp;#39;\n&amp;#39;}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To upgrade to v1, you must be running a Karpenter version between &lt;code>v0.33&lt;/code> and &lt;code>v0.37&lt;/code>.
If you are on an older version, you must upgrade before continuing with this guide.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Before upgrading to v1, we&amp;rsquo;re going to upgrade to a patch release that supports rollback.
Set the &lt;code>KARPENTER_VERSION&lt;/code> environment variable to the latest patch release for your current minor version.
The following releases are the current latest:&lt;/p>
&lt;ul>
&lt;li>&lt;code>0.37.7&lt;/code>&lt;/li>
&lt;li>&lt;code>0.36.9&lt;/code>&lt;/li>
&lt;li>&lt;code>0.35.12&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.34.13&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.33.12&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Note: v0.33.x and v0.34.x include the v prefix, omit it for versions v0.35+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;0.37.7&amp;#34;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># Replace with your minor version&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Upgrade Karpenter to the latest patch release for your current minor version.
Note that webhooks must be enabled.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Service account annotation can be dropped when using pod identity&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter --version &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> --namespace &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --create-namespace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set serviceAccount.annotations.&lt;span style="color:#4e9a06">&amp;#34;eks\.amazonaws\.com/role-arn&amp;#34;&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_IAM_ROLE_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set settings.clusterName&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set settings.interruptionQueue&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.requests.cpu&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.requests.memory&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>1Gi &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.limits.cpu&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.limits.memory&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>1Gi &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.enabled&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87">true&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.port&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">8443&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --wait
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Apply the latest patch version of your current minor version&amp;rsquo;s Custom Resource Definitions (CRDs).
Applying this version of the CRDs will enable the use of both the &lt;code>v1&lt;/code> and &lt;code>v1beta1&lt;/code> APIs on this version via the conversion webhooks.
Note that this is only for rollback purposes, and new features available with the &lt;code>v1&lt;/code> APIs will not work on your minor version.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>helm upgrade --install karpenter-crd oci://public.ecr.aws/karpenter/karpenter-crd --version &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --namespace &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --create-namespace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.enabled&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87">true&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.serviceName&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;karpenter&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.port&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">8443&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;p>To properly template the &lt;code>conversion&lt;/code> field in the CRD, the &lt;code>karpenter-crd&lt;/code> chart must be used.
If you&amp;rsquo;re using a GitOps solution to manage your Karpenter installation, you should use this chart to manage your CRDs.
You should set &lt;code>skipCrds&lt;/code> to true for the main &lt;code>karpenter&lt;/code> chart (e.g. &lt;a href="https://argo-cd.readthedocs.io/en/latest/user-guide/helm/#helm-skip-crds">Argo CD&lt;/a>).&lt;/p>
&lt;p>Alternatively, you can install the CRDs with the main chart and apply the following patches. However, we strongly recommend using the dedicated CRD chart.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">SERVICE_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;karpenter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">SERVICE_NAMESPACE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;kube-system&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">SERVICE_PORT&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;8443&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">CRDS&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=(&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;nodepools.karpenter.sh&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;nodeclaims.karpenter.sh&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;ec2nodeclasses.karpenter.k8s.aws&amp;#34;&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">for&lt;/span> crd in &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CRDS&lt;/span>&lt;span style="color:#000;font-weight:bold">[@]&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span> &lt;span style="color:#204a87;font-weight:bold">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> kubectl patch customresourcedefinitions &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">crd&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> --patch-file&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>/dev/stdin &lt;span style="color:#4e9a06">&amp;lt;&amp;lt;-EOF
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> conversion:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> webhook:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> clientConfig:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> service:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> name: &amp;#34;${SERVICE_NAME}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> namespace: &amp;#34;${SERVICE_NAMESPACE}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> port: ${SERVICE_PORT}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Helm uses annotations on resources it provisions to track ownership.
Switching to the new chart may result in Helm failing to install the chart due to &lt;code>invalid ownership metadata&lt;/code>.
If you encounter errors at this step, consult this &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/troubleshooting/#helm-error-when-installing-the-karpenter-crd-chart">troubleshooting entry&lt;/a> to resolve.
&lt;/div>
&lt;/li>
&lt;li>
&lt;p>Validate that Karpenter is operating as expected on this patch release.
If you need to rollback after upgrading to &lt;code>v1&lt;/code>, this is the version you will need to rollback to.&lt;/p>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
The conversion webhooks must be able to communicate with the API server to operate correctly.
If you see errors related to the conversion webhooks, ensure that your security groups and network policies allow traffic between the webhooks and the API server.
&lt;/div>
&lt;/li>
&lt;li>
&lt;p>We&amp;rsquo;re now ready to begin the upgrade to &lt;code>v1&lt;/code>. Set the &lt;code>KARPENTER_VERSION&lt;/code> environment variable to the latest &lt;code>v1.0.x&lt;/code> release.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;1.0.10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Attach the v1 policy to your existing NodeRole.
Notable Changes to the IAM Policy include additional tag-scoping for the &lt;code>eks:eks-cluster-name&lt;/code> tag for instances and instance profiles.
We will remove this additional policy later once the controller has been migrated to v1 and we&amp;rsquo;ve updated the Karpenter cloudformation stack.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_DOCUMENT&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>mktemp&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/13d6fc014ea59019b1c3b1953184efc41809df11/website/content/en/v1.0/upgrading/get-controller-policy.sh &lt;span style="color:#000;font-weight:bold">|&lt;/span> sh &lt;span style="color:#000;font-weight:bold">|&lt;/span> envsubst &amp;gt; &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_DOCUMENT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;KarpenterControllerPolicy-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-v1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>aws iam create-policy --policy-name &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --policy-document &lt;span style="color:#4e9a06">&amp;#34;file://&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_DOCUMENT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r .Policy.Arn&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws iam attach-role-policy --role-name &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --policy-arn &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Apply the &lt;code>v1&lt;/code> Custom Resource Definitions (CRDs):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>helm upgrade --install karpenter-crd oci://public.ecr.aws/karpenter/karpenter-crd --version &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --namespace &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --create-namespace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.enabled&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87">true&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.serviceName&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;karpenter&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.port&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">8443&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Upgrade Karpenter to the latest &lt;code>v1.0.x&lt;/code> release.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Service account annotion can be dropped when using pod identity&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter --version &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> --namespace &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --create-namespace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set serviceAccount.annotations.&lt;span style="color:#4e9a06">&amp;#34;eks\.amazonaws\.com/role-arn&amp;#34;&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_IAM_ROLE_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set settings.clusterName&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set settings.interruptionQueue&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.requests.cpu&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.requests.memory&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>1Gi &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.limits.cpu&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.limits.memory&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>1Gi &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --wait
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;!-- Note: don't indent this line to match the indenting of the alert box. Hugo will create a code block. -->
&lt;p>Karpenter has deprecated and moved a number of Helm values as part of the v1 release. Ensure that you upgrade to the newer version of these helm values during your migration to v1. You can find detail for all the settings that were moved in the &lt;a href="#helm-values">v1 Upgrade Reference&lt;/a>.
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;!-- Note: don't indent this line to match the indenting of the alert box. Hugo will create a code block. -->
&lt;p>Karpenter versions 0.32.x through 0.37.x have a number of mutating webhooks and validating webhooks that are not present
in 1.0.x; if you are only using &lt;code>helm&lt;/code> to generate manifests and are not using it to deploy them, you must clean up
these webhook configurations by hand: specifically, you will need to remove the following resources:&lt;/p>
&lt;ul>
&lt;li>&lt;code>defaulting.webhook.karpenter.k8s.aws&lt;/code>&lt;/li>
&lt;li>&lt;code>validation.webhook.karpenter.sh&lt;/code>&lt;/li>
&lt;li>&lt;code>validation.webhook.config.karpenter.sh&lt;/code>&lt;/li>
&lt;li>&lt;code>validation.webhook.karpenter.k8s.aws&lt;/code>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/li>
&lt;li>
&lt;p>Upgrade your cloudformation stack and remove the temporary &lt;code>v1&lt;/code> controller policy.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">TEMPOUT&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>mktemp&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/v&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>/website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml &amp;gt; &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TEMPOUT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws cloudformation deploy &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --stack-name &lt;span style="color:#4e9a06">&amp;#34;Karpenter-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --template-file &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TEMPOUT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --capabilities CAPABILITY_NAMED_IAM &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --parameter-overrides &lt;span style="color:#4e9a06">&amp;#34;ClusterName=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;KarpenterControllerPolicy-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-v1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>aws iam list-policies --query &lt;span style="color:#4e9a06">&amp;#34;Policies[?PolicyName==&amp;#39;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;].Arn&amp;#34;&lt;/span> --output text&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws iam detach-role-policy --role-name &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --policy-arn &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws iam delete-policy --policy-arn &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="downgrading">Downgrading&lt;/h2>
&lt;p>Once you upgrade to Karpenter &lt;code>v1.0.x&lt;/code>, both &lt;code>v1&lt;/code> and &lt;code>v1beta1&lt;/code> resources may be stored in ETCD.
Due to this, you may only rollback to a version of Karpenter with the conversion webhooks.
The following releases should be used as rollback targets:&lt;/p>
&lt;ul>
&lt;li>&lt;code>v0.37.7&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.36.9&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.35.12&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.34.13&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.33.12&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;p>When rolling back from &lt;code>v1&lt;/code>, Karpenter will not retain data that was only valid in the &lt;code>v1&lt;/code> APIs.
For instance, if you upgraded from &lt;code>v0.33.5&lt;/code> to &lt;code>v1.0.x&lt;/code>, updated the &lt;code>NodePool.Spec.Disruption.Budgets&lt;/code> field, and then rolled back to &lt;code>v0.33.12&lt;/code>, Karpenter would not retain the &lt;code>NodePool.Spec.Disruption.Budgets&lt;/code> field, as that was introduced in &lt;code>v0.34.0&lt;/code>.&lt;/p>
&lt;p>If you have configured the &lt;code>kubelet&lt;/code> field on your &lt;code>EC2NodeClass&lt;/code> and have removed the &lt;code>compatibility.karpenter.sh/v1beta1-kubelet-conversion&lt;/code> annotation from your &lt;code>NodePools&lt;/code>, you must re-add the annotation before downgrading.
For more information, refer to &lt;a href="#kubelet-configuration-migration">kubelet configuration migration&lt;/a>.&lt;/p>
&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Since both &lt;code>v1beta1&lt;/code> and &lt;code>v1&lt;/code> will be served, &lt;code>kubectl&lt;/code> will default to returning the &lt;code>v1&lt;/code> version of your CRs.
To interact with the v1beta1 version of your CRs, you&amp;rsquo;ll need to add the full resource path (including api version) into &lt;code>kubectl&lt;/code> calls.
For example: &lt;code>kubectl get nodepool.v1beta1.karpenter.sh&lt;/code>.
&lt;/div>
&lt;h4 id="downgrade-procedure">Downgrade Procedure&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>Configure environment variables for the cluster you&amp;rsquo;re downgrading:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">AWS_PARTITION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;aws&amp;#34;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># if you are not using standard partitions, you may need to configure to aws-cn / aws-us-gov&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">USER&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter-demo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">AWS_REGION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;us-west-2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>aws sts get-caller-identity --query Account --output text&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>kube-system
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">KARPENTER_IAM_ROLE_ARN&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;arn:&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">AWS_PARTITION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">:iam::&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">AWS_ACCOUNT_ID&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">:role/&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Configure your target Karpenter version. You should select one of the following versions:&lt;/p>
&lt;ul>
&lt;li>&lt;code>0.37.7&lt;/code>&lt;/li>
&lt;li>&lt;code>0.36.9&lt;/code>&lt;/li>
&lt;li>&lt;code>0.35.12&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.34.13&lt;/code>&lt;/li>
&lt;li>&lt;code>v0.33.12&lt;/code>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Note: v0.33.x and v0.34.x include the v prefix, omit it for versions v0.35+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">export&lt;/span> &lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;0.37.7&amp;#34;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># Replace with your minor version&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Attach the &lt;code>v1beta1&lt;/code> policy from your target version to your existing NodeRole.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_DOCUMENT&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>mktemp&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/website/docs/v1.0/upgrading/get-controller-policy.sh &lt;span style="color:#000;font-weight:bold">|&lt;/span> sh &lt;span style="color:#000;font-weight:bold">|&lt;/span> envsubst &amp;gt; &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_DOCUMENT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;KarpenterControllerPolicy-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>aws iam create-policy --policy-name &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --policy-document &lt;span style="color:#4e9a06">&amp;#34;file://&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_DOCUMENT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#000;font-weight:bold">|&lt;/span> jq -r .Policy.Arn&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws iam attach-role-policy --role-name &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --policy-arn &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Rollback the Karpenter Controller:
Note that webhooks must be &lt;strong>enabled&lt;/strong> to rollback.
Without enabling the webhooks, Karpenter will be unable to correctly operate on &lt;code>v1&lt;/code> versions of the resources already stored in ETCD.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># Service account annotation can be dropped when using pod identity&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm upgrade --install karpenter oci://public.ecr.aws/karpenter/karpenter --version &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> --namespace &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --create-namespace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set serviceAccount.annotations.&lt;span style="color:#4e9a06">&amp;#34;eks\.amazonaws\.com/role-arn&amp;#34;&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_IAM_ROLE_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set settings.clusterName&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set settings.interruptionQueue&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.requests.cpu&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.requests.memory&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>1Gi &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.limits.cpu&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set controller.resources.limits.memory&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>1Gi &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.enabled&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87">true&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.port&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">8443&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --wait
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Rollback the CRDs.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>helm upgrade --install karpenter-crd oci://public.ecr.aws/karpenter/karpenter-crd --version &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --namespace &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_NAMESPACE&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --create-namespace &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.enabled&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87">true&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.serviceName&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>karpenter &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --set webhook.port&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#0000cf;font-weight:bold">8443&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>Rollback your cloudformation stack and remove the temporary &lt;code>v1beta1&lt;/code> controller policy.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">TEMPOUT&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>mktemp&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">VERSION_TAG&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">[[&lt;/span> &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">==&lt;/span> v* &lt;span style="color:#ce5c00;font-weight:bold">]]&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#204a87">echo&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">||&lt;/span> &lt;span style="color:#204a87">echo&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;v&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -fsSL https://raw.githubusercontent.com/aws/karpenter-provider-aws/&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">VERSION_TAG&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>/website/content/en/preview/getting-started/getting-started-with-karpenter/cloudformation.yaml &amp;gt; &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TEMPOUT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws cloudformation deploy &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --stack-name &lt;span style="color:#4e9a06">&amp;#34;Karpenter-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --template-file &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">TEMPOUT&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --capabilities CAPABILITY_NAMED_IAM &lt;span style="color:#4e9a06">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">&lt;/span> --parameter-overrides &lt;span style="color:#4e9a06">&amp;#34;ClusterName=&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-karpenter&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;KarpenterControllerPolicy-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">CLUSTER_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">-&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">KARPENTER_VERSION&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#204a87;font-weight:bold">$(&lt;/span>aws iam list-policies --query &lt;span style="color:#4e9a06">&amp;#34;Policies[?PolicyName==&amp;#39;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;].Arn&amp;#34;&lt;/span> --output text&lt;span style="color:#204a87;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws iam detach-role-policy --role-name &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">ROLE_NAME&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span> --policy-arn &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>aws iam delete-policy --policy-arn &lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">POLICY_ARN&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="before-upgrading-to-v110">Before Upgrading to &lt;code>v1.1.0&lt;/code>&lt;/h2>
&lt;p>You&amp;rsquo;ve successfully upgraded to &lt;code>v1.0&lt;/code>, but more than likely your manifests are still &lt;code>v1beta1&lt;/code>.
You can continue to apply these &lt;code>v1beta1&lt;/code> manifests on &lt;code>v1.0&lt;/code>, but support will be dropped in &lt;code>v1.1&lt;/code>.
Before upgrading to &lt;code>v1.1+&lt;/code>, you will need to migrate your manifests over to &lt;code>v1&lt;/code>.&lt;/p>
&lt;h4 id="manifest-migration">Manifest Migration&lt;/h4>
&lt;p>You can manually migrate your manifests by referring to the &lt;a href="#changelog">changelog&lt;/a> and the updated API docs (&lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodepools/">NodePool&lt;/a>, &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodeclasses/">EC2NodeClass&lt;/a>).
Alternatively, you can take advantage of the conversion webhooks.
Performing a &lt;code>get&lt;/code> using &lt;code>kubectl&lt;/code> will return the &lt;code>v1&lt;/code> version of the resource, even if it was applied with a &lt;code>v1beta1&lt;/code> manifest.&lt;/p>
&lt;p>For example, applying the following &lt;code>v1beta1&lt;/code> manifest and performing a &lt;code>get&lt;/code> will return the &lt;code>v1&lt;/code> equivalent:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &lt;span style="color:#4e9a06">&amp;lt;&amp;lt;EOF | kubectl apply -f -
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">apiVersion: karpenter.sh/v1beta1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">kind: NodePool
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">metadata:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> name: default
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> template:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> requirements:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> - key: kubernetes.io/arch
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> operator: In
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> values: [&amp;#34;amd64&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> - key: kubernetes.io/os
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> operator: In
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> values: [&amp;#34;linux&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> - key: karpenter.sh/capacity-type
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> operator: In
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> values: [&amp;#34;on-demand&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> - key: karpenter.k8s.aws/instance-category
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> operator: In
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> values: [&amp;#34;c&amp;#34;, &amp;#34;m&amp;#34;, &amp;#34;r&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> - key: karpenter.k8s.aws/instance-generation
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> operator: Gt
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> values: [&amp;#34;2&amp;#34;]
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> nodeClassRef:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> apiVersion: karpenter.k8s.aws/v1beta1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> kind: EC2NodeClass
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> name: default
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> limits:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> cpu: 1000
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> disruption:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> consolidationPolicy: WhenUnderutilized
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> expireAfter: 720h # 30 * 24h = 720h
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl get nodepools default -o yaml &amp;gt; v1-nodepool.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Due to the many-to-one relation between &lt;code>NodePools&lt;/code> and &lt;code>EC2NodeClasses&lt;/code>, the &lt;code>kubelet&lt;/code> field is &lt;strong>not&lt;/strong> automtatically migrated by the conversion webhooks.
When updating your manifests, make sure you are migrating the &lt;code>kubelet&lt;/code> field from your &lt;code>NodePools&lt;/code> to your &lt;code>EC2NodeClasses&lt;/code>.
For more information, refer to &lt;a href="#kubelet-configuration-migration">kubelet configuration migration&lt;/a>.
&lt;/div>
&lt;h4 id="kubelet-configuration-migration">Kubelet Configuration Migration&lt;/h4>
&lt;p>One of the changes made to the &lt;code>NodePool&lt;/code> and &lt;code>EC2NodeClass&lt;/code> schemas for &lt;code>v1&lt;/code> was the migration of the &lt;code>kubelet&lt;/code> field from the &lt;code>NodePool&lt;/code> to the &lt;code>EC2NodeClass&lt;/code>.
This change is difficult to properly handle with conversion webhooks due to the many-to-one relation between &lt;code>NodePools&lt;/code> and &lt;code>EC2NodeClasses&lt;/code>.
To facilitate this, Karpenter adds the &lt;code>compatibility.karpenter.sh/v1beta1-kubelet-conversion&lt;/code> annotation to converted &lt;code>NodePools&lt;/code>.
If this annotation is present, it will take precedence over the &lt;code>kubelet&lt;/code> field in the &lt;code>EC2NodeClass&lt;/code>.&lt;/p>
&lt;p>This annotation is only meant to support migration, and support will be dropped in &lt;code>v1.1&lt;/code>.
Before upgrading to &lt;code>v1.1+&lt;/code>, you must migrate your kubelet configuration to your &lt;code>EC2NodeClasses&lt;/code>, and remove the compatibility annotation from your &lt;code>NodePools&lt;/code>.&lt;/p>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Warning&lt;/h4>
&lt;p>Do not remove the compatibility annotation until you have updated your &lt;code>EC2NodeClass&lt;/code> with the matching &lt;code>kubelet&lt;/code> field.
Once the annotations is removed, the &lt;code>EC2NodeClass&lt;/code> will be used as the source of truth for your kubelet configuration.
If the field doesn&amp;rsquo;t match, this will result in Nodes drifting.&lt;/p>
&lt;p>If you need to rollback to a pre-&lt;code>v1.0&lt;/code> version after removing the compatibility annotation, you must re-add it before rolling back.&lt;/p>
&lt;/div>
&lt;p>If you have multiple &lt;code>NodePools&lt;/code> that refer to the same &lt;code>EC2NodeClass&lt;/code>, but have varying kubelet configurations, you will need to create a separate &lt;code>EC2NodeClass&lt;/code> for unique set of kubelet configurations.&lt;/p>
&lt;p>For example, consider the following &lt;code>v1beta1&lt;/code> manifests:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.sh/v1beta1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">NodePool&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodepool-a&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">template&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kubelet&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">maxPods&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#0000cf;font-weight:bold">10&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">nodeClassRef&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1beta1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#000">---&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.sh/v1beta1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">NodePool&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodepool-b&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">template&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kubelet&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">maxPods&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#0000cf;font-weight:bold">20&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">nodeClassRef&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1beta1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#000">---&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1beta1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>In this example, we have two &lt;code>NodePools&lt;/code> with different &lt;code>kubelet&lt;/code> values, but they refer to the same &lt;code>EC2NodeClass&lt;/code>.
The conversion webhook will annotate the &lt;code>NodePools&lt;/code> with the &lt;code>compatibility.karpenter.sh/v1beta1-kubelet-conversion&lt;/code> annotation.
This is the result of that conversion:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.sh/v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">NodePool&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodepool-a&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">annotations&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">compatibility.karpenter.sh/v1beta1-kubelet-conversion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">&amp;#34;{\&amp;#34;maxPods\&amp;#34;: &lt;/span>&lt;span style="color:#0000cf;font-weight:bold">10&lt;/span>}&lt;span style="color:#4e9a06">&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> template:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> nodeClassRef:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> group: karpenter.k8s.aws
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> kind: EC2NodeClass
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> name: nodeclass
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">---
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">apiVersion: karpenter.sh/v1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">kind: NodePool
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06">metadata:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> name: nodepool-b
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> annotations:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#4e9a06"> compatibility.karpenter.sh/v1beta1-kubelet-conversion: &amp;#34;&lt;/span>{&lt;span style="color:#000">\&amp;#34;maxPods\&amp;#34;: 20}&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">template&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">nodeClassRef&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">group&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#000">---&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Before upgrading to &lt;code>v1.1&lt;/code>, you must update your &lt;code>NodePools&lt;/code> to refer to separate &lt;code>EC2NodeClasses&lt;/code> to retain this behavior.
Note that this will drift the Nodes associated with these NodePools due to the updated &lt;code>nodeClassRef&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.sh/v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">NodePool&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodepool-a&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">template&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">nodeClassRef&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">group&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass-a&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#000">---&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.sh/v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">NodePool&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodepool-b&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">template&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">nodeClassRef&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">group&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass-b&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#000">---&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass-a&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kubelet&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">maxPods&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#0000cf;font-weight:bold">10&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#000">---&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">karpenter.k8s.aws/v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">EC2NodeClass&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">nodeclass-b&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">kubelet&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">maxPods&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#0000cf;font-weight:bold">20&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="nodeclassref-requirements">NodeClassRef Requirements&lt;/h4>
&lt;p>Starting with Karpenter &lt;code>v1.1.0&lt;/code>, &lt;code>nodeClassRef.group&lt;/code> and &lt;code>nodeClassRef.kind&lt;/code> are strictly required on both NodePools and NodeClaims.
Ensure these values are set for all resources &lt;strong>before&lt;/strong> upgrading Karpenter.
Failing to do so will result in Karpenter being unable to operate against those resources.
For the AWS provider, the group will always be &lt;code>karpenter.k8s.aws&lt;/code> and the kind will always be &lt;code>EC2NodeClass&lt;/code>.&lt;/p>
&lt;h4 id="stored-version-migration">Stored Version Migration&lt;/h4>
&lt;p>Once you have upgraded all of your manifests, you need to ensure that all existing resources are stored as &lt;code>v1&lt;/code> in ETCD.
Karpenter &lt;code>v1.0.6&lt;/code>+ includes a controller to automatically migrate all stored resources to &lt;code>v1&lt;/code>.
To validate that the migration was successful, you should check the stored versions for Karpenter&amp;rsquo;s CRDs:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">for&lt;/span> crd in &lt;span style="color:#4e9a06">&amp;#34;nodepools.karpenter.sh&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;nodeclaims.karpenter.sh&amp;#34;&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;ec2nodeclasses.karpenter.k8s.aws&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">;&lt;/span> &lt;span style="color:#204a87;font-weight:bold">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> kubectl get crd &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">crd&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> -ojsonpath&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;{.status.storedVersions}{&amp;#39;\n&amp;#39;}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For more details on this migration process, refer to the &lt;a href="https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning/#upgrade-existing-objects-to-a-new-stored-version">kubernetes docs&lt;/a>.&lt;/p>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
&lt;p>If the &lt;code>v1beta1&lt;/code> stored version persists, ensure that you are on Karpenter &lt;code>v1.0.6+&lt;/code>.
Additionally, ensure that the storage version on the CRD in question is set to &lt;code>v1&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl get crd &lt;span style="color:#4e9a06">${&lt;/span>&lt;span style="color:#000">crd&lt;/span>&lt;span style="color:#4e9a06">}&lt;/span> -ojsonpath&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;{.spec.versions[?(.storage==true)].name}{&amp;#39;\n&amp;#39;}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>If it is not, this indicates an issue upgrading the CRD when upgrading Karpenter to &lt;code>v1.0.x&lt;/code>.
Revisit step 9 of the &lt;a href="#upgrading">upgrade procedure&lt;/a> and ensure the CRD was updated correctly.&lt;/p>
&lt;/div>
&lt;h2 id="changelog">Changelog&lt;/h2>
&lt;ul>
&lt;li>Features:
&lt;ul>
&lt;li>AMI Selector Terms has a new Alias field which can only be set by itself in &lt;code>EC2NodeClass.Spec.AMISelectorTerms&lt;/code>&lt;/li>
&lt;li>Disruption Budgets by Reason was added to &lt;code>NodePool.Spec.Disruption.Budgets&lt;/code>&lt;/li>
&lt;li>TerminationGracePeriod was added to &lt;code>NodePool.Spec.Template.Spec&lt;/code>.&lt;/li>
&lt;li>&lt;code>LOG_OUTPUT_PATHS&lt;/code> and &lt;code>LOG_ERROR_OUTPUT_PATHS&lt;/code> environment variables added&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>API Rename: NodePool’s ConsolidationPolicy &lt;code>WhenUnderutilized&lt;/code> is now renamed to &lt;code>WhenEmptyOrUnderutilized&lt;/code>&lt;/li>
&lt;li>Behavior Changes:
&lt;ul>
&lt;li>Expiration is now forceful and begins draining as soon as it’s expired. Karpenter does not wait for replacement capacity to be available before draining, but will start provisioning a replacement as soon as the node is expired and begins draining.&lt;/li>
&lt;li>Karpenter&amp;rsquo;s generated NodeConfig now takes precedence when generating UserData with the AL2023 &lt;code>amiFamily&lt;/code>. If you&amp;rsquo;re setting any values managed by Karpenter in your AL2023 UserData, configure these through Karpenter natively (e.g. kubelet configuration fields).&lt;/li>
&lt;li>Karpenter now adds a &lt;code>karpenter.sh/unregistered:NoExecute&lt;/code> taint to nodes in injected UserData when using alias in AMISelectorTerms or non-Custom AMIFamily. When using &lt;code>amiFamily: Custom&lt;/code>, users will need to add this taint into their UserData, where Karpenter will automatically remove it when provisioning nodes.&lt;/li>
&lt;li>Discovered standard AL2023 AMIs will no longer be considered compatible with GPU / accelerator workloads. If you&amp;rsquo;re using an AL2023 EC2NodeClass (without AMISelectorTerms) for these workloads, you will need to select your AMI via AMISelectorTerms (non-alias).&lt;/li>
&lt;li>Karpenter now waits for underlying instances to be completely terminated before removing the associated nodes. This means it may take longer for nodes to be deleted and for nodeclaims to get cleaned up.&lt;/li>
&lt;li>NodePools now have &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodepools/#statusconditions">status conditions&lt;/a> that indicate if they are ready. If not, then they will not be considered during scheduling.&lt;/li>
&lt;li>NodeClasses now have &lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodeclasses/#statusconditions">status conditions&lt;/a> that indicate if they are ready. If they are not ready, NodePools that reference them through their &lt;code>nodeClassRef&lt;/code> will not be considered during scheduling.&lt;/li>
&lt;li>Karpenter will no longer set &lt;code>associatePublicIPAddress&lt;/code> to false in private subnets by default. Users with IAM policies / SCPs that require this field to be set explicitly should configure this through their &lt;code>EC2NodeClass&lt;/code> (&lt;a href="https://pr-35.d2bgfookghzifw.amplifyapp.com/v1.0/concepts/nodeclasses/#specassociatepublicipaddress">ref&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>API Moves:
&lt;ul>
&lt;li>ExpireAfter has moved from the &lt;code>NodePool.Spec.Disruption&lt;/code> block to &lt;code>NodePool.Spec.Template.Spec&lt;/code>, and is now a drift-able field.&lt;/li>
&lt;li>&lt;code>Kubelet&lt;/code> was moved to the EC2NodeClass from the NodePool.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>RBAC changes: added &lt;code>delete pods&lt;/code> | added &lt;code>get, patch crds&lt;/code> | added &lt;code>update nodes&lt;/code> | removed &lt;code>create nodes&lt;/code>&lt;/li>
&lt;li>Breaking API (Manual Migration Needed):
&lt;ul>
&lt;li>Ubuntu is dropped as a first class supported AMI Family&lt;/li>
&lt;li>&lt;code>karpenter.sh/do-not-consolidate&lt;/code> (annotation), &lt;code>karpenter.sh/do-not-evict&lt;/code> (annotation), and &lt;code>karpenter.sh/managed-by&lt;/code> (tag) are all removed. &lt;code>karpenter.sh/managed-by&lt;/code>, which currently stores the cluster name in its value, will be replaced by eks:eks-cluster-name. &lt;code>karpenter.sh/do-not-consolidate&lt;/code> and &lt;code>karpenter.sh/do-not-evict&lt;/code> are both replaced by &lt;code>karpenter.sh/do-not-disrupt&lt;/code>.&lt;/li>
&lt;li>The taint used to mark nodes for disruption and termination changed from &lt;code>karpenter.sh/disruption=disrupting:NoSchedule&lt;/code> to &lt;code>karpenter.sh/disrupted:NoSchedule&lt;/code>. It is not recommended to tolerate this taint, however, if you were tolerating it in your applications, you&amp;rsquo;ll need to adjust your taints to reflect this.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Environment Variable Changes:
&lt;ul>
&lt;li>Environment Variable Changes&lt;/li>
&lt;li>&lt;code>LOGGING_CONFIG, &lt;/code>ASSUME_ROLE_ARN&lt;code>, &lt;/code>ASSUME_ROLE_DURATION` Dropped&lt;/li>
&lt;li>&lt;code>LEADER_ELECT&lt;/code> renamed to &lt;code>DISABLE_LEADER_ELECTION&lt;/code>&lt;/li>
&lt;li>&lt;code>FEATURE_GATES.DRIFT=true&lt;/code> was dropped and promoted to Stable, and cannot be disabled.
&lt;ul>
&lt;li>Users currently opting out of drift, disabling the drift feature flag will no longer be able to do so.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Defaults changed:
&lt;ul>
&lt;li>API: Karpenter will drop support for IMDS access from containers by default on new EC2NodeClasses by updating the default of &lt;code>httpPutResponseHopLimit&lt;/code> from 2 to 1.&lt;/li>
&lt;li>API: ConsolidateAfter is required. Users couldn’t set this before with ConsolidationPolicy: WhenUnderutilized, where this is now required. Users can set it to 0 to have the same behavior as in v1beta1.&lt;/li>
&lt;li>API: All &lt;code>NodeClassRef&lt;/code> fields are now all required, and apiVersion has been renamed to group&lt;/li>
&lt;li>API: AMISelectorTerms are required. Setting an Alias cannot be done with any other type of term, and must match the AMI Family that&amp;rsquo;s set or be Custom.&lt;/li>
&lt;li>Helm: Deployment spec TopologySpreadConstraint to have required zonal spread over preferred. Users who had one node running their Karpenter deployments need to either:
&lt;ul>
&lt;li>Have two nodes in different zones to ensure both Karpenter replicas schedule&lt;/li>
&lt;li>Scale down their Karpenter replicas from 2 to 1 in the helm chart&lt;/li>
&lt;li>Edit and relax the topology spread constraint in their helm chart from DoNotSchedule to ScheduleAnyway&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Helm/Binary: &lt;code>controller.METRICS_PORT&lt;/code> default changed back to 8080&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="updated-metrics">Updated metrics&lt;/h3>
&lt;p>The following changes have been made to Karpenter&amp;rsquo;s metrics in &lt;code>v1.0.0&lt;/code>.&lt;/p>
&lt;h4 id="renamed-metrics">Renamed Metrics&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Original Name&lt;/th>
&lt;th>New Name&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Node&lt;/td>
&lt;td>karpenter_nodes_termination_time_seconds&lt;/td>
&lt;td>karpenter_nodes_termination_duration_seconds&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node&lt;/td>
&lt;td>karpenter_nodes_terminated&lt;/td>
&lt;td>karpenter_nodes_terminated_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node&lt;/td>
&lt;td>karpenter_nodes_leases_deleted&lt;/td>
&lt;td>karpenter_nodes_leases_deleted_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Node&lt;/td>
&lt;td>karpenter_nodes_created&lt;/td>
&lt;td>karpenter_nodes_created_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Pod&lt;/td>
&lt;td>karpenter_pods_startup_time_seconds&lt;/td>
&lt;td>karpenter_pods_startup_duration_seconds&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_replacement_nodeclaim_failures_total&lt;/td>
&lt;td>karpenter_voluntary_disruption_queue_failures_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_evaluation_duration_seconds&lt;/td>
&lt;td>karpenter_voluntary_disruption_decision_evaluation_duration_seconds&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_eligible_nodes&lt;/td>
&lt;td>karpenter_voluntary_disruption_eligible_nodes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_consolidation_timeouts_total&lt;/td>
&lt;td>karpenter_voluntary_disruption_consolidation_timeouts_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_budgets_allowed_disruptions&lt;/td>
&lt;td>karpenter_nodepools_allowed_disruptions&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_actions_performed_total&lt;/td>
&lt;td>karpenter_voluntary_disruption_decisions_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Provisioner&lt;/td>
&lt;td>karpenter_provisioner_scheduling_simulation_duration_seconds&lt;/td>
&lt;td>karpenter_scheduler_scheduling_duration_seconds&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Provisioner&lt;/td>
&lt;td>karpenter_provisioner_scheduling_queue_depth&lt;/td>
&lt;td>karpenter_scheduler_queue_depth&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Interruption&lt;/td>
&lt;td>karpenter_interruption_received_messages&lt;/td>
&lt;td>karpenter_interruption_received_messages_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Interruption&lt;/td>
&lt;td>karpenter_interruption_deleted_messages&lt;/td>
&lt;td>karpenter_interruption_deleted_messages_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Interruption&lt;/td>
&lt;td>karpenter_interruption_message_latency_time_seconds&lt;/td>
&lt;td>karpenter_interruption_message_queue_duration_seconds&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodePool&lt;/td>
&lt;td>karpenter_nodepool_usage&lt;/td>
&lt;td>karpenter_nodepools_usage&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodePool&lt;/td>
&lt;td>karpenter_nodepool_limit&lt;/td>
&lt;td>karpenter_nodepools_limit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodeClaim&lt;/td>
&lt;td>karpenter_nodeclaims_terminated&lt;/td>
&lt;td>karpenter_nodeclaims_terminated_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodeClaim&lt;/td>
&lt;td>karpenter_nodeclaims_disrupted&lt;/td>
&lt;td>karpenter_nodeclaims_disrupted_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodeClaim&lt;/td>
&lt;td>karpenter_nodeclaims_created&lt;/td>
&lt;td>karpenter_nodeclaims_created_total&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="dropped-metrics">Dropped Metrics&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Type&lt;/th>
&lt;th>Name&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_replacement_nodeclaim_initialized_seconds&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_queue_depth&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Disruption&lt;/td>
&lt;td>karpenter_disruption_pods_disrupted_total&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>karpenter_consistency_errors&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodeClaim&lt;/td>
&lt;td>karpenter_nodeclaims_registered&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodeClaim&lt;/td>
&lt;td>karpenter_nodeclaims_launched&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodeClaim&lt;/td>
&lt;td>karpenter_nodeclaims_initialized&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NodeClaim&lt;/td>
&lt;td>karpenter_nodeclaims_drifted&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Provisioner&lt;/td>
&lt;td>karpenter_provisioner_scheduling_duration_seconds&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Interruption&lt;/td>
&lt;td>karpenter_interruption_actions_performed&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
Karpenter now waits for the underlying instance to be completely terminated before deleting a node and orchestrates this by emitting &lt;code>NodeClaimNotFoundError&lt;/code>.
With this change we expect to see an increase in the &lt;code>NodeClaimNotFoundError&lt;/code>.
Customers can filter out this error by label in order to get accurate values for &lt;code>karpenter_cloudprovider_errors_total&lt;/code> metric.
Use this Prometheus filter expression - &lt;code>({controller!=&amp;quot;node.termination&amp;quot;} or {controller!=&amp;quot;nodeclaim.termination&amp;quot;}) and {error!=&amp;quot;NodeClaimNotFoundError&amp;quot;}&lt;/code>.
&lt;/div></description></item></channel></rss>