<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes Blog</title>
    <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/</link>
    <description>The Kubernetes blog is used by the project to communicate new features, community reports, and any news that might be relevant to the Kubernetes community.</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <image>
      <url>https://raw.githubusercontent.com/kubernetes/kubernetes/master/logo/logo.png</url>
      <title>The Kubernetes project logo</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/</link>
    </image>
    
    <atom:link href="https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/feed.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Spotlight on SIG Architecture: API Governance</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/02/12/sig-architecture-api-spotlight/</link>
      <pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/02/12/sig-architecture-api-spotlight/</guid>
      <description>
        
        
        &lt;p&gt;&lt;em&gt;This is the fifth interview of a SIG Architecture Spotlight series that covers the different
subprojects, and we will be covering &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-architecture/README.md#architecture-and-api-governance-1&#34;&gt;SIG Architecture: API
Governance&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this SIG Architecture spotlight we talked with &lt;a href=&#34;https://github.com/liggitt&#34;&gt;Jordan Liggitt&lt;/a&gt;, lead
of the API Governance sub-project.&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FM: Hello Jordan, thank you for your availability. Tell us a bit about yourself, your role and how
you got involved in Kubernetes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: My name is Jordan Liggitt. I&#39;m a Christian, husband, father of four, software engineer at
&lt;a href=&#34;https://about.google/&#34;&gt;Google&lt;/a&gt; by day, and &lt;a href=&#34;https://www.youtube.com/watch?v=UDdr-VIWQwo&#34;&gt;amateur musician&lt;/a&gt; by stealth. I was born in Texas (and still
like to claim it as my point of origin), but I&#39;ve lived in North Carolina for most of my life.&lt;/p&gt;
&lt;p&gt;I&#39;ve been working on Kubernetes since 2014. At that time, I was working on authentication and
authorization at Red Hat, and my very first pull request to Kubernetes attempted to &lt;a href=&#34;https://github.com/kubernetes/kubernetes/pull/2328&#34;&gt;add an OAuth
server&lt;/a&gt; to the Kubernetes API server. It never
exited work-in-progress status. I ended up going with a different approach that layered on top of
the core Kubernetes API server in a different project (spoiler alert: this is foreshadowing), and I
closed it without merging six months later.&lt;/p&gt;
&lt;p&gt;Undeterred by that start, I stayed involved, helped build Kubernetes authentication and
authorization capabilities, and got involved in the definition and evolution of the core Kubernetes
APIs from early beta APIs, like &lt;code&gt;v1beta3&lt;/code&gt; to &lt;code&gt;v1&lt;/code&gt;. I got tagged as an API reviewer in 2016 based on
those contributions, and was added as an API approver in 2017.&lt;/p&gt;
&lt;p&gt;Today, I help lead the API Governance and code organization subprojects for SIG Architecture, and I
am a tech lead for SIG Auth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: And when did you get specifically involved in the API Governance project?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: Around 2019.&lt;/p&gt;
&lt;h2 id=&#34;goals-and-scope-of-api-governance&#34;&gt;Goals and scope of API Governance&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FM:  How would you describe the main goals and areas of intervention of the subproject?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The surface area includes all the various APIs Kubernetes has, and there are APIs that people do not
always realize are APIs: command-line flags, configuration files, how binaries are run, how they
talk to back-end components like the container runtime, and how they persist data. People often
think of &amp;quot;the API&amp;quot; as only the &lt;a href=&#34;https://kubernetes.io/docs/reference/using-api/&#34;&gt;REST API&lt;/a&gt;... that
is the biggest and most obvious one, and the one with the largest audience, but all of these other
surfaces are also APIs. Their audiences are narrower, so there is more flexibility there, but they
still require consideration.&lt;/p&gt;
&lt;p&gt;The goals are to be stable while still enabling innovation. Stability is easy if you never change
anything, but that contradicts the goal of evolution and growth. So we balance &amp;quot;be stable&amp;quot; with
&amp;quot;allow change&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: Speaking of changes, in terms of ensuring consistency and quality (which is clearly one of the
reasons this project exists), what are the specific quality gates in the lifecycle of a Kubernetes
change? Does API Governance get involved during the release cycle, prior to it through guidelines,
or somewhere in between? At what points do you ensure the intended role is fulfilled?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: We have &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md&#34;&gt;guidelines and
conventions&lt;/a&gt;,
both for APIs in general and for how to change an API. These are living documents that we update as
we encounter new scenarios. They are long and dense, so we also support them with involvement at
either the design stage or the implementation stage.&lt;/p&gt;
&lt;p&gt;Sometimes, due to bandwidth constraints, teams move ahead with design work without feedback from &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-architecture/api-review-process.md&#34;&gt;API Review&lt;/a&gt;. That’s fine, but it means that when implementation begins, the API review will happen then,
and there may be substantial feedback. So we get involved when a new API is created or an existing
API is changed, either at design or implementation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: Is this during the Kubernetes Enhancement Proposal (KEP) process? Since KEPs are mandatory for
enhancements, I assume part of the work intersects with API Governance?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: It can. &lt;a href=&#34;https://github.com/kubernetes/enhancements/blob/master/keps/README.md&#34;&gt;KEPs&lt;/a&gt; vary
in how detailed they are. Some include literal API definitions. When they do, we can perform an API
review at the design stage. Then implementation becomes a matter of checking fidelity to the design.&lt;/p&gt;
&lt;p&gt;Getting involved early is ideal. But some KEPs are conceptual and leave details to the
implementation. That’s not wrong; it just means the implementation will be more exploratory. Then
API Review gets involved later, possibly recommending structural changes.&lt;/p&gt;
&lt;p&gt;There’s a trade-off regardless: detailed design upfront versus iterative discovery during
implementation. People and teams work differently, and we’re flexible and happy to consult early or
at implementation time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: This reminds me of what Fred Brooks wrote in &amp;quot;The Mythical Man-Month&amp;quot; about conceptual
integrity being central to product quality... No matter how you structure the process, there must be
a point where someone looks at what is coming and ensures conceptual integrity. Kubernetes uses APIs
everywhere -- externally and internally -- so API Governance is critical to maintaining that
integrity. How is this captured?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: Yes, the conventions document captures patterns we’ve learned over time: what to do in
various situations. We also have automated linters and checks to ensure correctness around patterns
like spec/status semantics. These automated tools help catch issues even when humans miss them.&lt;/p&gt;
&lt;p&gt;As new scenarios arise -- and they do constantly -- we think through how to approach them and fold
the results back into our documentation and tools. Sometimes it takes a few attempts before we
settle on an approach that works well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: Exactly. Each new interaction improves the guidelines.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: Right. And sometimes the first approach turns out to be wrong. It may take two or three
iterations before we land on something robust.&lt;/p&gt;
&lt;h2 id=&#34;the-impact-of-custom-resource-definitions&#34;&gt;The impact of Custom Resource Definitions&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FM: Is there any particular change, episode, or domain that stands out as especially noteworthy,
complex, or interesting in your experience?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: The watershed moment was &lt;a href=&#34;https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/&#34;&gt;Custom Resources&lt;/a&gt;.
Prior to that, every API was handcrafted by us and fully reviewed. There were inconsistencies, but
we understood and controlled every type and field.&lt;/p&gt;
&lt;p&gt;When Custom Resources arrived, anyone could define anything. The first version did not even require
a schema. That made it extremely powerful -- it enabled change immediately -- but it left us playing
catch-up on stability and consistency.&lt;/p&gt;
&lt;p&gt;When Custom Resources graduated to General Availability (GA), schemas became required, but escape
hatches still existed for backward compatibility. Since then, we’ve been working on giving CRD
authors validation capabilities comparable to built-ins. Built-in validation rules for CRDs have
only just reached GA in the last few releases.&lt;/p&gt;
&lt;p&gt;So CRDs opened the &amp;quot;anything is possible&amp;quot; era. Built-in validation rules are the second major
milestone: bringing consistency back.&lt;/p&gt;
&lt;p&gt;The three major themes have been defining schemas, validating data, and handling pre-existing
invalid data. With ratcheting validation (allowing data to improve without breaking existing
objects), we can now guide CRD authors toward conventions without breaking the world.&lt;/p&gt;
&lt;h2 id=&#34;api-governance-in-context&#34;&gt;API Governance in context&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FM: How does API Governance relate to SIG Architecture and API Machinery?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: &lt;a href=&#34;https://github.com/kubernetes/apimachinery&#34;&gt;API Machinery&lt;/a&gt; provides the actual code and
tools that people build APIs on. They don’t review APIs for storage, networking, scheduling, etc.&lt;/p&gt;
&lt;p&gt;SIG Architecture sets the overall system direction and works with API Machinery to ensure the system
supports that direction. API Governance works with other SIGs building on that foundation to define
conventions and patterns, ensuring consistent use of what API Machinery provides.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: Thank you. That clarifies the flow. Going back to &lt;a href=&#34;https://kubernetes.io/releases/release/&#34;&gt;release cycles&lt;/a&gt;: do release phases -- enhancements freeze, code
freeze -- change your workload? Or is API Governance mostly continuous?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: We get involved in two places: design and implementation. Design involvement increases
before enhancements freeze; implementation involvement increases before code freeze. However, many
efforts span multiple releases, so there is always some design and implementation happening, even
for work targeting future releases. Between those intense periods, we often have time to work on
long-term design work.&lt;/p&gt;
&lt;p&gt;An anti-pattern we see is teams thinking about a large feature for months and then presenting it
three weeks before enhancements freeze, saying, &amp;quot;Here is the design, please review.&amp;quot; For big changes
with API impact, it’s much better to involve API Governance early.&lt;/p&gt;
&lt;p&gt;And there are good times in the cycle for this -- between freezes -- when people have bandwidth.
That’s when long-term review work fits best.&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Getting involved&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FM: Clearly. Now, regarding team dynamics and new contributors: how can someone get involved in
API Governance? What should they focus on?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: It’s usually best to follow a specific change rather than trying to learn everything at
once. Pick a small API change, perhaps one someone else is making or one you want to make, and
observe the full process: design, implementation, review.&lt;/p&gt;
&lt;p&gt;High-bandwidth review -- live discussion over video -- is often very effective. If you’re making or
following a change, ask whether there’s a time to go over the design or PR together. Observing those
discussions is extremely instructive.&lt;/p&gt;
&lt;p&gt;Start with a small change. Then move to a bigger one. Then maybe a new API. That builds
understanding of conventions as they are applied in practice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: Excellent. Any final comments, or anything we missed?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: Yes... the reason we care so much about compatibility and stability is for our users. It’s
easy for contributors to see those requirements as painful obstacles preventing cleanup or requiring
tedious work... but users integrated with our system, and we made a promise to them: we want them to
trust that we won’t break that contract. So even when it requires more work, moves slower, or
involves duplication, we choose stability.&lt;/p&gt;
&lt;p&gt;We are not trying to be obstructive; we are trying to make life good for users.&lt;/p&gt;
&lt;p&gt;A lot of our questions focus on the future: you want to do something now... how will you evolve it
later without breaking it? We assume we will know more in the future, and we want the design to
leave room for that.&lt;/p&gt;
&lt;p&gt;We also assume we will make mistakes. The question then is: how do we leave ourselves avenues to
improve while keeping compatibility promises?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FM: Exactly. Jordan, thank you, I think we’ve covered everything. This has been an insightful view
into the API Governance project and its role in the wider Kubernetes project.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JL&lt;/strong&gt;: Thank you.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Introducing Node Readiness Controller</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/02/03/introducing-node-readiness-controller/</link>
      <pubDate>Tue, 03 Feb 2026 10:00:00 +0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/02/03/introducing-node-readiness-controller/</guid>
      <description>
        
        
        &lt;img style=&#34;float: right; display: inline-block; margin-left: 2em; max-width: 15em;&#34; src=&#34;./node-readiness-controller-logo.svg&#34; alt=&#34;Logo for node readiness controller&#34; /&gt;
&lt;p&gt;In the standard Kubernetes model, a node’s suitability for workloads hinges on a single binary &amp;quot;Ready&amp;quot; condition. However, in modern Kubernetes environments, nodes require complex infrastructure dependencies—such as network agents, storage drivers, GPU firmware, or custom health checks—to be fully operational before they can reliably host pods.&lt;/p&gt;
&lt;p&gt;Today, on behalf of the Kubernetes project, I am announcing the &lt;a href=&#34;https://node-readiness-controller.sigs.k8s.io/&#34;&gt;Node Readiness Controller&lt;/a&gt;.
This project introduces a declarative system for managing node taints, extending the readiness guardrails during node bootstrapping beyond standard conditions.
By dynamically managing taints based on custom health signals, the controller ensures that workloads are only placed on nodes that met all infrastructure-specific requirements.&lt;/p&gt;
&lt;h2 id=&#34;why-the-node-readiness-controller&#34;&gt;Why the Node Readiness Controller?&lt;/h2&gt;
&lt;p&gt;Core Kubernetes Node &amp;quot;Ready&amp;quot; status is often insufficient for clusters with sophisticated bootstrapping requirements. Operators frequently struggle to ensure that specific DaemonSets or local services are healthy before a node enters the scheduling pool.&lt;/p&gt;
&lt;p&gt;The Node Readiness Controller fills this gap by allowing operators to define custom scheduling gates tailored to specific node groups. This enables you to enforce
distinct readiness requirements across heterogeneous clusters, ensuring for example, that GPU equipped nodes only accept pods once specialized drivers are verified,
while general purpose nodes follow a standard path.&lt;/p&gt;
&lt;p&gt;It provides three primary advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom Readiness Definitions&lt;/strong&gt;: Define what &lt;em&gt;ready&lt;/em&gt; means for your specific platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated Taint Management&lt;/strong&gt;: The controller automatically applies or removes node taints based on condition status, preventing pods from landing on unready infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declarative Node Bootstrapping&lt;/strong&gt;: Manage multi-step node initialization reliably, with a clear observability into the bootstrapping process.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;core-concepts-and-features&#34;&gt;Core concepts and features&lt;/h2&gt;
&lt;p&gt;The controller centers around the NodeReadinessRule (NRR) API, which allows you to define declarative &lt;em&gt;gates&lt;/em&gt; for your nodes.&lt;/p&gt;
&lt;h3 id=&#34;flexible-enforcement-modes&#34;&gt;Flexible enforcement modes&lt;/h3&gt;
&lt;p&gt;The controller supports two distinct operational modes:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Continuous enforcement&lt;/dt&gt;
&lt;dd&gt;Actively maintains the readiness guarantee throughout the node’s entire lifecycle. If a critical dependency (like a device driver) fails later, the node is immediately tainted to prevent new scheduling.&lt;/dd&gt;
&lt;dt&gt;Bootstrap-only enforcement&lt;/dt&gt;
&lt;dd&gt;Specifically for one-time initialization steps, such as pre-pulling heavy images or hardware provisioning. Once conditions are met, the controller marks the bootstrap as complete and stops monitoring that specific rule for the node.&lt;/dd&gt;
&lt;/dl&gt;
&lt;h3 id=&#34;condition-reporting&#34;&gt;Condition reporting&lt;/h3&gt;
&lt;p&gt;The controller reacts to Node Conditions rather than performing health checks itself. This decoupled design allows it to integrate seamlessly with other tools existing in the ecosystem as well as custom solutions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/kubernetes/node-problem-detector&#34;&gt;Node Problem Detector&lt;/a&gt; (NPD)&lt;/strong&gt;: Use existing NPD setups and custom scripts to report node health.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness Condition Reporter&lt;/strong&gt;: A lightweight agent provided by the project that can be deployed to periodically check local HTTP endpoints and patch node conditions accordingly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;operational-safety-with-dry-run&#34;&gt;Operational safety with dry run&lt;/h3&gt;
&lt;p&gt;Deploying new readiness rules across a fleet carries inherent risk. To mitigate this, &lt;em&gt;dry run&lt;/em&gt; mode allows operators to first simulate impact on the cluster.
In this mode, the controller logs intended actions and updates the rule&#39;s status to show affected nodes without applying actual taints, enabling safe validation before enforcement.&lt;/p&gt;
&lt;h2 id=&#34;example-cni-bootstrapping&#34;&gt;Example: CNI bootstrapping&lt;/h2&gt;
&lt;p&gt;The following NodeReadinessRule ensures a node remains unschedulable until its CNI agent is functional. The controller monitors a custom &lt;code&gt;cniplugin.example.net/NetworkReady&lt;/code&gt; condition and only removes the &lt;code&gt;readiness.k8s.io/acme.com/network-unavailable&lt;/code&gt; taint once the status is True.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;readiness.node.x-k8s.io/v1alpha1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;NodeReadinessRule&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;network-readiness-rule&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;conditions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;cniplugin.example.net/NetworkReady&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requiredStatus&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;taint&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;readiness.k8s.io/acme.com/network-unavailable&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;pending&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;enforcementMode&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;bootstrap-only&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeSelector&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matchLabels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;node-role.kubernetes.io/worker&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;:&lt;/p&gt;


    
    &lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/hohIIEXlNpo?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;Node Readiness Controller Demo&#34;
      &gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;h2 id=&#34;getting-involved&#34;&gt;Getting involved&lt;/h2&gt;
&lt;p&gt;The Node Readiness Controller is just getting started, with our &lt;a href=&#34;https://github.com/kubernetes-sigs/node-readiness-controller/releases/tag/v0.1.1&#34;&gt;initial releases&lt;/a&gt; out, and we are seeking community feedback to refine the roadmap. Following our productive Unconference discussions at KubeCon NA 2025, we are excited to continue the conversation in person.&lt;/p&gt;
&lt;p&gt;Join us at KubeCon + CloudNativeCon Europe 2026 for our maintainer track session: &lt;em&gt;&lt;a href=&#34;https://sched.co/2EF6E&#34;&gt;Addressing Non-Deterministic Scheduling: Introducing the Node Readiness Controller&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the meantime, you can contribute or track our progress here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href=&#34;https://sigs.k8s.io/node-readiness-controller&#34;&gt;https://sigs.k8s.io/node-readiness-controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Slack: Join the conversation in &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node-readiness-controller&#34;&gt;#sig-node-readiness-controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href=&#34;https://node-readiness-controller.sigs.k8s.io/&#34;&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>New Conversion from cgroup v1 CPU Shares to v2 CPU Weight</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/30/new-cgroup-v1-to-v2-cpu-conversion-formula/</link>
      <pubDate>Fri, 30 Jan 2026 08:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/30/new-cgroup-v1-to-v2-cpu-conversion-formula/</guid>
      <description>
        
        
        &lt;p&gt;I&#39;m excited to announce the implementation of an improved conversion formula
from cgroup v1 CPU shares to cgroup v2 CPU weight. This enhancement addresses
critical issues with CPU priority allocation for Kubernetes workloads when
running on systems with cgroup v2.&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Kubernetes was originally designed with cgroup v1 in mind, where CPU shares
were defined simply by assigning the container&#39;s CPU requests in millicpu
form.&lt;/p&gt;
&lt;p&gt;For example, a container requesting 1 CPU (1024m) would get (cpu.shares = 1024).&lt;/p&gt;
&lt;p&gt;After a while, cgroup v1 started being replaced by its successor,
cgroup v2. In cgroup v2, the concept of CPU shares (which ranges from 2 to
262144, or from 2¹ to 2¹⁸) was replaced with CPU weight (which ranges from
[1, 10000], or 10⁰ to 10⁴).&lt;/p&gt;
&lt;p&gt;With the transition to cgroup v2,
&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2254-cgroup-v2&#34;&gt;KEP-2254&lt;/a&gt;
introduced a conversion formula to map cgroup v1 CPU shares to cgroup v2 CPU
weight. The conversion formula was defined as: &lt;code&gt;cpu.weight = (1 + ((cpu.shares - 2) * 9999) / 262142)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This formula linearly maps values from [2¹, 2¹⁸] to [10⁰, 10⁴].&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Linear conversion formula&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/30/new-cgroup-v1-to-v2-cpu-conversion-formula/linear-conversion.png&#34; title=&#34;formula&#34;&gt;&lt;/p&gt;
&lt;p&gt;While this approach is simple, the linear mapping imposes a few significant
problems and impacts both performance and configuration granularity.&lt;/p&gt;
&lt;h2 id=&#34;problems-with-previous-conversion-formula&#34;&gt;Problems with previous conversion formula&lt;/h2&gt;
&lt;p&gt;The current conversion formula creates two major issues:&lt;/p&gt;
&lt;h3 id=&#34;1-reduced-priority-against-non-kubernetes-workloads&#34;&gt;1. Reduced priority against non-Kubernetes workloads&lt;/h3&gt;
&lt;p&gt;In cgroup v1, the default value for CPU shares is &lt;code&gt;1024&lt;/code&gt;, meaning a container
requesting 1 CPU has equal priority with system processes that live outside
of Kubernetes&#39; scope.
However, in cgroup v2, the default CPU weight is &lt;code&gt;100&lt;/code&gt;, but the current
formula converts 1 CPU (1024m) to only &lt;code&gt;≈39&lt;/code&gt; weight - less than 40% of the
default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container requesting 1 CPU (1024m)&lt;/li&gt;
&lt;li&gt;cgroup v1: &lt;code&gt;cpu.shares = 1024&lt;/code&gt; (equal to default)&lt;/li&gt;
&lt;li&gt;cgroup v2 (current): &lt;code&gt;cpu.weight = 39&lt;/code&gt; (much lower than default 100)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that after moving to cgroup v2, Kubernetes (or OCI) workloads would
de-facto reduce their CPU priority against non-Kubernetes processes. The
problem can be severe for setups with many system daemons that run
outside of Kubernetes&#39; scope and expect Kubernetes workloads to have
priority, especially in situations of resource starvation.&lt;/p&gt;
&lt;h3 id=&#34;2-unmanageable-granularity&#34;&gt;2. Unmanageable granularity&lt;/h3&gt;
&lt;p&gt;The current formula produces very low values for small CPU requests,
limiting the ability to create sub-cgroups within containers for
fine-grained resource distribution (which will possibly be much easier moving
forward, see &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5474&#34;&gt;KEP #5474&lt;/a&gt; for more info).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Container requesting 100m CPU&lt;/li&gt;
&lt;li&gt;cgroup v1: &lt;code&gt;cpu.shares = 102&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;cgroup v2 (current): &lt;code&gt;cpu.weight = 4&lt;/code&gt; (too low for sub-cgroup
configuration)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With cgroup v1, requesting 100m CPU which led to 102 CPU shares was manageable
in the sense that sub-cgroups could have been created inside the main
container, assigning fine-grained CPU priorities for different groups of
processes. With cgroup v2 however, having 4 shares is very hard to
distribute between sub-cgroups since it&#39;s not granular enough.&lt;/p&gt;
&lt;p&gt;With plans to allow &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5474&#34;&gt;writable cgroups for unprivileged containers&lt;/a&gt;,
this becomes even
more relevant.&lt;/p&gt;
&lt;h2 id=&#34;new-conversion-formula&#34;&gt;New conversion formula&lt;/h2&gt;
&lt;h3 id=&#34;description&#34;&gt;Description&lt;/h3&gt;
&lt;p&gt;The new formula is more complicated, but does a much better job mapping
between cgroup v1 CPU shares and cgroup v2 CPU weight:&lt;/p&gt;

&lt;div class=&#34;math&#34;&gt;$$cpu.weight = \lceil 10^{(L^{2}/612 + 125L/612 - 7/34)} \rceil, \text{ where: } L = \log_2(cpu.shares)$$&lt;/div&gt;&lt;p&gt;The idea is that this is a quadratic function to cross the following values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(2, 1): The minimum values for both ranges.&lt;/li&gt;
&lt;li&gt;(1024, 100): The default values for both ranges.&lt;/li&gt;
&lt;li&gt;(262144, 10000): The maximum values for both ranges.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visually, the new function looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2025-10-25-new-cgroup-v1-to-v2-conversion-formula-new-conversion.png&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/30/new-cgroup-v1-to-v2-cpu-conversion-formula/new-conversion-formula.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;And if you zoom in to the important part:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;2025-10-25-new-cgroup-v1-to-v2-conversion-formula-new-conversion-zoom.png&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/30/new-cgroup-v1-to-v2-cpu-conversion-formula/new-conversion-formula-zoom.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;The new formula is &amp;quot;close to linear&amp;quot;, yet it is carefully designed to
map the ranges in a clever way so the three important points above would
cross.&lt;/p&gt;
&lt;h3 id=&#34;how-it-solves-the-problems&#34;&gt;How it solves the problems&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better priority alignment:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A container requesting 1 CPU (1024m) will now get a &lt;code&gt;cpu.weight = 102&lt;/code&gt;. This
value is close to cgroup v2&#39;s default 100.
This restores the intended priority relationship between Kubernetes
workloads and system processes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved granularity:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A container requesting 100m CPU will get &lt;code&gt;cpu.weight = 17&lt;/code&gt;, (see
&lt;a href=&#34;https://go.dev/play/p/sLlAfCg54Eg&#34;&gt;here&lt;/a&gt;).
Enables better fine-grained resource distribution within containers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;adoption-and-integration&#34;&gt;Adoption and integration&lt;/h2&gt;
&lt;p&gt;This change was implemented at the OCI layer.
In other words, this is not implemented in Kubernetes itself; therefore the
adoption of the new conversion formula depends solely on the OCI runtime
adoption.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;runc: The new formula is enabled from version &lt;a href=&#34;https://github.com/opencontainers/runc/releases/tag/v1.3.2&#34;&gt;1.3.2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;crun: The new formula is enabled from version &lt;a href=&#34;https://github.com/containers/crun/releases/tag/1.23&#34;&gt;1.23&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;impact-on-existing-deployments&#34;&gt;Impact on existing deployments&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Some consumers may be affected if they assume the older linear conversion formula.
Applications or monitoring tools that directly calculate expected CPU weight values based on the
previous formula may need updates to account for the new quadratic conversion.
This is particularly relevant for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom resource management tools that predict CPU weight values.&lt;/li&gt;
&lt;li&gt;Monitoring systems that validate or expect specific weight values.&lt;/li&gt;
&lt;li&gt;Applications that programmatically set or verify CPU weight values.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Kubernetes project recommends testing the new conversion formula in non-production
environments before upgrading OCI runtimes to ensure compatibility with existing tooling.&lt;/p&gt;
&lt;h2 id=&#34;where-can-i-learn-more&#34;&gt;Where can I learn more?&lt;/h2&gt;
&lt;p&gt;For those interested in this enhancement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/131216&#34;&gt;Kubernetes GitHub Issue #131216&lt;/a&gt; - Detailed technical
analysis and examples, including discussions and reasoning for choosing the
above formula.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2254-cgroup-v2&#34;&gt;KEP-2254: cgroup v2&lt;/a&gt; -
Original cgroup v2 implementation in Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/&#34;&gt;Kubernetes cgroup documentation&lt;/a&gt; -
Current resource management guidance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;How do I get involved?&lt;/h2&gt;
&lt;p&gt;For those interested in getting involved with Kubernetes node-level
features, join the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;Kubernetes Node Special Interest Group&lt;/a&gt;.
We always welcome new contributors and diverse perspectives on resource management
challenges.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Ingress NGINX: Statement from the Kubernetes Steering and Security Response Committees</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/29/ingress-nginx-statement/</link>
      <pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/29/ingress-nginx-statement/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;In March 2026, Kubernetes will retire Ingress NGINX, a piece of critical infrastructure for about half of cloud native environments.&lt;/strong&gt; The retirement of Ingress NGINX was &lt;a href=&#34;https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/&#34;&gt;announced&lt;/a&gt; for March 2026, after years of &lt;a href=&#34;https://groups.google.com/a/kubernetes.io/g/dev/c/rxtrKvT_Q8E/m/6_ej0c1ZBAAJ&#34;&gt;public warnings&lt;/a&gt; that the project was in dire need of contributors and maintainers. There will be no more releases for bug fixes, security patches, or any updates of any kind after the project is retired. This cannot be ignored, brushed off, or left until the last minute to address. We cannot overstate the severity of this situation or the importance of beginning migration to alternatives like &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/getting-started/&#34;&gt;Gateway API&lt;/a&gt; or one of the many &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/&#34;&gt;third-party Ingress controllers&lt;/a&gt; immediately.&lt;/p&gt;
&lt;p&gt;To be abundantly clear: choosing to remain with Ingress NGINX after its retirement leaves you and your users vulnerable to attack. None of the available alternatives are direct drop-in replacements. This will require planning and engineering time. Half of you will be affected. You have two months left to prepare.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Existing deployments will continue to work, so unless you proactively check, you may not know you are affected until you are compromised.&lt;/strong&gt; In most cases, you can check to find out whether or not you rely on Ingress NGINX by running &lt;code&gt;kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx&lt;/code&gt; with cluster administrator permissions.&lt;/p&gt;
&lt;p&gt;Despite its broad appeal and widespread use by companies of all sizes, and repeated calls for help from the maintainers, the Ingress NGINX project never received the contributors it so desperately needed. According to internal Datadog research, about 50% of cloud native environments currently rely on this tool, and yet for the last several years, it has been maintained solely by one or two people working in their free time. Without sufficient staffing to maintain the tool to a standard both ourselves and our users would consider secure, the responsible choice is to wind it down and refocus efforts on modern alternatives like &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/getting-started/&#34;&gt;Gateway API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We did not make this decision lightly; as inconvenient as it is now, doing so is necessary for the safety of all users and the ecosystem as a whole. Unfortunately, the flexibility Ingress NGINX was designed with, that was once a boon, has become a burden that cannot be resolved. With the technical debt that has piled up, and fundamental design decisions that exacerbate security flaws, it is no longer reasonable or even possible to continue maintaining the tool even if resources did materialize.&lt;/p&gt;
&lt;p&gt;We issue this statement together to reinforce the scale of this change and the potential for serious risk to a significant percentage of Kubernetes users if this issue is ignored. It is imperative that you check your clusters now. If you are reliant on Ingress NGINX, you must begin planning for migration.&lt;/p&gt;
&lt;p&gt;Thank you,&lt;/p&gt;
&lt;p&gt;Kubernetes Steering Committee&lt;/p&gt;
&lt;p&gt;Kubernetes Security Response Committee&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Experimenting with Gateway API using kind</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/28/experimenting-gateway-api-with-kind/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/28/experimenting-gateway-api-with-kind/</guid>
      <description>
        
        
        &lt;p&gt;This document will guide you through setting up a local experimental environment with &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API&lt;/a&gt; on &lt;a href=&#34;https://kind.sigs.k8s.io/&#34;&gt;kind&lt;/a&gt;. This setup is designed for learning and testing. It helps you understand Gateway API concepts without production complexity.&lt;/p&gt;
&lt;div class=&#34;alert alert-caution&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Caution:&lt;/h4&gt;This is an experimentation learning setup, and should not be used for production. The components used on this document are not suited for production usage.
Once you&#39;re ready to deploy Gateway API in a production environment,
select an &lt;a href=&#34;https://gateway-api.sigs.k8s.io/implementations/&#34;&gt;implementation&lt;/a&gt; that suits your needs.&lt;/div&gt;

&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;In this guide, you will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set up a local Kubernetes cluster using kind (Kubernetes in Docker)&lt;/li&gt;
&lt;li&gt;Deploy &lt;a href=&#34;https://github.com/kubernetes-sigs/cloud-provider-kind&#34;&gt;cloud-provider-kind&lt;/a&gt;, which provides both LoadBalancer Services and a Gateway API controller&lt;/li&gt;
&lt;li&gt;Create a Gateway and HTTPRoute to route traffic to a demo application&lt;/li&gt;
&lt;li&gt;Test your Gateway API configuration locally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This setup is ideal for learning, development, and experimentation with Gateway API concepts.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before you begin, ensure you have the following installed on your local machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://docs.docker.com/get-docker/&#34;&gt;Docker&lt;/a&gt;&lt;/strong&gt; - Required to run kind and cloud-provider-kind&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/&#34;&gt;kubectl&lt;/a&gt;&lt;/strong&gt; - The Kubernetes command-line tool&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://kind.sigs.k8s.io/docs/user/quick-start/#installation&#34;&gt;kind&lt;/a&gt;&lt;/strong&gt; - Kubernetes in Docker&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://curl.se/&#34;&gt;curl&lt;/a&gt;&lt;/strong&gt; - Required to test the routes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;create-a-kind-cluster&#34;&gt;Create a kind cluster&lt;/h3&gt;
&lt;p&gt;Create a new kind cluster by running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind create cluster
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will create a single-node Kubernetes cluster running in a Docker container.&lt;/p&gt;
&lt;h3 id=&#34;install-cloud-provider-kind&#34;&gt;Install cloud-provider-kind&lt;/h3&gt;
&lt;p&gt;Next, you need &lt;a href=&#34;https://github.com/kubernetes-sigs/cloud-provider-kind/&#34;&gt;cloud-provider-kind&lt;/a&gt;, which provides two key components for this setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A LoadBalancer controller that assigns addresses to LoadBalancer-type Services&lt;/li&gt;
&lt;li&gt;A Gateway API controller that implements the Gateway API specification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also automatically installs the Gateway API Custom Resource Definitions (CRDs) in your cluster.&lt;/p&gt;
&lt;p&gt;Run cloud-provider-kind as a Docker container on the same host where you created the kind cluster:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;basename &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;curl -s -L -o /dev/null -w &lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;%{url_effective}&amp;#39;&lt;/span&gt; https://github.com/kubernetes-sigs/cloud-provider-kind/releases/latest&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;))&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run -d --name cloud-provider-kind --rm --network host -v /var/run/docker.sock:/var/run/docker.sock registry.k8s.io/cloud-provider-kind/cloud-controller-manager:&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;VERSION&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; On some systems, you may need elevated privileges to access the Docker socket.&lt;/p&gt;
&lt;p&gt;Verify that cloud-provider-kind is running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker ps --filter &lt;span style=&#34;color:#b8860b&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;cloud-provider-kind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see the container listed and in a running state. You can also check the logs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker logs cloud-provider-kind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;experimenting-with-gateway-api&#34;&gt;Experimenting with Gateway API&lt;/h2&gt;
&lt;p&gt;Now that your cluster is set up, you can start experimenting with Gateway API resources.&lt;/p&gt;
&lt;p&gt;cloud-provider-kind automatically provisions a GatewayClass called &lt;code&gt;cloud-provider-kind&lt;/code&gt;. You&#39;ll use this class to create your Gateway.&lt;/p&gt;
&lt;p&gt;It is worth noticing that while kind is not a cloud provider, the project is named as &lt;code&gt;cloud-provider-kind&lt;/code&gt; as it provides features that simulate a cloud-enabled environment.&lt;/p&gt;
&lt;h3 id=&#34;deploy-a-gateway&#34;&gt;Deploy a Gateway&lt;/h3&gt;
&lt;p&gt;The following manifest will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a new namespace called &lt;code&gt;gateway-infra&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Deploy a Gateway that listens on port 80&lt;/li&gt;
&lt;li&gt;Accept HTTPRoutes with hostnames matching the &lt;code&gt;*.exampledomain.example&lt;/code&gt; pattern&lt;/li&gt;
&lt;li&gt;Allow routes from any namespace to attach to the Gateway.
&lt;strong&gt;Note&lt;/strong&gt;: In real clusters, prefer Same or Selector values on the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/reference/spec/#fromnamespaces&#34;&gt;&lt;code&gt;allowedRoutes&lt;/code&gt; namespace selector&lt;/a&gt; field to limit attachments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apply the following manifest:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Namespace&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway-infra&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Gateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway-infra&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;gatewayClassName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;cloud-provider-kind&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;listeners&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostname&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;*.exampledomain.example&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;protocol&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;HTTP&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;allowedRoutes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespaces&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;from&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;All&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then verify that your Gateway is properly programmed and has an address assigned:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get gateway -n gateway-infra gateway
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Expected output:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NAME      CLASS                 ADDRESS      PROGRAMMED   AGE
gateway   cloud-provider-kind   172.18.0.3   True         5m6s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The PROGRAMMED column should show True, and the ADDRESS field should contain an IP address.&lt;/p&gt;
&lt;h3 id=&#34;deploy-a-demo-application&#34;&gt;Deploy a demo application&lt;/h3&gt;
&lt;p&gt;Next, deploy a simple echo application that will help you test your Gateway configuration. This application:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Listens on port 3000&lt;/li&gt;
&lt;li&gt;Echoes back request details including path, headers, and environment variables&lt;/li&gt;
&lt;li&gt;Runs in a namespace called &lt;code&gt;demo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apply the following manifest:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Namespace&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;demo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Service&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;labels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;app.kubernetes.io/name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;demo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;ports&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;http&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;protocol&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;TCP&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;targetPort&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;selector&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;app.kubernetes.io/name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ClusterIP&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;apps/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Deployment&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;labels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;app.kubernetes.io/name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;demo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;selector&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matchLabels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;app.kubernetes.io/name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;template&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;labels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;app.kubernetes.io/name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;env&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;POD_NAME&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;valueFrom&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;fieldRef&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;fieldPath&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;metadata.name&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;NAMESPACE&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;valueFrom&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;fieldRef&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;fieldPath&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;metadata.namespace&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry.k8s.io/gateway-api/echo-basic:v20251204-v1.4.1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo-basic&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;create-an-httproute&#34;&gt;Create an HTTPRoute&lt;/h3&gt;
&lt;p&gt;Now create an HTTPRoute to route traffic from your Gateway to the echo application.
This HTTPRoute will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Respond to requests for the hostname &lt;code&gt;some.exampledomain.example&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Route traffic to the echo application&lt;/li&gt;
&lt;li&gt;Attach to the Gateway in the &lt;code&gt;gateway-infra&lt;/code&gt; namespace&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apply the following manifest:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;HTTPRoute&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;demo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;parentRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway-infra&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostnames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;some.exampledomain.example&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matches&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;path&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;PathPrefix&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;/&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backendRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;echo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;test-your-route&#34;&gt;Test your route&lt;/h3&gt;
&lt;p&gt;The final step is to test your route using curl. You&#39;ll make a request to the Gateway&#39;s IP address with the hostname &lt;code&gt;some.exampledomain.example&lt;/code&gt;. The command below is for POSIX shell only, and may need to be adjusted for your environment:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;GW_ADDR&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;$(&lt;/span&gt;kubectl get gateway -n gateway-infra gateway -o &lt;span style=&#34;color:#b8860b&#34;&gt;jsonpath&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;{.status.addresses[0].value}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl --resolve some.exampledomain.example:80:&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;GW_ADDR&lt;/span&gt;&lt;span style=&#34;color:#b68;font-weight:bold&#34;&gt;}&lt;/span&gt; http://some.exampledomain.example
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should receive a JSON response similar to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;host&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;some.exampledomain.example&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;method&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;proto&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;HTTP/1.1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;*/*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;curl/8.15.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;demo&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;ingress&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;pod&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;echo-dc48d7cf8-vs2df&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see this response, congratulations! Your Gateway API setup is working correctly.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;If something isn&#39;t working as expected, you can troubleshoot by checking the status of your resources.&lt;/p&gt;
&lt;h3 id=&#34;check-the-gateway-status&#34;&gt;Check the Gateway status&lt;/h3&gt;
&lt;p&gt;First, inspect your Gateway resource:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get gateway -n gateway-infra gateway -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look at the &lt;code&gt;status&lt;/code&gt; section for conditions. Your Gateway should have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Accepted: True&lt;/code&gt; - The Gateway was accepted by the controller&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Programmed: True&lt;/code&gt; - The Gateway was successfully configured&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.status.addresses&lt;/code&gt; populated with an IP address&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;check-the-httproute-status&#34;&gt;Check the HTTPRoute status&lt;/h3&gt;
&lt;p&gt;Next, inspect your HTTPRoute:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get httproute -n demo &lt;span style=&#34;color:#a2f&#34;&gt;echo&lt;/span&gt; -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check the &lt;code&gt;status.parents&lt;/code&gt; section for conditions. Common issues include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ResolvedRefs set to False with reason &lt;code&gt;BackendNotFound&lt;/code&gt;; this means that the backend Service doesn&#39;t exist or has the wrong name&lt;/li&gt;
&lt;li&gt;Accepted set to False; this means that the route couldn&#39;t attach to the Gateway (check namespace permissions or hostname matching)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example error when a backend is not found:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;parents&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;conditions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;lastTransitionTime&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;2026-01-19T17:13:35Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;message&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;backend not found&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;observedGeneration&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;reason&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;BackendNotFound&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ResolvedRefs&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;controllerName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kind.sigs.k8s.io/gateway-controller&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;check-controller-logs&#34;&gt;Check controller logs&lt;/h3&gt;
&lt;p&gt;If the resource statuses don&#39;t reveal the issue, check the cloud-provider-kind logs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker logs -f cloud-provider-kind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will show detailed logs from both the LoadBalancer and Gateway API controllers.&lt;/p&gt;
&lt;h2 id=&#34;cleanup&#34;&gt;Cleanup&lt;/h2&gt;
&lt;p&gt;When you&#39;re finished with your experiments, you can clean up the resources:&lt;/p&gt;
&lt;h3 id=&#34;remove-kubernetes-resources&#34;&gt;Remove Kubernetes resources&lt;/h3&gt;
&lt;p&gt;Delete the namespaces (this will remove all resources within them):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl delete namespace gateway-infra
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl delete namespace demo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;stop-cloud-provider-kind&#34;&gt;Stop cloud-provider-kind&lt;/h3&gt;
&lt;p&gt;Stop and remove the cloud-provider-kind container:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker stop cloud-provider-kind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because the container was started with the &lt;code&gt;--rm&lt;/code&gt; flag, it will be automatically removed when stopped.&lt;/p&gt;
&lt;h3 id=&#34;delete-the-kind-cluster&#34;&gt;Delete the kind cluster&lt;/h3&gt;
&lt;p&gt;Finally, delete the kind cluster:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kind delete cluster
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;Now that you&#39;ve experimented with Gateway API locally, you&#39;re ready to explore production-ready implementations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Production Deployments&lt;/strong&gt;: Review the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/implementations/&#34;&gt;Gateway API implementations&lt;/a&gt; to find a controller that matches your production requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learn More&lt;/strong&gt;: Explore the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API documentation&lt;/a&gt; to learn about advanced features like TLS, traffic splitting, and header manipulation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Advanced Routing&lt;/strong&gt;: Experiment with path-based routing, header matching, request mirroring and other features following &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/getting-started/&#34;&gt;Gateway API user guides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;a-final-word-of-caution&#34;&gt;A final word of caution&lt;/h3&gt;
&lt;p&gt;This &lt;em&gt;kind&lt;/em&gt; setup is for development and learning only.
Always use a production-grade Gateway API implementation for real workloads.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Cluster API v1.12: Introducing In-place Updates and Chained Upgrades</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/27/cluster-api-v1-12-release/</link>
      <pubDate>Tue, 27 Jan 2026 08:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/27/cluster-api-v1-12-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;a href=&#34;https://cluster-api.sigs.k8s.io/&#34;&gt;Cluster API&lt;/a&gt; brings declarative management to Kubernetes cluster lifecycle, allowing users and platform teams to define the desired state of clusters and rely on controllers to continuously reconcile toward it.&lt;/p&gt;
&lt;p&gt;Similar to how you can use StatefulSets or Deployments in Kubernetes to manage a group of Pods, in Cluster API you can use KubeadmControlPlane to manage a set of control plane Machines, or you can use MachineDeployments to manage a group of worker Nodes.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/releases/tag/v1.12.0&#34;&gt;Cluster API v1.12.0&lt;/a&gt; release expands what is possible in Cluster API, reducing friction in common lifecycle operations by introducing in-place updates and chained upgrades.&lt;/p&gt;
&lt;h2 id=&#34;emphasis-on-simplicity-and-usability&#34;&gt;Emphasis on simplicity and usability&lt;/h2&gt;
&lt;p&gt;With v1.12.0, the Cluster API project demonstrates once again that this community is capable of delivering a great amount of innovation, while at the same time minimizing impact for Cluster API users.&lt;/p&gt;
&lt;p&gt;What does this mean in practice?&lt;/p&gt;
&lt;p&gt;Users simply have to change the &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts#cluster&#34;&gt;Cluster&lt;/a&gt; or the &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts#machine&#34;&gt;Machine&lt;/a&gt; spec (just as with previous Cluster API releases), and Cluster API will automatically trigger in-place updates or chained upgrades when possible and advisable.&lt;/p&gt;
&lt;h2 id=&#34;in-place-updates&#34;&gt;In-place Updates&lt;/h2&gt;
&lt;p&gt;Like Kubernetes does for Pods in Deployments, when the &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts#machine&#34;&gt;Machine&lt;/a&gt; spec changes also Cluster API performs rollouts by creating a new Machine and deleting the old one.&lt;/p&gt;
&lt;p&gt;This approach, inspired by the principle of immutable infrastructure, has a set of considerable advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is simple to explain, predictable, consistent and easy to reason about with users and engineers.&lt;/li&gt;
&lt;li&gt;It is simple to implement, because it relies only on two core primitives, create and delete.&lt;/li&gt;
&lt;li&gt;Implementation does not depend on Machine-specific choices, like OS, bootstrap mechanism etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, Machine rollouts drastically reduce the number of variables to be considered when managing the lifecycle of a host server that is hosting Nodes.&lt;/p&gt;
&lt;p&gt;However, while advantages of immutability are not under discussion, both Kubernetes and Cluster API are undergoing a similar journey, introducing changes that allow users to minimize workload disruption whenever possible.&lt;/p&gt;
&lt;p&gt;Over time, also Cluster API has introduced several improvements to immutable rollouts, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for &lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20221003-In-place-propagation-of-Kubernetes-objects-only-changes.md&#34;&gt;in-place propagation of changes affecting Kubernetes resources only&lt;/a&gt;, thus avoiding unnecessary rollouts&lt;/li&gt;
&lt;li&gt;A way to &lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/pull/10223&#34;&gt;Taint outdated nodes with PreferNoSchedule&lt;/a&gt;, thus reducing Pod churn by optimizing how Pods are rescheduled during rollouts.&lt;/li&gt;
&lt;li&gt;Support for the delete first rollout strategy, thus making it easier to do immutable rollouts on bare metal / environments with constrained resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The new &lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240807-in-place-updates.md&#34;&gt;in-place update&lt;/a&gt; feature in Cluster API is the next step in this journey.&lt;/p&gt;
&lt;p&gt;With the v1.12.0 release, Cluster API introduces support for &lt;a href=&#34;https://cluster-api.sigs.k8s.io/tasks/experimental-features/runtime-sdk/implement-in-place-update-hooks&#34;&gt;update extensions&lt;/a&gt; allowing users to make changes on existing machines in-place, without deleting and re-creating the Machines.&lt;/p&gt;
&lt;p&gt;Both KubeadmControlPlane and MachineDeployments support in-place updates based on the new update extension, and this means that the boundary of what is possible in Cluster API is now changed in a significant way.&lt;/p&gt;
&lt;p&gt;How do in-place updates work?&lt;/p&gt;
&lt;p&gt;The simplest way to explain it is that once the user triggers an update by changing the desired state of Machines, then Cluster API chooses the best tool to achieve the desired state.&lt;/p&gt;
&lt;p&gt;The news is that now Cluster API can choose between immutable rollouts and in-place update extensions to perform required changes.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/27/cluster-api-v1-12-release/in-place.svg&#34;
         alt=&#34;In-place updates in Cluster API&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Importantly, this is not immutable rollouts vs in-place updates; Cluster API considers both valid options and selects the most appropriate mechanism for a given change.&lt;/p&gt;
&lt;p&gt;From the perspective of the Cluster API maintainers, in-place updates are most useful for making changes that don&#39;t otherwise require a node drain or pod restart; for example: changing user credentials for the Machine. On the other hand, when the workload will be disrupted anyway, just do a rollout.&lt;/p&gt;
&lt;p&gt;Nevertheless, Cluster API remains true to its extensible nature, and everyone can create their own update extension and decide when and how to use in-place updates by trading in some of the benefits of immutable rollouts.&lt;/p&gt;
&lt;p&gt;For a deep dive into this feature, make sure to attend the session &lt;a href=&#34;https://kccnceu2026.sched.com/event/2CW1r/in-place-updates-with-cluster-api-the-sweet-spot-between-immutable-and-mutable-infrastructure-fabrizio-pandini-stefan-buringer-broadcom?iframe=yes&amp;w=100%&amp;sidebar=yes&amp;bg=no&#34;&gt;In-place Updates with Cluster API: The Sweet Spot Between Immutable and Mutable Infrastructure&lt;/a&gt; at KubeCon EU in Amsterdam!&lt;/p&gt;
&lt;h2 id=&#34;chained-upgrades&#34;&gt;Chained Upgrades&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://cluster-api.sigs.k8s.io/tasks/experimental-features/cluster-class/&#34;&gt;ClusterClass&lt;/a&gt; and managed topologies in Cluster API jointly provided a powerful and effective framework that acts as a building block for many platforms offering Kubernetes-as-a-Service.&lt;/p&gt;
&lt;p&gt;Now with v1.12.0 this feature is making another important step forward, by allowing users to upgrade by more than one Kubernetes minor version in a single operation, commonly referred to as a &lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20250513-chained-and-efficient-upgrades-for-clusters-with-managed-topologies.md&#34;&gt;chained upgrade&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This allows users to declare a target Kubernetes version and let Cluster API safely orchestrate the required intermediate steps, rather than manually managing each minor upgrade.&lt;/p&gt;
&lt;p&gt;The simplest way to explain how chained upgrades work, is that once the user triggers an update by changing the desired version for a Cluster, Cluster API computes an upgrade plan, and then starts executing it. Rather than (for example) update the Cluster to v1.33.0 and then v1.34.0 and then v1.35.0, checking on progress at each step, a chained upgrade lets you go directly to v1.35.0.&lt;/p&gt;
&lt;p&gt;Executing an upgrade plan means upgrading control plane and worker machines in a strictly controlled order, repeating this process as many times as needed to reach the desired state. The Cluster API is now capable of managing this for you.&lt;/p&gt;
&lt;p&gt;Cluster API takes care of optimizing and minimizing the upgrade steps for worker machines, and in fact worker machines will skip upgrades to intermediate Kubernetes minor releases whenever allowed by the Kubernetes version skew policies.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/27/cluster-api-v1-12-release/chained.svg&#34;
         alt=&#34;Chained upgrades in Cluster API&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Also in this case extensibility is at the core of this feature, and &lt;a href=&#34;https://cluster-api.sigs.k8s.io/tasks/experimental-features/runtime-sdk/implement-upgrade-plan-hooks&#34;&gt;upgrade plan runtime extensions&lt;/a&gt; can be used to influence how the upgrade plan is computed; similarly, &lt;a href=&#34;https://cluster-api.sigs.k8s.io/tasks/experimental-features/runtime-sdk/implement-lifecycle-hooks&#34;&gt;lifecycle hooks&lt;/a&gt; can be used to automate other tasks that must be performed during an upgrade, e.g. upgrading an addon after the control plane update completed.&lt;/p&gt;
&lt;p&gt;From our perspective, chained upgrades are most useful for users that struggle to keep up with Kubernetes minor releases, and e.g. they want to upgrade only once per year and then upgrade by three versions (n-3 → n). But be warned: the fact that you can now easily upgrade by more than one minor version is not an excuse to not patch your cluster frequently!&lt;/p&gt;
&lt;h2 id=&#34;release-team&#34;&gt;Release team&lt;/h2&gt;
&lt;p&gt;I would like to thank all the contributors, the maintainers, and all the engineers that volunteered for the release team.&lt;/p&gt;
&lt;p&gt;The reliability and predictability of Cluster API releases, which is one of the most appreciated features from our users, is only possible with the support, commitment, and hard work of its community.&lt;/p&gt;
&lt;p&gt;Kudos to the entire Cluster API community for the v1.12.0 release and all the great releases delivered in 2025!
​​
If you are interested in getting involved, learn about
&lt;a href=&#34;https://cluster-api.sigs.k8s.io/contributing&#34;&gt;Cluster API contributing guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;If you read the &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/manifesto&#34;&gt;Cluster API manifesto&lt;/a&gt;, you can see how the Cluster API subproject claims the right to remain unfinished, recognizing the need to continuously evolve, improve, and adapt to the changing needs of Cluster API’s users and the broader Cloud Native ecosystem.&lt;/p&gt;
&lt;p&gt;As Kubernetes itself continues to evolve, the Cluster API subproject will keep advancing alongside it, focusing on safer upgrades, reduced disruption, and stronger building blocks for platforms managing Kubernetes at scale.&lt;/p&gt;
&lt;p&gt;Innovation remains at the heart of Cluster API, stay tuned for an exciting 2026!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Useful links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cluster-api.sigs.k8s.io/&#34;&gt;Cluster API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/releases/tag/v1.12.0&#34;&gt;Cluster API v1.12.0 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240807-in-place-updates.md&#34;&gt;In-place update proposal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20250513-chained-and-efficient-upgrades-for-clusters-with-managed-topologies.md&#34;&gt;Chained upgrade proposal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Headlamp in 2025: Project Highlights</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/</link>
      <pubDate>Thu, 22 Jan 2026 10:00:00 +0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/</guid>
      <description>
        
        
        &lt;p&gt;&lt;em&gt;This announcement is a recap from a post originally &lt;a href=&#34;https://headlamp.dev/blog/2025/11/13/headlamp-in-2025&#34;&gt;published&lt;/a&gt; on the Headlamp blog.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://headlamp.dev/&#34;&gt;Headlamp&lt;/a&gt; has come a long way in 2025. The project has continued to grow – reaching more teams across platforms, powering new workflows and integrations through plugins, and seeing increased collaboration from the broader community.&lt;/p&gt;
&lt;p&gt;We wanted to take a moment to share a few updates and highlight how Headlamp has evolved over the past year.&lt;/p&gt;
&lt;h2 id=&#34;updates&#34;&gt;Updates&lt;/h2&gt;
&lt;h3 id=&#34;joining-kubernetes-sig-ui&#34;&gt;Joining Kubernetes SIG UI&lt;/h3&gt;
&lt;p&gt;This year marked a big milestone for the project: Headlamp is now officially part of Kubernetes &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-ui/README.md&#34;&gt;SIG UI&lt;/a&gt;. This move brings roadmap and design discussions even closer to the core Kubernetes community and reinforces Headlamp’s role as a modern, extensible UI for the project.&lt;/p&gt;


    
    &lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/Q5xkeoj6JiA?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;
      &gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;As part of that, we’ve also been sharing more about making Kubernetes approachable for a wider audience, including an &lt;a href=&#34;https://www.youtube.com/watch?v=VFOSyKVOPxs&#34;&gt;appearance on Enlightening with Whitney Lee&lt;/a&gt; and a &lt;a href=&#34;https://www.youtube.com/watch?v=Q7cbT2UBfE0&#34;&gt;talk at KCD New York 2025&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;linux-foundation-mentorship&#34;&gt;Linux Foundation mentorship&lt;/h3&gt;
&lt;p&gt;This year, we were excited to work with several students through the Linux Foundation’s Mentorship program, and our mentees have already left a visible mark on Headlamp:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/adwait-godbole&#34;&gt;&lt;strong&gt;Adwait Godbole&lt;/strong&gt;&lt;/a&gt; built the KEDA plugin, adding a UI in Headlamp to view and manage KEDA resources like ScaledObjects and ScaledJobs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DhairyaMajmudar&#34;&gt;&lt;strong&gt;Dhairya Majmudar&lt;/strong&gt;&lt;/a&gt; set up an OpenTelemetry-based observability stack for Headlamp, wiring up metrics, logs, and traces so the project is easier to monitor and debug.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/aishwarya-ghatole-506745231/&#34;&gt;&lt;strong&gt;Aishwarya Ghatole&lt;/strong&gt;&lt;/a&gt; led a UX audit of Headlamp plugins, identifying usability issues and proposing design improvements and personas for plugin users.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/SinghaAnirban005&#34;&gt;&lt;strong&gt;Anirban Singha&lt;/strong&gt;&lt;/a&gt; developed the Karpenter plugin, giving Headlamp a focused view into Karpenter autoscaling resources and decisions.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/useradityaa&#34;&gt;&lt;strong&gt;Aditya Chaudhary&lt;/strong&gt;&lt;/a&gt; improved Gateway API support, so you can see networking relationships on the resource map, as well as improved support for many of the new Gateway API resources.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Faakhir30&#34;&gt;&lt;strong&gt;Faakhir Zahid&lt;/strong&gt;&lt;/a&gt; completed a way to easily &lt;a href=&#34;https://headlamp.dev/docs/latest/installation/in-cluster/#plugin-management&#34;&gt;manage plugin installation&lt;/a&gt; with Headlamp deployed in clusters.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/upsaurav12&#34;&gt;&lt;strong&gt;Saurav Upadhyay&lt;/strong&gt;&lt;/a&gt; worked on backend caching for Kubernetes API calls, reducing load on the API server and improving performance in Headlamp.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;new-changes&#34;&gt;New changes&lt;/h2&gt;
&lt;h3 id=&#34;multi-cluster-view&#34;&gt;Multi-cluster view&lt;/h3&gt;
&lt;p&gt;Managing multiple clusters is challenging: teams often switch between tools and lose context when trying to see what runs where. Headlamp solves this by giving you a single view to compare clusters side-by-side. This makes it easier to understand workloads across environments and reduces the time spent hunting for resources.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/multi-cluster-view.png&#34;
         alt=&#34;Multi-cluster view&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of multi-cluster workloads&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;projects&#34;&gt;Projects&lt;/h3&gt;
&lt;p&gt;Kubernetes apps often span multiple namespaces and resource types, which makes troubleshooting feel like piecing together a puzzle. We’ve added &lt;strong&gt;Projects&lt;/strong&gt; to give you an application-centric view that groups related resources across multiple namespaces – and even clusters. This allows you to reduce sprawl, troubleshoot faster, and collaborate without digging through YAML or cluster-wide lists.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/projects-feature.png&#34;
         alt=&#34;Projects feature&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of the new Projects feature&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New “Projects” feature for grouping namespaces into app- or team-centric projects&lt;/li&gt;
&lt;li&gt;Extensible Projects details view that plugins can customize with their own tabs and actions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;navigation-and-activities&#34;&gt;Navigation and Activities&lt;/h3&gt;
&lt;p&gt;Day-to-day ops in Kubernetes often means juggling logs, terminals, YAML, and dashboards across clusters. We redesigned Headlamp’s navigation to treat these as first-class “activities” you can keep open and come back to, instead of one-off views you lose as soon as you click away.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/new-task-bar.png&#34;
         alt=&#34;New task bar&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of the new task bar&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new task bar/activities model lets you pin logs, exec sessions, and details as ongoing activities&lt;/li&gt;
&lt;li&gt;An activity overview with a “Close all” action and cluster information&lt;/li&gt;
&lt;li&gt;Multi-select and global filters in tables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/farodin91&#34;&gt;Jan Jansen&lt;/a&gt; and &lt;a href=&#34;https://github.com/useradityaa&#34;&gt;Aditya Chaudhary&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;search-and-map&#34;&gt;Search and map&lt;/h3&gt;
&lt;p&gt;When something breaks in production, the first two questions are usually “where is it?” and “what is it connected to?” We’ve upgraded both search and the map view so you can get from a high-level symptom to the right set of objects much faster.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/advanced-search.png&#34;
         alt=&#34;Advanced search&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of the new Advanced Search feature&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Advanced search view that supports rich, expression-based queries over Kubernetes objects&lt;/li&gt;
&lt;li&gt;Improved global search that understands labels and multiple search items, and can even update your current namespace based on what you find&lt;/li&gt;
&lt;li&gt;EndpointSlice support in the Network section&lt;/li&gt;
&lt;li&gt;A richer map view that now includes Custom Resources and Gateway API objects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/faebr&#34;&gt;Fabian&lt;/a&gt;, &lt;a href=&#34;https://github.com/alexandernorth&#34;&gt;Alexander North&lt;/a&gt;, and &lt;a href=&#34;https://github.com/victormarcolino&#34;&gt;Victor Marcolino&lt;/a&gt; from Swisscom, and also to &lt;a href=&#34;https://github.com/useradityaa&#34;&gt;Aditya Chaudhary&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;oidc-and-authentication&#34;&gt;OIDC and authentication&lt;/h3&gt;
&lt;p&gt;We’ve put real work into making OIDC setup clearer and more resilient, especially for in-cluster deployments.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/user-info.png&#34;
         alt=&#34;User info&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of user information for OIDC clusters&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User information displayed in the top bar for OIDC-authenticated users&lt;/li&gt;
&lt;li&gt;PKCE support for more secure authentication flows, as well as hardened token refresh handling&lt;/li&gt;
&lt;li&gt;Documentation for using the access token using &lt;code&gt;-oidc-use-access-token=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Improved support for public OIDC clients like AKS and EKS&lt;/li&gt;
&lt;li&gt;New guide for setting up Headlamp &lt;a href=&#34;https://headlamp.dev/docs/latest/installation/in-cluster/aks-cluster-oauth/&#34;&gt;on AKS with Azure Entra-ID using OAuth2Proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/daviddob&#34;&gt;David Dobmeier&lt;/a&gt; and &lt;a href=&#34;https://github.com/HarshSrivastava275&#34;&gt;Harsh Srivastava&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;app-catalog-and-helm&#34;&gt;App Catalog and Helm&lt;/h3&gt;
&lt;p&gt;We’ve broadened how you deploy and source apps via Headlamp, specifically supporting vanilla Helm repos.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A more capable Helm chart with optional backend TLS termination, PodDisruptionBudgets, custom pod labels, and more&lt;/li&gt;
&lt;li&gt;Improved formatting and added missing access token arg in the Helm chart&lt;/li&gt;
&lt;li&gt;New in-cluster Helm support with an &lt;code&gt;--enable-helm&lt;/code&gt; flag and a service proxy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/shahvrushali22&#34;&gt;Vrushali Shah&lt;/a&gt; and &lt;a href=&#34;https://github.com/muraliinformal&#34;&gt;Murali Annamneni&lt;/a&gt; from Oracle, and also to &lt;a href=&#34;https://github.com/jcpunk&#34;&gt;Pat Riehecky&lt;/a&gt;, &lt;a href=&#34;https://github.com/jda258&#34;&gt;Joshua Akers&lt;/a&gt;, &lt;a href=&#34;https://github.com/rstribrn&#34;&gt;Rostislav Stříbrný&lt;/a&gt;, &lt;a href=&#34;https://github.com/rickliujh&#34;&gt;Rick L&lt;/a&gt;, and &lt;a href=&#34;https://github.com/vnea&#34;&gt;Victor&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;performance-accessibility-and-ux&#34;&gt;Performance, accessibility, and UX&lt;/h3&gt;
&lt;p&gt;Finally, we’ve spent a lot of time on the things you notice every day but don’t always make headlines: startup time, list views, log viewers, accessibility, and small network UX details. A continuous accessibility self-audit has also helped us identify key issues and make Headlamp easier for everyone to use.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/learn-section.png&#34;
         alt=&#34;Learn section&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of the Learn section in docs&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Significant desktop improvements, with up to 60% faster app loads and much quicker dev-mode reloads for contributors&lt;/li&gt;
&lt;li&gt;Numerous table and log viewer refinements: persistent sort order, consistent row actions, copy-name buttons, better tooltips, and more forgiving log inputs&lt;/li&gt;
&lt;li&gt;Accessibility and localization improvements, including fixes for zoom-related layout issues, better color contrast, improved screen reader support, and expanded language coverage&lt;/li&gt;
&lt;li&gt;More control over resources, with live pod CPU/memory metrics, richer pod details, and inline editing for secrets and CRD fields&lt;/li&gt;
&lt;li&gt;A refreshed documentation and plugin onboarding experience, including a “Learn” section and plugin showcase&lt;/li&gt;
&lt;li&gt;A more complete NetworkPolicy UI and network-related polish&lt;/li&gt;
&lt;li&gt;Nightly builds available for early testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/jaehanbyun&#34;&gt;Jaehan Byun&lt;/a&gt; and &lt;a href=&#34;https://github.com/farodin91&#34;&gt;Jan Jansen&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;plugins-and-extensibility&#34;&gt;Plugins and extensibility&lt;/h2&gt;
&lt;p&gt;Discovering plugins is simpler now – no more hopping between Artifact Hub and assorted GitHub repos. Browse our dedicated &lt;a href=&#34;https://headlamp.dev/plugins&#34;&gt;Plugins page&lt;/a&gt; for a curated catalog of Headlamp-endorsed plugins, along with a showcase of featured plugins.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/plugins-page.png&#34;
         alt=&#34;Plugins page&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of the Plugins showcase&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;headlamp-ai-assistant&#34;&gt;Headlamp AI Assistant&lt;/h3&gt;
&lt;p&gt;Managing Kubernetes often means memorizing commands and juggling tools. Headlamp’s new AI Assistant changes this by adding a natural-language interface built into the UI. Now, instead of typing &lt;code&gt;kubectl&lt;/code&gt; or digging through YAML you can ask, “Is my app healthy?” or “Show logs for this deployment,” and get answers in context, speeding up troubleshooting and smoothing onboarding for new users. Learn more about it &lt;a href=&#34;https://headlamp.dev/blog/2025/08/07/introducing-the-headlamp-ai-assistant/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;


    
    &lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/GzXkUuCTcd4?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;
      &gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;h3 id=&#34;new-plugins-additions&#34;&gt;New plugins additions&lt;/h3&gt;
&lt;p&gt;Alongside the new AI Assistant, we’ve been growing Headlamp’s plugin ecosystem so you can bring more of your workflows into a single UI, with integrations like Minikube, Karpenter, and more.&lt;/p&gt;
&lt;p&gt;Highlights from the latest plugin releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Minikube plugin, providing a locally stored single node Minikube cluster&lt;/li&gt;
&lt;li&gt;Karpenter plugin, with support for Azure Node Auto-Provisioning (NAP)&lt;/li&gt;
&lt;li&gt;KEDA plugin, which you can learn more about &lt;a href=&#34;https://headlamp.dev/blog/2025/07/25/enabling-event-driven-autoscaling-with-the-new-keda-plugin-for-headlamp/&#34;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Community-maintained plugins for &lt;a href=&#34;https://github.com/sozercan/gatekeeper-headlamp-plugin&#34;&gt;Gatekeeper&lt;/a&gt; and &lt;a href=&#34;https://github.com/kaito-project/headlamp-kaito&#34;&gt;KAITO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to &lt;a href=&#34;https://github.com/shahvrushali22&#34;&gt;Vrushali Shah&lt;/a&gt; and &lt;a href=&#34;https://github.com/muraliinformal&#34;&gt;Murali Annamneni&lt;/a&gt; from Oracle, and also to &lt;a href=&#34;https://github.com/SinghaAnirban005&#34;&gt;Anirban Singha&lt;/a&gt;, &lt;a href=&#34;https://github.com/adwait-godbole&#34;&gt;Adwait Godbole&lt;/a&gt;, &lt;a href=&#34;https://github.com/sozercan&#34;&gt;Sertaç Özercan&lt;/a&gt;, &lt;a href=&#34;https://github.com/chewong&#34;&gt;Ernest Wong&lt;/a&gt;, and &lt;a href=&#34;https://github.com/chloe608&#34;&gt;Chloe Lim&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;other-plugins-updates&#34;&gt;Other plugins updates&lt;/h3&gt;
&lt;p&gt;Alongside new additions, we’ve also spent time refining plugins that many of you already use, focusing on smoother workflows and better integration with the core UI.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/backstage-plugin.png&#34;
         alt=&#34;Backstage plugin&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of the Backstage plugin&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flux plugin&lt;/strong&gt;: Updated for Flux v2.7, with support for newer CRDs, navigation fixes so it works smoothly on recent clusters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Catalog&lt;/strong&gt;: Now supports Helm repos in addition to Artifact Hub, can run in-cluster via /serviceproxy, and shows both current and latest app versions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin Catalog&lt;/strong&gt;: Improved card layout and accessibility, plus dependency and Storybook test updates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backstage plugin&lt;/strong&gt;: Dependency and build updates, more info &lt;a href=&#34;https://headlamp.dev/blog/2025/11/05/strengthening-backstage-and-headlamp-integration/&#34;&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;plugin-development&#34;&gt;Plugin development&lt;/h3&gt;
&lt;p&gt;We’ve focused on making it faster and clearer to build, test, and ship Headlamp plugins, backed by improved documentation and lighter tooling.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/plugin-development.png&#34;
         alt=&#34;Plugin development&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;View of the Plugin Development guide&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New and expanded guides for &lt;a href=&#34;https://headlamp.dev/docs/latest/development/architecture#plugins&#34;&gt;plugin architecture&lt;/a&gt; and &lt;a href=&#34;https://headlamp.dev/docs/latest/development/plugins/getting-started&#34;&gt;development&lt;/a&gt;, including how to publish and ship plugins&lt;/li&gt;
&lt;li&gt;Added &lt;a href=&#34;https://headlamp.dev/docs/latest/development/plugins/i18n&#34;&gt;i18n support documentation&lt;/a&gt; so plugins can be translated and localized&lt;/li&gt;
&lt;li&gt;Added example plugins: &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/tree/main/plugins/examples/ui-panels&#34;&gt;ui-panels&lt;/a&gt;, &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/tree/main/plugins/examples/resource-charts&#34;&gt;resource-charts&lt;/a&gt;, &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/tree/main/plugins/examples/custom-theme&#34;&gt;custom-theme&lt;/a&gt;, and &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/tree/main/plugins/examples/projects&#34;&gt;projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improved type checking for Headlamp APIs, restored Storybook support for component testing, and reduced dependencies for faster installs and fewer updates&lt;/li&gt;
&lt;li&gt;Documented plugin install locations, UI signifiers in Plugin Settings, and labels that differentiated shipped, UI-installed, and dev-mode plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;security-upgrades&#34;&gt;Security upgrades&lt;/h2&gt;
&lt;p&gt;We&#39;ve also been investing in keeping Headlamp secure – both by tightening how authentication works and by staying on top of upstream vulnerabilities and tooling.&lt;/p&gt;
&lt;p&gt;Updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We&#39;ve been keeping up with security updates, regularly updating dependencies and addressing upstream security issues.&lt;/li&gt;
&lt;li&gt;We tightened the Helm chart&#39;s default security context and fixed a regression that broke the plugin manager.&lt;/li&gt;
&lt;li&gt;We&#39;ve improved OIDC security with PKCE support, helping unblock more secure and standards-compliant OIDC setups when deploying Headlamp in-cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Thank you to everyone who has contributed to Headlamp this year – whether through pull requests, plugins, or simply sharing how you&#39;re using the project. Seeing the different ways teams are adopting and extending the project is a big part of what keeps us moving forward. If your organization uses Headlamp, consider adding it to our &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/blob/main/ADOPTERS.md&#34;&gt;adopters list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you haven&#39;t tried Headlamp recently, all these updates are available today. Check out the latest Headlamp release, explore the new views, plugins, and docs, and share your feedback with us on Slack or GitHub – your feedback helps shape where Headlamp goes next.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Announcing the Checkpoint/Restore Working Group</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/21/introducing-checkpoint-restore-wg/</link>
      <pubDate>Wed, 21 Jan 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/21/introducing-checkpoint-restore-wg/</guid>
      <description>
        
        
        &lt;p&gt;The community around Kubernetes includes a number of Special Interest Groups (SIGs) and Working Groups (WGs) facilitating discussions on important topics between interested contributors. Today we would like to announce the new &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-checkpoint-restore&#34;&gt;Kubernetes Checkpoint Restore WG&lt;/a&gt; focusing on the integration of Checkpoint/Restore functionality into Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;motivation-and-use-cases&#34;&gt;Motivation and use cases&lt;/h2&gt;
&lt;p&gt;There are several high-level scenarios discussed in the working group:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Optimizing resource utilization for interactive workloads, such as Jupyter notebooks and AI chatbots&lt;/li&gt;
&lt;li&gt;Accelerating startup of applications with long initialization times, including Java applications and &lt;a href=&#34;https://doi.org/10.1145/3731599.3767354&#34;&gt;LLM inference services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using periodic checkpointing to enable fault-tolerance for long-running workloads, such as distributed model training&lt;/li&gt;
&lt;li&gt;Providing &lt;a href=&#34;https://doi.org/10.1007/978-3-032-10507-3_3&#34;&gt;interruption-aware scheduling&lt;/a&gt; with transparent checkpoint/restore, allowing lower-priority Pods to be preempted while preserving the runtime state of applications&lt;/li&gt;
&lt;li&gt;Facilitating Pod migration across nodes for load balancing and maintenance, without disrupting workloads.&lt;/li&gt;
&lt;li&gt;Enabling forensic checkpointing to investigate and analyze security incidents such as cyberattacks, data breaches, and unauthorized access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Across these scenarios, the goal is to help facilitate discussions of ideas between the Kubernetes community and the growing Checkpoint/Restore in Userspace (CRIU) ecosystem. The CRIU community includes several projects that support these use cases, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/checkpoint-restore/criu&#34;&gt;CRIU&lt;/a&gt; - A tool for checkpointing and restoring running applications and containers&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/checkpoint-restore/checkpointctl&#34;&gt;checkpointctl&lt;/a&gt; - A tool for in-depth analysis of container checkpoints&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/checkpoint-restore/criu-coordinator&#34;&gt;criu-coordinator&lt;/a&gt; - A tool for coordinated checkpoint/restore of distributed applications with CRIU&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/checkpoint-restore/checkpoint-restore-operator&#34;&gt;checkpoint-restore-operator&lt;/a&gt; - A Kubernetes operator for managing checkpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More information about the checkpoint/restore integration with Kubernetes is also available &lt;a href=&#34;https://criu.org/Kubernetes&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;related-events&#34;&gt;Related events&lt;/h2&gt;
&lt;p&gt;Following our presentation about &lt;a href=&#34;https://sched.co/1tx7i&#34;&gt;transparent checkpointing&lt;/a&gt; at KubeCon EU 2025, we are excited to welcome you to our &lt;a href=&#34;https://sched.co/2CW6P&#34;&gt;panel discussion&lt;/a&gt; and &lt;a href=&#34;https://sched.co/2CW7Z&#34;&gt;AI + ML session&lt;/a&gt; at KubeCon + CloudNativeCon Europe 2026.&lt;/p&gt;
&lt;h2 id=&#34;connect-with-us&#34;&gt;Connect with us&lt;/h2&gt;
&lt;p&gt;If you are interested in contributing to Kubernetes or CRIU, there are several ways to participate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Join our meeting every second Thursday at 17:00 UTC via the Zoom link in our &lt;a href=&#34;https://docs.google.com/document/d/1ZMtHBibXfTw4cQerM4O4DJonzVs3W7Hp2K5ml6pTufs/edit&#34;&gt;meeting notes&lt;/a&gt;; recordings of our prior meetings are available &lt;a href=&#34;https://www.youtube.com/playlist?list=PL69nYSiGNLP1P7F40IMVL3NsNiIm5AGos&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Chat with us on the &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Kubernetes Slack&lt;/a&gt;: &lt;a href=&#34;https://kubernetes.slack.com/messages/wg-checkpoint-restore&#34;&gt;#wg-checkpoint-restore&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Email us at the &lt;a href=&#34;https://groups.google.com/a/kubernetes.io/g/wg-checkpoint-restore&#34;&gt;wg-checkpoint-restore mailing list&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Uniform API server access using clientcmd</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/19/clientcmd-apiserver-access/</link>
      <pubDate>Mon, 19 Jan 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/19/clientcmd-apiserver-access/</guid>
      <description>
        
        
        &lt;p&gt;If you&#39;ve ever wanted to develop a command line client for a Kubernetes API,
especially if you&#39;ve considered making your client usable as a &lt;code&gt;kubectl&lt;/code&gt; plugin,
you might have wondered how to make your client feel familiar to users of &lt;code&gt;kubectl&lt;/code&gt;.
A quick glance at the output of &lt;code&gt;kubectl options&lt;/code&gt; might put a damper on that:
&amp;quot;Am I really supposed to implement all those options?&amp;quot;&lt;/p&gt;
&lt;p&gt;Fear not, others have done a lot of the work involved for you.
In fact, the Kubernetes project provides two libraries to help you handle
&lt;code&gt;kubectl&lt;/code&gt;-style command line arguments in Go programs:
&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd&#34;&gt;&lt;code&gt;clientcmd&lt;/code&gt;&lt;/a&gt; and
&lt;a href=&#34;https://pkg.go.dev/k8s.io/cli-runtime&#34;&gt;&lt;code&gt;cli-runtime&lt;/code&gt;&lt;/a&gt;
(which uses &lt;code&gt;clientcmd&lt;/code&gt;).
This article will show how to use the former.&lt;/p&gt;
&lt;h2 id=&#34;general-philosophy&#34;&gt;General philosophy&lt;/h2&gt;
&lt;p&gt;As might be expected since it&#39;s part of &lt;code&gt;client-go&lt;/code&gt;,
&lt;code&gt;clientcmd&lt;/code&gt;&#39;s ultimate purpose is to provide an instance of
&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/rest#Config&#34;&gt;&lt;code&gt;restclient.Config&lt;/code&gt;&lt;/a&gt;
that can issue requests to an API server.&lt;/p&gt;
&lt;p&gt;It follows &lt;code&gt;kubectl&lt;/code&gt; semantics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;defaults are taken from &lt;code&gt;~/.kube&lt;/code&gt; or equivalent;&lt;/li&gt;
&lt;li&gt;files can be specified using the &lt;code&gt;KUBECONFIG&lt;/code&gt; environment variable;&lt;/li&gt;
&lt;li&gt;all of the above settings can be further overridden using command line arguments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It doesn&#39;t set up a &lt;code&gt;--kubeconfig&lt;/code&gt; command line argument,
which you might want to do to align with &lt;code&gt;kubectl&lt;/code&gt;;
you&#39;ll see how to do this
in the &lt;a href=&#34;#bind-the-flags&#34;&gt;&amp;quot;Bind the flags&amp;quot;&lt;/a&gt; section.&lt;/p&gt;
&lt;h2 id=&#34;available-features&#34;&gt;Available features&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;clientcmd&lt;/code&gt; allows programs to handle&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubeconfig&lt;/code&gt; selection (using &lt;code&gt;KUBECONFIG&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;context selection;&lt;/li&gt;
&lt;li&gt;namespace selection;&lt;/li&gt;
&lt;li&gt;client certificates and private keys;&lt;/li&gt;
&lt;li&gt;user impersonation;&lt;/li&gt;
&lt;li&gt;HTTP Basic authentication support (username/password).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-merging&#34;&gt;Configuration merging&lt;/h2&gt;
&lt;p&gt;In various scenarios, &lt;code&gt;clientcmd&lt;/code&gt; supports &lt;em&gt;merging&lt;/em&gt; configuration settings:
&lt;code&gt;KUBECONFIG&lt;/code&gt; can specify multiple files whose contents are combined.
This can be confusing, because settings are merged in different directions
depending on how they are implemented.
If a setting is defined in a map, the first definition wins,
subsequent definitions are ignored.
If a setting is not defined in a map, the last definition wins.&lt;/p&gt;
&lt;p&gt;When settings are retrieved using &lt;code&gt;KUBECONFIG&lt;/code&gt;,
missing files result in warnings only.
If the user explicitly specifies a path (in &lt;code&gt;--kubeconfig&lt;/code&gt; style),
there must be a corresponding file.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;KUBECONFIG&lt;/code&gt; isn&#39;t defined,
the default configuration file, &lt;code&gt;~/.kube/config&lt;/code&gt;, is used instead,
if present.&lt;/p&gt;
&lt;h3 id=&#34;overall-process&#34;&gt;Overall process&lt;/h3&gt;
&lt;p&gt;The general usage pattern is succinctly expressed in
the &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd&#34;&gt;&lt;code&gt;clientcmd&lt;/code&gt;&lt;/a&gt; package documentation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loadingRules &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;NewDefaultClientConfigLoadingRules&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// if you want to change the loading rules (which files in which order), you can do so here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;configOverrides &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;clientcmd.ConfigOverrides{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// if you want to change override values or bind them to flags, there are methods to help you
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubeConfig &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;NewNonInteractiveDeferredLoadingClientConfig&lt;/span&gt;(loadingRules, configOverrides)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config, err &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kubeConfig.&lt;span style=&#34;color:#00a000&#34;&gt;ClientConfig&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Do something
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client, err &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; metav1.&lt;span style=&#34;color:#00a000&#34;&gt;New&lt;/span&gt;(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the context of this article, there are six steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#configure-the-loading-rules&#34;&gt;Configure the loading rules&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#configure-the-overrides&#34;&gt;Configure the overrides&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#build-a-set-of-flags&#34;&gt;Build a set of flags&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#bind-the-flags&#34;&gt;Bind the flags&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#build-the-merged-configuration&#34;&gt;Build the merged configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#obtain-an-api-client&#34;&gt;Obtain an API client&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;configure-the-loading-rules&#34;&gt;Configure the loading rules&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;clientcmd.NewDefaultClientConfigLoadingRules()&lt;/code&gt; builds loading rules which will use either the contents of the &lt;code&gt;KUBECONFIG&lt;/code&gt; environment variable,
or the default configuration file name (&lt;code&gt;~/.kube/config&lt;/code&gt;).
In addition, if the default configuration file is used,
it is able to migrate settings from the (very) old default configuration file
(&lt;code&gt;~/.kube/.kubeconfig&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;You can build your own &lt;code&gt;ClientConfigLoadingRules&lt;/code&gt;,
but in most cases the defaults are fine.&lt;/p&gt;
&lt;h3 id=&#34;configure-the-overrides&#34;&gt;Configure the overrides&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;clientcmd.ConfigOverrides&lt;/code&gt; is a &lt;code&gt;struct&lt;/code&gt; storing overrides which will be applied over the settings loaded from the configuration derived using the loading rules.
In the context of this article,
its primary purpose is to store values obtained from command line arguments.
These are handled using the &lt;a href=&#34;https://github.com/spf13/pflag&#34;&gt;pflag&lt;/a&gt; library,
which is a drop-in replacement for Go&#39;s &lt;a href=&#34;https://pkg.go.dev/flag&#34;&gt;&lt;code&gt;flag&lt;/code&gt;&lt;/a&gt; package,
adding support for double-hyphen arguments with long names.&lt;/p&gt;
&lt;p&gt;In most cases there&#39;s nothing to set in the overrides;
I will only bind them to flags.&lt;/p&gt;
&lt;h3 id=&#34;build-a-set-of-flags&#34;&gt;Build a set of flags&lt;/h3&gt;
&lt;p&gt;In this context, a flag is a representation of a command line argument,
specifying its long name (such as &lt;code&gt;--namespace&lt;/code&gt;),
its short name if any (such as &lt;code&gt;-n&lt;/code&gt;),
its default value,
and a description shown in the usage information.
Flags are stored in instances of
the &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#FlagInfo&#34;&gt;&lt;code&gt;FlagInfo&lt;/code&gt;&lt;/a&gt; struct.&lt;/p&gt;
&lt;p&gt;Three sets of flags are available,
representing the following command line arguments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;authentication arguments (certificates, tokens, impersonations, username/password);&lt;/li&gt;
&lt;li&gt;cluster arguments (API server, certificate authority, TLS configuration, proxy, compression)&lt;/li&gt;
&lt;li&gt;context arguments (cluster name, &lt;code&gt;kubeconfig&lt;/code&gt; user name, namespace)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The recommended selection includes all three with a named context selection argument and a timeout argument.&lt;/p&gt;
&lt;p&gt;These are all available using the &lt;code&gt;Recommended…Flags&lt;/code&gt; functions.
The functions take a prefix, which is prepended to all the argument long names.&lt;/p&gt;
&lt;p&gt;So calling
&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#RecommendedConfigOverrideFlags&#34;&gt;&lt;code&gt;clientcmd.RecommendedConfigOverrideFlags(&amp;quot;&amp;quot;)&lt;/code&gt;&lt;/a&gt;
results in command line arguments such as &lt;code&gt;--context&lt;/code&gt;, &lt;code&gt;--namespace&lt;/code&gt;, and so on.
The &lt;code&gt;--timeout&lt;/code&gt; argument is given a default value of 0,
and the &lt;code&gt;--namespace&lt;/code&gt; argument has a corresponding short variant, &lt;code&gt;-n&lt;/code&gt;.
Adding a prefix, such as &lt;code&gt;&amp;quot;from-&amp;quot;&lt;/code&gt;, results in command line arguments such as
&lt;code&gt;--from-context&lt;/code&gt;, &lt;code&gt;--from-namespace&lt;/code&gt;, etc.
This might not seem particularly useful on commands involving a single API server,
but they come in handy when multiple API servers are involved,
such as in multi-cluster scenarios.&lt;/p&gt;
&lt;p&gt;There&#39;s a potential gotcha here: prefixes don&#39;t modify the short name,
so &lt;code&gt;--namespace&lt;/code&gt; needs some care if multiple prefixes are used:
only one of the prefixes can be associated with the &lt;code&gt;-n&lt;/code&gt; short name.
You&#39;ll have to clear the short names associated with the other prefixes&#39;
&lt;code&gt;--namespace&lt;/code&gt; , or perhaps all prefixes if there&#39;s no sensible
&lt;code&gt;-n&lt;/code&gt; association.
Short names can be cleared as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kflags &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;RecommendedConfigOverrideFlags&lt;/span&gt;(prefix)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kflags.ContextOverrideFlags.Namespace.ShortName = &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In a similar fashion, flags can be disabled entirely by clearing their long name:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kflags.ContextOverrideFlags.Namespace.LongName = &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;bind-the-flags&#34;&gt;Bind the flags&lt;/h3&gt;
&lt;p&gt;Once a set of flags has been defined,
it can be used to bind command line arguments to overrides using
&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#BindOverrideFlags&#34;&gt;&lt;code&gt;clientcmd.BindOverrideFlags&lt;/code&gt;&lt;/a&gt;.
This requires a
&lt;a href=&#34;https://pkg.go.dev/github.com/spf13/pflag&#34;&gt;&lt;code&gt;pflag&lt;/code&gt;&lt;/a&gt; &lt;code&gt;FlagSet&lt;/code&gt;
rather than one from Go&#39;s &lt;code&gt;flag&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;If you also want to bind &lt;code&gt;--kubeconfig&lt;/code&gt;, you should do so now,
by binding &lt;code&gt;ExplicitPath&lt;/code&gt; in the loading rules:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags.&lt;span style=&#34;color:#00a000&#34;&gt;StringVarP&lt;/span&gt;(&lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;loadingRules.ExplicitPath, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kubeconfig&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;absolute path(s) to the kubeconfig file(s)&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;build-the-merged-configuration&#34;&gt;Build the merged configuration&lt;/h3&gt;
&lt;p&gt;Two functions are available to build a merged configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#NewInteractiveDeferredLoadingClientConfig&#34;&gt;&lt;code&gt;clientcmd.NewInteractiveDeferredLoadingClientConfig&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#NewNonInteractiveDeferredLoadingClientConfig&#34;&gt;&lt;code&gt;clientcmd.NewNonInteractiveDeferredLoadingClientConfig&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As the names suggest, the difference between the two is that the first
can ask for authentication information interactively,
using a provided reader,
whereas the second only operates on the information given to it by the caller.&lt;/p&gt;
&lt;p&gt;The &amp;quot;deferred&amp;quot; mention in these function names refers to the fact that
the final configuration will be determined as late as possible.
This means that these functions can be called before the command line arguments are parsed,
and the resulting configuration will use whatever values have been parsed
by the time it&#39;s actually constructed.&lt;/p&gt;
&lt;h3 id=&#34;obtain-an-api-client&#34;&gt;Obtain an API client&lt;/h3&gt;
&lt;p&gt;The merged configuration is returned as a
&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#ClientConfig&#34;&gt;&lt;code&gt;ClientConfig&lt;/code&gt;&lt;/a&gt; instance.
An API client can be obtained from that by calling the &lt;code&gt;ClientConfig()&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;If no configuration is given
(&lt;code&gt;KUBECONFIG&lt;/code&gt; is empty or points to non-existent files,
&lt;code&gt;~/.kube/config&lt;/code&gt; doesn&#39;t exist,
and no configuration is given using command line arguments),
the default setup will return an obscure error referring to &lt;code&gt;KUBERNETES_MASTER&lt;/code&gt;.
This is legacy behaviour;
several attempts have been made to get rid of it,
but it is preserved for the &lt;code&gt;--local&lt;/code&gt; and &lt;code&gt;--dry-run&lt;/code&gt; command line arguments in &lt;code&gt;--kubectl&lt;/code&gt;.
You should check for &amp;quot;empty configuration&amp;quot; errors by calling &lt;code&gt;clientcmd.IsEmptyConfig()&lt;/code&gt;
and provide a more explicit error message.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Namespace()&lt;/code&gt; method is also useful:
it returns the namespace that should be used.
It also indicates whether the namespace was overridden by the user
(using &lt;code&gt;--namespace&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;full-example&#34;&gt;Full example&lt;/h2&gt;
&lt;p&gt;Here&#39;s a complete example.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;context&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;github.com/spf13/pflag&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	v1 &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;k8s.io/apimachinery/pkg/apis/meta/v1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;k8s.io/client-go/kubernetes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;k8s.io/client-go/tools/clientcmd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Loading rules, no configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;	loadingRules &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;NewDefaultClientConfigLoadingRules&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Overrides and flag (command line argument) setup
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;	configOverrides &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;clientcmd.ConfigOverrides{}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	flags &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; pflag.&lt;span style=&#34;color:#00a000&#34;&gt;NewFlagSet&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;clientcmddemo&amp;#34;&lt;/span&gt;, pflag.ExitOnError)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;BindOverrideFlags&lt;/span&gt;(configOverrides, flags,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;RecommendedConfigOverrideFlags&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	flags.&lt;span style=&#34;color:#00a000&#34;&gt;StringVarP&lt;/span&gt;(&lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;loadingRules.ExplicitPath, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kubeconfig&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;absolute path(s) to the kubeconfig file(s)&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	flags.&lt;span style=&#34;color:#00a000&#34;&gt;Parse&lt;/span&gt;(os.Args)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Client construction
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;	kubeConfig &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;NewNonInteractiveDeferredLoadingClientConfig&lt;/span&gt;(loadingRules, configOverrides)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	config, err &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kubeConfig.&lt;span style=&#34;color:#00a000&#34;&gt;ClientConfig&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; clientcmd.&lt;span style=&#34;color:#00a000&#34;&gt;IsEmptyConfig&lt;/span&gt;(err) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#a2f&#34;&gt;panic&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Please provide a configuration pointing to the Kubernetes API server&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a2f&#34;&gt;panic&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	client, err &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kubernetes.&lt;span style=&#34;color:#00a000&#34;&gt;NewForConfig&lt;/span&gt;(config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a2f&#34;&gt;panic&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// How to find out what namespace to use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;	namespace, overridden, err &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; kubeConfig.&lt;span style=&#34;color:#00a000&#34;&gt;Namespace&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a2f&#34;&gt;panic&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt.&lt;span style=&#34;color:#00a000&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Chosen namespace: %s; overridden: %t\n&amp;#34;&lt;/span&gt;, namespace, overridden)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Let&amp;#39;s use the client
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;	nodeList, err &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; client.&lt;span style=&#34;color:#00a000&#34;&gt;CoreV1&lt;/span&gt;().&lt;span style=&#34;color:#00a000&#34;&gt;Nodes&lt;/span&gt;().&lt;span style=&#34;color:#00a000&#34;&gt;List&lt;/span&gt;(context.&lt;span style=&#34;color:#00a000&#34;&gt;TODO&lt;/span&gt;(), v1.ListOptions{})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; err &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a2f&#34;&gt;panic&lt;/span&gt;(err)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;for&lt;/span&gt; _, node &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;range&lt;/span&gt; nodeList.Items {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		fmt.&lt;span style=&#34;color:#00a000&#34;&gt;Println&lt;/span&gt;(node.Name)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Happy coding, and thank you for your interest in implementing tools with
familiar usage patterns!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Restricting executables invoked by kubeconfigs via exec plugin allowList added to kuberc</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/09/kubernetes-v1-35-kuberc-credential-plugin-allowlist/</link>
      <pubDate>Fri, 09 Jan 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/09/kubernetes-v1-35-kuberc-credential-plugin-allowlist/</guid>
      <description>
        
        
        &lt;p&gt;Did you know that &lt;code&gt;kubectl&lt;/code&gt; can run arbitrary executables, including shell
scripts, with the full privileges of the invoking user, and without your
knowledge? Whenever you download or auto-generate a &lt;code&gt;kubeconfig&lt;/code&gt;, the
&lt;code&gt;users[n].exec.command&lt;/code&gt; field can specify an executable to fetch credentials on
your behalf. Don&#39;t get me wrong, this is an incredible feature that allows you
to authenticate to the cluster with external identity providers. Nevertheless,
you probably see the problem: Do you know exactly what executables your &lt;code&gt;kubeconfig&lt;/code&gt;
is running on your system? Do you trust the pipeline that generated your &lt;code&gt;kubeconfig&lt;/code&gt;?
If there has been a supply-chain attack on the code that generates the kubeconfig,
or if the generating pipeline has been compromised, an attacker might well be
doing unsavory things to your machine by tricking your &lt;code&gt;kubeconfig&lt;/code&gt; into running
arbitrary code.&lt;/p&gt;
&lt;p&gt;To give the user more control over what gets run on their system, &lt;a href=&#34;https://git.k8s.io/community/sig-auth&#34;&gt;SIG-Auth&lt;/a&gt; and &lt;a href=&#34;https://git.k8s.io/community/sig-cli&#34;&gt;SIG-CLI&lt;/a&gt; added the credential plugin policy and allowlist as a beta feature to
Kubernetes 1.35. This is available to all clients using the &lt;code&gt;client-go&lt;/code&gt; library,
by filling out the &lt;a href=&#34;https://github.com/kubernetes/client-go/blob/master/tools/clientcmd/api/types.go#L290&#34;&gt;ExecProvider.PluginPolicy&lt;/a&gt; struct on a REST config. To
broaden the impact of this change, Kubernetes v1.35 also lets you manage this without
writing a line of application code. You can configure &lt;code&gt;kubectl&lt;/code&gt; to enforce
the policy and allowlist by adding two fields to the &lt;code&gt;kuberc&lt;/code&gt; configuration
file: &lt;code&gt;credentialPluginPolicy&lt;/code&gt; and &lt;code&gt;credentialPluginAllowlist&lt;/code&gt;. Adding one or
both of these fields restricts which credential plugins &lt;code&gt;kubectl&lt;/code&gt; is allowed to execute.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;A full description of this functionality is available in our &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/kuberc/&#34;&gt;official documentation&lt;/a&gt; for kuberc,
but this blog post will give a brief overview of the new security knobs. The new
features are in beta and available without using any feature gates.&lt;/p&gt;
&lt;p&gt;The following example is the simplest one: simply don&#39;t specify the new fields.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubectl.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Preference&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will keep &lt;code&gt;kubectl&lt;/code&gt; acting as it always has, and all plugins will be
allowed.&lt;/p&gt;
&lt;p&gt;The next example is functionally identical, but it is more explicit and
therefore preferred if it&#39;s actually what you want:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubectl.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Preference&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;credentialPluginPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;AllowAll&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you &lt;em&gt;don&#39;t know&lt;/em&gt; whether or not you&#39;re using exec credential plugins, try
setting your policy to &lt;code&gt;DenyAll&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubectl.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Preference&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;credentialPluginPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;DenyAll&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you &lt;em&gt;are&lt;/em&gt; using credential plugins, you&#39;ll quickly find out what &lt;code&gt;kubectl&lt;/code&gt; is
trying to execute. You&#39;ll get an error like the following.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unable to connect to the server: getting credentials: plugin &amp;quot;cloudco-login&amp;quot; not allowed: policy set to &amp;quot;DenyAll&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If there is insufficient information for you to debug the issue, increase the
logging verbosity when you run your next command.  For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# increase or decrease verbosity if the issue is still unclear&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods --verbosity &lt;span style=&#34;color:#666&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;selectively-allowing-plugins&#34;&gt;Selectively allowing plugins&lt;/h3&gt;
&lt;p&gt;What if you need the &lt;code&gt;cloudco-login&lt;/code&gt; plugin to do your daily work? That is why
there&#39;s a third option for your policy, &lt;code&gt;Allowlist&lt;/code&gt;. To allow a specific plugin,
set the policy and add the &lt;code&gt;credentialPluginAllowlist&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubectl.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Preference&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;credentialPluginPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Allowlist&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;credentialPluginAllowlist&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;/usr/local/bin/cloudco-login&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;get-identity&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&#39;ll notice that there are two entries in the allowlist. One of them is
specified by full path, and the other, &lt;code&gt;get-identity&lt;/code&gt; is just a basename. When
you specify just the basename, the full path will be looked up using
&lt;code&gt;exec.LookPath&lt;/code&gt;, which does not expand globbing or handle wildcards.
Globbing is not supported at this time. Both forms
(basename and full path) are acceptable, but the full path is preferable because
it narrows the scope of allowed binaries even further.&lt;/p&gt;
&lt;h3 id=&#34;future-enhancements&#34;&gt;Future enhancements&lt;/h3&gt;
&lt;p&gt;Currently, an allowlist entry has only one field, &lt;code&gt;name&lt;/code&gt;. In the future, we
(Kubernetes SIG CLI) want to see other requirements added. One idea that seems
useful is checksum verification whereby, for example, a binary would only be allowed
to run if it has the sha256 sum
&lt;code&gt;b9a3fad00d848ff31960c44ebb5f8b92032dc085020f857c98e32a5d5900ff9c&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt;
exists at the path &lt;code&gt;/usr/bin/cloudco-login&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Another possibility is only allowing binaries that have been signed by one of a
set of a trusted signing keys.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;The credential plugin policy is still under development and we are very interested
in your feedback. We&#39;d love to hear what you like about it and what problems
you&#39;d like to see it solve. Or, if you have the cycles to contribute one of the
above enhancements, they&#39;d be a great way to get started contributing to
Kubernetes. Feel free to join in the discussion on slack:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.slack.com/archives/C2GL57FJ4&#34;&gt;#sig-cli&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.slack.com/archives/C0EN96KUY&#34;&gt;#sig-auth&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Mutable PersistentVolume Node Affinity (alpha)</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/08/kubernetes-v1-35-mutable-pv-nodeaffinity/</link>
      <pubDate>Thu, 08 Jan 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/08/kubernetes-v1-35-mutable-pv-nodeaffinity/</guid>
      <description>
        
        
        &lt;p&gt;The PersistentVolume &lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/persistent-volumes/#node-affinity&#34;&gt;node affinity&lt;/a&gt; API
dates back to Kubernetes v1.10.
It is widely used to express that volumes may not be equally accessible by all nodes in the cluster.
This field was previously immutable,
and it is now mutable in Kubernetes v1.35 (alpha). This change opens a door to more flexible online volume management.&lt;/p&gt;
&lt;h2 id=&#34;why-make-node-affinity-mutable&#34;&gt;Why make node affinity mutable?&lt;/h2&gt;
&lt;p&gt;This raises an obvious question: why make node affinity mutable now?
While stateless workloads like Deployments can be changed freely
and the changes will be rolled out automatically by re-creating every Pod,
PersistentVolumes (PVs) are stateful and cannot be re-created easily without losing data.&lt;/p&gt;
&lt;p&gt;However, Storage providers evolve and storage requirements change.
Most notably, multiple providers are offering regional disks now.
Some of them even support live migration from zonal to regional disks, without disrupting the workloads.
This change can be expressed through the
&lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/&#34;&gt;VolumeAttributesClass&lt;/a&gt; API,
which recently graduated to GA in 1.34.
However, even if the volume is migrated to regional storage,
Kubernetes still prevents scheduling Pods to other zones because of the node affinity recorded in the PV object.
In this case, you may want to change the PV node affinity from:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeAffinity&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;required&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeSelectorTerms&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matchExpressions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;topology.kubernetes.io/zone&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;In&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;values&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;- us-east1-b&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeAffinity&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;required&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeSelectorTerms&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matchExpressions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;topology.kubernetes.io/region&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;In&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;values&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;- us-east1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As another example, providers sometimes offer new generations of disks.
New disks cannot always be attached to older nodes in the cluster.
This accessibility can also be expressed through PV node affinity and ensures the Pods can be scheduled to the right nodes.
But when the disk is upgraded, new Pods using this disk can still be scheduled to older nodes.
To prevent this, you may want to change the PV node affinity from:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeAffinity&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;required&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeSelectorTerms&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matchExpressions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;provider.com/disktype.gen1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;In&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;values&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;- available&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeAffinity&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;required&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodeSelectorTerms&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matchExpressions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;provider.com/disktype.gen2&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;In&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;values&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;- available&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, it is mutable now, a first step towards a more flexible online volume management.
While it is a simple change that removes one validation from the API server,
we still have a long way to go to integrate well with the Kubernetes ecosystem.&lt;/p&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Try it out&lt;/h2&gt;
&lt;p&gt;This feature is for you if you are a Kubernetes cluster administrator,
and your storage provider allows online update that you want to utilize,
but those updates can affect the accessibility of the volume.&lt;/p&gt;
&lt;p&gt;Note that changing PV node affinity alone will not actually change the accessibility of the underlying volume.
Before using this feature,
you must first update the underlying volume in the storage provider,
and understand which nodes can access the volume after the update.
You can then enable this feature and keep the PV node affinity in sync.&lt;/p&gt;
&lt;p&gt;Currently, this feature is in alpha state.
It is disabled by default, and may subject to change.
To try it out, enable the &lt;code&gt;MutablePVNodeAffinity&lt;/code&gt; feature gate on APIServer, then you can edit the PV &lt;code&gt;spec.nodeAffinity&lt;/code&gt; field.
Typically only administrators can edit PVs, please make sure you have the right RBAC permissions.&lt;/p&gt;
&lt;h3 id=&#34;race-condition-between-updating-and-scheduling&#34;&gt;Race condition between updating and scheduling&lt;/h3&gt;
&lt;p&gt;There are only a few factors outside of a Pod that can affect the scheduling decision, and PV node affinity is one of them.
It is fine to allow more nodes to access the volume by relaxing node affinity,
but there is a race condition when you try to tighten node affinity:
it is unclear how the Scheduler will see the modified PV in its cache,
so there is a small window where the scheduler may place a Pod on an old node that can no longer access the volume.
In this case, the Pod will stuck at &lt;code&gt;ContainerCreating&lt;/code&gt; state.&lt;/p&gt;
&lt;p&gt;One mitigation currently under discussion is for the kubelet to fail Pod startup if the PersistentVolume’s node affinity is violated.
This has not landed yet.
So if you are trying this out now, please watch subsequent Pods that use the updated PV,
and make sure they are scheduled onto nodes that can access the volume.
If you update PV and immediately start new Pods in a script, it may not work as intended.&lt;/p&gt;
&lt;h2 id=&#34;future-integration-with-csi-container-storage-interface&#34;&gt;Future integration with CSI (Container Storage Interface)&lt;/h2&gt;
&lt;p&gt;Currently, it is up to the cluster administrator to modify both PV&#39;s node affinity and the underlying volume in the storage provider.
But manual operations are error-prone and time-consuming.
It is preferred to eventually integrate this with VolumeAttributesClass,
so that an unprivileged user can modify their PersistentVolumeClaim (PVC) to trigger storage-side updates,
and PV node affinity is updated automatically when appropriate, without the need for cluster admin&#39;s intervention.&lt;/p&gt;
&lt;h2 id=&#34;we-welcome-your-feedback-from-users-and-storage-driver-developers&#34;&gt;We welcome your feedback from users and storage driver developers&lt;/h2&gt;
&lt;p&gt;As noted earlier, this is only a first step.&lt;/p&gt;
&lt;p&gt;If you are a Kubernetes user,
we would like to learn how you use (or will use) PV node affinity.
Is it beneficial to update it online in your case?&lt;/p&gt;
&lt;p&gt;If you are a CSI driver developer,
would you be willing to implement this feature? How would you like the API to look?&lt;/p&gt;
&lt;p&gt;Please provide your feedback via:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack channel &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-storage&#34;&gt;#sig-storage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mailing list &lt;a href=&#34;https://groups.google.com/a/kubernetes.io/g/sig-storage&#34;&gt;kubernetes-sig-storage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The KEP issue &lt;a href=&#34;https://kep.k8s.io/5381&#34;&gt;Mutable PersistentVolume Node Affinity&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For any inquiries or specific questions related to this feature, please reach out to the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;SIG Storage community&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: A Better Way to Pass Service Account Tokens to CSI Drivers</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/07/kubernetes-v1-35-csi-sa-tokens-secrets-field-beta/</link>
      <pubDate>Wed, 07 Jan 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/07/kubernetes-v1-35-csi-sa-tokens-secrets-field-beta/</guid>
      <description>
        
        
        &lt;p&gt;If you maintain a CSI driver that uses service account tokens,
Kubernetes v1.35 brings a refinement you&#39;ll want to know about.
Since the introduction of the &lt;a href=&#34;https://kubernetes-csi.github.io/docs/token-requests.html&#34;&gt;TokenRequests feature&lt;/a&gt;,
service account tokens requested by CSI drivers have been passed to them through the &lt;code&gt;volume_context&lt;/code&gt; field.
While this has worked, it&#39;s not the ideal place for sensitive information,
and we&#39;ve seen instances where tokens were accidentally logged in CSI drivers.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 introduces a beta solution to address this:
&lt;em&gt;CSI Driver Opt-in for Service Account Tokens via Secrets Field&lt;/em&gt;.
This allows CSI drivers to receive service account tokens
through the &lt;code&gt;secrets&lt;/code&gt; field in &lt;code&gt;NodePublishVolumeRequest&lt;/code&gt;,
which is the appropriate place for sensitive data in the CSI specification.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-existing-approach&#34;&gt;Understanding the existing approach&lt;/h2&gt;
&lt;p&gt;When CSI drivers use the &lt;a href=&#34;https://kubernetes-csi.github.io/docs/token-requests.html&#34;&gt;TokenRequests feature&lt;/a&gt;,
they can request service account tokens for workload identity
by configuring the &lt;code&gt;TokenRequests&lt;/code&gt; field in the CSIDriver spec.
These tokens are passed to drivers as part of the volume attributes map,
using the key &lt;code&gt;csi.storage.k8s.io/serviceAccount.tokens&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;volume_context&lt;/code&gt; field works, but it&#39;s not designed for sensitive data.
Because of this, there are a few challenges:&lt;/p&gt;
&lt;p&gt;First, the &lt;a href=&#34;https://github.com/kubernetes-csi/csi-lib-utils/tree/master/protosanitizer&#34;&gt;&lt;code&gt;protosanitizer&lt;/code&gt;&lt;/a&gt; tool that CSI drivers use doesn&#39;t treat volume context as sensitive,
so service account tokens can end up in logs when gRPC requests are logged.
This happened with &lt;a href=&#34;https://github.com/kubernetes-sigs/secrets-store-csi-driver/security/advisories/GHSA-g82w-58jf-gcxx&#34;&gt;CVE-2023-2878&lt;/a&gt; in the Secrets Store CSI Driver
and &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/124759&#34;&gt;CVE-2024-3744&lt;/a&gt; in the Azure File CSI Driver.&lt;/p&gt;
&lt;p&gt;Second, each CSI driver that wants to avoid this issue needs to implement its own sanitization logic,
which leads to inconsistency across drivers.&lt;/p&gt;
&lt;p&gt;The CSI specification already has a &lt;code&gt;secrets&lt;/code&gt; field in &lt;code&gt;NodePublishVolumeRequest&lt;/code&gt;
that&#39;s designed exactly for this kind of sensitive information.
The challenge is that we can&#39;t just change where we put the tokens
without breaking existing CSI drivers that expect them in volume context.&lt;/p&gt;
&lt;h2 id=&#34;how-the-opt-in-mechanism-works&#34;&gt;How the opt-in mechanism works&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 introduces an opt-in mechanism that lets CSI drivers choose
how they receive service account tokens.
This way, existing drivers continue working as they do today,
and drivers can move to the more appropriate secrets field when they&#39;re ready.&lt;/p&gt;
&lt;p&gt;CSI drivers can set a new field in their CSIDriver spec:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# CAUTION: this is an example configuration.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#          Do not use this for your own cluster!&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;storage.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CSIDriver&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;example-csi-driver&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# ... existing fields ...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tokenRequests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;audience&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;expirationSeconds&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3600&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# New field for opting into secrets delivery&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;serviceAccountTokenInSecrets&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# defaults to false&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The behavior depends on the &lt;code&gt;serviceAccountTokenInSecrets&lt;/code&gt; field:&lt;/p&gt;
&lt;p&gt;When set to &lt;code&gt;false&lt;/code&gt; (the default), tokens are placed in &lt;code&gt;VolumeContext&lt;/code&gt; with the key &lt;code&gt;csi.storage.k8s.io/serviceAccount.tokens&lt;/code&gt;, just like today.
When set to &lt;code&gt;true&lt;/code&gt;, tokens are placed only in the &lt;code&gt;Secrets&lt;/code&gt; field with the same key.&lt;/p&gt;
&lt;h2 id=&#34;about-the-beta-release&#34;&gt;About the beta release&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;CSIServiceAccountTokenSecrets&lt;/code&gt; feature gate is enabled by default
on both kubelet and kube-apiserver.
Since the &lt;code&gt;serviceAccountTokenInSecrets&lt;/code&gt; field defaults to &lt;code&gt;false&lt;/code&gt;,
enabling the feature gate doesn&#39;t change any existing behavior.
All drivers continue receiving tokens via volume context unless they explicitly opt in.
This is why we felt comfortable starting at beta rather than alpha.&lt;/p&gt;
&lt;h2 id=&#34;guide-for-csi-driver-authors&#34;&gt;Guide for CSI driver authors&lt;/h2&gt;
&lt;p&gt;If you maintain a CSI driver that uses service account tokens, here&#39;s how to adopt this feature.&lt;/p&gt;
&lt;h3 id=&#34;adding-fallback-logic&#34;&gt;Adding fallback logic&lt;/h3&gt;
&lt;p&gt;First, update your driver code to check both locations for tokens.
This makes your driver compatible with both the old and new approaches:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;const&lt;/span&gt; serviceAccountTokenKey = &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;csi.storage.k8s.io/serviceAccount.tokens&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#00a000&#34;&gt;getServiceAccountTokens&lt;/span&gt;(req &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;csi.NodePublishVolumeRequest) (&lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;string&lt;/span&gt;, &lt;span style=&#34;color:#0b0;font-weight:bold&#34;&gt;error&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Check secrets field first (new behavior when driver opts in)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; tokens, ok &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; req.Secrets[serviceAccountTokenKey]; ok {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; tokens, &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Fall back to volume context (existing behavior)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;if&lt;/span&gt; tokens, ok &lt;span style=&#34;color:#666&#34;&gt;:=&lt;/span&gt; req.VolumeContext[serviceAccountTokenKey]; ok {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; tokens, &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, fmt.&lt;span style=&#34;color:#00a000&#34;&gt;Errorf&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;service account tokens not found&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This fallback logic is backward compatible and safe to ship in any driver version,
even before clusters upgrade to v1.35.&lt;/p&gt;
&lt;h3 id=&#34;rollout-sequence&#34;&gt;Rollout sequence&lt;/h3&gt;
&lt;p&gt;CSI driver authors need to follow a specific sequence when adopting this feature to avoid breaking existing volumes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Driver preparation&lt;/strong&gt; (can happen anytime)&lt;/p&gt;
&lt;p&gt;You can start preparing your driver right away by adding fallback logic that checks both the secrets field and volume context for tokens.
This code change is backward compatible and safe to ship in any driver version, even before clusters upgrade to v1.35.
We encourage you to add this fallback logic early, cut releases, and even backport to maintenance branches where feasible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cluster upgrade and feature enablement&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once your driver has the fallback logic deployed, here&#39;s the safe rollout order for enabling the feature in a cluster:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Complete the kube-apiserver upgrade to 1.35 or later&lt;/li&gt;
&lt;li&gt;Complete kubelet upgrade to 1.35 or later on all nodes&lt;/li&gt;
&lt;li&gt;Ensure CSI driver version with fallback logic is deployed (if not already done in preparation phase)&lt;/li&gt;
&lt;li&gt;Fully complete CSI driver DaemonSet rollout across all nodes&lt;/li&gt;
&lt;li&gt;Update your CSIDriver manifest to set &lt;code&gt;serviceAccountTokenInSecrets: true&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;important-constraints&#34;&gt;Important constraints&lt;/h3&gt;
&lt;p&gt;The most important thing to remember is timing.
If your CSI driver DaemonSet and CSIDriver object are in the same manifest or Helm chart,
you need two separate updates.
Deploy the new driver version with fallback logic first,
wait for the DaemonSet rollout to complete,
then update the CSIDriver spec to set &lt;code&gt;serviceAccountTokenInSecrets: true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Also, don&#39;t update the CSIDriver before all driver pods have rolled out.
If you do, volume mounts will fail on nodes still running the old driver version,
since those pods only check volume context.&lt;/p&gt;
&lt;h2 id=&#34;why-this-matters&#34;&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;Adopting this feature helps in a few ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It eliminates the risk of accidentally logging service account tokens as part of volume context in gRPC requests&lt;/li&gt;
&lt;li&gt;It uses the CSI specification&#39;s designated field for sensitive data, which feels right&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;protosanitizer&lt;/code&gt; tool automatically handles the secrets field correctly, so you don&#39;t need driver-specific workarounds&lt;/li&gt;
&lt;li&gt;It&#39;s opt-in, so you can migrate at your own pace without breaking existing deployments&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;call-to-action&#34;&gt;Call to action&lt;/h2&gt;
&lt;p&gt;We (Kubernetes SIG Storage) encourage CSI driver authors to adopt this feature and provide feedback
on the migration experience.
If you have thoughts on the API design or run into any issues during adoption,
please reach out to us on the
&lt;a href=&#34;https://kubernetes.slack.com/archives/C8EJ01Z46&#34;&gt;#csi&lt;/a&gt; channel on Kubernetes Slack
(for an invitation, visit &lt;a href=&#34;https://slack.k8s.io/&#34;&gt;https://slack.k8s.io/&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;You can follow along on
&lt;a href=&#34;https://kep.k8s.io/5538&#34;&gt;KEP-5538&lt;/a&gt;
to track progress across the coming Kubernetes releases.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Extended Toleration Operators to Support Numeric Comparisons (Alpha)</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/05/kubernetes-v1-35-numeric-toleration-operators/</link>
      <pubDate>Mon, 05 Jan 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/05/kubernetes-v1-35-numeric-toleration-operators/</guid>
      <description>
        
        
        &lt;p&gt;Many production Kubernetes clusters blend on-demand (higher-SLA) and spot/preemptible (lower-SLA) nodes to optimize costs while maintaining reliability for critical workloads. Platform teams need a safe default that keeps most workloads away from risky capacity, while allowing specific workloads to opt-in with explicit thresholds like &amp;quot;I can tolerate nodes with failure probability up to 5%&amp;quot;.&lt;/p&gt;
&lt;p&gt;Today, Kubernetes taints and tolerations can match exact values or check for existence, but they can&#39;t compare numeric thresholds. You&#39;d need to create discrete taint categories, use external admission controllers, or accept less-than-optimal placement decisions.&lt;/p&gt;
&lt;p&gt;In Kubernetes v1.35, we&#39;re introducing &lt;strong&gt;Extended Toleration Operators&lt;/strong&gt; as an alpha feature. This enhancement adds &lt;code&gt;Gt&lt;/code&gt; (Greater Than) and &lt;code&gt;Lt&lt;/code&gt; (Less Than) operators to &lt;code&gt;spec.tolerations&lt;/code&gt;, enabling threshold-based scheduling decisions that unlock new possibilities for SLA-based placement, cost optimization, and performance-aware workload distribution.&lt;/p&gt;
&lt;h2 id=&#34;the-evolution-of-tolerations&#34;&gt;The evolution of tolerations&lt;/h2&gt;
&lt;p&gt;Historically, Kubernetes supported two primary toleration operators:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Equal&lt;/code&gt;&lt;/strong&gt;: The toleration matches a taint if the key and value are exactly equal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Exists&lt;/code&gt;&lt;/strong&gt;: The toleration matches a taint if the key exists, regardless of value&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While these worked well for categorical scenarios, they fell short for numeric comparisons. Starting with v1.35, we are closing this gap.&lt;/p&gt;
&lt;p&gt;Consider these real-world scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLA requirements&lt;/strong&gt;: Schedule high-availability workloads only on nodes with failure probability below a certain threshold&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost optimization&lt;/strong&gt;: Allow cost-sensitive batch jobs to run on cheaper nodes that exceed a specific cost-per-hour value&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance guarantees&lt;/strong&gt;: Ensure latency-sensitive applications run only on nodes with disk IOPS or network bandwidth above minimum thresholds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without numeric comparison operators, cluster operators have had to resort to workarounds like creating multiple discrete taint values or using external admission controllers, neither of which scale well or provide the flexibility needed for dynamic threshold-based scheduling.&lt;/p&gt;
&lt;h2 id=&#34;why-extend-tolerations-instead-of-using-nodeaffinity&#34;&gt;Why extend tolerations instead of using NodeAffinity?&lt;/h2&gt;
&lt;p&gt;You might wonder: NodeAffinity already supports numeric comparison operators, so why extend tolerations? While NodeAffinity is powerful for expressing pod preferences, taints and tolerations provide critical operational benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Policy orientation&lt;/strong&gt;: NodeAffinity is per-pod, requiring every workload to explicitly opt-out of risky nodes. Taints invert control—nodes declare their risk level, and only pods with matching tolerations may land there. This provides a safer default; most pods stay away from spot/preemptible nodes unless they explicitly opt-in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eviction semantics&lt;/strong&gt;: NodeAffinity has no eviction capability. Taints support the &lt;code&gt;NoExecute&lt;/code&gt; effect with &lt;code&gt;tolerationSeconds&lt;/code&gt;, enabling operators to drain and evict pods when a node&#39;s SLA degrades or spot instances receive termination notices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational ergonomics&lt;/strong&gt;: Centralized, node-side policy is consistent with other safety taints like disk-pressure and memory-pressure, making cluster management more intuitive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This enhancement preserves the well-understood safety model of taints and tolerations while enabling threshold-based placement for SLA-aware scheduling.&lt;/p&gt;
&lt;h2 id=&#34;introducing-gt-and-lt-operators&#34;&gt;Introducing Gt and Lt operators&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 introduces two new operators for tolerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Gt&lt;/code&gt; (Greater Than)&lt;/strong&gt;: The toleration matches if the taint&#39;s numeric value is greater than the toleration&#39;s value&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Lt&lt;/code&gt; (Less Than)&lt;/strong&gt;: The toleration matches if the taint&#39;s numeric value is less than the toleration&#39;s value&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a pod tolerates a taint with &lt;code&gt;Lt&lt;/code&gt;, it&#39;s saying &amp;quot;I can tolerate nodes where this metric is &lt;em&gt;less than&lt;/em&gt; my threshold&amp;quot;. Since tolerations allow scheduling, the pod can run on nodes where the taint value is greater than the toleration value. Think of it as: &amp;quot;I tolerate nodes that are above my minimum requirements&amp;quot;.&lt;/p&gt;
&lt;p&gt;These operators work with numeric taint values and enable the scheduler to make sophisticated placement decisions based on continuous metrics rather than discrete categories.&lt;/p&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Note:&lt;/h4&gt;&lt;p&gt;Numeric values for &lt;code&gt;Gt&lt;/code&gt; and &lt;code&gt;Lt&lt;/code&gt; operators must be positive 64-bit integers without leading zeros. For example, &lt;code&gt;&amp;quot;100&amp;quot;&lt;/code&gt; is valid, but &lt;code&gt;&amp;quot;0100&amp;quot;&lt;/code&gt; (with leading zero) and &lt;code&gt;&amp;quot;0&amp;quot;&lt;/code&gt; (zero value) are not permitted.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Gt&lt;/code&gt; and &lt;code&gt;Lt&lt;/code&gt; operators work with all taint effects: &lt;code&gt;NoSchedule&lt;/code&gt;, &lt;code&gt;NoExecute&lt;/code&gt;, and &lt;code&gt;PreferNoSchedule&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;

&lt;h2 id=&#34;use-cases-and-examples&#34;&gt;Use cases and examples&lt;/h2&gt;
&lt;p&gt;Let&#39;s explore how Extended Toleration Operators solve real-world scheduling challenges.&lt;/p&gt;
&lt;h3 id=&#34;example-1-spot-instance-protection-with-sla-thresholds&#34;&gt;Example 1: Spot instance protection with SLA thresholds&lt;/h3&gt;
&lt;p&gt;Many clusters mix on-demand and spot/preemptible nodes to optimize costs. Spot nodes offer significant savings but have higher failure rates. You want most workloads to avoid spot nodes by default, while allowing specific workloads to opt-in with clear SLA boundaries.&lt;/p&gt;
&lt;p&gt;First, taint spot nodes with their failure probability (for example, 15% annual failure rate):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Node&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;spot-node-1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;taints&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;15&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On-demand nodes have much lower failure rates:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Node&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ondemand-node-1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;taints&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Critical workloads can specify strict SLA requirements:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;payment-processor&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerationSeconds&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;30&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;app&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;payment-app:v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This pod will &lt;strong&gt;only&lt;/strong&gt; schedule on nodes with &lt;code&gt;failure-probability&lt;/code&gt; less than 5 (meaning &lt;code&gt;ondemand-node-1&lt;/code&gt; with 2% but not &lt;code&gt;spot-node-1&lt;/code&gt; with 15%). The &lt;code&gt;NoExecute&lt;/code&gt; effect with &lt;code&gt;tolerationSeconds: 30&lt;/code&gt; means if a node&#39;s SLA degrades (for example, cloud provider changes the taint value), the pod gets 30 seconds to gracefully terminate before forced eviction.&lt;/p&gt;
&lt;p&gt;Meanwhile, a fault-tolerant batch job can explicitly opt-in to spot instances:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;batch-job&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;20&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;worker&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;batch-worker:v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This batch job tolerates nodes with failure probability up to 20%, so it can run on both on-demand and spot nodes, maximizing cost savings while accepting higher risk.&lt;/p&gt;
&lt;h3 id=&#34;example-2-ai-workload-placement-with-gpu-tiers&#34;&gt;Example 2: AI workload placement with GPU tiers&lt;/h3&gt;
&lt;p&gt;AI and machine learning workloads often have specific hardware requirements. With Extended Toleration Operators, you can create GPU node tiers and ensure workloads land on appropriately powered hardware.&lt;/p&gt;
&lt;p&gt;Taint GPU nodes with their compute capability score:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Node&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gpu-node-a100&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;taints&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1000&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Node&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gpu-node-t4&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;taints&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;500&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A heavy training workload can require high-performance GPUs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;model-training&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Gt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;800&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;trainer&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ml-trainer:v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;limits&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nvidia.com/gpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This ensures the training pod only schedules on nodes with compute scores greater than 800 (like the A100 node), preventing placement on lower-tier GPUs that would slow down training.&lt;/p&gt;
&lt;p&gt;Meanwhile, inference workloads with less demanding requirements can use any available GPU:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;model-inference&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Gt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;400&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;inference&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ml-inference:v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;limits&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nvidia.com/gpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;example-3-cost-optimized-workload-placement&#34;&gt;Example 3: Cost-optimized workload placement&lt;/h3&gt;
&lt;p&gt;For batch processing or non-critical workloads, you might want to minimize costs by running on cheaper nodes, even if they have lower performance characteristics.&lt;/p&gt;
&lt;p&gt;Nodes can be tainted with their cost rating:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;taints&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;cost-per-hour&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A cost-sensitive batch job can express its tolerance for expensive nodes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;cost-per-hour&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;100&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This batch job will schedule on nodes costing less than $100/hour but avoid more expensive nodes. Combined with Kubernetes scheduling priorities, this enables sophisticated cost-tiering strategies where critical workloads get premium nodes while batch workloads efficiently use budget-friendly resources.&lt;/p&gt;
&lt;h3 id=&#34;example-4-performance-based-placement&#34;&gt;Example 4: Performance-based placement&lt;/h3&gt;
&lt;p&gt;Storage-intensive applications often require minimum disk performance guarantees. With Extended Toleration Operators, you can enforce these requirements at the scheduling level.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;disk-iops&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Gt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;3000&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This toleration ensures the pod only schedules on nodes where &lt;code&gt;disk-iops&lt;/code&gt; exceeds 3000. The &lt;code&gt;Gt&lt;/code&gt; operator means &amp;quot;I need nodes that are greater than this minimum&amp;quot;.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-this-feature&#34;&gt;How to use this feature&lt;/h2&gt;
&lt;p&gt;Extended Toleration Operators is an &lt;strong&gt;alpha feature&lt;/strong&gt; in Kubernetes v1.35. To try it out:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enable the feature gate&lt;/strong&gt; on both your API server and scheduler:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--feature-gates&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;TaintTolerationComparisonOperators&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Taint your nodes&lt;/strong&gt; with numeric values representing the metrics relevant to your scheduling needs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kubectl taint nodes node-1 failure-probability&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;5:NoSchedule
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kubectl taint nodes node-2 disk-iops&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;5000:NoSchedule
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use the new operators&lt;/strong&gt; in your pod specifications:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tolerations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;effect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Note:&lt;/h4&gt;As an alpha feature, Extended Toleration Operators may change in future releases and should be used with caution in production environments. Always test thoroughly in non-production clusters first.&lt;/div&gt;

&lt;h2 id=&#34;what-s-next&#34;&gt;What&#39;s next?&lt;/h2&gt;
&lt;p&gt;This alpha release is just the beginning. As we gather feedback from the community, we plan to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add support for &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5500&#34;&gt;CEL (Common Expression Language) expressions&lt;/a&gt; in tolerations and node affinity for even more flexible scheduling logic, including semantic versioning comparisons&lt;/li&gt;
&lt;li&gt;Improve integration with cluster autoscaling for threshold-aware capacity planning&lt;/li&gt;
&lt;li&gt;Graduate the feature to beta and eventually GA with production-ready stability&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&#39;re particularly interested in hearing about your use cases! Do you have scenarios where threshold-based scheduling would solve problems? Are there additional operators or capabilities you&#39;d like to see?&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Getting involved&lt;/h2&gt;
&lt;p&gt;This feature is driven by the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-scheduling&#34;&gt;SIG Scheduling&lt;/a&gt; community. Please join us to connect with the community and share your ideas and feedback around this feature and beyond.&lt;/p&gt;
&lt;p&gt;You can reach the maintainers of this feature at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-scheduling&#34;&gt;#sig-scheduling&lt;/a&gt; on Kubernetes Slack&lt;/li&gt;
&lt;li&gt;Mailing list: &lt;a href=&#34;https://groups.google.com/g/kubernetes-sig-scheduling&#34;&gt;kubernetes-sig-scheduling@googlegroups.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For questions or specific inquiries related to Extended Toleration Operators, please reach out to the SIG Scheduling community. We look forward to hearing from you!&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;How can I learn more?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/taint-and-toleration/&#34;&gt;Taints and Tolerations&lt;/a&gt; for understanding the fundamentals&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/taint-and-toleration/#numeric-comparison-operators&#34;&gt;Numeric comparison operators&lt;/a&gt; for details on using &lt;code&gt;Gt&lt;/code&gt; and &lt;code&gt;Lt&lt;/code&gt; operators&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5471&#34;&gt;KEP-5471: Extended Toleration Operators for Threshold-Based Placement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: New level of efficiency with in-place Pod restart</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/02/kubernetes-v1-35-restart-all-containers/</link>
      <pubDate>Fri, 02 Jan 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2026/01/02/kubernetes-v1-35-restart-all-containers/</guid>
      <description>
        
        
        &lt;p&gt;The release of Kubernetes 1.35 introduces a powerful new feature that provides a much-requested capability: the ability to trigger a full, in-place restart of the Pod. This feature, &lt;em&gt;Restart All Containers&lt;/em&gt; (alpha in 1.35), allows for an efficient way to reset a Pod&#39;s state compared to resource-intensive approach of deleting and recreating the entire Pod. This feature is especially useful for AI/ML workloads allowing application developers to concentrate on their core training logic while offloading complex failure-handling and recovery mechanisms to sidecars and declarative Kubernetes configuration. With &lt;code&gt;RestartAllContainers&lt;/code&gt; and other planned enhancements, Kubernetes continues to add building blocks for creating the most flexible, robust, and efficient platforms for AI/ML workloads.&lt;/p&gt;
&lt;p&gt;This new functionality is available by enabling the &lt;code&gt;RestartAllContainersOnContainerExits&lt;/code&gt; feature gate. This alpha feature extends the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/pods/pod-lifecycle/#container-restart-rules&#34;&gt;&lt;em&gt;Container Restart Rules&lt;/em&gt; feature&lt;/a&gt;, which graduated to beta in Kubernetes 1.35.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-when-a-single-container-restart-isn-t-enough-and-recreating-pods-is-too-costly&#34;&gt;The problem: when a single container restart isn&#39;t enough and recreating pods is too costly&lt;/h2&gt;
&lt;p&gt;Kubernetes has long supported restart policies at the Pod level (&lt;code&gt;restartPolicy&lt;/code&gt;) and, more recently, at the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/08/29/kubernetes-v1-34-per-container-restart-policy/&#34;&gt;individual container level&lt;/a&gt;. These policies are great for handling crashes in a single, isolated process. However, many modern applications have more complex inter-container dependencies. For instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;init container&lt;/strong&gt; prepares the environment by mounting a volume or generating a configuration file. If the main application container corrupts this environment, simply restarting that one container is not enough. The entire initialization process needs to run again.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;watcher sidecar&lt;/strong&gt; monitors system health. If it detects an unrecoverable but retriable error state, it must trigger a restart of the main application container from a clean slate.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;sidecar&lt;/strong&gt; that manages a remote resource fails. Even if the sidecar restarts on its own, the main container may be stuck trying to access an outdated or broken connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In all these cases, the desired action is not to restart a single container, but all of them. Previously, the only way to achieve this was to delete the Pod and have a controller (like a Job or ReplicaSet) create a new one. This process is slow and expensive, involving the scheduler, node resource allocation and re-initialization of networking and storage.&lt;/p&gt;
&lt;p&gt;This inefficiency becomes even worse when handling large-scale AI/ML workloads (&amp;gt;= 1,000 Nodes with one Pod per Node). A common requirement for these synchronous workloads is that when a failure occurs (such as a Node crash), all Pods in the fleet must be recreated to reset the state before training can resume, even if all the other Pods were not directly affected by the failure. Deleting, creating and scheduling thousands of Pods simultaneously creates a massive bottleneck. The estimated overhead of this failure could cost &lt;a href=&#34;https://docs.google.com/document/d/16zexVooHKPc80F4dVtUjDYK9DOpkVPRNfSv0zRtfFpk/edit?tab=t.0#bookmark=id.qwqcnzf96avw&#34;&gt;$100,000 per month in wasted resources&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Handling these failures for AI/ML training jobs requires a complex integration touching both the training framework and Kubernetes, which are often fragile and toilsome. This feature introduces a Kubernetes-native solution, improving system robustness and allowing application developers to concentrate on their core training logic.&lt;/p&gt;
&lt;p&gt;Another major benefit of restarting Pods in place is that keeping Pods on their assigned Nodes allows for further optimizations. For example, one can implement node-level caching tied to a specific Pod identity, something that is impossible when Pods are unnecessarily being recreated on different Nodes.&lt;/p&gt;
&lt;h2 id=&#34;introducing-the-restartallcontainers-action&#34;&gt;Introducing the &lt;code&gt;RestartAllContainers&lt;/code&gt; action&lt;/h2&gt;
&lt;p&gt;To address this, Kubernetes v1.35 adds a new action to the container restart rules: &lt;code&gt;RestartAllContainers&lt;/code&gt;. When a container exits in a way that matches a rule with this action, the kubelet initiates a fast, &lt;strong&gt;in-place&lt;/strong&gt; restart of the Pod.&lt;/p&gt;
&lt;p&gt;This in-place restart is highly efficient because it preserves the Pod&#39;s most important resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Pod&#39;s UID, IP address and network namespace.&lt;/li&gt;
&lt;li&gt;The Pod&#39;s sandbox and any attached devices.&lt;/li&gt;
&lt;li&gt;All volumes, including &lt;code&gt;emptyDir&lt;/code&gt; and mounted volumes from PVCs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After terminating all running containers, the Pod&#39;s startup sequence is re-executed from the very beginning. This means all &lt;strong&gt;init containers&lt;/strong&gt; are run again in order, followed by the sidecar and regular containers, ensuring a completely fresh start in a known-good environment. With the exception of ephemeral containers (which are terminated), all other containers—including those that previously succeeded or failed—will be restarted, regardless of their individual restart policies.&lt;/p&gt;
&lt;h2 id=&#34;use-cases&#34;&gt;Use cases&lt;/h2&gt;
&lt;h3 id=&#34;1-efficient-restarts-for-ml-batch-jobs&#34;&gt;1. Efficient restarts for ML/Batch jobs&lt;/h3&gt;
&lt;p&gt;For ML training jobs, &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/07/03/navigating-failures-in-pods-with-devices/#roadmap-for-failure-modes-container-code-failed&#34;&gt;rescheduling a worker Pod on failure&lt;/a&gt; is a costly operation that wastes valuable compute resources. On a 1,000-node training cluster, rescheduling overhead can waste &lt;a href=&#34;https://docs.google.com/document/d/16zexVooHKPc80F4dVtUjDYK9DOpkVPRNfSv0zRtfFpk/edit?tab=t.0#bookmark=id.qwqcnzf96avw&#34;&gt;over $100,000 in compute resources monthly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;RestartAllContainers&lt;/code&gt; actions you can address this by enabling a much faster, hybrid recovery strategy: recreate only the &amp;quot;bad&amp;quot; Pods (e.g., those on unhealthy Nodes) while triggering &lt;code&gt;RestartAllContainers&lt;/code&gt; for the remaining healthy Pods. Benchmarks show this reduces the recovery overhead &lt;a href=&#34;https://docs.google.com/document/d/16zexVooHKPc80F4dVtUjDYK9DOpkVPRNfSv0zRtfFpk/edit?tab=t.0#bookmark=id.cwkee8kar0i5&#34;&gt;from minutes to a few seconds&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With in-place restarts, a watcher sidecar can monitor the main training process. If it encounters a specific, retriable error, the watcher can exit with a designated code to trigger a fast reset of the worker Pod, allowing it to restart from the last checkpoint without involving the Job controller. This capability is now natively supported by Kubernetes.&lt;/p&gt;
&lt;p&gt;Read more details about future development and JobSet features at &lt;a href=&#34;https://github.com/kubernetes-sigs/jobset/issues/467&#34;&gt;KEP-467 JobSet in-place restart&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ml-worker-pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Never&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;initContainers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# This init container will re-run on every in-place restart&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;setup-environment&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-repo/setup-worker:1.0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;watcher-sidecar&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-repo/watcher:1.0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Always&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicyRules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;action&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;RestartAllContainers&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;exitCodes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;In&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# A specific exit code from the watcher triggers a full pod restart&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;values&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#666&#34;&gt;88&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;main-application&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-repo/training-app:1.0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-re-running-init-containers-for-a-clean-state&#34;&gt;2. Re-running init containers for a clean state&lt;/h3&gt;
&lt;p&gt;Imagine a scenario where an init container is responsible for fetching credentials or setting up a shared volume. If the main application fails in a way that corrupts this shared state, you need the &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3676&#34;&gt;init container to rerun&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By configuring the main application to exit with a specific code upon detecting such a corruption, you can trigger the &lt;code&gt;RestartAllContainers&lt;/code&gt; action, guaranteeing that the init container provides a clean setup before the application restarts.&lt;/p&gt;
&lt;h3 id=&#34;3-handling-high-rate-of-similar-tasks-execution&#34;&gt;3. Handling high rate of similar tasks execution&lt;/h3&gt;
&lt;p&gt;There are cases when tasks are best represented as a Pod execution. And each task requires a clean execution. The task may be a game session backend or some queue item processing. If the rate of tasks is high, running the whole cycle of Pod creation, scheduling and initialization is simply too expensive, especially when tasks can be short. The ability to restart all containers from scratch enables a Kubernetes-native way to handle this scenario without custom solutions or frameworks.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-it&#34;&gt;How to use it&lt;/h2&gt;
&lt;p&gt;To try this feature, you must enable the &lt;code&gt;RestartAllContainersOnContainerExits&lt;/code&gt; feature gate on your Kubernetes cluster components (API server and kubelet) running Kubernetes v1.35+. This alpha feature extends the &lt;code&gt;ContainerRestartRules&lt;/code&gt; feature, which graduated to beta in v1.35 and is enabled by default.&lt;/p&gt;
&lt;p&gt;Once enabled, you can add &lt;code&gt;restartPolicyRules&lt;/code&gt; to any container (init, sidecar, or regular) and use the &lt;code&gt;RestartAllContainers&lt;/code&gt; action.&lt;/p&gt;
&lt;p&gt;The feature is designed to be easily usable on existing apps. However, if an application does not follow some best practices, it may cause issues for the application or for observability tooling. When enabling the feature, make sure that all containers are reentrant and that external tooling is prepared for init containers to re-run. Also, when restarting all containers, the kubelet does not run &lt;code&gt;preStop&lt;/code&gt; hooks. This means containers must be designed to handle abrupt termination without relying on &lt;code&gt;preStop&lt;/code&gt; hooks for graceful shutdown.&lt;/p&gt;
&lt;h2 id=&#34;observing-the-restart&#34;&gt;Observing the restart&lt;/h2&gt;
&lt;p&gt;To make this process observable, a new Pod condition, &lt;code&gt;AllContainersRestarting&lt;/code&gt;, is added to the Pod&#39;s status. When a restart is triggered, this condition becomes &lt;code&gt;True&lt;/code&gt; and it reverts to &lt;code&gt;False&lt;/code&gt; once all containers have terminated and the Pod is ready to start its lifecycle anew. This provides a clear signal to users and other cluster components about the Pod&#39;s state.&lt;/p&gt;
&lt;p&gt;All containers restarted by this action will have their restart count incremented in the container status.&lt;/p&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Learn more&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read the official documentation on &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/pods/pod-lifecycle/#restart-all-containers&#34;&gt;Pod Lifecycle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read the detailed proposal in the &lt;a href=&#34;https://kep.k8s.io/5532&#34;&gt;KEP-5532: Restart All Containers on Container Exits&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read the proposal for JobSet in-place restart in &lt;a href=&#34;https://github.com/kubernetes-sigs/jobset/issues/467&#34;&gt;JobSet issue #467&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;we-want-your-feedback&#34;&gt;We want your feedback!&lt;/h2&gt;
&lt;p&gt;As an alpha feature, &lt;code&gt;RestartAllContainers&lt;/code&gt; is ready for you to experiment with and any use cases and feedback are welcome. This feature is driven by the &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-node/README.md&#34;&gt;SIG Node&lt;/a&gt; community. If you are interested in getting involved, sharing your thoughts, or contributing, please join us!&lt;/p&gt;
&lt;p&gt;You can reach SIG Node through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34;&gt;Mailing list&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes 1.35: Enhanced Debugging with Versioned z-pages APIs</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/31/kubernetes-v1-35-structured-zpages/</link>
      <pubDate>Wed, 31 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/31/kubernetes-v1-35-structured-zpages/</guid>
      <description>
        
        
        &lt;p&gt;Debugging Kubernetes control plane components can be challenging, especially when you need to quickly understand the runtime state of a component or verify its configuration. With Kubernetes 1.35, we&#39;re enhancing the z-pages debugging endpoints with structured, machine-parseable responses that make it easier to build tooling and automate troubleshooting workflows.&lt;/p&gt;
&lt;h2 id=&#34;what-are-z-pages&#34;&gt;What are z-pages?&lt;/h2&gt;
&lt;p&gt;z-pages are special debugging endpoints exposed by Kubernetes control plane components. Introduced as an alpha feature in Kubernetes 1.32, these endpoints provide runtime diagnostics for components like &lt;code&gt;kube-apiserver&lt;/code&gt;, &lt;code&gt;kube-controller-manager&lt;/code&gt;, &lt;code&gt;kube-scheduler&lt;/code&gt;, &lt;code&gt;kubelet&lt;/code&gt; and &lt;code&gt;kube-proxy&lt;/code&gt;. The name &amp;quot;z-pages&amp;quot; comes from the convention of using &lt;code&gt;/*z&lt;/code&gt; paths for debugging endpoints.&lt;/p&gt;
&lt;p&gt;Currently, Kubernetes supports two primary z-page endpoints:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;/statusz&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Displays high-level component information including version information, start time, uptime, and available debug paths&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;/flagz&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Shows all command-line arguments and their values used to start the component (with confidential values redacted for security)&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;These endpoints are valuable for human operators who need to quickly inspect component state, but until now, they only returned plain text output that was difficult to parse programmatically.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new-in-kubernetes-1-35&#34;&gt;What&#39;s new in Kubernetes 1.35?&lt;/h2&gt;
&lt;p&gt;Kubernetes 1.35 introduces structured, versioned responses for both &lt;code&gt;/statusz&lt;/code&gt; and &lt;code&gt;/flagz&lt;/code&gt; endpoints. This enhancement maintains backward compatibility with the existing plain text format while adding support for machine-readable JSON responses.&lt;/p&gt;
&lt;h3 id=&#34;backward-compatible-design&#34;&gt;Backward compatible design&lt;/h3&gt;
&lt;p&gt;The new structured responses are opt-in. Without specifying an &lt;code&gt;Accept&lt;/code&gt; header, the endpoints continue to return the familiar plain text format:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
  --key /etc/kubernetes/pki/apiserver-kubelet-client.key \
  --cacert /etc/kubernetes/pki/ca.crt \
  https://localhost:6443/statusz

kube-apiserver statusz
Warning: This endpoint is not meant to be machine parseable, has no formatting compatibility guarantees and is for debugging purposes only.

Started: Wed Oct 16 21:03:43 UTC 2024
Up: 0 hr 00 min 16 sec
Go version: go1.23.2
Binary version: 1.35.0-alpha.0.1595
Emulation version: 1.35
Paths: /healthz /livez /metrics /readyz /statusz /version
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;structured-json-responses&#34;&gt;Structured JSON responses&lt;/h3&gt;
&lt;p&gt;To receive a structured response, include the appropriate &lt;code&gt;Accept&lt;/code&gt; header:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Accept: application/json;v=v1alpha1;g=config.k8s.io;as=Statusz
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This returns a versioned JSON response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Statusz&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;config.k8s.io/v1alpha1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kube-apiserver&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;startTime&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;2025-10-29T00:30:01Z&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;uptimeSeconds&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#666&#34;&gt;856&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;goVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;go1.23.2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;binaryVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1.35.0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;emulationVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1.35&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;paths&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/healthz&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/livez&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/metrics&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/readyz&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/statusz&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/version&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Similarly, &lt;code&gt;/flagz&lt;/code&gt; supports structured responses with the header:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Accept: application/json;v=v1alpha1;g=config.k8s.io;as=Flagz
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Example response:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Flagz&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;apiVersion&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;config.k8s.io/v1alpha1&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;kube-apiserver&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;flags&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;advertise-address&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;192.168.8.4&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;allow-privileged&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;authorization-mode&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;[Node,RBAC]&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;enable-priority-and-fairness&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;profiling&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;why-structured-responses-matter&#34;&gt;Why structured responses matter&lt;/h2&gt;
&lt;p&gt;The addition of structured responses opens up several new possibilities:&lt;/p&gt;
&lt;h3 id=&#34;1-automated-health-checks-and-monitoring&#34;&gt;1. &lt;strong&gt;Automated health checks and monitoring&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Instead of parsing plain text, monitoring tools can now easily extract specific fields. For example, you can programmatically check if a component has been running with an unexpected emulated version or verify that critical flags are set correctly.&lt;/p&gt;
&lt;h3 id=&#34;2-better-debugging-tools&#34;&gt;2. &lt;strong&gt;Better debugging tools&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Developers can build sophisticated debugging tools that compare configurations across multiple components or track configuration drift over time. The structured format makes it trivial to &lt;code&gt;diff&lt;/code&gt; configurations or validate that components are running with expected settings.&lt;/p&gt;
&lt;h3 id=&#34;3-api-versioning-and-stability&#34;&gt;3. &lt;strong&gt;API versioning and stability&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;By introducing versioned APIs (starting with &lt;code&gt;v1alpha1&lt;/code&gt;), we provide a clear path to stability. As the feature matures, we&#39;ll introduce &lt;code&gt;v1beta1&lt;/code&gt; and eventually &lt;code&gt;v1&lt;/code&gt;, giving you confidence that your tooling won&#39;t break with future Kubernetes releases.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-structured-z-pages&#34;&gt;How to use structured z-pages&lt;/h2&gt;
&lt;h3 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Both endpoints require feature gates to be enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/statusz&lt;/code&gt;: Enable the &lt;code&gt;ComponentStatusz&lt;/code&gt; feature gate&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/flagz&lt;/code&gt;: Enable the &lt;code&gt;ComponentFlagz&lt;/code&gt; feature gate&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-getting-structured-responses&#34;&gt;Example: Getting structured responses&lt;/h3&gt;
&lt;p&gt;Here&#39;s an example using &lt;code&gt;curl&lt;/code&gt; to retrieve structured JSON responses from the kube-apiserver:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Get structured statusz response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  --key /etc/kubernetes/pki/apiserver-kubelet-client.key &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  --cacert /etc/kubernetes/pki/ca.crt &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Accept: application/json;v=v1alpha1;g=config.k8s.io;as=Statusz&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  https://localhost:6443/statusz | jq .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Get structured flagz response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  --key /etc/kubernetes/pki/apiserver-kubelet-client.key &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  --cacert /etc/kubernetes/pki/ca.crt &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Accept: application/json;v=v1alpha1;g=config.k8s.io;as=Flagz&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b62;font-weight:bold&#34;&gt;&lt;/span&gt;  https://localhost:6443/flagz | jq .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Note:&lt;/h4&gt;The examples above use client certificate authentication and verify the server&#39;s certificate using &lt;code&gt;--cacert&lt;/code&gt;.
If you need to bypass certificate verification in a test environment, you can use &lt;code&gt;--insecure&lt;/code&gt; (or &lt;code&gt;-k&lt;/code&gt;),
but this should never be done in production as it makes you vulnerable to man-in-the-middle attacks.&lt;/div&gt;

&lt;h2 id=&#34;important-considerations&#34;&gt;Important considerations&lt;/h2&gt;
&lt;h3 id=&#34;alpha-feature-status&#34;&gt;Alpha feature status&lt;/h3&gt;
&lt;p&gt;The structured z-page responses are an &lt;strong&gt;alpha&lt;/strong&gt; feature in Kubernetes 1.35. This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The API format may change in future releases&lt;/li&gt;
&lt;li&gt;These endpoints are intended for debugging, not production automation&lt;/li&gt;
&lt;li&gt;You should avoid relying on them for critical monitoring workflows until they reach beta or stable status&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;security-and-access-control&#34;&gt;Security and access control&lt;/h3&gt;
&lt;p&gt;z-pages expose internal component information and require proper access controls. Here are the key security considerations:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authorization&lt;/strong&gt;: Access to z-page endpoints is restricted to members of the &lt;code&gt;system:monitoring&lt;/code&gt; group, which follows the same authorization model as other debugging endpoints like &lt;code&gt;/healthz&lt;/code&gt;, &lt;code&gt;/livez&lt;/code&gt;, and &lt;code&gt;/readyz&lt;/code&gt;. This ensures that only authorized users and service accounts can access debugging information. If your cluster uses RBAC, you can manage access by granting appropriate permissions to this group.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authentication&lt;/strong&gt;: The authentication requirements for these endpoints depend on your cluster&#39;s configuration. Unless anonymous authentication is enabled for your cluster, you typically need to use authentication mechanisms (such as client certificates) to access these endpoints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Information disclosure&lt;/strong&gt;: These endpoints reveal configuration details about your cluster components, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Component versions and build information&lt;/li&gt;
&lt;li&gt;All command-line arguments and their values (with confidential values redacted)&lt;/li&gt;
&lt;li&gt;Available debug endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only grant access to trusted operators and debugging tools. Avoid exposing these endpoints to unauthorized users or automated systems that don&#39;t require this level of access.&lt;/p&gt;
&lt;h3 id=&#34;future-evolution&#34;&gt;Future evolution&lt;/h3&gt;
&lt;p&gt;As the feature matures, we (Kubernetes SIG Instrumentation) expect to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Introduce &lt;code&gt;v1beta1&lt;/code&gt; and eventually &lt;code&gt;v1&lt;/code&gt; versions of the API&lt;/li&gt;
&lt;li&gt;Gather community feedback on the response schema&lt;/li&gt;
&lt;li&gt;Potentially add additional z-page endpoints based on user needs&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Try it out&lt;/h2&gt;
&lt;p&gt;We encourage you to experiment with structured z-pages in a test environment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable the &lt;code&gt;ComponentStatusz&lt;/code&gt; and &lt;code&gt;ComponentFlagz&lt;/code&gt; feature gates on your control plane components&lt;/li&gt;
&lt;li&gt;Try querying the endpoints with both plain text and structured formats&lt;/li&gt;
&lt;li&gt;Build a simple tool or script that uses the structured data&lt;/li&gt;
&lt;li&gt;Share your feedback with the community&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Learn more&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/zpages/&#34;&gt;z-pages documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/4827-component-statusz/README.md&#34;&gt;KEP-4827: Component Statusz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/4828-component-flagz/README.md&#34;&gt;KEP-4828: Component Flagz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join the discussion in the &lt;a href=&#34;https://kubernetes.slack.com/archives/C20HH14P7&#34;&gt;#sig-instrumentation&lt;/a&gt; channel on Kubernetes Slack&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;We&#39;d love to hear your feedback! The structured z-pages feature is designed to make Kubernetes easier to debug and monitor. Whether you&#39;re building internal tooling, contributing to open source projects, or just exploring the feature, your input helps shape the future of Kubernetes observability.&lt;/p&gt;
&lt;p&gt;If you have questions, suggestions, or run into issues, please reach out to SIG Instrumentation. You can find us on Slack or at our regular &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-instrumentation&#34;&gt;community meetings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Happy debugging!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Watch Based Route Reconciliation in the Cloud Controller Manager</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/30/kubernetes-v1-35-watch-based-route-reconciliation-in-ccm/</link>
      <pubDate>Tue, 30 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/30/kubernetes-v1-35-watch-based-route-reconciliation-in-ccm/</guid>
      <description>
        
        
        &lt;p&gt;Up to and including Kubernetes v1.34, the route controller in Cloud Controller Manager (CCM)
implementations built using the &lt;a href=&#34;https://github.com/kubernetes/cloud-provider&#34;&gt;k8s.io/cloud-provider&lt;/a&gt; library reconciles
routes at a fixed interval. This causes unnecessary API requests to the cloud provider when
there are no changes to routes. Other controllers implemented through the same library already
use watch-based mechanisms, leveraging informers to avoid unnecessary API calls. A new feature gate
is being introduced in v1.35 to allow changing the behavior of the route controller to use watch-based informers.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new&#34;&gt;What&#39;s new?&lt;/h2&gt;
&lt;p&gt;The feature gate &lt;code&gt;CloudControllerManagerWatchBasedRoutesReconciliation&lt;/code&gt; has been
introduced to &lt;a href=&#34;https://github.com/kubernetes/cloud-provider&#34;&gt;k8s.io/cloud-provider&lt;/a&gt; in alpha stage by &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-cloud-provider/README.md&#34;&gt;SIG Cloud Provider&lt;/a&gt;.
To enable this feature you can use &lt;code&gt;--feature-gate=CloudControllerManagerWatchBasedRoutesReconciliation=true&lt;/code&gt;
in the CCM implementation you are using.&lt;/p&gt;
&lt;h2 id=&#34;about-the-feature-gate&#34;&gt;About the feature gate&lt;/h2&gt;
&lt;p&gt;This feature gate will trigger the route reconciliation loop whenever a node is
added, deleted, or the fields &lt;code&gt;.spec.podCIDRs&lt;/code&gt; or &lt;code&gt;.status.addresses&lt;/code&gt; are updated.&lt;/p&gt;
&lt;p&gt;An additional reconcile is performed in a random interval between 12h and 24h,
which is chosen at the controller&#39;s start time.&lt;/p&gt;
&lt;p&gt;This feature gate does not modify the logic within the reconciliation loop.
Therefore, users of a CCM implementation should not experience significant
changes to their existing route configurations.&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;How can I learn more?&lt;/h2&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&#34;https://kep.k8s.io/5237&#34;&gt;KEP-5237&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Introducing Workload Aware Scheduling</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/29/kubernetes-v1-35-introducing-workload-aware-scheduling/</link>
      <pubDate>Mon, 29 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/29/kubernetes-v1-35-introducing-workload-aware-scheduling/</guid>
      <description>
        
        
        &lt;p&gt;Scheduling large workloads is a much more complex and fragile operation than scheduling a single Pod,
as it often requires considering all Pods together instead of scheduling each one independently.
For example, when scheduling a machine learning batch job, you often need to place each worker strategically,
such as on the same rack, to make the entire process as efficient as possible.
At the same time, the Pods that are part of such a workload are very often identical
from the scheduling perspective, which fundamentally changes how this process should look.&lt;/p&gt;
&lt;p&gt;There are many custom schedulers adapted to perform workload scheduling efficiently,
but considering how common and important workload scheduling is to Kubernetes users,
especially in the AI era with the growing number of use cases,
it is high time to make workloads a first-class citizen for &lt;code&gt;kube-scheduler&lt;/code&gt; and support them natively.&lt;/p&gt;
&lt;h2 id=&#34;workload-aware-scheduling&#34;&gt;Workload aware scheduling&lt;/h2&gt;
&lt;p&gt;The recent 1.35 release of Kubernetes delivered the first tranche of &lt;em&gt;workload aware scheduling&lt;/em&gt; improvements.
These are part of a wider effort that is aiming to improve scheduling and management of workloads.
The effort will span over many SIGs and releases, and is supposed to gradually expand
capabilities of the system toward reaching the north star goal,
which is seamless workload scheduling and management in Kubernetes including,
but not limited to, preemption and autoscaling.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 introduces the Workload API that you can use to describe the desired shape
as well as scheduling-oriented requirements of the workload. It comes with an initial implementation
of &lt;em&gt;gang scheduling&lt;/em&gt; that instructs the &lt;code&gt;kube-scheduler&lt;/code&gt; to schedule gang Pods in the &lt;em&gt;all-or-nothing&lt;/em&gt; fashion.
Finally, we improved scheduling of identical Pods (that typically make a gang) to speed up the process
thanks to the &lt;em&gt;opportunistic batching&lt;/em&gt; feature.&lt;/p&gt;
&lt;h2 id=&#34;workload-api&#34;&gt;Workload API&lt;/h2&gt;
&lt;p&gt;The new Workload API resource is part of the &lt;code&gt;scheduling.k8s.io/v1alpha1&lt;/code&gt;
&lt;a class=&#39;glossary-tooltip&#39; title=&#39;A set of related paths in the Kubernetes API.&#39; data-toggle=&#39;tooltip&#39; data-placement=&#39;top&#39; href=&#39;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/overview/kubernetes-api/#api-groups-and-versioning&#39; target=&#39;_blank&#39; aria-label=&#39;API group&#39;&gt;API group&lt;/a&gt;.
This resource acts as a structured, machine-readable definition of the scheduling requirements
of a multi-Pod application. While user-facing workloads like Jobs define what to run, the Workload resource
determines how a group of Pods should be scheduled and how its placement should be managed
throughout its lifecycle.&lt;/p&gt;
&lt;p&gt;A Workload allows you to define a group of Pods and apply a scheduling policy to them.
Here is what a gang scheduling configuration looks like. You can define a &lt;code&gt;podGroup&lt;/code&gt; named &lt;code&gt;workers&lt;/code&gt;
and apply the &lt;code&gt;gang&lt;/code&gt; policy with a &lt;code&gt;minCount&lt;/code&gt; of 4.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;scheduling.k8s.io/v1alpha1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Workload&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;training-job-workload&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;some-ns&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;podGroups&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;workers&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;policy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;gang&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# The gang is schedulable only if 4 pods can run at once&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;minCount&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you create your Pods, you link them to this Workload using the new &lt;code&gt;workloadRef&lt;/code&gt; field:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;worker-0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;some-ns&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;workloadRef&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;training-job-workload&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;podGroup&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;workers&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;...&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;how-gang-scheduling-works&#34;&gt;How gang scheduling works&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;gang&lt;/code&gt; policy enforces &lt;em&gt;all-or-nothing&lt;/em&gt; placement. Without gang scheduling,
a Job might be partially scheduled, consuming resources without being able to run,
leading to resource wastage and potential deadlocks.&lt;/p&gt;
&lt;p&gt;When you create Pods that are part of a gang-scheduled pod group, the scheduler&#39;s &lt;code&gt;GangScheduling&lt;/code&gt;
plugin manages the lifecycle independently for each pod group (or replica key):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;When you create your Pods (or a controller makes them for you),
the scheduler blocks them from scheduling, until:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The referenced Workload object is created.&lt;/li&gt;
&lt;li&gt;The referenced pod group exists in a Workload.&lt;/li&gt;
&lt;li&gt;The number of pending Pods in that group meets your &lt;code&gt;minCount&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once enough Pods arrive, the scheduler tries to place them. However,
instead of binding them to nodes immediately, the Pods wait at a &lt;code&gt;Permit&lt;/code&gt; gate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The scheduler checks if it has found valid assignments for the entire group (at least the &lt;code&gt;minCount&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If there is room for the group, the gate opens, and all Pods are bound to nodes.&lt;/li&gt;
&lt;li&gt;If only a subset of the group pods was successfully scheduled within a timeout (set to 5 minutes),
the scheduler rejects &lt;strong&gt;all&lt;/strong&gt; of the Pods in the group.
They go back to the queue, freeing up the reserved resources for other workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We&#39;d like to point out that that while this is a first implementation, the Kubernetes project firmly
intends to improve and expand the gang scheduling algorithm in future releases.
Benefits we hope to deliver include a single-cycle scheduling phase for a whole gang,
workload-level preemption, and more, moving towards the north star goal.&lt;/p&gt;
&lt;h2 id=&#34;opportunistic-batching&#34;&gt;Opportunistic batching&lt;/h2&gt;
&lt;p&gt;In addition to explicit gang scheduling, v1.35 introduces &lt;em&gt;opportunistic batching&lt;/em&gt;.
This is a Beta feature that improves scheduling latency for identical Pods.&lt;/p&gt;
&lt;p&gt;Unlike gang scheduling, this feature does not require the Workload API
or any explicit opt-in on the user&#39;s part. It works opportunistically within the scheduler
by identifying Pods that have identical scheduling requirements (container images, resource requests,
affinities, etc.). When the scheduler processes a Pod, it can reuse the feasibility calculations
for subsequent identical Pods in the queue, significantly speeding up the process.&lt;/p&gt;
&lt;p&gt;Most users will benefit from this optimization automatically, without taking any special steps,
provided their Pods meet the following criteria.&lt;/p&gt;
&lt;h3 id=&#34;restrictions&#34;&gt;Restrictions&lt;/h3&gt;
&lt;p&gt;Opportunistic batching works under specific conditions. All fields used by the &lt;code&gt;kube-scheduler&lt;/code&gt;
to find a placement must be identical between Pods. Additionally, using some features
disables the batching mechanism for those Pods to ensure correctness.&lt;/p&gt;
&lt;p&gt;Note that you may need to review your &lt;code&gt;kube-scheduler&lt;/code&gt; configuration
to ensure it is not implicitly disabling batching for your workloads.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/scheduler-perf-tuning/#enabling-opportunistic-batching&#34;&gt;docs&lt;/a&gt; for more details about restrictions.&lt;/p&gt;
&lt;h2 id=&#34;the-north-star-vision&#34;&gt;The north star vision&lt;/h2&gt;
&lt;p&gt;The project has a broad ambition to deliver workload aware scheduling.
These new APIs and scheduling enhancements are just the first steps.
In the near future, the effort aims to tackle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Introducing a workload scheduling phase&lt;/li&gt;
&lt;li&gt;Improved support for multi-node &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;DRA&lt;/a&gt;
and topology aware scheduling&lt;/li&gt;
&lt;li&gt;Workload-level preemption&lt;/li&gt;
&lt;li&gt;Improved integration between scheduling and autoscaling&lt;/li&gt;
&lt;li&gt;Improved interaction with external workload schedulers&lt;/li&gt;
&lt;li&gt;Managing placement of workloads throughout their entire lifecycle&lt;/li&gt;
&lt;li&gt;Multi-workload scheduling simulations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And more. The priority and implementation order of these focus areas
are subject to change. Stay tuned for further updates.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting started&lt;/h2&gt;
&lt;p&gt;To try the workload aware scheduling improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workload API: Enable the
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/#GenericWorkload&#34;&gt;&lt;code&gt;GenericWorkload&lt;/code&gt;&lt;/a&gt;
feature gate on both &lt;code&gt;kube-apiserver&lt;/code&gt; and &lt;code&gt;kube-scheduler&lt;/code&gt;, and ensure the &lt;code&gt;scheduling.k8s.io/v1alpha1&lt;/code&gt;
&lt;a class=&#39;glossary-tooltip&#39; title=&#39;A set of related paths in the Kubernetes API.&#39; data-toggle=&#39;tooltip&#39; data-placement=&#39;top&#39; href=&#39;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/overview/kubernetes-api/#api-groups-and-versioning&#39; target=&#39;_blank&#39; aria-label=&#39;API group&#39;&gt;API group&lt;/a&gt; is enabled.&lt;/li&gt;
&lt;li&gt;Gang scheduling: Enable the
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/#GangScheduling&#34;&gt;&lt;code&gt;GangScheduling&lt;/code&gt;&lt;/a&gt;
feature gate on &lt;code&gt;kube-scheduler&lt;/code&gt; (requires the Workload API to be enabled).&lt;/li&gt;
&lt;li&gt;Opportunistic batching: As a Beta feature, it is enabled by default in v1.35.
You can disable it using the
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/#OpportunisticBatching&#34;&gt;&lt;code&gt;OpportunisticBatching&lt;/code&gt;&lt;/a&gt;
feature gate on &lt;code&gt;kube-scheduler&lt;/code&gt; if needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We encourage you to try out workload aware scheduling in your test clusters
and share your experiences to help shape the future of Kubernetes scheduling.
You can send your feedback by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reaching out via &lt;a href=&#34;https://kubernetes.slack.com/archives/C09TP78DV&#34;&gt;Slack (#sig-scheduling)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Commenting on the &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/132192&#34;&gt;workload aware scheduling tracking issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Filing a new &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues&#34;&gt;issue&lt;/a&gt; in the Kubernetes repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Learn more&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read the KEPs for
&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/4671-gang-scheduling&#34;&gt;Workload API and gang scheduling&lt;/a&gt; and
&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/5598-opportunistic-batching&#34;&gt;Opportunistic batching&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Track the &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/132192&#34;&gt;Workload aware scheduling issue&lt;/a&gt;
for recent updates.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Fine-grained Supplemental Groups Control Graduates to GA</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/23/kubernetes-v1-35-fine-grained-supplementalgroups-control-ga/</link>
      <pubDate>Tue, 23 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/23/kubernetes-v1-35-fine-grained-supplementalgroups-control-ga/</guid>
      <description>
        
        
        &lt;p&gt;On behalf of Kubernetes SIG Node, we are pleased to announce the graduation of &lt;em&gt;fine-grained supplemental groups control&lt;/em&gt; to General Availability (GA) in Kubernetes v1.35!&lt;/p&gt;
&lt;p&gt;The new Pod field, &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt;, was introduced as an opt-in alpha feature for Kubernetes v1.31, and then had graduated to beta in v1.33.
Now, the feature is generally available.
This feature allows you to implement more precise control over supplemental groups in Linux containers that can strengthen the security posture particularly in accessing volumes.
Moreover, it also enhances the transparency of UID/GID details in containers, offering improved security oversight.&lt;/p&gt;
&lt;p&gt;If you are planning to upgrade your cluster from v1.32 or an earlier version, please be aware that some behavioral breaking change introduced since beta (v1.33).
For more details, see the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/05/06/kubernetes-v1-33-fine-grained-supplementalgroups-control-beta/#the-behavioral-changes-introduced-in-beta&#34;&gt;behavioral changes introduced in beta&lt;/a&gt; and
the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/05/06/kubernetes-v1-33-fine-grained-supplementalgroups-control-beta/#upgrade-consideration&#34;&gt;upgrade considerations&lt;/a&gt; sections of the previous blog for graduation to beta.&lt;/p&gt;
&lt;h2 id=&#34;motivation-implicit-group-memberships-defined-in-etc-group-in-the-container-image&#34;&gt;Motivation: Implicit group memberships defined in &lt;code&gt;/etc/group&lt;/code&gt; in the container image&lt;/h2&gt;
&lt;p&gt;Even though the majority of Kubernetes cluster admins/users may not be aware of this,
by default Kubernetes &lt;em&gt;merges&lt;/em&gt; group information from the Pod with information defined in &lt;code&gt;/etc/group&lt;/code&gt; in the container image.&lt;/p&gt;
&lt;p&gt;Here&#39;s an example; a Pod manifest that specifies &lt;code&gt;spec.securityContext.runAsUser: 1000&lt;/code&gt;, &lt;code&gt;spec.securityContext.runAsGroup: 3000&lt;/code&gt; and &lt;code&gt;spec.securityContext.supplementalGroups: 4000&lt;/code&gt; as part of the Pod&#39;s security context.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;implicit-groups-example&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;securityContext&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;runAsUser&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;runAsGroup&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;supplementalGroups&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#666&#34;&gt;4000&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;example-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry.k8s.io/e2e-test-images/agnhost:2.45&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;sleep 1h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;securityContext&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;allowPrivilegeEscalation&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What is the result of &lt;code&gt;id&lt;/code&gt; command in the &lt;code&gt;example-container&lt;/code&gt; container? The output should be similar to this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-none&#34; data-lang=&#34;none&#34;&gt;uid=1000 gid=3000 groups=3000,4000,50000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Where does group ID &lt;code&gt;50000&lt;/code&gt; in supplementary groups (&lt;code&gt;groups&lt;/code&gt; field) come from, even though &lt;code&gt;50000&lt;/code&gt; is not defined in the Pod&#39;s manifest at all? The answer is &lt;code&gt;/etc/group&lt;/code&gt; file in the container image.&lt;/p&gt;
&lt;p&gt;Checking the contents of &lt;code&gt;/etc/group&lt;/code&gt; in the container image contains something like the following:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-none&#34; data-lang=&#34;none&#34;&gt;user-defined-in-image:x:1000:
group-defined-in-image:x:50000:user-defined-in-image
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This shows that the container&#39;s primary user &lt;code&gt;1000&lt;/code&gt; belongs to the group &lt;code&gt;50000&lt;/code&gt; in the last entry.&lt;/p&gt;
&lt;p&gt;Thus, the group membership defined in &lt;code&gt;/etc/group&lt;/code&gt; in the container image for the container&#39;s primary user is &lt;em&gt;implicitly&lt;/em&gt; merged to the information from the Pod. Please note that this was a design decision the current CRI implementations inherited from Docker, and the community never really reconsidered it until now.&lt;/p&gt;
&lt;h3 id=&#34;what-s-wrong-with-it&#34;&gt;What&#39;s wrong with it?&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;implicitly&lt;/em&gt; merged group information from &lt;code&gt;/etc/group&lt;/code&gt; in the container image poses a security risk. These implicit GIDs can&#39;t be detected or validated by policy engines because there&#39;s no record of them in the Pod manifest. This can lead to unexpected access control issues, particularly when accessing volumes (see &lt;a href=&#34;https://issue.k8s.io/112879&#34;&gt;kubernetes/kubernetes#112879&lt;/a&gt; for details) because file permission is controlled by UID/GIDs in Linux.&lt;/p&gt;
&lt;h2 id=&#34;fine-grained-supplemental-groups-control-in-a-pod-supplementarygroupspolicy&#34;&gt;Fine-grained supplemental groups control in a Pod: &lt;code&gt;supplementaryGroupsPolicy&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;To tackle this problem, a Pod&#39;s &lt;code&gt;.spec.securityContext&lt;/code&gt; now includes &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;This field lets you control how Kubernetes calculates the supplementary groups for container processes within a Pod. The available policies are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Merge&lt;/em&gt;: The group membership defined in &lt;code&gt;/etc/group&lt;/code&gt; for the container&#39;s primary user will be merged. If not specified, this policy will be applied (i.e. as-is behavior for backward compatibility).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Strict&lt;/em&gt;: Only the group IDs specified in &lt;code&gt;fsGroup&lt;/code&gt;, &lt;code&gt;supplementalGroups&lt;/code&gt;, or &lt;code&gt;runAsGroup&lt;/code&gt; are attached as supplementary groups to the container processes. Group memberships defined in &lt;code&gt;/etc/group&lt;/code&gt; for the container&#39;s primary user are ignored.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ll explain how the &lt;code&gt;Strict&lt;/code&gt; policy works. The following Pod manifest specifies &lt;code&gt;supplementalGroupsPolicy: Strict&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;strict-supplementalgroups-policy-example&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;securityContext&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;runAsUser&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;runAsGroup&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;supplementalGroups&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#666&#34;&gt;4000&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;supplementalGroupsPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Strict&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;example-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry.k8s.io/e2e-test-images/agnhost:2.45&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;sh&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;sleep 1h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;securityContext&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;allowPrivilegeEscalation&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The result of &lt;code&gt;id&lt;/code&gt; command in the &lt;code&gt;example-container&lt;/code&gt; container should be similar to this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-none&#34; data-lang=&#34;none&#34;&gt;uid=1000 gid=3000 groups=3000,4000
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can see &lt;code&gt;Strict&lt;/code&gt; policy can exclude group &lt;code&gt;50000&lt;/code&gt; from &lt;code&gt;groups&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;Thus, ensuring &lt;code&gt;supplementalGroupsPolicy: Strict&lt;/code&gt; (enforced by some policy mechanism) helps prevent the implicit supplementary groups in a Pod.&lt;/p&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Note:&lt;/h4&gt;&lt;p&gt;A container with sufficient privileges can change its process identity.
The &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt; only affect the initial process identity.&lt;/p&gt;
&lt;p&gt;Read on for more details.&lt;/p&gt;
&lt;/div&gt;

&lt;h2 id=&#34;attached-process-identity-in-pod-status&#34;&gt;Attached process identity in Pod status&lt;/h2&gt;
&lt;p&gt;This feature also exposes the process identity attached to the first container process of the container
via &lt;code&gt;.status.containerStatuses[].user.linux&lt;/code&gt; field. It would be helpful to see if implicit group IDs are attached.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containerStatuses&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ctr&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;user&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;linux&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;gid&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;3000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;supplementalGroups&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#666&#34;&gt;3000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#666&#34;&gt;4000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;uid&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Note:&lt;/h4&gt;&lt;p&gt;Please note that the values in &lt;code&gt;status.containerStatuses[].user.linux&lt;/code&gt; field is &lt;em&gt;the firstly attached&lt;/em&gt;
process identity to the first container process in the container. If the container has sufficient privilege
to call system calls related to process identity (e.g. &lt;a href=&#34;https://man7.org/linux/man-pages/man2/setuid.2.html&#34;&gt;&lt;code&gt;setuid(2)&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://man7.org/linux/man-pages/man2/setgid.2.html&#34;&gt;&lt;code&gt;setgid(2)&lt;/code&gt;&lt;/a&gt; or &lt;a href=&#34;https://man7.org/linux/man-pages/man2/setgroups.2.html&#34;&gt;&lt;code&gt;setgroups(2)&lt;/code&gt;&lt;/a&gt;, etc.), the container process can change its identity. Thus, the &lt;em&gt;actual&lt;/em&gt; process identity will be dynamic.&lt;/p&gt;
&lt;p&gt;There are several ways to restrict these permissions in containers. We suggest the belows as simple solutions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;setting &lt;code&gt;privilege: false&lt;/code&gt; and &lt;code&gt;allowPrivilegeEscalation: false&lt;/code&gt; in your container&#39;s &lt;code&gt;securityContext&lt;/code&gt;, or&lt;/li&gt;
&lt;li&gt;conform your pod to &lt;a href=&#34;https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted&#34;&gt;&lt;code&gt;Restricted&lt;/code&gt; policy in Pod Security Standard&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, kubelet has no visibility into NRI plugins or container runtime internal workings. Cluster Administrator configuring nodes or highly privilege workloads with the permission of a local administrator may change supplemental groups for any pod. However this is outside of a scope of Kubernetes control and should not be a concern for security-hardened nodes.&lt;/p&gt;
&lt;/div&gt;

&lt;h2 id=&#34;strict-policy-requires-up-to-date-container-runtimes&#34;&gt;&lt;code&gt;Strict&lt;/code&gt; policy requires up-to-date container runtimes&lt;/h2&gt;
&lt;p&gt;The high level container runtime (e.g. containerd, CRI-O) plays a key role for calculating supplementary group ids
that will be attached to the containers. Thus, &lt;code&gt;supplementalGroupsPolicy: Strict&lt;/code&gt; requires a CRI runtime that support this feature.
The old behavior (&lt;code&gt;supplementalGroupsPolicy: Merge&lt;/code&gt;) can work with a CRI runtime that does not support this feature,
because this policy is fully backward compatible.&lt;/p&gt;
&lt;p&gt;Here are some CRI runtimes that support this feature, and the versions you need
to be running:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;containerd: v2.0 or later&lt;/li&gt;
&lt;li&gt;CRI-O: v1.31 or later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, you can see if the feature is supported in the Node&#39;s &lt;code&gt;.status.features.supplementalGroupsPolicy&lt;/code&gt; field. Please note that this field is different from &lt;code&gt;status.declaredFeatures&lt;/code&gt; introduced in &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5328&#34;&gt;KEP-5328: Node Declared Features(formerly Node Capabilities)&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Node&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;features&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;supplementalGroupsPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As container runtimes support this feature universally, various security policies may start enforcing the &lt;code&gt;Strict&lt;/code&gt; behavior as more secure. It is the best practice to ensure that your Pods are ready for this enforcement and all supplemental groups are transparently declared in Pod spec, rather than in images.&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Getting involved&lt;/h2&gt;
&lt;p&gt;This enhancement was driven by the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt; community.
Please join us to connect with the community and share your ideas and feedback around the above feature and
beyond. We look forward to hearing from you!&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;How can I learn more?&lt;/h2&gt;
&lt;!-- https://github.com/kubernetes/website/pull/46920 --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/security-context/&#34;&gt;Configure a Security Context for a Pod or Container&lt;/a&gt;
for the further details of &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3619&#34;&gt;KEP-3619: Fine-grained SupplementalGroups control&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Kubelet Configuration Drop-in Directory Graduates to GA</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/22/kubernetes-v1-35-kubelet-config-drop-in-directory-ga/</link>
      <pubDate>Mon, 22 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/22/kubernetes-v1-35-kubelet-config-drop-in-directory-ga/</guid>
      <description>
        
        
        &lt;p&gt;With the recent v1.35 release of Kubernetes, support for a kubelet configuration drop-in directory is generally available.
The newly stable feature simplifies the management of kubelet configuration across large, heterogeneous clusters.&lt;/p&gt;
&lt;p&gt;With v1.35, the kubelet command line argument &lt;code&gt;--config-dir&lt;/code&gt; is production-ready and fully supported,
allowing you to specify a directory containing kubelet configuration drop-in files.
All files in that directory will be automatically merged with your main kubelet configuration.
This allows cluster administrators to maintain a cohesive &lt;em&gt;base configuration&lt;/em&gt; for kubelets while enabling targeted customizations for different node groups or use cases, and without complex tooling or manual configuration management.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-managing-kubelet-configuration-at-scale&#34;&gt;The problem: managing kubelet configuration at scale&lt;/h2&gt;
&lt;p&gt;As Kubernetes clusters grow larger and more complex, they often include heterogeneous node pools with different hardware capabilities, workload requirements, and operational constraints. This diversity necessitates different kubelet configurations across node groups—yet managing these varied configurations at scale becomes increasingly challenging. Several pain points emerge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Configuration drift&lt;/strong&gt;: Different nodes may have slightly different configurations, leading to inconsistent behavior&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node group customization&lt;/strong&gt;: GPU nodes, edge nodes, and standard compute nodes often require different kubelet settings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational overhead&lt;/strong&gt;: Maintaining separate, complete configuration files for each node type is error-prone and difficult to audit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change management&lt;/strong&gt;: Rolling out configuration changes across heterogeneous node pools requires careful coordination&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before this support was added to Kubernetes, cluster administrators had to choose between using a single monolithic configuration file for all nodes,
manually maintaining multiple complete configuration files, or relying on separate tooling. Each approach had its own drawbacks.
This graduation to stable gives cluster administrators a fully supported fourth way to solve that challenge.&lt;/p&gt;
&lt;h2 id=&#34;example-use-cases&#34;&gt;Example use cases&lt;/h2&gt;
&lt;h3 id=&#34;managing-heterogeneous-node-pools&#34;&gt;Managing heterogeneous node pools&lt;/h3&gt;
&lt;p&gt;Consider a cluster with multiple node types: standard compute nodes, high-capacity nodes (such as those with GPUs or large amounts of memory), and edge nodes with specialized requirements.&lt;/p&gt;
&lt;h4 id=&#34;base-configuration&#34;&gt;Base configuration&lt;/h4&gt;
&lt;p&gt;File: &lt;code&gt;00-base.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubelet.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;KubeletConfiguration&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;clusterDNS&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;10.96.0.10&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;clusterDomain&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;cluster.local&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;high-capacity-node-override&#34;&gt;High-capacity node override&lt;/h4&gt;
&lt;p&gt;File: &lt;code&gt;50-high-capacity-nodes.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubelet.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;KubeletConfiguration&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;maxPods&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;50&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;systemReserved&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;4Gi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1000m&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;edge-node-override&#34;&gt;Edge node override&lt;/h4&gt;
&lt;p&gt;File: &lt;code&gt;50-edge-nodes.conf&lt;/code&gt; (edge compute typically has lower capacity)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubelet.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;KubeletConfiguration&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;evictionHard&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory.available&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;500Mi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;nodefs.available&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;5%&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this structure, high-capacity nodes apply both the base configuration and the capacity-specific overrides, while edge nodes apply the base configuration with edge-specific settings.&lt;/p&gt;
&lt;h3 id=&#34;gradual-configuration-rollouts&#34;&gt;Gradual configuration rollouts&lt;/h3&gt;
&lt;p&gt;When rolling out configuration changes, you can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a new drop-in file with a high numeric prefix (e.g., &lt;code&gt;99-new-feature.conf&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Test the changes on a subset of nodes&lt;/li&gt;
&lt;li&gt;Gradually roll out to more nodes&lt;/li&gt;
&lt;li&gt;Once stable, merge changes into the base configuration&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;viewing-the-merged-configuration&#34;&gt;Viewing the merged configuration&lt;/h2&gt;
&lt;p&gt;Since configuration is now spread across multiple files, you can inspect the final merged configuration using the kubelet&#39;s &lt;code&gt;/configz&lt;/code&gt; endpoint:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Start kubectl proxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl proxy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# In another terminal, fetch the merged configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Change the &amp;#39;&amp;lt;node-name&amp;gt;&amp;#39; placeholder before running the curl command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X GET http://127.0.0.1:8001/api/v1/nodes/&amp;lt;node-name&amp;gt;/proxy/configz | jq .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This shows the actual configuration the kubelet is using after all merging has been applied.
The merged configuration also includes any configuration settings that were specified via kubelet command-line arguments.&lt;/p&gt;
&lt;p&gt;For detailed setup instructions, configuration examples, and merging behavior, see the official documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/kubelet-config-file/#kubelet-conf-d&#34;&gt;Set Kubelet Parameters Via A Configuration File&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/node/kubelet-config-directory-merging/&#34;&gt;Kubelet Configuration Directory Merging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;good-practices&#34;&gt;Good practices&lt;/h2&gt;
&lt;p&gt;When using the kubelet configuration drop-in directory:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test configurations incrementally&lt;/strong&gt;: Always test new drop-in configurations on a subset of nodes before rolling out cluster-wide to minimize risk&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Version control your drop-ins&lt;/strong&gt;: Store your drop-in configuration files in version control (or the configuration source from which these are generated) alongside your infrastructure as code to track changes and enable easy rollbacks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use numeric prefixes for predictable ordering&lt;/strong&gt;: Name files with numeric prefixes (e.g., &lt;code&gt;00-&lt;/code&gt;, &lt;code&gt;50-&lt;/code&gt;, &lt;code&gt;90-&lt;/code&gt;) to explicitly control merge order and make the configuration layering obvious to other administrators&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Be mindful of temporary files&lt;/strong&gt;: Some text editors automatically create backup files (such as &lt;code&gt;.bak&lt;/code&gt;, &lt;code&gt;.swp&lt;/code&gt;, or files with &lt;code&gt;~&lt;/code&gt; suffix) in the same directory when editing. Ensure these temporary or backup files are not left in the configuration directory, as they may be processed by the kubelet&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;This feature was developed through the collaborative efforts of &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt;. Special thanks to all contributors who helped design, implement, test, and document this feature across its journey from alpha in v1.28, through beta in v1.30, to GA in v1.35.&lt;/p&gt;
&lt;p&gt;To provide feedback on this feature, join the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;Kubernetes Node Special Interest Group&lt;/a&gt;, participate in discussions on the &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;public Slack channel&lt;/a&gt; (#sig-node), or file an issue on &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;If you have feedback or questions about kubelet configuration management, or want to share your experience using this feature, join the discussion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node community page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Kubernetes Slack&lt;/a&gt; in the #sig-node channel&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34;&gt;SIG Node mailing list&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SIG Node would love to hear about your experiences using this feature in production!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Avoiding Zombie Cluster Members When Upgrading to etcd v3.6</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/21/preventing-etcd-zombies/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/21/preventing-etcd-zombies/</guid>
      <description>
        
        
        &lt;p&gt;&lt;em&gt;This article is a mirror of an &lt;a href=&#34;https://etcd.io/blog/2025/zombie_members_upgrade/&#34;&gt;original&lt;/a&gt; that was recently published to the official etcd blog&lt;/em&gt;.
The &lt;a href=&#34;https://etcd.io/blog/2025/zombie_members_upgrade/#key-takeaway&#34;&gt;key takeaway&lt;/a&gt;?
Always upgrade to etcd v3.5.26 or later before moving to v3.6. This ensures your cluster is automatically repaired, and avoids zombie members.&lt;/p&gt;
&lt;h2 id=&#34;issue-summary&#34;&gt;Issue summary&lt;/h2&gt;
&lt;p&gt;Recently, the etcd community addressed an issue that may appear when users &lt;a href=&#34;https://etcd.io/docs/v3.6/upgrades/upgrade_3_6/&#34;&gt;upgrade from v3.5 to v3.6&lt;/a&gt;.  This bug can cause the cluster to report &amp;quot;zombie members&amp;quot;, which are etcd nodes that were removed from the database cluster some time ago, and are re-appearing and joining database consensus.  The etcd cluster is then inoperable until these zombie members are removed.&lt;/p&gt;
&lt;p&gt;In etcd v3.5 and earlier, the v2store was the source of truth for membership data, even though the v3store was also present. As a part of our &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/12913&#34;&gt;v2store deprecation plan&lt;/a&gt;, in v3.6 the v3store is the source of truth for cluster membership. Through a &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/20967&#34;&gt;bug report&lt;/a&gt; we found out that, in some older clusters, v2store and v3store could become inconsistent.  This inconsistency manifests after upgrading as seeing old, removed &amp;quot;zombie&amp;quot; cluster members re-appearing in the cluster.&lt;/p&gt;
&lt;h2 id=&#34;the-fix-and-upgrade-path&#34;&gt;The fix and upgrade path&lt;/h2&gt;
&lt;p&gt;We’ve added a &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/20995&#34;&gt;mechanism in etcd v3.5.26&lt;/a&gt; to automatically sync v3store from v2store, ensuring that affected clusters are repaired before upgrading to 3.6.x.&lt;/p&gt;
&lt;p&gt;To support the many users currently upgrading to 3.6, we have provided the following safe upgrade path:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Upgrade your cluster to &lt;a href=&#34;https://github.com/etcd-io/etcd/releases/tag/v3.5.26&#34;&gt;v3.5.26&lt;/a&gt; or later.&lt;/li&gt;
&lt;li&gt;Wait and confirm that all members are healthy post-update.&lt;/li&gt;
&lt;li&gt;Upgrade to v3.6.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We are unable to provide a safe workaround path for users who have some obstacle preventing updating to v3.5.26.  As such, if v3.5.26 is not available from your packaging source or vendor, you should delay upgrading to v3.6 until it is.&lt;/p&gt;
&lt;h2 id=&#34;additional-technical-detail&#34;&gt;Additional technical detail&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Information below is offered for reference only.  Users can follow the safe upgrade path without knowledge of the following details.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This issue is encountered with clusters that have been running in production on etcd v3.5.25 or earlier.  It is a side effect of adding and removing members from the cluster, or recovering the cluster from failure.  This means that the issue is more likely the older the etcd cluster is, but it cannot be ruled out for any user regardless of the age of the cluster.&lt;/p&gt;
&lt;p&gt;etcd maintainers, working with issue reporters, have found three possible triggers for the issue based on symptoms and an analysis of etcd code and logs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bug in &lt;code&gt;etcdctl snapshot restore&lt;/code&gt; (v3.4 and old versions)&lt;/strong&gt;: When restoring a snapshot using &lt;code&gt;etcdctl snapshot restore&lt;/code&gt;, etcdctl was supposed to remove existing members before adding the new ones. In v3.4, due to a bug, old members were not removed, resulting in zombie members. Refer to the &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/20967#issuecomment-3618010356&#34;&gt;comment on etcdctl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--force-new-cluster&lt;/code&gt; in v3.5 and earlier versions&lt;/strong&gt;: In rare cases, forcibly creating a new single-member cluster did not fully remove old members, leaving zombies. The issue was &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/20339&#34;&gt;resolved&lt;/a&gt; in v3.5.22. Please refer to &lt;a href=&#34;https://github.com/etcd-io/raft/pull/300&#34;&gt;this PR&lt;/a&gt; in the Raft project for detailed technical information.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--unsafe-no-sync enabled&lt;/strong&gt;: If &lt;code&gt;--unsafe-no-sync&lt;/code&gt; is enabled, in rare cases etcd might persist a membership change to v3store but crash before writing it to the WAL, causing inconsistency between v2store and v3store. This is a problem for single-member clusters. For multi-member clusters, forcibly creating a new single-member cluster from the crashed node’s data may lead to zombie members.&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;

    &lt;code&gt;--unsafe-no-sync&lt;/code&gt; is generally not recommended, as it may break the guarantees given by the consensus protocol.

&lt;/div&gt;

&lt;p&gt;Importantly, there may be other triggers for v2store and v3store membership data becoming inconsistent that we have not yet found.  This means that you cannot assume that you are safe just because you have not performed any of the three actions above.
Once users are upgraded to etcd v3.6, v3store becomes the source of membership data, and further inconsistency is not possible.&lt;/p&gt;
&lt;p&gt;Advanced users who want to verify the consistency between v2store and v3store can follow the steps described in this &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/20967#issuecomment-3590609775&#34;&gt;comment&lt;/a&gt;.   This check is not required to fix the issue, nor does SIG etcd recommend bypassing the v3.5.26 update regardless of the results of the check.&lt;/p&gt;
&lt;h2 id=&#34;key-takeaway&#34;&gt;Key takeaway&lt;/h2&gt;
&lt;p&gt;Always upgrade to &lt;a href=&#34;https://github.com/etcd-io/etcd/releases/tag/v3.5.26&#34;&gt;v3.5.26&lt;/a&gt; or later before moving to v3.6. This ensures your cluster is automatically repaired and avoids zombie members.&lt;/p&gt;
&lt;h2 id=&#34;acknowledgements&#34;&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;We would like to thank &lt;a href=&#34;https://github.com/thechristschn&#34;&gt;Christian Baumann&lt;/a&gt; for reporting this long-standing upgrade issue. His report and follow-up work helped bring the issue to our attention so that we could investigate and resolve it upstream.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes 1.35: In-Place Pod Resize Graduates to Stable</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/19/kubernetes-v1-35-in-place-pod-resize-ga/</link>
      <pubDate>Fri, 19 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/19/kubernetes-v1-35-in-place-pod-resize-ga/</guid>
      <description>
        
        
        &lt;p&gt;This release marks a major step: more than 6 years after its initial conception,
the &lt;strong&gt;In-Place Pod Resize&lt;/strong&gt; feature (also known as In-Place Pod Vertical Scaling), first introduced as
alpha in Kubernetes v1.27, and graduated to beta in Kubernetes v1.33, is now &lt;strong&gt;stable (GA)&lt;/strong&gt; in Kubernetes
1.35!&lt;/p&gt;
&lt;p&gt;This graduation is a major milestone for improving resource efficiency and flexibility for workloads
running on Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;what-is-in-place-pod-resize&#34;&gt;What is in-place Pod Resize?&lt;/h2&gt;
&lt;p&gt;In the past, the CPU and memory resources allocated to a container in a Pod were immutable. This meant changing
them required deleting and recreating the entire Pod. For stateful services, batch jobs, or latency-sensitive
workloads, this was an incredibly disruptive operation.&lt;/p&gt;
&lt;p&gt;In-Place Pod Resize makes CPU and memory requests and limits mutable, allowing you to adjust these resources
within a running Pod, often without requiring a container restart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Concept:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Desired Resources:&lt;/strong&gt; A container&#39;s &lt;code&gt;spec.containers[*].resources&lt;/code&gt; field now represents the desired
resources. For CPU and memory, these fields are now mutable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actual Resources:&lt;/strong&gt; The &lt;code&gt;status.containerStatuses[*].resources&lt;/code&gt; field reflects the resources currently
configured for a running container.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Triggering a Resize:&lt;/strong&gt; You can request a resize by updating the desired &lt;code&gt;requests&lt;/code&gt;
and &lt;code&gt;limits&lt;/code&gt; in the Pod&#39;s specification by utilizing the new &lt;code&gt;resize&lt;/code&gt; subresource.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-can-i-start-using-in-place-pod-resize&#34;&gt;How can I start using in-place Pod Resize?&lt;/h2&gt;
&lt;p&gt;Detailed usage instructions and examples are provided in the official documentation:
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/resize-container-resources/&#34;&gt;Resize CPU and Memory Resources assigned to Containers&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-does-this-help-me&#34;&gt;How does this help me?&lt;/h2&gt;
&lt;p&gt;In-place Pod Resize is a foundational building block that unlocks seamless, vertical autoscaling and
improvements to workload efficiency.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resources adjusted without disruption&lt;/strong&gt; Workloads sensitive to latency or restarts can have their resources
modified in-place without downtime or loss of state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More powerful autoscaling&lt;/strong&gt; Autoscalers are now empowered to adjust resources and with less
impact. For example, Vertical Pod Autoscaler (VPA)&#39;s &lt;code&gt;InPlaceOrRecreate&lt;/code&gt; update mode, which leverages this
feature, has graduated to beta. This allows resources to be adjusted automatically and seamlessly based on
usage with minimal disruption.
&lt;ul&gt;
&lt;li&gt;See &lt;a href=&#34;https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler/enhancements/4016-in-place-updates-support&#34;&gt;AEP-4016&lt;/a&gt; for more details.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address transient resource needs&lt;/strong&gt; Workloads that temporarily need more resources can be adjusted quickly. This enables features like the CPU Startup Boost (&lt;a href=&#34;https://github.com/kubernetes/autoscaler/pull/7863&#34;&gt;AEP-7862&lt;/a&gt;) where applications can request more CPU during startup and then automatically scale back down.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a few examples of some use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A game server that needs to adjust its size with shifting player count.&lt;/li&gt;
&lt;li&gt;A pre-warmed worker that can be shrunk while unused but inflated with the first request.&lt;/li&gt;
&lt;li&gt;Dynamically scale with load for efficient bin-packing.&lt;/li&gt;
&lt;li&gt;Increased resources for JIT compilation on startup.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;changes-between-beta-1-33-and-stable-1-35&#34;&gt;Changes between beta (1.33) and stable (1.35)&lt;/h2&gt;
&lt;p&gt;Since the initial beta in v1.33, development effort has primarily been around stabilizing the feature and
improving its usability based on community feedback. Here are the primary changes for the stable release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory limit decrease&lt;/strong&gt; Decreasing memory limits was previously prohibited. This restriction has been
lifted, and memory limit decreases are now permitted. The Kubelet attempts to prevent OOM-kills by allowing the
resize only if the current memory usage is below the new desired limit. However, this check is best-effort and
not guaranteed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prioritized resizes&lt;/strong&gt; If a node doesn&#39;t have enough room to accept all resize requests, &lt;em&gt;Deferred&lt;/em&gt; resizes
are reattempted based on the following priority:
&lt;ul&gt;
&lt;li&gt;PriorityClass&lt;/li&gt;
&lt;li&gt;QoS class&lt;/li&gt;
&lt;li&gt;Duration &lt;em&gt;Deferred&lt;/em&gt;, with older requests prioritized first.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pod Level Resources (Alpha)&lt;/strong&gt; Support for in-place Pod Resize with Pod Level Resources has been introduced
behind its own feature gate, which is alpha in v1.35.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increased observability&lt;/strong&gt;: There are now new Kubelet metrics and Pod events specifically associated with
In-Place Pod Resize to help users track and debug resource changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What&#39;s next?&lt;/h2&gt;
&lt;p&gt;The graduation of In-Place Pod Resize to stable opens the door for powerful integrations across the Kubernetes
ecosystem. There are several areas for futher improvement that are currently planned.&lt;/p&gt;
&lt;h3 id=&#34;integration-with-autoscalers-and-other-projects&#34;&gt;Integration with autoscalers and other projects&lt;/h3&gt;
&lt;p&gt;There are planned integrations with several autoscalers and other projects to improve workload efficiency at a larger scale. Some projects under discussion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPA CPU startup boost (&lt;a href=&#34;https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler/enhancements/7862-cpu-startup-boost&#34;&gt;AEP-7862&lt;/a&gt;): Allows applications to request more CPU at startup and scale back down after a specific period of time.&lt;/li&gt;
&lt;li&gt;VPA Support for in-place updates (&lt;a href=&#34;https://github.com/kubernetes/autoscaler/tree/455d29039bf6b1eb9f784f498f28769a8698bc21/vertical-pod-autoscaler/enhancements/4016-in-place-updates-support&#34;&gt;AEP-4016&lt;/a&gt;): VPA support for &lt;code&gt;InPlaceOrRecreate&lt;/code&gt; has recently graduated to beta, with the eventual goal being to graduate
the feature to stable. Support for &lt;code&gt;InPlace&lt;/code&gt; mode is still being worked on; see &lt;a href=&#34;https://github.com/kubernetes/autoscaler/pull/8818&#34;&gt;this pull request&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ray autoscaler: Plans to leverage In-Place Pod Resize to improve workload efficiency. See &lt;a href=&#34;https://cloud.google.com/blog/products/containers-kubernetes/ray-on-gke-new-features-for-ai-scheduling-and-scaling&#34;&gt;this Google Cloud blog post&lt;/a&gt; for more details.&lt;/li&gt;
&lt;li&gt;Agent-sandbox &amp;quot;Soft-Pause&amp;quot;: Investigating leveraging in-place Pod Resize for better improved latency. See the &lt;a href=&#34;https://github.com/kubernetes-sigs/agent-sandbox/issues/103&#34;&gt;Github issue&lt;/a&gt; for more details.&lt;/li&gt;
&lt;li&gt;Runtime support: Java and Python runtimes do not support resizing memory without restart. There is an open
conversation with the Java developers, see &lt;a href=&#34;https://bugs.openjdk.org/browse/JDK-8359211&#34;&gt;the bug&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have a project that could benefit from integration with in-place pod resize, please reach out using
the channels listed in the feedback section!&lt;/p&gt;
&lt;h3 id=&#34;feature-expansion&#34;&gt;Feature expansion&lt;/h3&gt;
&lt;p&gt;Today, In-Place Pod Resize is prohibited when used in combination with: swap, the static CPU Manager, and the
static Memory Manager. Additionally, resources other than CPU and memory are still immutable. Expanding the set
of supported features and resources is under consideration as more feedback about community needs comes in.&lt;/p&gt;
&lt;p&gt;There are also plans to support workload preemption; if there is not enough room on the node for the resize of
a high priority pod, the goal is to enable policies to automatically evict a lower-priority pod or upsize
the node.&lt;/p&gt;
&lt;h3 id=&#34;improved-stability&#34;&gt;Improved stability&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Resolve kubelet-scheduler race conditions&lt;/strong&gt; There are known race conditions between the kubelet and
scheduler with regards to in-place pod resize. Work is underway to resolve these issues over the next few releases. See the &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/126891&#34;&gt;issue&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Safer memory limit decrease&lt;/strong&gt; The Kubelet&#39;s best-effort check for OOM-kill prevention can be made even
safer by moving the memory usage check into the container runtime itself. See the &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/135670&#34;&gt;issue&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;providing-feedback&#34;&gt;Providing feedback&lt;/h2&gt;
&lt;p&gt;Looking to further build on this foundational feature, please share your feedback on how to improve and
extend this feature. You can share your feedback through GitHub issues, mailing lists, or Slack channels
related to the Kubernetes &lt;a href=&#34;https://kubernetes.slack.com/archives/C0BP8PW9G&#34;&gt;#sig-node&lt;/a&gt; and &lt;a href=&#34;https://kubernetes.slack.com/archives/C09R1LV8S&#34;&gt;#sig-autoscaling&lt;/a&gt; communities.&lt;/p&gt;
&lt;p&gt;Thank you to everyone who contributed to making this long-awaited feature a reality!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Job Managed By Goes GA</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/18/kubernetes-v1-35-job-managedby-for-jobs-goes-ga/</link>
      <pubDate>Thu, 18 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/18/kubernetes-v1-35-job-managedby-for-jobs-goes-ga/</guid>
      <description>
        
        
        &lt;p&gt;In Kubernetes v1.35, the ability to specify an external Job controller (through &lt;code&gt;.spec.managedBy&lt;/code&gt;) graduates to General Availability.&lt;/p&gt;
&lt;p&gt;This feature allows external controllers to take full responsibility for Job reconciliation, unlocking powerful scheduling patterns like multi-cluster dispatching with &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/multikueue/&#34;&gt;MultiKueue&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;why-delegate-job-reconciliation&#34;&gt;Why delegate Job reconciliation?&lt;/h2&gt;
&lt;p&gt;The primary motivation for this feature is to support multi-cluster batch scheduling architectures, such as MultiKueue.&lt;/p&gt;
&lt;p&gt;The MultiKueue architecture distinguishes between a Management Cluster and a pool of Worker Clusters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Management Cluster is responsible for dispatching Jobs but not executing them. It needs to accept Job objects to track status, but it skips the creation and execution of Pods.&lt;/li&gt;
&lt;li&gt;The Worker Clusters receive the dispatched Jobs and execute the actual Pods.&lt;/li&gt;
&lt;li&gt;Users usually interact with the Management Cluster. Because the status is automatically propagated back, they can observe the Job&#39;s progress &amp;quot;live&amp;quot; without accessing the Worker Clusters.&lt;/li&gt;
&lt;li&gt;In the Worker Clusters, the dispatched Jobs run as regular Jobs managed by the built-in Job controller, with no &lt;code&gt;.spec.managedBy&lt;/code&gt; set.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By using &lt;code&gt;.spec.managedBy&lt;/code&gt;, the MultiKueue controller on the Management Cluster can take over the reconciliation of a Job. It copies the status from the &amp;quot;mirror&amp;quot; Job running on the Worker Cluster back to the Management Cluster.&lt;/p&gt;
&lt;p&gt;Why not just disable the Job controller? While one could theoretically achieve this by disabling the built-in Job controller entirely, this is often impossible or impractical for two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Managed Control Planes: In many cloud environments, the Kubernetes control plane is locked, and users cannot modify controller manager flags.&lt;/li&gt;
&lt;li&gt;Hybrid Cluster Role: Users often need a &amp;quot;hybrid&amp;quot; mode where the Management Cluster dispatches some heavy workloads to remote clusters but still executes smaller or control-plane-related Jobs in the Management Cluster. &lt;code&gt;.spec.managedBy&lt;/code&gt; allows this granularity on a per-Job basis.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;how-spec-managedby-works&#34;&gt;How &lt;code&gt;.spec.managedBy&lt;/code&gt; works&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;.spec.managedBy&lt;/code&gt; field indicates which controller is responsible for the Job, specifically there are two modes of operation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standard&lt;/strong&gt;: if unset or set to the reserved value &lt;code&gt;kubernetes.io/job-controller&lt;/code&gt;, the built-in Job controller reconciles the Job as usual (standard behavior).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delegation&lt;/strong&gt;: If set to any other value, the built-in Job controller skips reconciliation entirely for that Job.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To prevent orphaned Pods or resource leaks, this field is immutable. You cannot transfer a running Job from one controller to another.&lt;/p&gt;
&lt;p&gt;If you are looking into implementing an external controller, be aware that your controller needs to be conformant with the definitions for the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/kubernetes-api/workload-resources/job-v1/&#34;&gt;Job API&lt;/a&gt;.
In order to enforce the conformance, a significant part of the effort was to introduce the extensive Job status validation rules.
Navigate to the &lt;a href=&#34;#how-can-you-learn-more&#34;&gt;How can you learn more?&lt;/a&gt; section for more details.&lt;/p&gt;
&lt;h2 id=&#34;ecosystem-adoption&#34;&gt;Ecosystem Adoption&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;.spec.managedBy&lt;/code&gt; field is rapidly becoming the standard interface for delegating control in the Kubernetes batch ecosystem.&lt;/p&gt;
&lt;p&gt;Various custom workload controllers are adding this field (or an equivalent) to allow MultiKueue to take over their reconciliation and orchestrate them across clusters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-sigs/jobset&#34;&gt;JobSet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubeflow.org/docs/components/training/&#34;&gt;Kubeflow Trainer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.ray.io/en/latest/cluster/kubernetes/&#34;&gt;KubeRay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://project-codeflare.github.io/appwrapper/&#34;&gt;AppWrapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tekton.dev/docs/&#34;&gt;Tekton Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While it is possible to use &lt;code&gt;.spec.managedBy&lt;/code&gt; to implement a custom Job controller from scratch, we haven&#39;t observed that yet. The feature is specifically designed to support delegation patterns, like MultiKueue, without reinventing the wheel.&lt;/p&gt;
&lt;h2 id=&#34;how-can-you-learn-more&#34;&gt;How can you learn more?&lt;/h2&gt;
&lt;p&gt;If you want to dig deeper:&lt;/p&gt;
&lt;p&gt;Read the user-facing documentation for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/job/&#34;&gt;Jobs&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/job/#delegation-of-managing-a-job-object-to-external-controller&#34;&gt;Delegation of managing a Job object to an external controller&lt;/a&gt;, and&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/multikueue/&#34;&gt;MultiKueue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deep dive into the design history:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Kubernetes Enhancement Proposal (KEP) &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4368&#34;&gt;Job&#39;s managed-by mechanism&lt;/a&gt; including introduction of the extensive &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/4368-support-managed-by-for-batch-jobs#job-status-validation&#34;&gt;Job status validation rules&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The Kueue KEP for &lt;a href=&#34;https://github.com/kubernetes-sigs/kueue/tree/main/keps/693-multikueue&#34;&gt;MultiKueue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Explore how MultiKueue uses &lt;code&gt;.spec.managedBy&lt;/code&gt; in practice in the task guide for &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/tasks/run/multikueue/job/&#34;&gt;running Jobs across clusters&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;As with any Kubernetes feature, a lot of people helped shape this one through design discussions, reviews, test runs,
and bug reports.&lt;/p&gt;
&lt;p&gt;We would like to thank, in particular:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/soltysh&#34;&gt;Maciej Szulik&lt;/a&gt; - for guidance, mentorship, and reviews.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/atiratree&#34;&gt;Filip Křepinský&lt;/a&gt; - for guidance, mentorship, and reviews.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;This work was sponsored by the Kubernetes
&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-batch&#34;&gt;Batch Working Group&lt;/a&gt;
in close collaboration with the
&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-apps&#34;&gt;SIG Apps&lt;/a&gt;,
and with strong input from the
&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-scheduling&#34;&gt;SIG Scheduling&lt;/a&gt; community.&lt;/p&gt;
&lt;p&gt;If you are interested in batch scheduling, multi-cluster solutions, or further improving the Job API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Join us in the Batch WG and SIG Apps meetings.&lt;/li&gt;
&lt;li&gt;Subscribe to the &lt;a href=&#34;https://kubernetes.slack.com/messages/wg-batch&#34;&gt;WG Batch Slack channel&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Timbernetes (The World Tree Release)</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/17/kubernetes-v1-35-release/</link>
      <pubDate>Wed, 17 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/17/kubernetes-v1-35-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Editors&lt;/strong&gt;: Aakanksha Bhende, Arujjwal Negi, Chad M. Crowell, Graziano Casto, Swathi Rao&lt;/p&gt;
&lt;p&gt;Similar to previous releases, the release of Kubernetes v1.35 introduces new stable, beta, and alpha features. The consistent delivery of high-quality releases underscores the strength of our development cycle and the vibrant support from our community.&lt;/p&gt;
&lt;p&gt;This release consists of 60 enhancements, including 17 stable, 19 beta, and 22 alpha features.&lt;/p&gt;
&lt;p&gt;There are also some &lt;a href=&#34;#deprecations-removals-and-community-updates&#34;&gt;deprecations and removals&lt;/a&gt; in this release; make sure to read about those.&lt;/p&gt;
&lt;h2 id=&#34;release-theme-and-logo&#34;&gt;Release theme and logo&lt;/h2&gt;


&lt;figure class=&#34;release-logo &#34;&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/12/17/kubernetes-v1-35-release/k8s-v1.35.png&#34;
         alt=&#34;Kubernetes v1.35 Timbernetes logo: a storybook hex badge with a glowing world tree whose branches cradle Earth and a white Kubernetes wheel; three cheerful squirrels stand below—a wizard in a plum robe holding an LGTM scroll, a warrior with an axe and blue Kubernetes shield, and a lantern-carrying rogue in a navy cloak—on green grass above a gold ribbon reading World Tree Release, backed by soft mountains and cloud-swept sky&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;2025 began in the shimmer of Octarine: The Color of Magic (v1.33) and rode the gusts Of Wind &amp;amp; Will (v1.34). We close the year with our hands on the World Tree, inspired by Yggdrasil, the tree of life that binds many realms. Like any great tree, Kubernetes grows ring by ring and release by release, shaped by the care of a global community.&lt;/p&gt;
&lt;p&gt;At its center sits the Kubernetes wheel wrapped around the Earth, grounded by the resilient maintainers, contributors and users who keep showing up. Between day jobs, life changes, and steady open-source stewardship, they prune old APIs, graft new features and keep one of the world’s largest open source projects healthy.&lt;/p&gt;
&lt;p&gt;Three squirrels guard the tree: a wizard holding the LGTM scroll for reviewers, a warrior with an axe and Kubernetes shield for the release crews who cut new branches, and a rogue with a lantern for the triagers who bring light to dark issue queues.&lt;/p&gt;
&lt;p&gt;Together, they stand in for a much larger adventuring party. Kubernetes v1.35 adds another growth ring to the World Tree, a fresh cut shaped by many hands, many paths and a community whose branches reach higher as its roots grow deeper.&lt;/p&gt;
&lt;h2 id=&#34;spotlight-on-key-updates&#34;&gt;Spotlight on key updates&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 is packed with new features and improvements. Here are a few select updates the Release Team would like to highlight!&lt;/p&gt;
&lt;h3 id=&#34;stable-in-place-update-of-pod-resources&#34;&gt;Stable: In-place update of Pod resources&lt;/h3&gt;
&lt;p&gt;Kubernetes has graduated in-place updates for Pod resources to General Availability (GA).
This feature allows users to adjust CPU and memory resources without restarting Pods or Containers. Previously, such modifications required recreating Pods, which could disrupt workloads, particularly for stateful or batch applications. Earlier Kubernetes releases allowed you to change only infrastructure resource settings (requests and limits) for existing Pods. The new in-place functionality allows for smoother, nondisruptive vertical scaling, improves efficiency, and can also simplify development.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP #1287&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;beta-pod-certificates-for-workload-identity-and-security&#34;&gt;Beta: Pod certificates for workload identity and security&lt;/h3&gt;
&lt;p&gt;Previously, delivering certificates to pods required external controllers (cert-manager, SPIFFE/SPIRE), CRD orchestration, and Secret management, with rotation handled by sidecars or init containers. Kubernetes v1.35 enables native workload identity with automated certificate rotation, drastically simplifying service mesh and zero-trust architectures.&lt;/p&gt;
&lt;p&gt;Now, the &lt;code&gt;kubelet&lt;/code&gt; generates keys, requests certificates via PodCertificateRequest, and writes credential bundles directly to the Pod&#39;s filesystem. The &lt;code&gt;kube-apiserver&lt;/code&gt; enforces node restriction at admission time, eliminating the most common pitfall for third-party signers: accidentally violating node isolation boundaries. This enables pure mTLS flows with no bearer tokens in the issuance path.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4317&#34;&gt;KEP #4317&lt;/a&gt; led by SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;alpha-node-declared-features-before-scheduling&#34;&gt;Alpha: Node declared features before scheduling&lt;/h3&gt;
&lt;p&gt;When control planes enable new features but nodes lag behind (permitted by Kubernetes skew policy), the scheduler can place pods requiring those features onto incompatible older nodes.
The node-declaration features framework allows nodes to declare their supported Kubernetes features. With the new alpha feature enabled, a Node reports the features it supports, publishing this information to the control plane via a new &lt;code&gt;.status.declaredFeatures&lt;/code&gt; field. Then, the &lt;code&gt;kube-scheduler&lt;/code&gt;, admission controllers, and third-party components can use these declarations. For example, you can enforce scheduling and API validation constraints to ensure that Pods run only on compatible nodes.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5328&#34;&gt;KEP #5328&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;features-graduating-to-stable&#34;&gt;Features graduating to Stable&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;This is a selection of some of the improvements that are now stable following the v1.35 release.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;prefersamenode-traffic-distribution&#34;&gt;PreferSameNode traffic distribution&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;trafficDistribution&lt;/code&gt; field for Services has been updated to provide more explicit control over traffic routing. A new option, &lt;code&gt;PreferSameNode&lt;/code&gt;, has been introduced to let services strictly prioritize endpoints on the local node if available, falling back to remote endpoints otherwise.&lt;/p&gt;
&lt;p&gt;Simultaneously, the existing &lt;code&gt;PreferClose&lt;/code&gt; option has been renamed to &lt;code&gt;PreferSameZone&lt;/code&gt;. This change makes the API self-explanatory by explicitly indicating that traffic is preferred within the current availability zone. While &lt;code&gt;PreferClose&lt;/code&gt; is preserved for backward compatibility, &lt;code&gt;PreferSameZone&lt;/code&gt; is now the standard for zonal routing, ensuring that both node-level and zone-level preferences are clearly distinguished.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/3015&#34;&gt;KEP #3015&lt;/a&gt; led by SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;job-api-managed-by-mechanism&#34;&gt;Job API managed-by mechanism&lt;/h3&gt;
&lt;p&gt;The Job API now includes a &lt;code&gt;managedBy&lt;/code&gt; field that allows an external controller to handle Job status synchronization. This feature, which graduates to stable in Kubernetes v1.35, is primarily driven by &lt;a href=&#34;https://github.com/kubernetes-sigs/kueue/tree/main/keps/693-multikueue&#34;&gt;MultiKueue&lt;/a&gt;, a multi-cluster dispatching system where a Job created in a management cluster is mirrored and executed in a worker cluster, with status updates propagated back. To enable this workflow, the built-in Job controller must not act on a particular Job resource so that the Kueue controller can manage status updates instead.&lt;/p&gt;
&lt;p&gt;The goal is to allow clean delegation of Job synchronization to another controller. It does not aim to pass custom parameters to that controller or modify CronJob concurrency policies.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4368&#34;&gt;KEP #4368&lt;/a&gt; led by SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;reliable-pod-update-tracking-with-metadata-generation&#34;&gt;Reliable Pod update tracking with &lt;code&gt;.metadata.generation&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Historically, the Pod API lacked the &lt;code&gt;metadata.generation&lt;/code&gt; field found in other Kubernetes objects such as Deployments.
Because of this omission, controllers and users had no reliable way to verify whether the &lt;code&gt;kubelet&lt;/code&gt; had actually processed the latest changes to a Pod&#39;s specification. This ambiguity was particularly problematic for features like &lt;a href=&#34;#stable-in-place-update-of-pod-resources&#34;&gt;In-Place Pod Vertical Scaling&lt;/a&gt;, where it was difficult to know exactly when a resource resize request had been enacted.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.33 added &lt;code&gt;.metadata.generation&lt;/code&gt; fields for Pods, as an alpha feature. That field is now stable in the v1.35 Pod API, which means that every time a Pod&#39;s &lt;code&gt;spec&lt;/code&gt; is updated, the &lt;code&gt;.metadata.generation&lt;/code&gt; value is incremented. As part of this improvement, the Pod API also gained a &lt;code&gt;.status.observedGeneration&lt;/code&gt; field, which reports the generation that the &lt;code&gt;kubelet&lt;/code&gt; has successfully seen and processed. Pod conditions also each contain their own individual &lt;code&gt;observedGeneration&lt;/code&gt; field that clients can report and / or observe.&lt;/p&gt;
&lt;p&gt;Because this feature has graduated to stable in v1.35, it is available for all workloads.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5067&#34;&gt;KEP #5067&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;configurable-numa-node-limit-for-topology-manager&#34;&gt;Configurable NUMA node limit for topology manager&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/policy/node-resource-managers/&#34;&gt;topology manager&lt;/a&gt; historically used a hard-coded limit of 8 for the maximum number of NUMA nodes it can support, preventing state explosion during affinity calculation. (There&#39;s an important detail here; a &lt;em&gt;NUMA node&lt;/em&gt; is not the same as a Node in the Kubernetes API.) This limit on the number of NUMA nodes prevented Kubernetes from fully utilizing modern high-end servers, which increasingly feature CPU architectures with more than 8 NUMA nodes.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.31 introduced a new, &lt;strong&gt;beta&lt;/strong&gt; &lt;code&gt;max-allowable-numa-nodes&lt;/code&gt; option to the topology manager policy configuration. In Kubernetes v1.35, that option is stable. Cluster administrators who enable it can use servers with more than 8 NUMA nodes.&lt;/p&gt;
&lt;p&gt;Although the configuration option is stable, the Kubernetes community is aware of the poor performance for large NUMA hosts, and there is a &lt;a href=&#34;https://kep.k8s.io/5726&#34;&gt;proposed enhancement&lt;/a&gt; (KEP-5726) that aims to improve on it. You can learn more about this by reading &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/topology-manager/&#34;&gt;Control Topology Management Policies on a node&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4622&#34;&gt;KEP #4622&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-beta&#34;&gt;New features in Beta&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;This is a selection of some of the improvements that are now beta following the v1.35 release.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;expose-node-topology-labels-via-downward-api&#34;&gt;Expose node topology labels via Downward API&lt;/h3&gt;
&lt;p&gt;Accessing node topology information, such as region and zone, from within a Pod has typically required querying the Kubernetes API server. While functional, this approach creates complexity and security risks by necessitating broad RBAC permissions or sidecar containers just to retrieve infrastructure metadata. Kubernetes v1.35 promotes the capability to expose node topology labels directly via the Downward API to beta.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;kubelet&lt;/code&gt; can now inject standard topology labels, such as &lt;code&gt;topology.kubernetes.io/zone&lt;/code&gt; and &lt;code&gt;topology.kubernetes.io/region&lt;/code&gt;, into Pods as environment variables or projected volume files. The primary benefit is a safer and more efficient way for workloads to be topology-aware. This allows applications to natively adapt to their availability zone or region without dependencies on the API server, strengthening security by upholding the principle of least privilege and simplifying cluster configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Kubernetes now injects available topology labels to every Pod so that they can be used as inputs to the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/pods/downward-api/&#34;&gt;downward API&lt;/a&gt;. With the v1.35 upgrade, most cluster administrators will see several new labels added to each Pod; this is expected as part of the design.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4742&#34;&gt;KEP #4742&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;native-support-for-storage-version-migration&#34;&gt;Native support for storage version migration&lt;/h3&gt;
&lt;p&gt;In Kubernetes v1.35, the native support for storage version migration graduates to beta and is enabled by default. This move integrates the migration logic directly into the core Kubernetes control plane (&amp;quot;in-tree&amp;quot;), eliminating the dependency on external tools.&lt;/p&gt;
&lt;p&gt;Historically, administrators relied on manual &amp;quot;read/write loops&amp;quot;—often piping &lt;code&gt;kubectl get&lt;/code&gt; into &lt;code&gt;kubectl replace&lt;/code&gt;—to update schemas or re-encrypt data at rest. This method was inefficient and prone to conflicts, especially for large resources like Secrets. With this release, the built-in controller automatically handles update conflicts and consistency tokens, providing a safe, streamlined, and reliable way to ensure stored data remains current with minimal operational overhead.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4192&#34;&gt;KEP #4192&lt;/a&gt; led by SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;mutable-volume-attach-limits&#34;&gt;Mutable Volume attach limits&lt;/h3&gt;
&lt;p&gt;A CSI (Container Storage Interface) driver is a Kubernetes plugin that provides a consistent way for storage systems to be exposed to containerized workloads. The &lt;code&gt;CSINode&lt;/code&gt; object records details about all CSI drivers installed on a node. However, a mismatch can arise between the reported and actual attachment capacity on nodes. When volume slots are consumed after a CSI driver starts up, the &lt;code&gt;kube-scheduler&lt;/code&gt; may assign stateful pods to nodes without sufficient capacity, ultimately getting stuck in a &lt;code&gt;ContainerCreating&lt;/code&gt; state.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 makes &lt;code&gt;CSINode.spec.drivers[*].allocatable.count&lt;/code&gt; mutable so that a node’s available volume attachment capacity can be updated dynamically. It also allows CSI drivers to control how frequently the &lt;code&gt;allocatable.count&lt;/code&gt; value is updated on all nodes by introducing a configurable refresh interval, defined through the &lt;code&gt;CSIDriver&lt;/code&gt; object. Additionally, it automatically updates &lt;code&gt;CSINode.spec.drivers[*].allocatable.count&lt;/code&gt; on detecting a failure in volume attachment due to insufficient capacity. Although this feature graduated to beta in v1.34 with the feature flag &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt; disabled by default, it remains in beta for v1.35 to allow time for feedback, but the feature flag is enabled by default.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;KEP #4876&lt;/a&gt; led by SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;opportunistic-batching&#34;&gt;Opportunistic batching&lt;/h3&gt;
&lt;p&gt;Historically, the Kubernetes scheduler processes pods sequentially with time complexity of &lt;code&gt;O(num pods × num nodes)&lt;/code&gt;, which can result in redundant computation for compatible pods. This KEP introduces an opportunistic batching mechanism that aims to improve performance by identifying such compatible Pods via &lt;code&gt;Pod scheduling signature&lt;/code&gt; and batching them together, allowing shared filtering and scoring results across them.&lt;/p&gt;
&lt;p&gt;The pod scheduling signature ensures that two pods with the same signature are “the same” from a scheduling perspective. It takes into account not only the pod and node attributes, but also the other pods in the system and global data about the pod placement. This means that any pod with the given signature will get the same scores/feasibility results from any arbitrary set of nodes.&lt;/p&gt;
&lt;p&gt;The batching mechanism consists of two operations that can be invoked whenever needed - &lt;em&gt;create&lt;/em&gt; and &lt;em&gt;nominate&lt;/em&gt;. Create leads to the creation of a new set of batch information from the scheduling results of Pods that have a valid signature. Nominate uses the batching information from create to set the nominated node name from a new Pod whose signature matches the canonical Pod’s signature.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5598&#34;&gt;KEP #5598&lt;/a&gt; led by SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;maxunavailable-for-statefulsets&#34;&gt;&lt;code&gt;maxUnavailable&lt;/code&gt; for StatefulSets&lt;/h3&gt;
&lt;p&gt;A StatefulSet runs a group of Pods and maintains a sticky identity for each of those Pods. This is critical for stateful workloads requiring stable network identifiers or persistent storage. When a StatefulSet&#39;s &lt;code&gt;.spec.updateStrategy.&amp;lt;type&amp;gt;&lt;/code&gt; is set to &lt;code&gt;RollingUpdate&lt;/code&gt;, the StatefulSet controller will delete and recreate each Pod in the StatefulSet. It will proceed in the same order as Pod termination (from the largest ordinal to the smallest), updating each Pod one at a time.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.24 added a new &lt;strong&gt;alpha&lt;/strong&gt; field to a StatefulSet&#39;s &lt;code&gt;rollingUpdate&lt;/code&gt; configuration settings, called &lt;code&gt;maxUnavailable&lt;/code&gt;. That field wasn&#39;t part of the Kubernetes API unless your cluster administrator explicitly opted in.
In Kubernetes v1.35 that field is beta and is available by default. You can use it to define the maximum number of pods that can be unavailable during an update. This setting is most effective in combination with &lt;code&gt;.spec.podManagementPolicy&lt;/code&gt; set to Parallel.  You can set &lt;code&gt;maxUnavailable&lt;/code&gt; as either a positive number (example: 2) or a percentage of the desired number of Pods (example: 10%). If this field is not specified, it will default to 1, to maintain the previous behavior of only updating one Pod at a time. This improvement allows stateful applications (that can tolerate more than one Pod being down) to finish updating faster.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/961&#34;&gt;KEP #961&lt;/a&gt; led by SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;configurable-credential-plugin-policy-in-kuberc&#34;&gt;Configurable credential plugin policy in &lt;code&gt;kuberc&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The optional &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/kuberc/&#34;&gt;&lt;code&gt;kuberc&lt;/code&gt; file&lt;/a&gt; is a way to separate server configurations and cluster credentials from user preferences without disrupting already running CI pipelines with unexpected outputs.&lt;/p&gt;
&lt;p&gt;As part of the v1.35 release, &lt;code&gt;kuberc&lt;/code&gt; gains additional functionality which allows users to configure credential plugin policy. This change introduces two fields &lt;code&gt;credentialPluginPolicy&lt;/code&gt;, which allows or denies all plugins, and allows specifying a list of allowed plugins using &lt;code&gt;credentialPluginAllowlist&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;KEP #3104&lt;/a&gt; as a cooperation between SIG Auth and SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;kyaml&#34;&gt;KYAML&lt;/h3&gt;
&lt;p&gt;YAML is a human-readable format of data serialization. In Kubernetes, YAML files are used to define and configure resources, such as Pods, Services, and Deployments. However, complex YAML is difficult to read. YAML&#39;s significant whitespace requires careful attention to indentation and nesting, while its optional string-quoting can lead to unexpected type coercion (see: The Norway Bug). While JSON is an alternative, it lacks support for comments and has strict requirements for trailing commas and quoted keys.&lt;/p&gt;
&lt;p&gt;KYAML is a safer and less ambiguous subset of YAML designed specifically for Kubernetes. Introduced as an opt-in alpha feature in v1.34, this feature graduated to beta in Kubernetes v1.35 and has been enabled by default. It can be disabled by setting the environment variable &lt;code&gt;KUBECTL_KYAML=false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;KYAML addresses challenges pertaining to both YAML and JSON. All KYAML files are also valid YAML files. This means you can write KYAML and pass it as an input to any version of kubectl. This also means that you don’t need to write in strict KYAML for the input to be parsed.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5295&#34;&gt;KEP #5295&lt;/a&gt; led by SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;configurable-tolerance-for-horizontalpodautoscalers&#34;&gt;Configurable tolerance for HorizontalPodAutoscalers&lt;/h3&gt;
&lt;p&gt;The Horizontal Pod Autoscaler (HPA) has historically relied on a fixed, global 10% tolerance for scaling actions. A drawback of this hardcoded value was that workloads requiring high sensitivity, such as those needing to scale on a 5% load increase, were often blocked from scaling, while others might oscillate unnecessarily.&lt;/p&gt;
&lt;p&gt;With Kubernetes v1.35, the configurable tolerance feature graduates to beta and is enabled by default. This enhancement allows users to define a custom tolerance window on a per-resource basis within the HPA &lt;code&gt;behavior&lt;/code&gt; field. By setting a specific tolerance (e.g., lowering it to 0.05 for 5%), operators gain precise control over autoscaling sensitivity, ensuring that critical workloads react quickly to small metric changes, without requiring cluster-wide configuration adjustments.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4951&#34;&gt;KEP #4951&lt;/a&gt; led by SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;support-for-user-namespaces-in-pods&#34;&gt;Support for user namespaces in Pods&lt;/h3&gt;
&lt;p&gt;Kubernetes is adding support for user namespaces, allowing pods to run with isolated user and group ID mappings instead of sharing host IDs. This means containers can operate as root internally while actually being mapped to an unprivileged user on the host, reducing the risk of privilege escalation in the event of a compromise. The feature improves pod-level security and makes it safer to run workloads that need root inside the container. Over time, support has expanded to both stateless and stateful Pods through id-mapped mounts.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP #127&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;volumesource-oci-artifact-and-or-image&#34;&gt;VolumeSource: OCI artifact and/or image&lt;/h3&gt;
&lt;p&gt;When creating a Pod, you often need to provide data, binaries, or configuration files for your containers. This meant including the content into the main container image or using a custom init container to download and unpack files into an &lt;code&gt;emptyDir&lt;/code&gt;. Both these approaches are still valid. Kubernetes v1.31 added support for the &lt;code&gt;image&lt;/code&gt; volume type allowing Pods to declaratively pull and unpack OCI container image artifacts into a volume. This lets you package and deliver data-only artifacts such as configs, binaries, or machine learning models using standard OCI registry tools.&lt;/p&gt;
&lt;p&gt;With this feature, you can fully separate your data from your container image and remove the need for extra init containers or startup scripts. The image volume type has been in beta since v1.33 and is enabled by default in v1.35. Please note that using this feature requires a compatible container runtime, such as containerd v2.1 or later.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4639&#34;&gt;KEP #4639&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;enforced-kubelet-credential-verification-for-cached-images&#34;&gt;Enforced &lt;code&gt;kubelet&lt;/code&gt; credential verification for cached images&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;imagePullPolicy: IfNotPresent&lt;/code&gt; setting currently allows a Pod to use a container image that is already cached on a node, even if the Pod itself does not possess the credentials to pull that image. A drawback of this behavior is that it creates a security vulnerability in multi-tenant clusters: if a Pod with valid credentials pulls a sensitive private image to a node, a subsequent unauthorized Pod on the same node can access that image simply by relying on the local cache.&lt;/p&gt;
&lt;p&gt;This KEP introduces a mechanism where the &lt;code&gt;kubelet&lt;/code&gt; enforces credential verification for cached images. Before allowing a Pod to use a locally cached image, the &lt;code&gt;kubelet&lt;/code&gt; checks if the Pod has the valid credentials to pull it. This ensures that only authorized workloads can use private images, regardless of whether they are already present on the node, significantly hardening the security posture for shared clusters.&lt;/p&gt;
&lt;p&gt;In Kubernetes v1.35, this feature has graduated to beta and is enabled by default. Users can still disable it by setting the &lt;code&gt;KubeletEnsureSecretPulledImages&lt;/code&gt; feature gate to false. Additionally, the &lt;code&gt;imagePullCredentialsVerificationPolicy&lt;/code&gt; flag allows operators to configure the desired security level, ranging from a mode that prioritizes backward compatibility to a strict enforcement mode that offers maximum security.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/2535&#34;&gt;KEP #2535&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;fine-grained-container-restart-rules&#34;&gt;Fine-grained Container restart rules&lt;/h3&gt;
&lt;p&gt;Historically, the &lt;code&gt;restartPolicy&lt;/code&gt; field was defined strictly at the Pod level, forcing the same behavior on all containers within a Pod. A drawback of this global setting was the lack of granularity for complex workloads, such as AI/ML training jobs. These often required &lt;code&gt;restartPolicy: Never&lt;/code&gt; for the Pod to manage job completion, yet individual containers would benefit from in-place restarts for specific, retriable errors (like network glitches or GPU init failures).&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 addresses this by enabling &lt;code&gt;restartPolicy&lt;/code&gt; and &lt;code&gt;restartPolicyRules&lt;/code&gt; within the container API itself. This allows users to define restart strategies for individual regular and init containers that operate independently of the Pod&#39;s overall policy. For example, a container can now be configured to restart automatically only if it exits with a specific error code, avoiding the expensive overhead of rescheduling the entire Pod for a transient failure.&lt;/p&gt;
&lt;p&gt;In this release, the feature has graduated to beta and is enabled by default. Users can immediately leverage &lt;code&gt;restartPolicyRules&lt;/code&gt; in their container specifications to optimize recovery times and resource utilization for long-running workloads, without altering the broader lifecycle logic of their Pods.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5307&#34;&gt;KEP #5307&lt;/a&gt; led by SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;csi-driver-opt-in-for-service-account-tokens-via-secrets-field&#34;&gt;CSI driver opt-in for service account tokens via secrets field&lt;/h3&gt;
&lt;p&gt;Providing ServiceAccount tokens to Container Storage Interface (CSI) drivers has traditionally relied on injecting them into the &lt;code&gt;volume_context&lt;/code&gt; field. This approach presents a significant security risk because &lt;code&gt;volume_context&lt;/code&gt; is intended for non-sensitive configuration data and is frequently logged in plain text by drivers and debugging tools, potentially leaking credentials.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 introduces an opt-in mechanism for CSI drivers to receive ServiceAccount tokens via the dedicated secrets field in the NodePublishVolume request. Drivers can now enable this behavior by setting the &lt;code&gt;serviceAccountTokenInSecrets&lt;/code&gt; field to true in their CSIDriver object, instructing the &lt;code&gt;kubelet&lt;/code&gt; to populate the token securely.&lt;/p&gt;
&lt;p&gt;The primary benefit is the prevention of accidental credential exposure in logs and error messages. This change ensures that sensitive workload identities are handled via the appropriate secure channels, aligning with best practices for secret management while maintaining backward compatibility for existing drivers.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5538&#34;&gt;KEP #5538&lt;/a&gt; led by SIG Auth in cooperation with SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;deployment-status-count-of-terminating-replicas&#34;&gt;Deployment status: count of terminating replicas&lt;/h3&gt;
&lt;p&gt;Historically, the Deployment status provided details on available and updated replicas but lacked explicit visibility into Pods that were in the process of shutting down. A drawback of this omission was that users and controllers could not easily distinguish between a stable Deployment and one that still had Pods executing cleanup tasks or adhering to long grace periods.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 promotes the &lt;code&gt;terminatingReplicas&lt;/code&gt; field within the Deployment status to beta. This field provides a count of Pods that have a deletion timestamp set but have not yet been removed from the system. This feature is a foundational step in a larger initiative to improve how Deployments handle Pod replacement, laying the groundwork for future policies regarding when to create new Pods during a rollout.&lt;/p&gt;
&lt;p&gt;The primary benefit is improved observability for lifecycle management tools and operators. By exposing the number of terminating Pods, external systems can now make more informed decisions such as waiting for a complete shutdown before proceeding with subsequent tasks without needing to manually query and filter individual Pod lists.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/3973&#34;&gt;KEP #3973&lt;/a&gt; led by SIG Apps.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-alpha&#34;&gt;New features in Alpha&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;This is a selection of some of the improvements that are now alpha following the v1.35 release.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;gang-scheduling-support-in-kubernetes&#34;&gt;Gang scheduling support in Kubernetes&lt;/h3&gt;
&lt;p&gt;Scheduling interdependent workloads, such as AI/ML training jobs or HPC simulations, has traditionally been challenging because the default Kubernetes scheduler places Pods individually. This often leads to partial scheduling where some Pods start while others wait indefinitely for resources, resulting in deadlocks and wasted cluster capacity.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 introduces native support for so-called &amp;quot;gang scheduling&amp;quot; via the new Workload API and PodGroup concept. This feature implements an &amp;quot;all-or-nothing&amp;quot; scheduling strategy, ensuring that a defined group of Pods is scheduled only if the cluster has sufficient resources to accommodate the entire group simultaneously.&lt;/p&gt;
&lt;p&gt;The primary benefit is improved reliability and efficiency for batch and parallel workloads. By preventing partial deployments, it eliminates resource deadlocks and ensures that expensive cluster capacity is utilized only when a complete job can run, significantly optimizing the orchestration of large-scale data processing tasks.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4671&#34;&gt;KEP #4671&lt;/a&gt; led by SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;constrained-impersonation&#34;&gt;Constrained impersonation&lt;/h3&gt;
&lt;p&gt;Historically, the &lt;code&gt;impersonate&lt;/code&gt; verb in Kubernetes RBAC functioned on an all-or-nothing basis: once a user was authorized to impersonate a target identity, they gained all associated permissions. A drawback of this broad authorization was that it violated the principle of least privilege, preventing administrators from restricting impersonators to specific actions or resources.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 introduces a new alpha feature, constrained impersonation, which adds a secondary authorization check to the impersonation flow. When enabled via the &lt;code&gt;ConstrainedImpersonation&lt;/code&gt; feature gate, the API server verifies not only the basic &lt;code&gt;impersonate&lt;/code&gt; permission but also checks if the impersonator is authorized for the specific action using new verb prefixes (e.g., &lt;code&gt;impersonate-on:&amp;lt;mode&amp;gt;:&amp;lt;verb&amp;gt;&lt;/code&gt;). This allows administrators to define fine-grained policies—such as permitting a support engineer to impersonate a cluster admin solely to view logs, without granting full administrative access.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5284&#34;&gt;KEP #5284&lt;/a&gt; led by SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;flagz-for-kubernetes-components&#34;&gt;Flagz for Kubernetes components&lt;/h3&gt;
&lt;p&gt;Verifying the runtime configuration of Kubernetes components, such as the API server or &lt;code&gt;kubelet&lt;/code&gt;, has traditionally required privileged access to the host node or process arguments. To address this, the &lt;code&gt;/flagz&lt;/code&gt; endpoint was introduced to expose command-line options via HTTP. However, its output was initially limited to plain text, making it difficult for automated tools to parse and validate configurations reliably.&lt;/p&gt;
&lt;p&gt;In Kubernetes v1.35, the &lt;code&gt;/flagz&lt;/code&gt; endpoint has been enhanced to support structured, machine-readable JSON output. Authorized users can now request a versioned JSON response using standard HTTP content negotiation, while the original plain text format remains available for human inspection. This update significantly improves observability and compliance workflows, allowing external systems to programmatically audit component configurations without fragile text parsing or direct infrastructure access.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4828&#34;&gt;KEP #4828&lt;/a&gt; led by SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;statusz-for-kubernetes-components&#34;&gt;Statusz for Kubernetes components&lt;/h3&gt;
&lt;p&gt;Troubleshooting Kubernetes components like the &lt;code&gt;kube-apiserver&lt;/code&gt; or &lt;code&gt;kubelet&lt;/code&gt; has traditionally involved parsing unstructured logs or text output, which is brittle and difficult to automate. While a basic &lt;code&gt;/statusz&lt;/code&gt; endpoint existed previously, it lacked a standardized, machine-readable format, limiting its utility for external monitoring systems.&lt;/p&gt;
&lt;p&gt;In Kubernetes v1.35, the &lt;code&gt;/statusz&lt;/code&gt; endpoint has been enhanced to support structured, machine-readable JSON output. Authorized users can now request this format using standard HTTP content negotiation to retrieve precise status data—such as version information and health indicators—without relying on fragile text parsing. This improvement provides a reliable, consistent interface for automated debugging and observability tools across all core components.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/4827&#34;&gt;KEP #4827&lt;/a&gt; led by SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;ccm-watch-based-route-controller-reconciliation-using-informers&#34;&gt;CCM: watch-based route controller reconciliation using informers&lt;/h3&gt;
&lt;p&gt;Managing network routes within cloud environments has traditionally relied on the Cloud Controller Manager (CCM) periodically polling the cloud provider&#39;s API to verify and update route tables. This fixed-interval reconciliation approach can be inefficient, often generating a high volume of unnecessary API calls and introducing latency between a node state change and the corresponding route update.&lt;/p&gt;
&lt;p&gt;For the Kubernetes v1.35 release, the cloud-controller-manager library introduces a watch-based reconciliation strategy for the route controller. Instead of relying on a timer, the controller now utilizes informers to watch for specific Node events, such as additions, deletions, or relevant field updates and triggers route synchronization only when a change actually occurs.&lt;/p&gt;
&lt;p&gt;The primary benefit is a significant reduction in cloud provider API usage, which lowers the risk of hitting rate limits and reduces operational overhead. Additionally, this event-driven model improves the responsiveness of the cluster&#39;s networking layer by ensuring that route tables are updated immediately following changes in cluster topology.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5237&#34;&gt;KEP #5237&lt;/a&gt; led by SIG Cloud Provider.&lt;/p&gt;
&lt;h3 id=&#34;extended-toleration-operators-for-threshold-based-placement&#34;&gt;Extended toleration operators for threshold-based placement&lt;/h3&gt;
&lt;p&gt;Kubernetes v1.35 introduces SLA-aware scheduling by enabling workloads to express reliability requirements. The feature adds numeric comparison operators to tolerations, allowing pods to match or avoid nodes based on SLA-oriented taints such as service guarantees or fault-domain quality.&lt;/p&gt;
&lt;p&gt;The primary benefit is enhancing the scheduler with more precise placement. Critical workloads can demand higher-SLA nodes, while lower priority workloads can opt into lower SLA ones. This improves utilization and reduces cost without compromising reliability.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5471&#34;&gt;KEP #5471&lt;/a&gt; led by SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;mutable-container-resources-when-job-is-suspended&#34;&gt;Mutable container resources when Job is suspended&lt;/h3&gt;
&lt;p&gt;Running batch workloads often involves trial and error with resource limits. Currently, the Job specification is immutable, meaning that if a Job fails due to an Out of Memory (OOM) error or insufficient CPU, the user cannot simply adjust the resources; they must delete the Job and create a new one, losing the execution history and status.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 introduces the capability to update resource requests and limits for Jobs that are in a suspended state. Enabled via the &lt;code&gt;MutablePodResourcesForSuspendedJobs&lt;/code&gt; feature gate, this enhancement allows users to pause a failing Job, modify its Pod template with appropriate resource values, and then resume execution with the corrected configuration.&lt;/p&gt;
&lt;p&gt;The primary benefit is a smoother recovery workflow for misconfigured jobs. By allowing in-place corrections during suspension, users can resolve resource bottlenecks without disrupting the Job&#39;s lifecycle identity or losing track of its completion status, significantly improving the developer experience for batch processing.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5440&#34;&gt;KEP #5440&lt;/a&gt; led by SIG Apps.&lt;/p&gt;
&lt;h2 id=&#34;other-notable-changes&#34;&gt;Other notable changes&lt;/h2&gt;
&lt;h3 id=&#34;continued-innovation-in-dynamic-resource-allocation-dra&#34;&gt;Continued innovation in Dynamic Resource Allocation (DRA)&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&#34;https://kep.k8s.io/4381&#34;&gt;core functionality&lt;/a&gt; was graduated to stable in v1.34, with the ability to turn it off. In v1.35 it is always enabled. Several alpha features have also been significantly improved and are ready for testing. We encourage users to provide feedback on these capabilities to help clear the path for their target promotion to beta in upcoming releases.&lt;/p&gt;
&lt;h4 id=&#34;extended-resource-requests-via-dra&#34;&gt;Extended Resource Requests via DRA&lt;/h4&gt;
&lt;p&gt;Several functional gaps compared to Extended Resource requests via Device Plugins were addressed, for example scoring and reuse of devices in init containers.&lt;/p&gt;
&lt;h4 id=&#34;device-taints-and-tolerations&#34;&gt;Device Taints and Tolerations&lt;/h4&gt;
&lt;p&gt;The new &amp;quot;None&amp;quot; effect can be used to report a problem without immediately affecting scheduling or running pod. DeviceTaintRule now provides status information about an ongoing eviction. The &amp;quot;None&amp;quot; effect can be used for a &amp;quot;dry run&amp;quot; before actually evicting pods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create DeviceTaintRule with &amp;quot;effect: None&amp;quot;.&lt;/li&gt;
&lt;li&gt;Check the status to see how many pods would be evicted.&lt;/li&gt;
&lt;li&gt;Replace &amp;quot;effect: None&amp;quot; with &amp;quot;effect: NoExecute&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;partitionable-devices&#34;&gt;Partitionable Devices&lt;/h4&gt;
&lt;p&gt;Devices belonging to the same partitionable devices may now be defined in different ResourceSlices.
You can read more in the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#partitionable-devices&#34;&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;consumable-capacity-device-binding-conditions&#34;&gt;Consumable Capacity, Device Binding Conditions&lt;/h4&gt;
&lt;p&gt;Several bugs were fixed and/or more tests added.
You can learn more about &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#consumable-capacity&#34;&gt;Consumable Capacity&lt;/a&gt; and &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#device-binding-conditions&#34;&gt;Binding Conditions&lt;/a&gt; in the official documentation.&lt;/p&gt;
&lt;h3 id=&#34;comparable-resource-version-semantics&#34;&gt;Comparable resource version semantics&lt;/h3&gt;
&lt;p&gt;Kubernetes v1.35 changes the way that clients are allowed to interpret &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/api-concepts/#resource-versions&#34;&gt;resource versions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before v1.35, the only supported comparison that clients could make was to check for string equality: if two resource versions were equal, they were the same. Clients could also provide a resource version to the API server and ask the control plane to do internal comparisons, such as streaming all events since a particular resource version.&lt;/p&gt;
&lt;p&gt;In v1.35, all in-tree resource versions meet a new stricter definition: the values are a special form of decimal number. And, because they can be compared, clients can do their own operations to compare two different resource versions.
For example, this means that a client reconnecting after a crash can detect when it has lost updates, as distinct from the case where there has been an update but no lost changes in the meantime.&lt;/p&gt;
&lt;p&gt;This change in semantics enables other important use cases such as &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/manage-kubernetes-objects/storage-version-migration/&#34;&gt;storage version migration&lt;/a&gt;, performance improvements to &lt;em&gt;informers&lt;/em&gt; (a client helper concept), and controller reliability. All of those cases require knowing whether one resource version is newer than another.&lt;/p&gt;
&lt;p&gt;This work was done as part of &lt;a href=&#34;https://kep.k8s.io/5504&#34;&gt;KEP #5504&lt;/a&gt; led by SIG API Machinery.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-v1-35&#34;&gt;Graduations, deprecations, and removals in v1.35&lt;/h2&gt;
&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Graduations to stable&lt;/h3&gt;
&lt;p&gt;This lists all the features that graduated to stable (also known as &lt;em&gt;general availability&lt;/em&gt;). For a full list of updates including new features and graduations from alpha to beta, see the release notes.&lt;/p&gt;
&lt;p&gt;This release includes a total of 15 enhancements promoted to stable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4540&#34;&gt;Add CPUManager policy option to restrict reservedSystemCPUs to system daemons and interrupt processing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5067&#34;&gt;Pod Generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5468&#34;&gt;Invariant Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;In-Place Update of Pod Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3619&#34;&gt;Fine-grained SupplementalGroups control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3983&#34;&gt;Add support for a drop-in kubelet configuration directory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5589&#34;&gt;Remove gogo protobuf dependency for Kubernetes API types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4210&#34;&gt;kubelet image GC after a maximum age&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3673&#34;&gt;Kubelet limit of Parallel Image Pulls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4622&#34;&gt;Add a TopologyManager policy option for MaxAllowableNUMANodes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/859&#34;&gt;Include kubectl command metadata in http request headers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3015&#34;&gt;PreferSameNode Traffic Distribution (formerly PreferLocal traffic policy / Node-level topology)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4368&#34;&gt;Job API managed-by mechanism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4006&#34;&gt;Transition from SPDY to WebSockets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;deprecations-removals-and-community-updates&#34;&gt;Deprecations, removals and community updates&lt;/h3&gt;
&lt;p&gt;As Kubernetes develops and matures, features may be deprecated, removed, or replaced with better
ones to improve the project&#39;s overall health. See the Kubernetes
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;deprecation and removal policy&lt;/a&gt; for more details on this process. Kubernetes v1.35 includes a couple of deprecations.&lt;/p&gt;
&lt;h4 id=&#34;ingress-nginx-retirement&#34;&gt;Ingress NGINX retirement&lt;/h4&gt;
&lt;p&gt;For years, the Ingress NGINX controller has been a popular choice for routing traffic into Kubernetes clusters. It was flexible, widely adopted, and served as the standard entry point for countless applications.&lt;/p&gt;
&lt;p&gt;However, maintaining the project has become unsustainable. With a severe shortage of maintainers and mounting technical debt, the community recently made the difficult decision to retire it. This isn&#39;t strictly part of the v1.35 release, but it&#39;s such an important change that we wanted to highlight it here.&lt;/p&gt;
&lt;p&gt;Consequently, the Kubernetes project announced that Ingress NGINX will receive only best-effort maintenance until &lt;strong&gt;March 2026&lt;/strong&gt;. After this date, it will be archived with no further updates. The recommended path forward is to migrate to the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API&lt;/a&gt;, which offers a more modern, secure, and extensible standard for traffic management.&lt;/p&gt;
&lt;p&gt;You can find more in the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/11/ingress-nginx-retirement/&#34;&gt;official blog post&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;removal-of-cgroup-v1-support&#34;&gt;Removal of cgroup v1 support&lt;/h4&gt;
&lt;p&gt;When it comes to managing resources on Linux nodes, Kubernetes has historically relied on cgroups (control groups). While the original cgroup v1 was functional, it was often inconsistent and limited. That is why Kubernetes introduced support for cgroup v2 back in v1.25, offering a much cleaner, unified hierarchy and better resource isolation.&lt;/p&gt;
&lt;p&gt;Because cgroup v2 is now the modern standard, Kubernetes is ready to retire the legacy cgroup v1 support in v1.35. This is an important notice for cluster administrators: if you are still running nodes on older Linux distributions that don&#39;t support cgroup v2, your &lt;code&gt;kubelet&lt;/code&gt; will fail to start. To avoid downtime, you will need to migrate those nodes to systems where cgroup v2 is enabled.&lt;/p&gt;
&lt;p&gt;To learn more, read &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/architecture/cgroups/&#34;&gt;about cgroup v2&lt;/a&gt;;&lt;br&gt;
you can also track the switchover work via &lt;a href=&#34;https://kep.k8s.io/5573&#34;&gt;KEP-5573: Remove cgroup v1 support&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;deprecation-of-ipvs-mode-in-kube-proxy&#34;&gt;Deprecation of ipvs mode in kube-proxy&lt;/h4&gt;
&lt;p&gt;Years ago, Kubernetes adopted the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-ipvs&#34;&gt;&lt;code&gt;ipvs&lt;/code&gt;&lt;/a&gt; mode in &lt;code&gt;kube-proxy&lt;/code&gt; to provide faster load balancing than the standard &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-iptables&#34;&gt;&lt;code&gt;iptables&lt;/code&gt;&lt;/a&gt;. While it offered a performance boost, keeping it in sync with evolving networking requirements created too much technical debt and complexity.&lt;/p&gt;
&lt;p&gt;Because of this maintenance burden, Kubernetes v1.35 deprecates &lt;code&gt;ipvs&lt;/code&gt; mode. Although the mode remains available in this release, &lt;code&gt;kube-proxy&lt;/code&gt; will now emit a warning on startup when configured to use it. The goal is to streamline the codebase and focus on modern standards. For Linux nodes, you should begin transitioning to &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-nftables&#34;&gt;&lt;code&gt;nftables&lt;/code&gt;&lt;/a&gt;, which is now the recommended replacement.&lt;/p&gt;
&lt;p&gt;You can find more in &lt;a href=&#34;https://kep.k8s.io/5495&#34;&gt;KEP-5495: Deprecate ipvs mode in kube-proxy&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;final-call-for-containerd-v1-x&#34;&gt;Final call for containerd v1.X&lt;/h4&gt;
&lt;p&gt;While Kubernetes v1.35 still supports containerd 1.7 and other LTS releases, this is the final version with such support. The SIG Node community has designated v1.35 as the last release to support the containerd v1.X series.&lt;/p&gt;
&lt;p&gt;This serves as an important reminder: before upgrading to the next Kubernetes version, you must switch to containerd 2.0 or later. To help identify which nodes need attention, you can monitor the &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt; metric within your cluster.&lt;/p&gt;
&lt;p&gt;You can find more in the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/#announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;official blog post&lt;/a&gt; or in &lt;a href=&#34;https://kep.k8s.io/4033&#34;&gt;KEP-4033: Discover cgroup driver from CRI&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;improved-pod-stability-during-kubelet-restarts&#34;&gt;Improved Pod stability during &lt;code&gt;kubelet&lt;/code&gt; restarts&lt;/h4&gt;
&lt;p&gt;Previously, restarting the &lt;code&gt;kubelet&lt;/code&gt; service often caused a temporary disruption in Pod status. During a restart, the kubelet would reset container states, causing healthy Pods to be marked as &lt;code&gt;NotReady&lt;/code&gt; and removed from load balancers, even if the application itself was still running correctly.&lt;/p&gt;
&lt;p&gt;To address this reliability issue, this behavior has been corrected to ensure seamless node maintenance. The &lt;code&gt;kubelet&lt;/code&gt; now properly restores the state of existing containers from the runtime upon startup. This ensures that your workloads remain &lt;code&gt;Ready&lt;/code&gt; and traffic continues to flow uninterrupted during &lt;code&gt;kubelet&lt;/code&gt; restarts or upgrades.&lt;/p&gt;
&lt;p&gt;You can find more in &lt;a href=&#34;https://kep.k8s.io/4781&#34;&gt;KEP-4781: Fix inconsistent container ready state after kubelet restart&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;release-notes&#34;&gt;Release notes&lt;/h2&gt;
&lt;p&gt;Check out the full details of the Kubernetes v1.35 release in our &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.35.md&#34;&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;availability&#34;&gt;Availability&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 is available for download on &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.35.0&#34;&gt;GitHub&lt;/a&gt; or on the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/releases/download/&#34;&gt;Kubernetes download page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To get started with Kubernetes, check out these &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tutorials/&#34;&gt;interactive tutorials&lt;/a&gt; or run local Kubernetes clusters using &lt;a href=&#34;https://minikube.sigs.k8s.io/&#34;&gt;minikube&lt;/a&gt;. You can also easily install v1.35 using &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/&#34;&gt;kubeadm&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;release-team&#34;&gt;Release team&lt;/h2&gt;
&lt;p&gt;Kubernetes is only possible with the support, commitment, and hard work of its community. Each release team is made up of dedicated community volunteers who work together to build the many pieces that make up the Kubernetes releases you rely on. This requires the specialized skills of people from all corners of our community, from the code itself to its documentation and project management.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/cncf/memorials/blob/main/han-kang.md&#34;&gt;We honor the memory of Han Kang&lt;/a&gt;, a long-time contributor and respected engineer whose technical excellence and infectious enthusiasm left a lasting impact on the Kubernetes community. Han was a significant force within SIG Instrumentation and SIG API Machinery, earning a &lt;a href=&#34;https://www.kubernetes.dev/community/awards/2021/&#34;&gt;2021 Kubernetes Contributor Award&lt;/a&gt; for his critical work and sustained commitment to the project&#39;s core stability. Beyond his technical contributions, Han was deeply admired for his generosity as a mentor and his passion for building connections among people. He was known for &amp;quot;opening doors&amp;quot; for others, whether guiding new contributors through their first pull requests or supporting colleagues with patience and kindness. Han’s legacy lives on through the engineers he inspired, the robust systems he helped build, and the warm, collaborative spirit he fostered within the cloud native ecosystem.&lt;/p&gt;
&lt;p&gt;We would like to thank the entire &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.35/release-team.md&#34;&gt;Release Team&lt;/a&gt; for the hours spent hard at work to deliver the Kubernetes v1.35 release to our community. The Release Team&#39;s membership ranges from first-time shadows to returning team leads with experience forged over several release cycles. We are incredibly grateful to our Release Lead, &lt;a href=&#34;https://github.com/drewhagen&#34;&gt;Drew Hagen&lt;/a&gt;, whose hands-on guidance and vibrant energy not only navigated us through complex challenges but also fueled the community spirit behind this successful release.&lt;/p&gt;
&lt;h2 id=&#34;project-velocity&#34;&gt;Project velocity&lt;/h2&gt;
&lt;p&gt;The CNCF K8s &lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;var-period=m&amp;var-repogroup_name=All&#34;&gt;DevStats&lt;/a&gt; project aggregates a number of interesting data points related to the velocity of Kubernetes and various sub-projects. This includes everything from individual contributions to the number of companies that are contributing and is an illustration of the depth and breadth of effort that goes into evolving this ecosystem.&lt;/p&gt;
&lt;p&gt;During the v1.35 release cycle, which spanned 14 weeks from 15th September 2025 to 17th December 2025, Kubernetes received contributions from as many as 85 different companies and 419 individuals. In the wider cloud native ecosystem, the figure goes up to 281 companies, counting 1769 total contributors.&lt;/p&gt;
&lt;p&gt;Note that &amp;quot;contribution&amp;quot; counts when someone makes a commit, code review, comment, creates an issue or PR, reviews a PR (including blogs and documentation) or comments on issues and PRs.&lt;br&gt;
If you are interested in contributing, visit &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/#getting-started&#34;&gt;Getting Started&lt;/a&gt; on our contributor website.&lt;/p&gt;
&lt;p&gt;Sources for this data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;from=1757890800000&amp;to=1765929599000&amp;var-period=d28&amp;var-repogroup_name=Kubernetes&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Companies contributing to Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;from=1757890800000&amp;to=1765929599000&amp;var-period=d28&amp;var-repogroup_name=All&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Overall ecosystem contributions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;events-update&#34;&gt;Events update&lt;/h2&gt;
&lt;p&gt;Explore upcoming Kubernetes and cloud native events, including KubeCon + CloudNativeCon, KCD, and other notable conferences worldwide. Stay informed and get involved with the Kubernetes community!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;February 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kcddelhi.com/index.html&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days:  New Delhi&lt;/strong&gt;&lt;/a&gt;: Feb 21, 2026 | New Delhi, India&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-guadalajara-presents-kcd-guadalajara-open-source-contributor-summit/cohost-kcd-guadalajara&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days:  Guadalajara&lt;/strong&gt;&lt;/a&gt;: Feb 23, 2026 | Guadalajara, Mexico&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;March 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Europe 2026&lt;/strong&gt;&lt;/a&gt;: Mar 23-26, 2026 | Amsterdam, Netherlands&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;May 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-toronto-presents-kcd-toronto-canada-2026/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days:  Toronto&lt;/strong&gt;&lt;/a&gt;: May 13, 2026 | Toronto, Canada&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloudnativefinland.org/kcd-helsinki-2026/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days:  Helsinki&lt;/strong&gt;&lt;/a&gt;: May 20, 2026 | Helsinki, Finland&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;June 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-india/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon India 2026&lt;/strong&gt;&lt;/a&gt;: Jun 18-19, 2026 | Mumbai, India&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/kcd-kuala-lumpur-2026/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days:  Kuala Lumpur&lt;/strong&gt;&lt;/a&gt;: Jun 27, 2026 | Kuala Lumpur, Malaysia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;July 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-japan/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Japan 2026&lt;/strong&gt;&lt;/a&gt;: Jul 29-30, 2026 | Yokohama, Japan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find the latest event details &lt;a href=&#34;https://community.cncf.io/events/#/list&#34;&gt;here&lt;/a&gt;.
​&lt;/p&gt;
&lt;h2 id=&#34;upcoming-release-webinar&#34;&gt;Upcoming release webinar&lt;/h2&gt;
&lt;p&gt;Join members of the Kubernetes v1.35 Release Team on &lt;strong&gt;Wednesday, January 14, 2026, at 5:00 PM (UTC)&lt;/strong&gt; to learn about the release highlights of this release. For more information and registration, visit the &lt;a href=&#34;https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cloud-native-live-kubernetes-v135-release/&#34;&gt;event page&lt;/a&gt; on the CNCF Online Programs site.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;The simplest way to get involved with Kubernetes is by joining one of the many &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-list.md&#34;&gt;Special Interest Groups&lt;/a&gt; (SIGs) that align with your interests. Have something you’d like to broadcast to the Kubernetes community? Share your voice at our weekly &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;community meeting&lt;/a&gt;, and through the channels below. Thank you for your continued feedback and support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Follow us on Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@Kubernetesio&lt;/a&gt; for the latest updates&lt;/li&gt;
&lt;li&gt;Join the community discussion on &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join the community on &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Post questions (or answer questions) on &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Share your Kubernetes &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read more about what’s happening with Kubernetes on the &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learn more about the &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;Kubernetes Release Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35 Sneak Peek</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/26/kubernetes-v1-35-sneak-peek/</link>
      <pubDate>Wed, 26 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/26/kubernetes-v1-35-sneak-peek/</guid>
      <description>
        
        
        &lt;p&gt;As the release of Kubernetes v1.35 approaches, the Kubernetes project continues to evolve. Features may be deprecated, removed, or replaced to improve the project&#39;s overall health. This blog post outlines planned changes for the v1.35 release that the release team believes you should be aware of to ensure the continued smooth operation of your Kubernetes cluster(s), and to keep you up to date with the latest developments. The information below is based on the current status of the v1.35 release and is subject to change before the final release date.&lt;/p&gt;
&lt;h2 id=&#34;deprecations-and-removals-for-kubernetes-v1-35&#34;&gt;Deprecations and removals for Kubernetes v1.35&lt;/h2&gt;
&lt;h3 id=&#34;cgroup-v1-support&#34;&gt;cgroup v1 support&lt;/h3&gt;
&lt;p&gt;On Linux nodes, container runtimes typically rely on cgroups (short for &amp;quot;control groups&amp;quot;).
Support for using cgroup v2 has been stable in Kubernetes since v1.25, providing an alternative to the original v1 cgroup support. While cgroup v1 provided the initial resource control mechanism, it suffered from well-known
inconsistencies and limitations. Adding support for cgroup v2 allowed use of a unified control group hierarchy, improved resource isolation, and served as the foundation for modern features, making legacy cgroup v1 support ready for removal.
The removal of cgroup v1 support will only impact cluster administrators running nodes on older Linux distributions that do not support cgroup v2; on those nodes, the &lt;code&gt;kubelet&lt;/code&gt; will fail to start. Administrators must migrate their nodes to systems with cgroup v2 enabled. More details on compatibility requirements will be available in a blog post soon after the v1.35 release.&lt;/p&gt;
&lt;p&gt;To learn more, read &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/architecture/cgroups/&#34;&gt;about cgroup v2&lt;/a&gt;;&lt;br&gt;
you can also track the switchover work via &lt;a href=&#34;https://kep.k8s.io/5573&#34;&gt;KEP-5573: Remove cgroup v1 support&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;deprecation-of-ipvs-mode-in-kube-proxy&#34;&gt;Deprecation of ipvs mode in kube-proxy&lt;/h3&gt;
&lt;p&gt;Many releases ago, the Kubernetes project implemented an &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-ipvs&#34;&gt;ipvs&lt;/a&gt; mode in &lt;code&gt;kube-proxy&lt;/code&gt;. It was adopted as a way to provide high-performance service load balancing, with better performance than the existing &lt;code&gt;iptables&lt;/code&gt; mode. However, maintaining feature parity between ipvs and other kube-proxy modes became difficult, due to technical complexity and diverging requirements. This created significant technical debt and made the ipvs backend impractical to support alongside newer networking capabilities.&lt;/p&gt;
&lt;p&gt;The Kubernetes project intends to deprecate kube-proxy &lt;code&gt;ipvs&lt;/code&gt; mode in the v1.35 release, to streamline the &lt;code&gt;kube-proxy&lt;/code&gt; codebase. For Linux nodes, the recommended &lt;code&gt;kube-proxy&lt;/code&gt; mode is already &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-nftables&#34;&gt;nftables&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can find more in &lt;a href=&#34;https://kep.k8s.io/5495&#34;&gt;KEP-5495: Deprecate ipvs mode in kube-proxy&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;Kubernetes is deprecating containerd v1.y support&lt;/h3&gt;
&lt;p&gt;While Kubernetes v1.35 still supports containerd 1.7 and other LTS releases of containerd, as a consequence of automated cgroup driver detection, the Kubernetes SIG Node community has formally agreed upon a final support timeline for containerd v1.X. Kubernetes v1.35 is the last release to offer this support (aligned with containerd 1.7 EOL).&lt;/p&gt;
&lt;p&gt;This is a final warning that if you are using containerd 1.X, you must switch to 2.0 or later before upgrading Kubernetes to the next version. You are able to monitor the &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt; metric to determine if any nodes in your cluster are using a containerd version that will soon be unsupported.&lt;/p&gt;
&lt;p&gt;You can find more in the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/#announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;official blog post&lt;/a&gt; or in &lt;a href=&#34;https://kep.k8s.io/4033&#34;&gt;KEP-4033: Discover cgroup driver from CRI&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;featured-enhancements-of-kubernetes-v1-35&#34;&gt;Featured enhancements of Kubernetes v1.35&lt;/h2&gt;
&lt;p&gt;The following enhancements are some of those likely to be included in the v1.35 release. This is not a commitment, and the release content is subject to change.&lt;/p&gt;
&lt;h3 id=&#34;node-declared-features&#34;&gt;Node declared features&lt;/h3&gt;
&lt;p&gt;When scheduling Pods, Kubernetes uses node labels, taints, and tolerations to match workload requirements with node capabilities. However, managing feature compatibility becomes challenging during cluster upgrades due to version skew between the control plane and nodes. This can lead to Pods being scheduled on nodes that lack required features, resulting in runtime failures.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;node declared features&lt;/em&gt; framework will introduce a standard mechanism for nodes to declare their supported Kubernetes features. With the new alpha feature enabled, a Node reports the features it can support, publishing this information to the control plane through a new &lt;code&gt;.status.declaredFeatures&lt;/code&gt; field. Then, the &lt;code&gt;kube-scheduler&lt;/code&gt;, admission controllers and third-party components can use these declarations. For example, you can enforce scheduling and API validation constraints, ensuring that Pods run only on compatible nodes.&lt;/p&gt;
&lt;p&gt;This approach reduces manual node labeling, improves scheduling accuracy, and prevents incompatible pod placements proactively. It also integrates with the Cluster Autoscaler for informed scale-up decisions. Feature declarations are temporary and tied to Kubernetes feature gates, enabling safe rollout and cleanup.&lt;/p&gt;
&lt;p&gt;Targeting alpha in v1.35, &lt;em&gt;node declared features&lt;/em&gt; aims to solve version skew scheduling issues by making node capabilities explicit, enhancing reliability and cluster stability in heterogeneous version environments.&lt;/p&gt;
&lt;p&gt;To learn more about this before the official documentation is published, you can read &lt;a href=&#34;https://kep.k8s.io/5328&#34;&gt;KEP-5328&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;in-place-update-of-pod-resources&#34;&gt;In-place update of Pod resources&lt;/h3&gt;
&lt;p&gt;Kubernetes is graduating in-place updates for Pod resources to General Availability (GA). This feature allows users to adjust &lt;code&gt;cpu&lt;/code&gt; and &lt;code&gt;memory&lt;/code&gt; resources without restarting Pods or Containers. Previously, such modifications required recreating Pods, which could disrupt workloads, particularly for stateful or batch applications.
Previous Kubernetes releases already allowed you to change infrastructure resources settings (requests and limits) for existing Pods. This allows for smoother &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/autoscaling/vertical-pod-autoscale/&#34;&gt;vertical scaling&lt;/a&gt;, improves efficiency, and can also simplify solution development.&lt;/p&gt;
&lt;p&gt;The Container Runtime Interface (CRI) has also been improved, extending the &lt;code&gt;UpdateContainerResources&lt;/code&gt; API for Windows and future runtimes while allowing &lt;code&gt;ContainerStatus&lt;/code&gt; to report real-time resource configurations. Together, these changes make scaling in Kubernetes faster, more flexible, and disruption-free.
The feature was introduced as alpha in v1.27, graduated to beta in v1.33, and is targeting graduation to stable in v1.35.&lt;/p&gt;
&lt;p&gt;You can find more in &lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP-1287: In-place Update of Pod Resources&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;pod-certificates&#34;&gt;Pod certificates&lt;/h3&gt;
&lt;p&gt;When running microservices, Pods often require a strong cryptographic identity to authenticate with each other using mutual TLS (mTLS). While Kubernetes provides Service Account tokens, these are designed for authenticating to the API server, not for general-purpose workload identity.&lt;/p&gt;
&lt;p&gt;Before this enhancement, operators had to rely on complex, external projects like SPIFFE/SPIRE or cert-manager to provision and rotate certificates for their workloads. But what if you could  issue a unique, short-lived certificate to your Pods natively and automatically? KEP-4317 is designed to enable such native workload identity. It opens up various possibilities for securing pod-to-pod communication by allowing the &lt;code&gt;kubelet&lt;/code&gt; to request and mount certificates for a Pod via a projected volume.&lt;/p&gt;
&lt;p&gt;This provides a built-in mechanism for workload identity, complete with automated certificate rotation, significantly simplifying the setup of service meshes and other zero-trust network policies. This feature was introduced as alpha in v1.34 and is targeting beta in v1.35.&lt;/p&gt;
&lt;p&gt;You can find more in &lt;a href=&#34;https://kep.k8s.io/4317&#34;&gt;KEP-4317: Pod Certificates&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;numeric-values-for-taints&#34;&gt;Numeric values for taints&lt;/h3&gt;
&lt;p&gt;Kubernetes is enhancing &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/taint-and-toleration/&#34;&gt;taints and tolerations&lt;/a&gt; by adding numeric comparison operators, such as &lt;code&gt;Gt&lt;/code&gt; (Greater Than) and &lt;code&gt;Lt&lt;/code&gt; (Less Than).&lt;/p&gt;
&lt;p&gt;Previously, tolerations supported only exact (&lt;code&gt;Equal&lt;/code&gt;) or existence (&lt;code&gt;Exists&lt;/code&gt;) matches, which were not suitable for numeric properties such as reliability SLAs.&lt;/p&gt;
&lt;p&gt;With this change, a Pod can use a toleration to &amp;quot;opt-in&amp;quot; to nodes that meet a specific numeric threshold. For example, a Pod can require a Node with an SLA taint value greater than 950 (&lt;code&gt;operator: Gt&lt;/code&gt;, &lt;code&gt;value: &amp;quot;950&amp;quot;&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This approach is more powerful than Node Affinity because it supports the NoExecute effect, allowing Pods to be automatically evicted if a node&#39;s numeric value drops below the tolerated threshold.&lt;/p&gt;
&lt;p&gt;You can find more in &lt;a href=&#34;https://kep.k8s.io/5471&#34;&gt;KEP-5471: Enable SLA-based Scheduling&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;user-namespaces&#34;&gt;User namespaces&lt;/h3&gt;
&lt;p&gt;When running Pods, you can use &lt;code&gt;securityContext&lt;/code&gt; to drop privileges, but containers inside the pod often still run as root (UID 0). This simplicity poses a significant challenge, as that container UID 0 maps directly to the host&#39;s root user.&lt;/p&gt;
&lt;p&gt;Before this enhancement, a container breakout vulnerability could grant an attacker full root access to the node. But what if you could dynamically remap the container&#39;s root user to a safe, unprivileged user on the host? KEP-127 specifically allows such native support for Linux User Namespaces. It opens up various possibilities for pod security by isolating container and host user/group IDs. This allows a process to have root privileges (UID 0) within its namespace, while running as a non-privileged, high-numbered UID on the host.&lt;/p&gt;
&lt;p&gt;Released as alpha in v1.25 and beta in v1.30, this feature continues to progress through beta maturity, paving the way for truly &amp;quot;rootless&amp;quot; containers that drastically reduce the attack surface for a whole class of security vulnerabilities.&lt;/p&gt;
&lt;p&gt;You can find more in &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP-127: User Namespaces&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;support-for-mounting-oci-images-as-volumes&#34;&gt;Support for mounting OCI images as volumes&lt;/h3&gt;
&lt;p&gt;When provisioning a Pod, you often need to bundle data, binaries, or configuration files for your containers.
Before this enhancement, people often included that kind of data directly into the main container image, or required a custom init container to download and unpack files into an &lt;code&gt;emptyDir&lt;/code&gt;. You can still take either of those approaches, of course.&lt;/p&gt;
&lt;p&gt;But what if you could populate a volume directly from a data-only artifact in an OCI registry, just like pulling a container image? Kubernetes v1.31 added support for the &lt;code&gt;image&lt;/code&gt; volume type, allowing Pods to pull and unpack OCI container image artifacts into a volume declaratively.&lt;/p&gt;
&lt;p&gt;This allows for seamless distribution of data, binaries, or ML models using standard registry tooling, completely decoupling data from the container image and eliminating the need for complex init containers or startup scripts.
This volume type has been in beta since v1.33 and will likely be enabled by default in v1.35.&lt;/p&gt;
&lt;p&gt;You can try out the beta version of &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/storage/volumes/#image&#34;&gt;&lt;code&gt;image&lt;/code&gt; volumes&lt;/a&gt;, or you can learn more about the plans from &lt;a href=&#34;https://kep.k8s.io/4639&#34;&gt;KEP-4639: OCI Volume Source&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;want-to-know-more&#34;&gt;Want to know more?&lt;/h2&gt;
&lt;p&gt;New features and deprecations are also announced in the Kubernetes release notes. We will formally announce what&#39;s new in &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.35.md&#34;&gt;Kubernetes v1.35&lt;/a&gt; as part of the CHANGELOG for that release.&lt;/p&gt;
&lt;p&gt;The Kubernetes v1.35 release is planned for &lt;strong&gt;December 17, 2025&lt;/strong&gt;. Stay tuned for updates!&lt;/p&gt;
&lt;p&gt;You can also see the announcements of changes in the release notes for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.34.md&#34;&gt;Kubernetes v1.34&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.33.md&#34;&gt;Kubernetes v1.33&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.32.md&#34;&gt;Kubernetes v1.32&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md&#34;&gt;Kubernetes v1.31&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.30.md&#34;&gt;Kubernetes v1.30&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;The simplest way to get involved with Kubernetes is by joining one of the many &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-list.md&#34;&gt;Special Interest Groups&lt;/a&gt; (SIGs) that align with your interests. Have something you’d like to broadcast to the Kubernetes community? Share your voice at our weekly &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;community meeting&lt;/a&gt;, and through the channels below. Thank you for your continued feedback and support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Follow us on Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@kubernetes.io&lt;/a&gt; for the latest updates&lt;/li&gt;
&lt;li&gt;Join the community discussion on &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join the community on &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Post questions (or answer questions) on &lt;a href=&#34;https://serverfault.com/questions/tagged/kubernetes&#34;&gt;Server Fault&lt;/a&gt; or &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Share your Kubernetes &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;story&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Read more about what’s happening with Kubernetes on the &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learn more about the &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;Kubernetes Release Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes Configuration Good Practices</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/25/configuration-good-practices/</link>
      <pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/25/configuration-good-practices/</guid>
      <description>
        
        
        &lt;p&gt;Configuration is one of those things in Kubernetes that seems small until it&#39;s not. Configuration is at the heart of every Kubernetes workload.
A missing quote, a wrong API version or a misplaced YAML indent can ruin your entire deploy.&lt;/p&gt;
&lt;p&gt;This blog brings together tried-and-tested configuration best practices. The small habits that make your Kubernetes setup clean, consistent and easier to manage.
Whether you are just starting out or already deploying apps daily, these are the little things that keep your cluster stable and your future self sane.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This blog is inspired by the original &lt;em&gt;Configuration Best Practices&lt;/em&gt; page, which has evolved through contributions from many members of the Kubernetes community.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;general-configuration-practices&#34;&gt;General configuration practices&lt;/h2&gt;
&lt;h3 id=&#34;use-the-latest-stable-api-version&#34;&gt;Use the latest stable API version&lt;/h3&gt;
&lt;p&gt;Kubernetes evolves fast. Older APIs eventually get deprecated and stop working. So, whenever you are defining resources, make sure you are using the latest stable API version.
You can always check with&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl api-resources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This simple step saves you from future compatibility issues.&lt;/p&gt;
&lt;h3 id=&#34;store-configuration-in-version-control&#34;&gt;Store configuration in version control&lt;/h3&gt;
&lt;p&gt;Never apply manifest files directly from your desktop. Always keep them in a version control system like Git, it&#39;s your safety net.
If something breaks, you can instantly roll back to a previous commit, compare changes or recreate your cluster setup without panic.&lt;/p&gt;
&lt;h3 id=&#34;write-configs-in-yaml-not-json&#34;&gt;Write configs in YAML not JSON&lt;/h3&gt;
&lt;p&gt;Write your configuration files using YAML rather than JSON. Both work technically, but YAML is just easier for humans. It&#39;s cleaner to read and less noisy and widely used in the community.&lt;/p&gt;
&lt;p&gt;YAML has some sneaky gotchas with boolean values:
Use only &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;.
Don&#39;t write &lt;code&gt;yes&lt;/code&gt;, &lt;code&gt;no&lt;/code&gt;, &lt;code&gt;on&lt;/code&gt; or  &lt;code&gt;off&lt;/code&gt;.
They might work in one version of YAML but break in another. To be safe, quote anything that looks like a Boolean (for example &lt;code&gt;&amp;quot;yes&amp;quot;&lt;/code&gt;).&lt;/p&gt;
&lt;h3 id=&#34;keep-configuration-simple-and-minimal&#34;&gt;Keep configuration simple and minimal&lt;/h3&gt;
&lt;p&gt;Avoid setting default values that are already handled by Kubernetes. Minimal manifests are easier to debug, cleaner to review and less likely to break things later.&lt;/p&gt;
&lt;h3 id=&#34;group-related-objects-together&#34;&gt;Group related objects together&lt;/h3&gt;
&lt;p&gt;If your Deployment, Service and ConfigMap all belong to one app, put them in a single manifest file.&lt;br&gt;
It&#39;s easier to track changes and apply them as a unit.
See the &lt;a href=&#34;https://github.com/kubernetes/examples/blob/master/web/guestbook/all-in-one/guestbook-all-in-one.yaml&#34;&gt;Guestbook all-in-one.yaml&lt;/a&gt; file for an example of this syntax.&lt;/p&gt;
&lt;p&gt;You can even apply entire directories with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f configs/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One command and boom everything in that folder gets deployed.&lt;/p&gt;
&lt;h3 id=&#34;add-helpful-annotations&#34;&gt;Add helpful annotations&lt;/h3&gt;
&lt;p&gt;Manifest files are not just for machines, they are for humans too. Use annotations to describe why something exists or what it does. A quick one-liner can save hours when debugging later and also allows better collaboration.&lt;/p&gt;
&lt;p&gt;The most helpful annotation to set is &lt;code&gt;kubernetes.io/description&lt;/code&gt;. It&#39;s like using comment, except that it gets copied into the API so that everyone else can see it even after you deploy.&lt;/p&gt;
&lt;h2 id=&#34;managing-workloads-pods-deployments-and-jobs&#34;&gt;Managing Workloads: Pods, Deployments, and Jobs&lt;/h2&gt;
&lt;p&gt;A common early mistake in Kubernetes is creating Pods directly. Pods work, but they don&#39;t reschedule themselves if something goes wrong.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Naked Pods&lt;/em&gt; (Pods not managed by a controller, such as &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/deployment/&#34;&gt;Deployment&lt;/a&gt; or a &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/statefulset/&#34;&gt;StatefulSet&lt;/a&gt;) are fine for testing, but in real setups, they are risky.&lt;/p&gt;
&lt;p&gt;Why?
Because if the node hosting that Pod dies, the Pod dies with it and Kubernetes won&#39;t bring it back automatically.&lt;/p&gt;
&lt;h3 id=&#34;use-deployments-for-apps-that-should-always-be-running&#34;&gt;Use Deployments for apps that should always be running&lt;/h3&gt;
&lt;p&gt;A Deployment, which both creates a ReplicaSet to ensure that the desired number of Pods is always available, and specifies a strategy to replace Pods (such as &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/deployment/#rolling-update-deployment&#34;&gt;RollingUpdate&lt;/a&gt;), is almost always preferable to creating Pods directly.
You can roll out a new version, and if something breaks, roll back instantly.&lt;/p&gt;
&lt;h3 id=&#34;use-jobs-for-tasks-that-should-finish&#34;&gt;Use Jobs for tasks that should finish&lt;/h3&gt;
&lt;p&gt;A &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/job/&#34;&gt;Job&lt;/a&gt; is perfect when you need something to run once and then stop like database migration or batch processing task.
It will retry if the pods fails and report success when it&#39;s done.&lt;/p&gt;
&lt;h2 id=&#34;service-configuration-and-networking&#34;&gt;Service Configuration and Networking&lt;/h2&gt;
&lt;p&gt;Services are how your workloads talk to each other inside (and sometimes outside) your cluster. Without them, your pods exist but can&#39;t reach anyone. Let&#39;s make sure that doesn&#39;t happen.&lt;/p&gt;
&lt;h3 id=&#34;create-services-before-workloads-that-use-them&#34;&gt;Create Services before workloads that use them&lt;/h3&gt;
&lt;p&gt;When Kubernetes starts a Pod, it automatically injects environment variables for existing Services.
So, if a Pod depends on a Service, create a &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/services-networking/service/&#34;&gt;Service&lt;/a&gt; &lt;strong&gt;before&lt;/strong&gt; its corresponding backend workloads (Deployments or StatefulSets), and before any workloads that need to access it.&lt;/p&gt;
&lt;p&gt;For example, if a Service named foo exists, all containers will get the following variables in their initial environment:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;FOO_SERVICE_HOST=&amp;lt;the host the Service runs on&amp;gt;
FOO_SERVICE_PORT=&amp;lt;the port the Service runs on&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;DNS based discovery doesn&#39;t have this problem, but it&#39;s a good habit to follow anyway.&lt;/p&gt;
&lt;h3 id=&#34;use-dns-for-service-discovery&#34;&gt;Use DNS for Service discovery&lt;/h3&gt;
&lt;p&gt;If your cluster has the DNS &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/cluster-administration/addons/&#34;&gt;add-on&lt;/a&gt; (most do), every Service automatically gets a DNS entry. That means you can access it by name instead of IP:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl http://my-service.default.svc.cluster.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&#39;s one of those features that makes Kubernetes networking feel magical.&lt;/p&gt;
&lt;h3 id=&#34;avoid-hostport-and-hostnetwork-unless-absolutely-necessary&#34;&gt;Avoid &lt;code&gt;hostPort&lt;/code&gt; and &lt;code&gt;hostNetwork&lt;/code&gt; unless absolutely necessary&lt;/h3&gt;
&lt;p&gt;You&#39;ll sometimes see these options in manifests:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostPort&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostNetwork&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But here&#39;s the thing:
They tie your Pods to specific nodes, making them harder to schedule and scale. Because each &amp;lt;&lt;code&gt;hostIP&lt;/code&gt;, &lt;code&gt;hostPort&lt;/code&gt;, &lt;code&gt;protocol&lt;/code&gt;&amp;gt; combination must be unique. If you don&#39;t specify the &lt;code&gt;hostIP&lt;/code&gt; and &lt;code&gt;protocol&lt;/code&gt; explicitly, Kubernetes will use &lt;code&gt;0.0.0.0&lt;/code&gt; as the default &lt;code&gt;hostIP&lt;/code&gt; and &lt;code&gt;TCP&lt;/code&gt; as the default &lt;code&gt;protocol&lt;/code&gt;.
Unless you&#39;re debugging or building something like a network plugin, avoid them.&lt;/p&gt;
&lt;p&gt;If you just need local access for testing, try &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/generated/kubectl_port-forward/&#34;&gt;&lt;code&gt;kubectl port-forward&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl port-forward deployment/web 8080:80
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/access-application-cluster/port-forward-access-application-cluster/&#34;&gt;Use Port Forwarding to access applications in a cluster&lt;/a&gt; to learn more.
Or if you really need external access, use a &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/services-networking/service/#type-nodeport&#34;&gt;&lt;code&gt;type: NodePort&lt;/code&gt; Service&lt;/a&gt;. That&#39;s the safer, Kubernetes-native way.&lt;/p&gt;
&lt;h3 id=&#34;use-headless-services-for-internal-discovery&#34;&gt;Use headless Services for internal discovery&lt;/h3&gt;
&lt;p&gt;Sometimes, you don&#39;t want Kubernetes to load balance traffic. You want to talk directly to each Pod. That&#39;s where &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/services-networking/service/#headless-services&#34;&gt;headless Services&lt;/a&gt; come in.&lt;/p&gt;
&lt;p&gt;You create one by setting &lt;code&gt;clusterIP: None&lt;/code&gt;.
Instead of a single IP, DNS gives you a list of all Pods IPs, perfect for apps that manage connections themselves.&lt;/p&gt;
&lt;h2 id=&#34;working-with-labels-effectively&#34;&gt;Working with labels effectively&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/overview/working-with-objects/labels/&#34;&gt;Labels&lt;/a&gt; are key/value pairs that are attached to objects such as Pods.
Labels help you organize, query and group your resources.
They don&#39;t do anything by themselves, but they make everything else from Services to Deployments work together smoothly.&lt;/p&gt;
&lt;h3 id=&#34;use-semantics-labels&#34;&gt;Use semantics labels&lt;/h3&gt;
&lt;p&gt;Good labels help you understand what&#39;s what, even after months later.
Define and use &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/overview/working-with-objects/labels/&#34;&gt;labels&lt;/a&gt; that identify semantic attributes of your application or Deployment.
For example;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;labels&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;app.kubernetes.io/name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;myapp&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;app.kubernetes.io/component&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;web&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tier&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;frontend&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;phase&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;test&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app.kubernetes.io/name&lt;/code&gt; : what the app is&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tier&lt;/code&gt; : which layer it belongs to (frontend/backend)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phase&lt;/code&gt; : which stage it&#39;s in (test/prod)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can then use these labels to make powerful selectors.
For example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods -l &lt;span style=&#34;color:#b8860b&#34;&gt;tier&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;frontend
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will list all frontend Pods across your cluster, no matter which Deployment they came from.
Basically you are not manually listing Pod names; you are just describing what you want.
See the &lt;a href=&#34;https://github.com/kubernetes/examples/tree/master/web/guestbook/&#34;&gt;guestbook&lt;/a&gt; app for examples of this approach.&lt;/p&gt;
&lt;h3 id=&#34;use-common-kubernetes-labels&#34;&gt;Use common Kubernetes labels&lt;/h3&gt;
&lt;p&gt;Kubernetes actually recommends a set of &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/overview/working-with-objects/common-labels/&#34;&gt;common labels&lt;/a&gt;. It&#39;s a standardized way to name things across your different workloads or projects.
Following this convention makes your manifests cleaner, and it means that tools such as &lt;a href=&#34;https://headlamp.dev/&#34;&gt;Headlamp&lt;/a&gt;, &lt;a href=&#34;https://github.com/kubernetes/dashboard#introduction&#34;&gt;dashboard&lt;/a&gt;, or third-party monitoring systems can all
automatically understand what&#39;s running.&lt;/p&gt;
&lt;h3 id=&#34;manipulate-labels-for-debugging&#34;&gt;Manipulate labels for debugging&lt;/h3&gt;
&lt;p&gt;Since controllers (like ReplicaSets or Deployments) use labels to manage Pods, you can remove a label to “detach” a Pod temporarily.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl label pod mypod app-
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;app-&lt;/code&gt; part removes the label key &lt;code&gt;app&lt;/code&gt;.
Once that happens, the controller won’t manage that Pod anymore.
It’s like isolating it for inspection, a “quarantine mode” for debugging. To interactively remove or add labels, use &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/generated/kubectl_label/&#34;&gt;&lt;code&gt;kubectl label&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can then check logs, exec into it and once done, delete it manually.
That’s a super underrated trick every Kubernetes engineer should know.&lt;/p&gt;
&lt;h2 id=&#34;handy-kubectl-tips&#34;&gt;Handy kubectl tips&lt;/h2&gt;
&lt;p&gt;These small tips make life much easier when you are working with multiple manifest files or clusters.&lt;/p&gt;
&lt;h3 id=&#34;apply-entire-directories&#34;&gt;Apply entire directories&lt;/h3&gt;
&lt;p&gt;Instead of applying one file at a time, apply the whole folder:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Using server-side apply is also a good practice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f configs/ --server-side
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command looks for &lt;code&gt;.yaml&lt;/code&gt;, &lt;code&gt;.yml&lt;/code&gt; and &lt;code&gt;.json&lt;/code&gt; files in that folder and applies them all together.
It&#39;s faster, cleaner and helps keep things grouped by app.&lt;/p&gt;
&lt;h3 id=&#34;use-label-selectors-to-get-or-delete-resources&#34;&gt;Use label selectors to get or delete resources&lt;/h3&gt;
&lt;p&gt;You don&#39;t always need to type out resource names one by one.
Instead, use &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/overview/working-with-objects/labels/#label-selectors&#34;&gt;selectors&lt;/a&gt; to act on entire groups at once:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods -l &lt;span style=&#34;color:#b8860b&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;myapp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl delete pod -l &lt;span style=&#34;color:#b8860b&#34;&gt;phase&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&#39;s especially useful in CI/CD pipelines, where you want to clean up test resources dynamically.&lt;/p&gt;
&lt;h3 id=&#34;quickly-create-deployments-and-services&#34;&gt;Quickly create Deployments and Services&lt;/h3&gt;
&lt;p&gt;For quick experiments, you don&#39;t always need to write a manifest. You can spin up a Deployment right from the CLI:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl create deployment webapp --image&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then expose it as a Service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl expose deployment webapp --port&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is great when you just want to test something before writing full manifests.
Also, see &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/access-application-cluster/service-access-application-cluster/&#34;&gt;Use a Service to Access an Application in a cluster&lt;/a&gt; for an example.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Cleaner configuration leads to calmer cluster administrators.
If you stick to a few simple habits: keep configuration simple and minimal, version-control everything,
use consistent labels, and avoid relying on naked Pods, you&#39;ll save yourself hours of debugging down the road.&lt;/p&gt;
&lt;p&gt;The best part?
Clean configurations stay readable. Even after months, you or anyone on your team can glance at them and know exactly what’s happening.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Ingress NGINX Retirement: What You Need to Know</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/11/ingress-nginx-retirement/</link>
      <pubDate>Tue, 11 Nov 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/11/ingress-nginx-retirement/</guid>
      <description>
        
        
        &lt;p&gt;To prioritize the safety and security of the ecosystem, Kubernetes SIG Network and the Security Response Committee are announcing the upcoming retirement of &lt;a href=&#34;https://github.com/kubernetes/ingress-nginx/&#34;&gt;Ingress NGINX&lt;/a&gt;. Best-effort maintenance will continue until March 2026. Afterward, there will be no further releases, no bugfixes, and no updates to resolve any security vulnerabilities that may be discovered. &lt;strong&gt;Existing deployments of Ingress NGINX will continue to function and installation artifacts will remain available.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We recommend migrating to one of the many alternatives. Consider &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/&#34;&gt;migrating to Gateway API&lt;/a&gt;, the modern replacement for Ingress. If you must continue using Ingress, many alternative Ingress controllers are &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/&#34;&gt;listed in the Kubernetes documentation&lt;/a&gt;. Continue reading for further information about the history and current state of Ingress NGINX, as well as next steps.&lt;/p&gt;
&lt;h2 id=&#34;about-ingress-nginx&#34;&gt;About Ingress NGINX&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/ingress/&#34;&gt;Ingress&lt;/a&gt; is the original user-friendly way to direct network traffic to workloads running on Kubernetes. (&lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/gateway/&#34;&gt;Gateway API&lt;/a&gt; is a newer way to achieve many of the same goals.) In order for an Ingress to work in your cluster, there must be an &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/&#34;&gt;Ingress controller&lt;/a&gt; running. There are many Ingress controller choices available, which serve the needs of different users and use cases. Some are cloud-provider specific, while others have more general applicability.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.github.com/kubernetes/ingress-nginx&#34;&gt;Ingress NGINX&lt;/a&gt; was an Ingress controller, developed early in the history of the Kubernetes project as an example implementation of the API. It became very popular due to its tremendous flexibility, breadth of features, and independence from any particular cloud or infrastructure provider. Since those days, many other Ingress controllers have been created within the Kubernetes project by community groups, and by cloud native vendors. Ingress NGINX has continued to be one of the most popular, deployed as part of many hosted Kubernetes platforms and within innumerable independent users’ clusters.&lt;/p&gt;
&lt;h2 id=&#34;history-and-challenges&#34;&gt;History and Challenges&lt;/h2&gt;
&lt;p&gt;The breadth and flexibility of Ingress NGINX has caused maintenance challenges. Changing expectations about cloud native software have also added complications. What were once considered helpful options have sometimes come to be considered serious security flaws, such as the ability to add arbitrary NGINX configuration directives via the &amp;quot;snippets&amp;quot; annotations. Yesterday’s flexibility has become today’s insurmountable technical debt.&lt;/p&gt;
&lt;p&gt;Despite the project’s popularity among users, Ingress NGINX has always struggled with insufficient or barely-sufficient maintainership. For years, the project has had only one or two people doing development work, on their own time, after work hours and on weekends. Last year, the Ingress NGINX maintainers &lt;a href=&#34;https://kccncna2024.sched.com/event/1hoxW/securing-the-future-of-ingress-nginx-james-strong-isovalent-marco-ebert-giant-swarm&#34;&gt;announced&lt;/a&gt; their plans to wind down Ingress NGINX and develop a replacement controller together with the Gateway API community. Unfortunately, even that announcement failed to generate additional interest in helping maintain Ingress NGINX or develop InGate to replace it. (InGate development never progressed far enough to create a mature replacement; it will also be retired.)&lt;/p&gt;
&lt;h2 id=&#34;current-state-and-next-steps&#34;&gt;Current State and Next Steps&lt;/h2&gt;
&lt;p&gt;Currently, Ingress NGINX is receiving best-effort maintenance. SIG Network and the Security Response Committee have exhausted our efforts to find additional support to make Ingress NGINX sustainable. To prioritize user safety, we must retire the project.&lt;/p&gt;
&lt;p&gt;In March 2026, Ingress NGINX maintenance will be halted, and the project will be &lt;a href=&#34;https://github.com/kubernetes-retired/&#34;&gt;retired&lt;/a&gt;. After that time, there will be no further releases, no bugfixes, and no updates to resolve any security vulnerabilities that may be discovered. The GitHub repositories will be made read-only and left available for reference.&lt;/p&gt;
&lt;p&gt;Existing deployments of Ingress NGINX will not be broken. Existing project artifacts such as Helm charts and container images will remain available.&lt;/p&gt;
&lt;p&gt;In most cases, you can check whether you use Ingress NGINX by running &lt;code&gt;kubectl get pods \--all-namespaces \--selector app.kubernetes.io/name=ingress-nginx&lt;/code&gt; with cluster administrator permissions.&lt;/p&gt;
&lt;p&gt;We would like to thank the Ingress NGINX maintainers for their work in creating and maintaining this project–their dedication remains impressive. This Ingress controller has powered billions of requests in datacenters and homelabs all around the world. In a lot of ways, Kubernetes wouldn’t be where it is without Ingress NGINX, and we are grateful for so many years of incredible effort.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SIG Network and the Security Response Committee recommend that all Ingress NGINX users begin migration to Gateway API or another Ingress controller immediately.&lt;/strong&gt; Many options are listed in the Kubernetes documentation: &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/&#34;&gt;Gateway API&lt;/a&gt;, &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/&#34;&gt;Ingress&lt;/a&gt;. Additional options may be available from vendors you work with.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Announcing the 2025 Steering Committee Election Results</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/09/steering-committee-results-2025/</link>
      <pubDate>Sun, 09 Nov 2025 15:10:00 -0500</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/09/steering-committee-results-2025/</guid>
      <description>
        
        
        &lt;p&gt;The &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/elections/steering/2025&#34;&gt;2025 Steering Committee Election&lt;/a&gt; is now complete. The Kubernetes Steering Committee consists of 7 seats, 4 of which were up for election in 2025. Incoming committee members serve a term of 2 years, and all members are elected by the Kubernetes Community.&lt;/p&gt;
&lt;p&gt;The Steering Committee oversees the governance of the entire Kubernetes project. With that great power comes great responsibility. You can learn more about the steering committee’s role in their &lt;a href=&#34;https://github.com/kubernetes/steering/blob/master/charter.md&#34;&gt;charter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thank you to everyone who voted in the election; your participation helps support the community’s continued health and success.&lt;/p&gt;
&lt;h2 id=&#34;results&#34;&gt;Results&lt;/h2&gt;
&lt;p&gt;Congratulations to the elected committee members whose two year terms begin immediately (listed in alphabetical order by GitHub handle):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kat Cosgrove (&lt;a href=&#34;https://github.com/katcosgrove&#34;&gt;@katcosgrove&lt;/a&gt;), Minimus&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paco Xu (&lt;a href=&#34;https://github.com/pacoxu&#34;&gt;@pacoxu&lt;/a&gt;), DaoCloud&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rita Zhang (&lt;a href=&#34;https://github.com/ritazh&#34;&gt;@ritazh&lt;/a&gt;), Microsoft&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maciej Szulik (&lt;a href=&#34;https://github.com/soltysh&#34;&gt;@soltysh&lt;/a&gt;), Defense Unicorns&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They join continuing members:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Antonio Ojea (&lt;a href=&#34;https://github.com/aojea&#34;&gt;@aojea&lt;/a&gt;), Google&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Benjamin Elder (&lt;a href=&#34;https://github.com/BenTheElder&#34;&gt;@BenTheElder&lt;/a&gt;), Google&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sascha Grunert (&lt;a href=&#34;https://github.com/saschagrunert&#34;&gt;@saschagrunert&lt;/a&gt;), Red Hat&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maciej Szulik and Paco Xu are returning Steering Committee Members.&lt;/p&gt;
&lt;h2 id=&#34;big-thanks&#34;&gt;Big thanks!&lt;/h2&gt;
&lt;p&gt;Thank you and congratulations on a successful election to this round’s election officers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Christoph Blecker (&lt;a href=&#34;https://github.com/cblecker&#34;&gt;@cblecker&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Nina Polshakova (&lt;a href=&#34;https://github.com/npolshakova&#34;&gt;@npolshakova&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Sreeram Venkitesh (&lt;a href=&#34;https://github.com/sreeram-venkitesh&#34;&gt;@sreeram-venkitesh&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to the Emeritus Steering Committee Members. Your service is appreciated by the community:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stephen Augustus (&lt;a href=&#34;https://github.com/justaugustus&#34;&gt;@justaugustus&lt;/a&gt;), Bloomberg&lt;/li&gt;
&lt;li&gt;Patrick Ohly (&lt;a href=&#34;https://github.com/pohly&#34;&gt;@pohly&lt;/a&gt;), Intel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And thank you to all the candidates who came forward to run for election.&lt;/p&gt;
&lt;h2 id=&#34;get-involved-with-the-steering-committee&#34;&gt;Get involved with the Steering Committee&lt;/h2&gt;
&lt;p&gt;This governing body, like all of Kubernetes, is open to all. You can follow along with Steering Committee &lt;a href=&#34;https://bit.ly/k8s-steering-wd&#34;&gt;meeting notes&lt;/a&gt; and weigh in by filing an issue or creating a PR against their &lt;a href=&#34;https://github.com/kubernetes/steering&#34;&gt;repo&lt;/a&gt;. They have an open meeting on &lt;a href=&#34;https://github.com/kubernetes/steering&#34;&gt;the first Wednesday at 8am PT of every month&lt;/a&gt;. They can also be contacted at their public mailing list &lt;a href=&#34;mailto:steering@kubernetes.io&#34;&gt;steering@kubernetes.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can see what the Steering Committee meetings are all about by watching past meetings on the &lt;a href=&#34;https://www.youtube.com/playlist?list=PL69nYSiGNLP1yP1B_nd9-drjoxp0Q14qM&#34;&gt;YouTube Playlist&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This post was adapted from one written by the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication/contributor-comms&#34;&gt;Contributor Comms Subproject&lt;/a&gt;. If you want to write stories about the Kubernetes community, learn more about us.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This article was revised in November 2025 to update the information about when the steering committee meets.&lt;/em&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Gateway API 1.4: New Features</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/06/gateway-api-v1-4/</link>
      <pubDate>Thu, 06 Nov 2025 09:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/06/gateway-api-v1-4/</guid>
      <description>
        
        
        &lt;p&gt;&lt;img alt=&#34;Gateway API logo&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/11/06/gateway-api-v1-4/gateway-api-logo.svg&#34;&gt;&lt;/p&gt;
&lt;p&gt;Ready to rock your Kubernetes networking? The Kubernetes SIG Network community presented the General Availability (GA) release of Gateway API (v1.4.0)! Released on October 6, 2025, version 1.4.0 reinforces the path for modern, expressive, and extensible service networking in Kubernetes.&lt;/p&gt;
&lt;p&gt;Gateway API v1.4.0 brings three new features to the &lt;em&gt;Standard channel&lt;/em&gt;
(Gateway API&#39;s GA release channel):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BackendTLSPolicy for TLS between gateways and backends&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;supportedFeatures&lt;/code&gt; in GatewayClass status&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Named rules for Routes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and introduces three new experimental features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mesh resource for service mesh configuration&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default gateways&lt;/strong&gt; to ease configuration burden**&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;externalAuth&lt;/code&gt; filter for HTTPRoute&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;graduations-to-standard-channel&#34;&gt;Graduations to Standard Channel&lt;/h2&gt;
&lt;h3 id=&#34;backend-tls-policy&#34;&gt;Backend TLS policy&lt;/h3&gt;
&lt;p&gt;Leads: &lt;a href=&#34;https://github.com/candita&#34;&gt;Candace Holman&lt;/a&gt;, &lt;a href=&#34;https://github.com/snorwin&#34;&gt;Norwin Schnyder&lt;/a&gt;, &lt;a href=&#34;https://github.com/kl52752&#34;&gt;Katarzyna Łach&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-1897: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/1897&#34;&gt;BackendTLSPolicy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gateway-api.sigs.k8s.io/api-types/backendtlspolicy&#34;&gt;BackendTLSPolicy&lt;/a&gt; is a new Gateway API type for specifying the TLS configuration
of the connection from the Gateway to backend pod(s).
.  Prior to the introduction of BackendTLSPolicy, there was no API specification
that allowed encrypted traffic on the hop from Gateway to backend.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;BackendTLSPolicy&lt;/code&gt; &lt;code&gt;validation&lt;/code&gt; configuration requires a hostname. This &lt;code&gt;hostname&lt;/code&gt;
serves two purposes. It is used as the SNI header when connecting to the backend and
for authentication, the certificate presented by the backend must match this hostname,
&lt;em&gt;unless&lt;/em&gt; &lt;code&gt;subjectAltNames&lt;/code&gt; is explicitly specified.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;subjectAltNames&lt;/code&gt; (SANs) are specified, the &lt;code&gt;hostname&lt;/code&gt; is only used for SNI, and authentication is performed against the SANs instead. If you still need to authenticate against the hostname value in this case, you MUST add it to the &lt;code&gt;subjectAltNames&lt;/code&gt; list.&lt;/p&gt;
&lt;p&gt;BackendTLSPolicy &lt;code&gt;validation&lt;/code&gt; configuration also requires either &lt;code&gt;caCertificateRefs&lt;/code&gt; or &lt;code&gt;wellKnownCACertificates&lt;/code&gt;.
&lt;code&gt;caCertificateRefs&lt;/code&gt; refer to one or more (up to 8) PEM-encoded TLS certificate bundles. If there are no specific certificates to use,
then depending on your implementation, you may use &lt;code&gt;wellKnownCACertificates&lt;/code&gt;,
set to &amp;quot;System&amp;quot; to tell the Gateway to use an implementation-specific set of trusted CA Certificates.&lt;/p&gt;
&lt;p&gt;In this example, the BackendTLSPolicy is configured to use certificates defined in the auth-cert ConfigMap
to connect with a TLS-encrypted upstream connection where pods backing the auth service are expected to serve a
valid certificate for &lt;code&gt;auth.example.com&lt;/code&gt;.  It uses &lt;code&gt;subjectAltNames&lt;/code&gt; with a Hostname type, but you may also use a URI type.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;BackendTLSPolicy&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tls-upstream-auth&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;targetRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Service&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;auth&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;group&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;sectionName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;https&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;validation&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;caCertificateRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;group&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# core API group&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ConfigMap&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;auth-cert&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;subjectAltNames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Hostname&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostname&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;auth.example.com&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example, the BackendTLSPolicy is configured to use system certificates to connect with a TLS-encrypted backend connection where Pods backing the dev Service are expected to serve a valid certificate for &lt;code&gt;dev.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;BackendTLSPolicy&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;tls-upstream-dev&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;targetRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Service&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dev&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;group&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;sectionName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;btls&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;validation&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;wellKnownCACertificates&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;System&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostname&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;dev.example.com&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;More information on the configuration of TLS in Gateway API can be found in &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/tls/&#34;&gt;Gateway API - TLS Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;status-information-about-the-features-that-an-implementation-supports&#34;&gt;Status information about the features that an implementation supports&lt;/h3&gt;
&lt;p&gt;Leads: &lt;a href=&#34;https://github.com/liorlieberman&#34;&gt;Lior Lieberman&lt;/a&gt;, &lt;a href=&#34;https://github.com/bexxmodd&#34;&gt;Beka Modebadze&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-2162: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/blob/main/geps/gep-2162/index.md&#34;&gt;Supported features in GatewayClass Status&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GatewayClass status has a new field, &lt;code&gt;supportedFeatures&lt;/code&gt;.
This addition allows implementations to declare the set of features they support. This provides a clear way for users and tools to understand the capabilities of a given GatewayClass.&lt;/p&gt;
&lt;p&gt;This feature&#39;s name for conformance tests (and GatewayClass status reporting) is &lt;strong&gt;SupportedFeatures&lt;/strong&gt;.
Implementations must populate the &lt;code&gt;supportedFeatures&lt;/code&gt; field in the &lt;code&gt;.status&lt;/code&gt; of the GatewayClass &lt;strong&gt;before&lt;/strong&gt; the GatewayClass
is accepted, or in the same operation.&lt;/p&gt;
&lt;p&gt;Here’s an example of a &lt;code&gt;supportedFeatures&lt;/code&gt; published under GatewayClass&#39; &lt;code&gt;.status&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;GatewayClass&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;conditions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;lastTransitionTime&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;2022-11-16T10:33:06Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;message&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Handled by Foo controller&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;observedGeneration&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;reason&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Accepted&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Accepted&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;supportedFeatures&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- HTTPRoute&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- HTTPRouteHostRewrite&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- HTTPRoutePortRedirect&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- HTTPRouteQueryParamMatching&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Graduation of SupportedFeatures to Standard, helped improve the conformance testing process for Gateway API.
The conformance test suite will now automatically run tests based on the features populated in the GatewayClass&#39; status.
This creates a strong, verifiable link between an implementation&#39;s declared capabilities and the test results,
making it easier for implementers to run the correct conformance tests and for users to trust the conformance reports.&lt;/p&gt;
&lt;p&gt;This means when the SupportedFeatures field is populated in the GatewayClass status there will be no need for additional
conformance tests flags like &lt;code&gt;–suported-features&lt;/code&gt;, or &lt;code&gt;–exempt&lt;/code&gt; or &lt;code&gt;–all-features&lt;/code&gt;.
It&#39;s important to note that Mesh features are an exception to this and can be tested for conformance by using
&lt;em&gt;Conformance Profiles&lt;/em&gt;, or by manually providing any combination of features related flags until the dedicated resource
graduates from the experimental channel.&lt;/p&gt;
&lt;h3 id=&#34;named-rules-for-routes&#34;&gt;Named rules for Routes&lt;/h3&gt;
&lt;p&gt;GEP-995: &lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-995&#34;&gt;Adding a new name field to all xRouteRule types (HTTPRouteRule, GRPCRouteRule, etc.)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Leads: &lt;a href=&#34;https://github.com/guicassolato&#34;&gt;Guilherme Cassolato&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This enhancement enables route rules to be explicitly identified and referenced across the Gateway API ecosystem.
Some of the key use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Status:&lt;/strong&gt; Allowing status conditions to reference specific rules directly by name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability:&lt;/strong&gt; Making it easier to identify individual rules in logs, traces, and metrics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policies:&lt;/strong&gt; Enabling policies (&lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-773&#34;&gt;GEP-713&lt;/a&gt;) to target specific route rules via the &lt;code&gt;sectionName&lt;/code&gt; field in their &lt;code&gt;targetRef[s]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tooling:&lt;/strong&gt; Simplifying filtering and referencing of route rules in tools such as &lt;code&gt;gwctl&lt;/code&gt;, &lt;code&gt;kubectl&lt;/code&gt;, and general-purpose utilities like &lt;code&gt;jq&lt;/code&gt; and &lt;code&gt;yq&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Internal configuration mapping:&lt;/strong&gt; Facilitating the generation of internal configurations that reference route rules by name within gateway and mesh implementations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This follows the same well-established pattern already adopted for Gateway listeners, Service ports, Pods (and containers),
and many other Kubernetes resources.&lt;/p&gt;
&lt;p&gt;While the new name field is &lt;strong&gt;optional&lt;/strong&gt; (so existing resources remain valid), its use is &lt;strong&gt;strongly encouraged&lt;/strong&gt;.
Implementations are not expected to assign a default value, but they may enforce constraints such as immutability.&lt;/p&gt;
&lt;p&gt;Finally, keep in mind that the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-995/?h=995#format&#34;&gt;name format&lt;/a&gt; is validated,
and other fields (such as &lt;a href=&#34;https://gateway-api.sigs.k8s.io/reference/spec/?h=sectionname#sectionname&#34;&gt;&lt;code&gt;sectionName&lt;/code&gt;&lt;/a&gt;)
may impose additional, indirect constraints.&lt;/p&gt;
&lt;h2 id=&#34;experimental-channel-changes&#34;&gt;Experimental channel changes&lt;/h2&gt;
&lt;h3 id=&#34;enabling-external-auth-for-httproute&#34;&gt;Enabling external Auth for HTTPRoute&lt;/h3&gt;
&lt;p&gt;Giving Gateway API the ability to enforce authentication and maybe authorization as well at the Gateway or HTTPRoute level has been a highly requested feature for a long time. (See the &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/1494&#34;&gt;GEP-1494 issue&lt;/a&gt; for some background.)&lt;/p&gt;
&lt;p&gt;This Gateway API release adds an Experimental filter in HTTPRoute that tells the Gateway API implementation to call out to an external service to authenticate (and, optionally, authorize) requests.&lt;/p&gt;
&lt;p&gt;This filter is based on the &lt;a href=&#34;https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/ext_authz_filter#config-http-filters-ext-authz&#34;&gt;Envoy ext_authz API&lt;/a&gt;, and allows talking to an Auth service that uses either gRPC or HTTP for its protocol.&lt;/p&gt;
&lt;p&gt;Both methods allow the configuration of what headers to forward to the Auth service, with the HTTP protocol allowing some extra information like a prefix path.&lt;/p&gt;
&lt;p&gt;A HTTP example might look like this (noting that this example requires the Experimental channel to be installed and an implementation that supports External Auth to actually understand the config):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;HTTPRoute&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;require-auth&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;parentRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;your-gateway-here&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matches&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;path&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Prefix&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;/admin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;filters&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ExternalAuth&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;externalAuth&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;protocol&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;HTTP&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backendRef&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;auth-service&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;http&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# These headers are always sent for the HTTP protocol,&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# but are included here for illustrative purposes&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;allowedHeaders&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;- Host&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;- Method&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;- Path&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;- Content-Length&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                &lt;/span&gt;- Authorization&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backendRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;admin-backend&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8080&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This allows the backend Auth service to use the supplied headers to make a determination about the authentication for the request.&lt;/p&gt;
&lt;p&gt;When a request is allowed, the external Auth service will respond with a 200 HTTP response code, and optionally extra headers to be included in the request that is forwarded to the backend. When the request is denied, the Auth service will respond with a 403 HTTP response.&lt;/p&gt;
&lt;p&gt;Since the Authorization header is used in many authentication methods, this method can be used to do Basic, Oauth, JWT, and other common authentication and authorization methods.&lt;/p&gt;
&lt;h3 id=&#34;mesh-resource&#34;&gt;Mesh resource&lt;/h3&gt;
&lt;p&gt;Lead(s): &lt;a href=&#34;https://github.com/kflynn&#34;&gt;Flynn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-3949: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/3949&#34;&gt;Mesh-wide configuration and supported features&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gateway API v1.4.0 introduces a new experimental Mesh resource, which provides a way to configure mesh-wide settings and discover the features supported by a given mesh implementation. This resource is analogous to the Gateway resource and will initially be mainly used for conformance testing, with plans to extend its use to off-cluster Gateways in the future.&lt;/p&gt;
&lt;p&gt;The Mesh resource is cluster-scoped and, as an experimental feature, is named &lt;code&gt;XMesh&lt;/code&gt; and resides in the &lt;code&gt;gateway.networking.x-k8s.io&lt;/code&gt; API group. A key field is controllerName, which specifies the mesh implementation responsible for the resource. The resource&#39;s &lt;code&gt;status&lt;/code&gt; stanza indicates whether the mesh implementation has accepted it and lists the features the mesh supports.&lt;/p&gt;
&lt;p&gt;One of the goals of this GEP is to avoid making it more difficult for users to adopt a mesh. To simplify adoption, mesh implementations are expected to create a default Mesh resource upon startup if one with a matching &lt;code&gt;controllerName&lt;/code&gt; doesn&#39;t already exist. This avoids the need for manual creation of the resource to begin using a mesh.&lt;/p&gt;
&lt;p&gt;The new XMesh API kind, within the gateway.networking.x-k8s.io/v1alpha1 API group,
provides a central point for mesh configuration and feature discovery (source).&lt;/p&gt;
&lt;p&gt;A minimal XMesh object specifies the &lt;code&gt;controllerName&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.x-k8s.io/v1alpha1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;XMesh&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;one-mesh-to-mesh-them-all&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;controllerName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;one-mesh.example.com/one-mesh&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The mesh implementation populates the status field to confirm it has accepted the resource and to list its supported features ( source):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;conditions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Accepted&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;reason&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Accepted&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;supportedFeatures&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;MeshHTTPRoute&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;OffClusterGateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;introducing-default-gateways&#34;&gt;Introducing default Gateways&lt;/h3&gt;
&lt;p&gt;Lead(s): &lt;a href=&#34;https://github.com/kflynn&#34;&gt;Flynn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-3793: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/3793&#34;&gt;Allowing Gateways to program some routes by default&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For application developers, one common piece of feedback has been the need to explicitly name a parent Gateway for every single north-south Route. While this explicitness prevents ambiguity, it adds friction, especially for developers who just want to expose their application to the outside world without worrying about the underlying infrastructure&#39;s naming scheme. To address this, we have introduce the concept of &lt;strong&gt;Default Gateways&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&#34;for-application-developers-just-use-the-default&#34;&gt;For application developers: Just &amp;quot;use the default&amp;quot;&lt;/h4&gt;
&lt;p&gt;As an application developer, you often don&#39;t care about the specific Gateway your traffic flows through, you just want it to work. With this enhancement, you can now create a Route and simply ask it to use a default Gateway.&lt;/p&gt;
&lt;p&gt;This is done by setting the new &lt;code&gt;useDefaultGateways&lt;/code&gt; field in your Route&#39;s &lt;code&gt;spec&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here’s a simple &lt;code&gt;HTTPRoute&lt;/code&gt; that uses a default Gateway:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;HTTPRoute&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-route&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;useDefaultGateways&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;All&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backendRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-service&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&#39;s it! No more need to hunt down the correct Gateway name for your environment. Your Route is now a &amp;quot;defaulted Route.&amp;quot;&lt;/p&gt;
&lt;h4 id=&#34;for-cluster-operators-you-re-still-in-control&#34;&gt;For cluster operators: You&#39;re still in control&lt;/h4&gt;
&lt;p&gt;This feature doesn&#39;t take control away from cluster operators (&amp;quot;Chihiro&amp;quot;).
In fact, they have explicit control over which Gateways can act as a default. A Gateway will only accept these &lt;em&gt;defaulted Routes&lt;/em&gt; if it is configured to do so.&lt;/p&gt;
&lt;p&gt;You can also use a ValidatingAdmissionPolicy to either require or even forbid for Routes to rely on a default Gateway.&lt;/p&gt;
&lt;p&gt;As a cluster operator, you can designate a Gateway as a default
by setting the (new) &lt;code&gt;.spec.defaultScope&lt;/code&gt; field:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Gateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-default-gateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;defaultScope&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;All&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# ... other gateway configuration&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Operators can choose to have no default Gateways, or even multiple.&lt;/p&gt;
&lt;h4 id=&#34;how-it-works-and-key-details&#34;&gt;How it works and key details&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To maintain a clean, GitOps-friendly workflow, a default Gateway does &lt;em&gt;not&lt;/em&gt; modify the &lt;code&gt;spec.parentRefs&lt;/code&gt; of your Route. Instead, the binding is reflected in the Route&#39;s &lt;code&gt;status&lt;/code&gt; field. You can always inspect the &lt;code&gt;status.parents&lt;/code&gt; stanza of your Route to see exactly which Gateway or Gateways have accepted it. This preserves your original intent and avoids conflicts with CD tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The design explicitly supports having multiple Gateways designated as defaults within a cluster. When this happens, a defaulted Route will bind to &lt;em&gt;all&lt;/em&gt; of them. This enables cluster operators to perform zero-downtime migrations and testing of new default Gateways.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can create a single Route that handles both north-south traffic (traffic entering or leaving the cluster, via a default Gateway) and east-west/mesh traffic (traffic between services within the cluster), by explicitly referencing a Service in &lt;code&gt;parentRefs&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Default Gateways represent a significant step forward in making the Gateway API simpler and more intuitive for everyday use cases, bridging the gap between the flexibility needed by operators and the simplicity desired by developers.&lt;/p&gt;
&lt;h3 id=&#34;configuring-client-certificate-validation&#34;&gt;Configuring client certificate validation&lt;/h3&gt;
&lt;p&gt;Lead(s): &lt;a href=&#34;https://github.com/arkodg&#34;&gt;Arko Dasgupta&lt;/a&gt;, &lt;a href=&#34;https://github.com/kl52752&#34;&gt;Katarzyna Łach&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-91: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/pull/3942&#34;&gt;Address connection coalescing security issue&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This release brings updates for configuring client certificate validation, addressing a critical security vulnerability related to connection reuse.
HTTP connection coalescing is a web performance optimization that allows a client to reuse an existing TLS connection
for requests to different domains. While this reduces the overhead of establishing new connections, it introduces a security risk
in the context of API gateways.
The ability to reuse a single TLS connection across multiple Listeners brings the need to introduce shared client certificate
configuration in order to avoid unauthorized access.&lt;/p&gt;
&lt;h4 id=&#34;why-sni-based-mtls-is-not-the-answer&#34;&gt;Why SNI-based mTLS is not the answer&lt;/h4&gt;
&lt;p&gt;One might think that using Server Name Indication (SNI) to differentiate between Listeners would solve this problem.
However, TLS SNI is not a reliable mechanism for enforcing security policies in a connection coalescing scenario.
A client could use a single TLS connection for multiple peer connections, as long as they are all covered by the same certificate.
This means that a client could establish a connection by indicating one peer identity (using SNI), and then reuse that connection
to access a different virtual host that is listening on the same IP address and port. That reuse, which is controlled by client side
heuristics, could bypass mutual TLS policies that were specific to the second listener configuration.&lt;/p&gt;
&lt;p&gt;Here&#39;s an example to help explain it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gateway.networking.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Gateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;wildcard-tls-gateway&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;gatewayClassName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;example&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;listeners&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;foo-https&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;protocol&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;HTTPS&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;443&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostname&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;foo.example.com&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tls&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;certificateRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;group&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# core API group&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Secret&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name: foo-example-com-cert  # SAN&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;foo.example.com&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;wildcard-https&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;protocol&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;HTTPS&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;port&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;443&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;hostname&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;*.example.com&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tls&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;certificateRefs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;group&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# core API group&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Secret&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name: wildcard-example-com-cert # SAN&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080&#34;&gt;*.example.com&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I have configured a Gateway with two listeners, both having overlapping hostnames.
My intention is for the &lt;code&gt;foo-http&lt;/code&gt; listener to be accessible only by clients presenting the &lt;code&gt;foo-example-com-cert&lt;/code&gt; certificate.
In contrast, the &lt;code&gt;wildcard-https&lt;/code&gt; listener should allow access to a broader audience using any certificate valid for the &lt;code&gt;*.example.com&lt;/code&gt; domain.&lt;/p&gt;
&lt;p&gt;Consider a scenario where a client initially connects to &lt;code&gt;foo.example.com&lt;/code&gt;. The server requests and successfully validates the
&lt;code&gt;foo-example-com-cert&lt;/code&gt; certificate, establishing the connection. Subsequently, the same client wishes to access other sites within this domain,
such as &lt;code&gt;bar.example.com&lt;/code&gt;, which is handled by the &lt;code&gt;wildcard-https&lt;/code&gt; listener. Due to connection reuse,
clients can access &lt;code&gt;wildcard-https&lt;/code&gt; backends without an additional TLS handshake on the existing connection.
This process functions as expected.&lt;/p&gt;
&lt;p&gt;However, a critical security vulnerability arises when the order of access is reversed.
If a client first connects to &lt;code&gt;bar.example.com&lt;/code&gt; and presents a valid &lt;code&gt;bar.example.com&lt;/code&gt; certificate, the connection is successfully established.
If this client then attempts to access &lt;code&gt;foo.example.com&lt;/code&gt;, the existing connection&#39;s client certificate will not be re-validated.
This allows the client to bypass the specific certificate requirement for the &lt;code&gt;foo&lt;/code&gt; backend, leading to a serious security breach.&lt;/p&gt;
&lt;h4 id=&#34;the-solution-per-port-tls-configuration&#34;&gt;The solution: per-port TLS configuration&lt;/h4&gt;
&lt;p&gt;The updated Gateway API gains a &lt;code&gt;tls&lt;/code&gt; field in the &lt;code&gt;.spec&lt;/code&gt; of a Gateway, that allows you to define a default client certificate
validation configuration for all Listeners, and then if needed override it on a per-port basis. This provides a flexible and
powerful way to manage your TLS policies.&lt;/p&gt;
&lt;p&gt;Here’s a look at the updated API definitions (shown as Go source code):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// GatewaySpec defines the desired state of Gateway.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;type&lt;/span&gt; GatewaySpec &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// GatewayTLSConfig specifies frontend tls configuration for gateway.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    TLS &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt;GatewayTLSConfig &lt;span style=&#34;color:#b44&#34;&gt;`json:&amp;#34;tls,omitempty&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// GatewayTLSConfig specifies frontend tls configuration for gateway.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;type&lt;/span&gt; GatewayTLSConfig &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// Default specifies the default client certificate validation configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    Default TLSConfig &lt;span style=&#34;color:#b44&#34;&gt;`json:&amp;#34;default&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// PerPort specifies tls configuration assigned per port.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    PerPort []TLSPortConfig &lt;span style=&#34;color:#b44&#34;&gt;`json:&amp;#34;perPort,omitempty&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// TLSPortConfig describes a TLS configuration for a specific port.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;type&lt;/span&gt; TLSPortConfig &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// The Port indicates the Port Number to which the TLS configuration will be applied.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    Port PortNumber &lt;span style=&#34;color:#b44&#34;&gt;`json:&amp;#34;port&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// TLS store the configuration that will be applied to all Listeners handling
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#080;font-style:italic&#34;&gt;// HTTPS traffic and matching given port.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;&lt;/span&gt;    TLS TLSConfig &lt;span style=&#34;color:#b44&#34;&gt;`json:&amp;#34;tls&amp;#34;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;breaking-changes&#34;&gt;Breaking changes&lt;/h2&gt;
&lt;h3 id=&#34;breaking-grpcroute&#34;&gt;Standard GRPCRoute - &lt;code&gt;.spec&lt;/code&gt; field required (technicality)&lt;/h3&gt;
&lt;p&gt;The promotion of GRPCRoute to Standard introduces a minor but technically breaking change regarding the presence of the top-level &lt;code&gt;.spec&lt;/code&gt; field.
As part of achieving Standard status, the Gateway API has tightened the OpenAPI schema validation within the GRPCRoute
CustomResourceDefinition (CRD)
to explicitly ensure the spec field is required for all GRPCRoute resources.
This change enforces stricter conformance to Kubernetes object standards and enhances the resource&#39;s stability and predictability.
While it is highly unlikely that users were attempting to define a GRPCRoute without any specification, any existing automation
or manifests that might have relied on a relaxed interpretation allowing a completely absent &lt;code&gt;spec&lt;/code&gt; field will now fail validation
and &lt;strong&gt;must&lt;/strong&gt; be updated to include the &lt;code&gt;.spec&lt;/code&gt; field, even if empty.&lt;/p&gt;
&lt;h3 id=&#34;breaking-httproute&#34;&gt;Experimental CORS support in HTTPRoute - breaking change for &lt;code&gt;allowCredentials&lt;/code&gt; field&lt;/h3&gt;
&lt;p&gt;The Gateway API subproject has introduced a breaking change to the Experimental CORS support in HTTPRoute, concerning the &lt;code&gt;allowCredentials&lt;/code&gt; field
within the CORS policy.
This field&#39;s definition has been strictly aligned with the upstream CORS specification, which dictates that the corresponding
&lt;code&gt;Access-Control-Allow-Credentials&lt;/code&gt; header must represent a Boolean value.
Previously, the implementation might have been overly permissive, potentially accepting non-standard or string representations such as
&lt;code&gt;true&lt;/code&gt; due to relaxed schema validation.
Users who were configuring CORS rules must now review their manifests and ensure the value for &lt;code&gt;allowCredentials&lt;/code&gt;
strictly conforms to the new, more restrictive schema.
Any existing HTTPRoute definitions that do not adhere to this stricter validation will now be rejected by the API server,
requiring a configuration update to maintain functionality.&lt;/p&gt;
&lt;h2 id=&#34;improving-the-development-and-usage-experience&#34;&gt;Improving the development and usage experience&lt;/h2&gt;
&lt;p&gt;As part of this release, we have improved some of the developer experience workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;a href=&#34;https://github.com/kubernetes-sigs/kube-api-linter&#34;&gt;Kube API Linter&lt;/a&gt; to the CI/CD pipelines, reducing the burden of API reviewers and also reducing the amount of common mistakes.&lt;/li&gt;
&lt;li&gt;Improving the execution time of CRD tests with the usage of &lt;a href=&#34;https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/envtest&#34;&gt;&lt;code&gt;envtest&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, as part of the effort to improve Gateway API usage experience, some efforts were made to remove some ambiguities and some old tech-debts from our documentation website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The API reference is now explicit when a field is &lt;code&gt;experimental&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The GEP (GatewayAPI Enhancement Proposal) navigation bar is automatically generated, reflecting the real status of the enhancements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Try it out&lt;/h2&gt;
&lt;p&gt;Unlike other Kubernetes APIs, you don&#39;t need to upgrade to the latest version of
Kubernetes to get the latest version of Gateway API. As long as you&#39;re running
Kubernetes 1.26 or later, you&#39;ll be able to get up and running with this version
of Gateway API.&lt;/p&gt;
&lt;p&gt;To try out the API, follow the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/&#34;&gt;Getting Started Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As of this writing, seven implementations are already conformant with Gateway API v1.4.0. In alphabetical order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kgateway-dev/kgateway/releases/tag/v2.2.0-alpha.1&#34;&gt;Agent Gateway (with kgateway)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/airlock/microgateway/releases/tag/4.8.0-alpha1&#34;&gt;Airlock Microgateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/envoyproxy/gateway/releases/tag/v1.6.0-rc.1&#34;&gt;Envoy Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.cloud.google.com/kubernetes-engine/docs/concepts/gateway-api&#34;&gt;GKE Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/istio/istio/releases/tag/1.28.0-rc.1&#34;&gt;Istio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kgateway-dev/kgateway/releases/tag/v2.1.0&#34;&gt;kgateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/traefik/traefik/releases/tag/v3.6.0-rc1&#34;&gt;Traefik Proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;Wondering when a feature will be added?  There are lots of opportunities to get
involved and help define the future of Kubernetes routing APIs for both ingress
and service mesh.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check out the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides&#34;&gt;user guides&lt;/a&gt; to see what use-cases can be addressed.&lt;/li&gt;
&lt;li&gt;Try out one of the &lt;a href=&#34;https://gateway-api.sigs.k8s.io/implementations/&#34;&gt;existing Gateway controllers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Or &lt;a href=&#34;https://gateway-api.sigs.k8s.io/contributing/&#34;&gt;join us in the community&lt;/a&gt;
and help us build the future of Gateway API together!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The maintainers would like to thank &lt;em&gt;everyone&lt;/em&gt; who&#39;s contributed to Gateway
API, whether in the form of commits to the repo, discussion, ideas, or general
support. We could never have made this kind of progress without the support of
this dedicated and active community.&lt;/p&gt;
&lt;h2 id=&#34;related-kubernetes-blog-articles&#34;&gt;Related Kubernetes blog articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/06/02/gateway-api-v1-3/&#34;&gt;Gateway API v1.3.0: Advancements in Request Mirroring, CORS, Gateway Merging, and Retry Budgets&lt;/a&gt;
(June 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2024/11/21/gateway-api-v1-2/&#34;&gt;Gateway API v1.2: WebSockets, Timeouts, Retries, and More&lt;/a&gt;
(November 2024)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2024/05/09/gateway-api-v1-1/&#34;&gt;Gateway API v1.1: Service mesh, GRPCRoute, and a whole lot more&lt;/a&gt;
(May 2024)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2023/11/28/gateway-api-ga/&#34;&gt;New Experimental Features in Gateway API v1.0&lt;/a&gt;
(November 2023)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2023/10/31/gateway-api-ga/&#34;&gt;Gateway API v1.0: GA Release&lt;/a&gt;
(October 2023)&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>7 Common Kubernetes Pitfalls (and How I Learned to Avoid Them)</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/20/seven-kubernetes-pitfalls-and-how-to-avoid/</link>
      <pubDate>Mon, 20 Oct 2025 08:30:00 -0700</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/20/seven-kubernetes-pitfalls-and-how-to-avoid/</guid>
      <description>
        
        
        &lt;p&gt;It’s no secret that Kubernetes can be both powerful and frustrating at times. When I first started dabbling with container orchestration, I made more than my fair share of mistakes enough to compile a whole list of pitfalls. In this post, I want to walk through seven big gotchas I’ve encountered (or seen others run into) and share some tips on how to avoid them. Whether you’re just kicking the tires on Kubernetes or already managing production clusters, I hope these insights help you steer clear of a little extra stress.&lt;/p&gt;
&lt;h2 id=&#34;1-skipping-resource-requests-and-limits&#34;&gt;1. Skipping resource requests and limits&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The pitfall&lt;/strong&gt;: Not specifying CPU and memory requirements in Pod specifications. This typically happens because Kubernetes does not require these fields, and workloads can often start and run without them—making the omission easy to overlook in early configurations or during rapid deployment cycles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;:
In Kubernetes, resource requests and limits are critical for efficient cluster management. Resource requests ensure that the scheduler reserves the appropriate amount of CPU and memory for each pod, guaranteeing that it has the necessary resources to operate. Resource limits cap the amount of CPU and memory a pod can use, preventing any single pod from consuming excessive resources and potentially starving other pods.
When resource requests and limits are not set:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Resource Starvation: Pods may get insufficient resources, leading to degraded performance or failures. This is because Kubernetes schedules pods based on these requests. Without them, the scheduler might place too many pods on a single node, leading to resource contention and performance bottlenecks.&lt;/li&gt;
&lt;li&gt;Resource Hoarding: Conversely, without limits, a pod might consume more than its fair share of resources, impacting the performance and stability of other pods on the same node. This can lead to issues such as other pods getting evicted or killed by the Out-Of-Memory (OOM) killer due to lack of available memory.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;how-to-avoid-it&#34;&gt;How to avoid it:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Start with modest &lt;code&gt;requests&lt;/code&gt; (for example &lt;code&gt;100m&lt;/code&gt; CPU, &lt;code&gt;128Mi&lt;/code&gt; memory) and see how your app behaves.&lt;/li&gt;
&lt;li&gt;Monitor real-world usage and refine your values; the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/run-application/horizontal-pod-autoscale/&#34;&gt;HorizontalPodAutoscaler&lt;/a&gt; can help automate scaling based on metrics.&lt;/li&gt;
&lt;li&gt;Keep an eye on &lt;code&gt;kubectl top pods&lt;/code&gt; or your logging/monitoring tool to confirm you’re not over- or under-provisioning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My reality check&lt;/strong&gt;: Early on, I never thought about memory limits. Things seemed fine on my local cluster. Then, on a larger environment, Pods got &lt;em&gt;OOMKilled&lt;/em&gt; left and right. Lesson learned.
For detailed instructions on configuring resource requests and limits for your containers, please refer to &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/assign-memory-resource/&#34;&gt;Assign Memory Resources to Containers and Pods&lt;/a&gt;
(part of the official Kubernetes documentation).&lt;/p&gt;
&lt;h2 id=&#34;2-underestimating-liveness-and-readiness-probes&#34;&gt;2. Underestimating liveness and readiness probes&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The pitfall&lt;/strong&gt;: Deploying containers without explicitly defining how Kubernetes should check their health or readiness. This tends to happen because Kubernetes will consider a container “running” as long as the process inside hasn’t exited. Without additional signals, Kubernetes assumes the workload is functioning—even if the application inside is unresponsive, initializing, or stuck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;:&lt;br&gt;
Liveness, readiness, and startup probes are mechanisms Kubernetes uses to monitor container health and availability.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Liveness probes&lt;/strong&gt; determine if the application is still alive. If a liveness check fails, the container is restarted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness probes&lt;/strong&gt; control whether a container is ready to serve traffic. Until the readiness probe passes, the container is removed from Service endpoints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Startup probes&lt;/strong&gt; help distinguish between long startup times and actual failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;how-to-avoid-it-1&#34;&gt;How to avoid it:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add a simple HTTP &lt;code&gt;livenessProbe&lt;/code&gt; to check a health endpoint (for example &lt;code&gt;/healthz&lt;/code&gt;) so Kubernetes can restart a hung container.&lt;/li&gt;
&lt;li&gt;Use a &lt;code&gt;readinessProbe&lt;/code&gt; to ensure traffic doesn’t reach your app until it’s warmed up.&lt;/li&gt;
&lt;li&gt;Keep probes simple. Overly complex checks can create false alarms and unnecessary restarts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My reality check&lt;/strong&gt;: I once forgot a readiness probe for a web service that took a while to load. Users hit it prematurely, got weird timeouts, and I spent hours scratching my head. A 3-line readiness probe would have saved the day.&lt;/p&gt;
&lt;p&gt;For comprehensive instructions on configuring liveness, readiness, and startup probes for containers, please refer to &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/&#34;&gt;Configure Liveness, Readiness and Startup Probes&lt;/a&gt;
in the official Kubernetes documentation.&lt;/p&gt;
&lt;h2 id=&#34;3-we-ll-just-look-at-container-logs-famous-last-words&#34;&gt;3. “We’ll just look at container logs” (famous last words)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The pitfall&lt;/strong&gt;: Relying solely on container logs retrieved via &lt;code&gt;kubectl logs&lt;/code&gt;. This often happens because the command is quick and convenient, and in many setups, logs appear accessible during development or early troubleshooting. However, &lt;code&gt;kubectl logs&lt;/code&gt; only retrieves logs from currently running or recently terminated containers, and those logs are stored on the node’s local disk. As soon as the container is deleted, evicted, or the node is restarted, the log files may be rotated out or permanently lost.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-2&#34;&gt;How to avoid it:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralize logs&lt;/strong&gt; using CNCF tools like &lt;a href=&#34;https://kubernetes.io/docs/concepts/cluster-administration/logging/#sidecar-container-with-a-logging-agent&#34;&gt;Fluentd&lt;/a&gt; or &lt;a href=&#34;https://fluentbit.io/&#34;&gt;Fluent Bit&lt;/a&gt; to aggregate output from all Pods.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adopt OpenTelemetry&lt;/strong&gt; for a unified view of logs, metrics, and (if needed) traces. This lets you spot correlations between infrastructure events and app-level behavior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pair logs with Prometheus metrics&lt;/strong&gt; to track cluster-level data alongside application logs. If you need distributed tracing, consider CNCF projects like &lt;a href=&#34;https://www.jaegertracing.io/&#34;&gt;Jaeger&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My reality check&lt;/strong&gt;: The first time I lost Pod logs to a quick restart, I realized how flimsy “kubectl logs” can be on its own. Since then, I’ve set up a proper pipeline for every cluster to avoid missing vital clues.&lt;/p&gt;
&lt;h2 id=&#34;4-treating-dev-and-prod-exactly-the-same&#34;&gt;4. Treating dev and prod exactly the same&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The pitfall&lt;/strong&gt;: Deploying the same Kubernetes manifests with identical settings across development, staging, and production environments. This often occurs when teams aim for consistency and reuse, but overlook that environment-specific factors—such as traffic patterns, resource availability, scaling needs, or access control—can differ significantly. Without customization, configurations optimized for one environment may cause instability, poor performance, or security gaps in another.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-3&#34;&gt;How to avoid it:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Use environment overlays or &lt;a href=&#34;https://kustomize.io/&#34;&gt;kustomize&lt;/a&gt; to maintain a shared base while customizing resource requests, replicas, or config for each environment.&lt;/li&gt;
&lt;li&gt;Extract environment-specific configuration into ConfigMaps and / or Secrets. You can use a specialized tool such as &lt;a href=&#34;https://github.com/bitnami-labs/sealed-secrets&#34;&gt;Sealed Secrets&lt;/a&gt; to manage confidential data.&lt;/li&gt;
&lt;li&gt;Plan for scale in production. Your dev cluster can probably get away with minimal CPU/memory, but prod might need significantly more.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My reality check&lt;/strong&gt;: One time, I scaled up &lt;code&gt;replicaCount&lt;/code&gt; from 2 to 10 in a tiny dev environment just to “test.” I promptly ran out of resources and spent half a day cleaning up the aftermath. Oops.&lt;/p&gt;
&lt;h2 id=&#34;5-leaving-old-stuff-floating-around&#34;&gt;5. Leaving old stuff floating around&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The pitfall&lt;/strong&gt;: Leaving unused or outdated resources—such as Deployments, Services, ConfigMaps, or PersistentVolumeClaims—running in the cluster. This often happens because Kubernetes does not automatically remove resources unless explicitly instructed, and there is no built-in mechanism to track ownership or expiration. Over time, these forgotten objects can accumulate, consuming cluster resources, increasing cloud costs, and creating operational confusion, especially when stale Services or LoadBalancers continue to route traffic.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-4&#34;&gt;How to avoid it:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Label everything&lt;/strong&gt; with a purpose or owner label. That way, you can easily query resources you no longer need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regularly audit&lt;/strong&gt; your cluster: run &lt;code&gt;kubectl get all -n &amp;lt;namespace&amp;gt;&lt;/code&gt; to see what’s actually running, and confirm it’s all legit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adopt Kubernetes’ Garbage Collection&lt;/strong&gt;: &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/garbage-collection/&#34;&gt;K8s docs&lt;/a&gt; show how to remove dependent objects automatically.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage policy automation&lt;/strong&gt;: Tools like &lt;a href=&#34;https://kyverno.io/&#34;&gt;Kyverno&lt;/a&gt; can automatically delete or block stale resources after a certain period, or enforce lifecycle policies so you don’t have to remember every single cleanup step.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My reality check&lt;/strong&gt;: After a hackathon, I forgot to tear down a “test-svc” pinned to an external load balancer. Three weeks later, I realized I’d been paying for that load balancer the entire time. Facepalm.&lt;/p&gt;
&lt;h2 id=&#34;6-diving-too-deep-into-networking-too-soon&#34;&gt;6. Diving too deep into networking too soon&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The pitfall&lt;/strong&gt;: Introducing advanced networking solutions—such as service meshes, custom CNI plugins, or multi-cluster communication—before fully understanding Kubernetes&#39; native networking primitives. This commonly occurs when teams implement features like traffic routing, observability, or mTLS using external tools without first mastering how core Kubernetes networking works: including Pod-to-Pod communication, ClusterIP Services, DNS resolution, and basic ingress traffic handling. As a result, network-related issues become harder to troubleshoot, especially when overlays introduce additional abstractions and failure points.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-5&#34;&gt;How to avoid it:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Start small: a Deployment, a Service, and a basic ingress controller such as one based on NGINX (e.g., Ingress-NGINX).&lt;/li&gt;
&lt;li&gt;Make sure you understand how traffic flows within the cluster, how service discovery works, and how DNS is configured.&lt;/li&gt;
&lt;li&gt;Only move to a full-blown mesh or advanced CNI features when you actually need them, complex networking adds overhead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My reality check&lt;/strong&gt;: I tried Istio on a small internal app once, then spent more time debugging Istio itself than the actual app. Eventually, I stepped back, removed Istio, and everything worked fine.&lt;/p&gt;
&lt;h2 id=&#34;7-going-too-light-on-security-and-rbac&#34;&gt;7. Going too light on security and RBAC&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The pitfall&lt;/strong&gt;: Deploying workloads with insecure configurations, such as running containers as the root user, using the &lt;code&gt;latest&lt;/code&gt; image tag, disabling security contexts, or assigning overly broad RBAC roles like &lt;code&gt;cluster-admin&lt;/code&gt;. These practices persist because Kubernetes does not enforce strict security defaults out of the box, and the platform is designed to be flexible rather than opinionated. Without explicit security policies in place, clusters can remain exposed to risks like container escape, unauthorized privilege escalation, or accidental production changes due to unpinned images.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-6&#34;&gt;How to avoid it:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/rbac/&#34;&gt;RBAC&lt;/a&gt; to define roles and permissions within Kubernetes. While RBAC is the default and most widely supported authorization mechanism, Kubernetes also allows the use of alternative authorizers. For more advanced or external policy needs, consider solutions like &lt;a href=&#34;https://open-policy-agent.github.io/gatekeeper/&#34;&gt;OPA Gatekeeper&lt;/a&gt; (based on Rego), &lt;a href=&#34;https://kyverno.io/&#34;&gt;Kyverno&lt;/a&gt;, or custom webhooks using policy languages such as CEL or &lt;a href=&#34;https://cedarpolicy.com/&#34;&gt;Cedar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Pin images to specific versions (no more &lt;code&gt;:latest&lt;/code&gt;!). This helps you know what’s actually deployed.&lt;/li&gt;
&lt;li&gt;Look into &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/security/pod-security-admission/&#34;&gt;Pod Security Admission&lt;/a&gt; (or other solutions like Kyverno) to enforce non-root containers, read-only filesystems, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My reality check&lt;/strong&gt;: I never had a huge security breach, but I’ve heard plenty of cautionary tales. If you don’t tighten things up, it’s only a matter of time before something goes wrong.&lt;/p&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;Final thoughts&lt;/h2&gt;
&lt;p&gt;Kubernetes is amazing, but it’s not psychic, it won’t magically do the right thing if you don’t tell it what you need. By keeping these pitfalls in mind, you’ll avoid a lot of headaches and wasted time. Mistakes happen (trust me, I’ve made my share), but each one is a chance to learn more about how Kubernetes truly works under the hood.
If you’re curious to dive deeper, the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/home/&#34;&gt;official docs&lt;/a&gt; and the &lt;a href=&#34;http://slack.kubernetes.io/&#34;&gt;community Slack&lt;/a&gt; are excellent next steps. And of course, feel free to share your own horror stories or success tips, because at the end of the day, we’re all in this cloud native adventure together.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Happy Shipping!&lt;/strong&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Spotlight on Policy Working Group</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/18/wg-policy-spotlight-2025/</link>
      <pubDate>Sat, 18 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/18/wg-policy-spotlight-2025/</guid>
      <description>
        
        
        &lt;p&gt;&lt;em&gt;(Note: The Policy Working Group has completed its mission and is no longer active. This article reflects its work, accomplishments, and insights into how a working group operates.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the complex world of Kubernetes, policies play a crucial role in managing and securing clusters. But have you ever wondered how these policies are developed, implemented, and standardized across the Kubernetes ecosystem? To answer that, let&#39;s take a look back at the work of the Policy Working Group.&lt;/p&gt;
&lt;p&gt;The Policy Working Group was dedicated to a critical mission: providing an overall architecture that encompasses both current policy-related implementations and future policy proposals in Kubernetes. Their goal was both ambitious and essential: to develop a universal policy architecture that benefits developers and end-users alike.&lt;/p&gt;
&lt;p&gt;Through collaborative methods, this working group strove to bring clarity and consistency to the often complex world of Kubernetes policies. By focusing on both existing implementations and future proposals, they ensured that the policy landscape in Kubernetes remains coherent and accessible as the technology evolves.&lt;/p&gt;
&lt;p&gt;This blog post dives deeper into the work of the Policy Working Group, guided by insights from its former co-chairs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/JimBugwadia&#34;&gt;Jim Bugwadia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/poonam_lamba&#34;&gt;Poonam Lamba&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://twitter.com/sudermanjr&#34;&gt;Andy Suderman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Interviewed by &lt;a href=&#34;https://twitter.com/arujjval&#34;&gt;Arujjwal Negi&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;These co-chairs explained what the Policy Working Group was all about.&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hello, thank you for the time! Let’s start with some introductions, could you tell us a bit about yourself, your role, and how you got involved in Kubernetes?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jim Bugwadia&lt;/strong&gt;: My name is Jim Bugwadia, and I am a co-founder and the CEO at Nirmata which provides solutions that automate security and compliance for cloud-native workloads. At Nirmata, we have been working with Kubernetes since it started in 2014. We initially built a Kubernetes policy engine in our commercial platform and later donated it to CNCF as the Kyverno project. I joined the CNCF Kubernetes Policy Working Group to help build and standardize various aspects of policy management for Kubernetes and later became a co-chair.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andy Suderman&lt;/strong&gt;: My name is Andy Suderman and I am the CTO of Fairwinds, a managed Kubernetes-as-a-Service provider. I began working with Kubernetes in 2016 building a web conferencing platform. I am an author and/or maintainer of several Kubernetes-related open-source projects such as Goldilocks, Pluto, and Polaris. Polaris is a JSON-schema-based policy engine, which started Fairwinds&#39; journey into the policy space and my involvement in the Policy Working Group.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Poonam Lamba&lt;/strong&gt;: My name is Poonam Lamba, and I currently work as a Product Manager for Google Kubernetes Engine (GKE) at Google. My journey with Kubernetes began back in 2017 when I was building an SRE platform for a large enterprise, using a private cloud built on Kubernetes. Intrigued by its potential to revolutionize the way we deployed and managed applications at the time, I dove headfirst into learning everything I could about it. Since then, I&#39;ve had the opportunity to build the policy and compliance products for GKE. I lead and contribute to GKE CIS benchmarks. I am involved with the Gatekeeper project as well as I have contributed to Policy-WG for over 2 years and served as a co-chair for the group.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Responses to the following questions represent an amalgamation of insights from the former co-chairs.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;about-working-groups&#34;&gt;About Working Groups&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;One thing even I am not aware of is the difference between a working group and a SIG. Can you help us understand what a working group is and how it is different from a SIG?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unlike SIGs, working groups are temporary and focused on tackling specific, cross-cutting issues or projects that may involve multiple SIGs. Their lifespan is defined, and they disband once they&#39;ve achieved their objective. Generally, working groups don&#39;t own code or have long-term responsibility for managing a particular area of the Kubernetes project.&lt;/p&gt;
&lt;p&gt;(To know more about SIGs, visit the &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-list.md&#34;&gt;list of Special Interest Groups&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You mentioned that Working Groups involve multiple SIGS. What SIGS was the Policy WG closely involved with, and how did you coordinate with them?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The group collaborated closely with Kubernetes SIG Auth throughout our existence, and more recently, the group also worked with SIG Security since its formation. Our collaboration occurred in a few ways. We provided periodic updates during the SIG meetings to keep them informed of our progress and activities. Additionally, we utilize other community forums to maintain open lines of communication and ensured our work aligned with the broader Kubernetes ecosystem. This collaborative approach helped the group stay coordinated with related efforts across the Kubernetes community.&lt;/p&gt;
&lt;h2 id=&#34;policy-wg&#34;&gt;Policy WG&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Why was the Policy Working Group created?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To enable a broad set of use cases, we recognize that Kubernetes is powered by a highly declarative, fine-grained, and extensible configuration management system. We&#39;ve observed that a Kubernetes configuration manifest may have different portions that are important to various stakeholders. For example, some parts may be crucial for developers, while others might be of particular interest to security teams or address operational concerns. Given this complexity, we believe that policies governing the usage of these intricate configurations are essential for success with Kubernetes.&lt;/p&gt;
&lt;p&gt;Our Policy Working Group was created specifically to research the standardization of policy definitions and related artifacts. We saw a need to bring consistency and clarity to how policies are defined and implemented across the Kubernetes ecosystem, given the diverse requirements and stakeholders involved in Kubernetes deployments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can you give me an idea of the work you did in the group?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We worked on several Kubernetes policy-related projects. Our initiatives included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We worked on a Kubernetes Enhancement Proposal (KEP) for the Kubernetes Policy Reports API. This aims to standardize how policy reports are generated and consumed within the Kubernetes ecosystem.&lt;/li&gt;
&lt;li&gt;We conducted a CNCF survey to better understand policy usage in the Kubernetes space. This helped gauge the practices and needs across the community at the time.&lt;/li&gt;
&lt;li&gt;We wrote a paper that will guide users in achieving PCI-DSS compliance for containers. This is intended to help organizations meet important security standards in their Kubernetes environments.&lt;/li&gt;
&lt;li&gt;We also worked on a paper highlighting how shifting security down can benefit organizations. This focuses on the advantages of implementing security measures earlier in the development and deployment process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Can you tell us what were the main objectives of the Policy Working Group and some of your key accomplishments?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The charter of the Policy WG was to help standardize policy management for Kubernetes and educate the community on best practices.&lt;/p&gt;
&lt;p&gt;To accomplish this we updated the Kubernetes documentation (&lt;a href=&#34;https://kubernetes.io/docs/concepts/policy&#34;&gt;Policies | Kubernetes&lt;/a&gt;), produced several whitepapers (&lt;a href=&#34;https://github.com/kubernetes/sig-security/blob/main/sig-security-docs/papers/policy/CNCF_Kubernetes_Policy_Management_WhitePaper_v1.pdf&#34;&gt;Kubernetes Policy Management&lt;/a&gt;, &lt;a href=&#34;https://github.com/kubernetes/sig-security/blob/main/sig-security-docs/papers/policy_grc/Kubernetes_Policy_WG_Paper_v1_101123.pdf&#34;&gt;Kubernetes GRC&lt;/a&gt;), and created the Policy Reports API (&lt;a href=&#34;https://github.com/kubernetes-retired/wg-policy-prototypes/blob/master/policy-report/docs/api-docs.md&#34;&gt;API reference&lt;/a&gt;) which standardizes reporting across various tools. Several popular tools such as Falco, Trivy, Kyverno, kube-bench, and others support the Policy Report API. A major milestone for the Policy WG was promoting the Policy Reports API to a SIG-level API or finding it a stable home.&lt;/p&gt;
&lt;p&gt;Beyond that, as &lt;a href=&#34;https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/&#34;&gt;ValidatingAdmissionPolicy&lt;/a&gt; and &lt;a href=&#34;https://kubernetes.io/docs/reference/access-authn-authz/mutating-admission-policy/&#34;&gt;MutatingAdmissionPolicy&lt;/a&gt; approached GA in Kubernetes, a key goal of the WG was to guide and educate the community on the tradeoffs and appropriate usage patterns for these built-in API objects and other CNCF policy management solutions like OPA/Gatekeeper and Kyverno.&lt;/p&gt;
&lt;h2 id=&#34;challenges&#34;&gt;Challenges&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;What were some of the major challenges that the Policy Working Group worked on?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;During our work in the Policy Working Group, we encountered several challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One of the main issues we faced was finding time to consistently contribute. Given that many of us have other professional commitments, it can be difficult to dedicate regular time to the working group&#39;s initiatives.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another challenge we experienced was related to our consensus-driven model. While this approach ensures that all voices are heard, it can sometimes lead to slower decision-making processes. We valued thorough discussion and agreement, but this can occasionally delay progress on our projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&#39;ve also encountered occasional differences of opinion among group members. These situations require careful navigation to ensure that we maintain a collaborative and productive environment while addressing diverse viewpoints.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lastly, we&#39;ve noticed that newcomers to the group may find it difficult to contribute effectively without consistent attendance at our meetings. The complex nature of our work often requires ongoing context, which can be challenging for those who aren&#39;t able to participate regularly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Can you tell me more about those challenges? How did you discover each one? What has the impact been? What were some strategies you used to address them?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are no easy answers, but having more contributors and maintainers greatly helps! Overall the CNCF community is great to work with and is very welcoming to beginners. So, if folks out there are hesitating to get involved, I highly encourage them to attend a WG or SIG meeting and just listen in.&lt;/p&gt;
&lt;p&gt;It often takes a few meetings to fully understand the discussions, so don&#39;t feel discouraged if you don&#39;t grasp everything right away. We made a point to emphasize this and encouraged new members to review documentation as a starting point for getting involved.&lt;/p&gt;
&lt;p&gt;Additionally, differences of opinion were valued and encouraged within the Policy-WG. We adhered to the CNCF core values and resolve disagreements by maintaining respect for one another. We also strove to timebox our decisions and assign clear responsibilities to keep things moving forward.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is where our discussion about the Policy Working Group ends. The working group, and especially the people who took part in this article, hope this gave you some insights into the group&#39;s aims and workings. You can get more info about Working Groups &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/committee-steering/governance/wg-governance.md&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Introducing Headlamp Plugin for Karpenter - Scaling and Visibility</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/</link>
      <pubDate>Mon, 06 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/</guid>
      <description>
        
        
        &lt;p&gt;Headlamp is an open‑source, extensible Kubernetes SIG UI project designed to let you explore, manage, and debug cluster resources.&lt;/p&gt;
&lt;p&gt;Karpenter is a Kubernetes Autoscaling SIG node provisioning project that helps clusters scale quickly and efficiently. It launches new nodes in seconds, selects appropriate instance types for workloads, and manages the full node lifecycle, including scale-down.&lt;/p&gt;
&lt;p&gt;The new Headlamp Karpenter Plugin adds real-time visibility into Karpenter’s activity directly from the Headlamp UI. It shows how Karpenter resources relate to Kubernetes objects, displays live metrics, and surfaces scaling events as they happen. You can inspect pending pods during provisioning, review scaling decisions, and edit Karpenter-managed resources with built-in validation. The Karpenter plugin was made as part of a LFX mentor project.&lt;/p&gt;
&lt;p&gt;The Karpenter plugin for Headlamp aims to make it easier for Kubernetes users and operators to understand, debug, and fine-tune autoscaling behavior in their clusters. Now we will give a brief tour of the Headlamp plugin.&lt;/p&gt;
&lt;h2 id=&#34;map-view-of-karpenter-resources-and-how-they-relate-to-kubernetes-resources&#34;&gt;Map view of Karpenter Resources and how they relate to Kubernetes resources&lt;/h2&gt;
&lt;p&gt;Easily see how Karpenter Resources like NodeClasses, NodePool and NodeClaims connect with core Kubernetes resources like Pods, Nodes etc.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Map view showing relationships between resources&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/mini-map-view.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;visualization-of-karpenter-metrics&#34;&gt;Visualization of Karpenter Metrics&lt;/h2&gt;
&lt;p&gt;Get instant insights of Resource Usage v/s Limits, Allowed disruptions, Pending Pods, Provisioning Latency and many more .&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;NodePool default metrics shown with controls to see different frequencies&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/chart-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;NodeClaim default metrics shown with controls to see different frequencies&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/chart-2.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;scaling-decisions&#34;&gt;Scaling decisions&lt;/h2&gt;
&lt;p&gt;Shows which instances are being provisioned for your workloads and understand the reason behind why Karpenter made those choices. Helpful while debugging.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Pod Placement Decisions data including reason, from, pod, message, and age&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/pod-decisions.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Node decision data including Type, Reason, Node, From, Message&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/node-decisions.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;config-editor-with-validation-support&#34;&gt;Config editor with validation support&lt;/h2&gt;
&lt;p&gt;Make live edits to Karpenter configurations. The editor includes diff previews and resource validation for safer adjustments.&lt;br&gt;
&lt;img alt=&#34;Config editor with validation support&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/config-editor.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;real-time-view-of-karpenter-resources&#34;&gt;Real time view of Karpenter resources&lt;/h2&gt;
&lt;p&gt;View and track Karpenter specific resources in real time such as “NodeClaims” as your  cluster scales up and down.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Node claims data including Name, Status, Instance Type, CPU, Zone, Age, and Actions&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/node-claims.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Node Pools data including Name, NodeClass, CPU, Memory, Nodes, Status, Age, Actions&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/nodepools.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;EC2 Node Classes data including Name, Cluster, Instance Profile, Status, IAM Role, Age, and Actions&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/nodeclass.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;dashboard-for-pending-pods&#34;&gt;Dashboard for Pending Pods&lt;/h2&gt;
&lt;p&gt;View all pending pods with unmet scheduling requirements/Failed Scheduling highlighting why they couldn&#39;t be scheduled.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Pending Pods data including Name, Namespace, Type, Reason, From, and Message&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/pending-pods.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;karpenter-providers&#34;&gt;&lt;strong&gt;Karpenter Providers&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This plugin should work with most Karpenter providers, but has only so far been tested on the ones listed in the table. Additionally, each provider gives some extra information, and the ones in the table below are displayed by the plugin.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider Name&lt;/th&gt;
&lt;th&gt;Tested&lt;/th&gt;
&lt;th&gt;Extra provider specific info supported&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/aws/karpenter-provider-aws&#34;&gt;AWS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/Azure/karpenter-provider-azure&#34;&gt;Azure&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/cloudpilot-ai/karpenter-provider-alibabacloud&#34;&gt;AlibabaCloud&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/bizflycloud/karpenter-provider-bizflycloud&#34;&gt;Bizfly Cloud&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/kubernetes-sigs/karpenter-provider-cluster-api&#34;&gt;Cluster API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/cloudpilot-ai/karpenter-provider-gcp&#34;&gt;GCP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/sergelogvinov/karpenter-provider-proxmox&#34;&gt;Proxmox&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/zoom/karpenter-oci&#34;&gt;Oracle Cloud Infrastructure (OCI)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Please &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/issues&#34;&gt;submit an issue&lt;/a&gt; if you test one of the untested providers or if you want support for this provider (PRs also gladly accepted).&lt;/p&gt;
&lt;h2 id=&#34;how-to-use&#34;&gt;How to use&lt;/h2&gt;
&lt;p&gt;Please see the &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/karpenter&#34;&gt;plugins/karpenter/README.md&lt;/a&gt; for instructions on how to use.&lt;/p&gt;
&lt;h2 id=&#34;feedback-and-questions&#34;&gt;Feedback and Questions&lt;/h2&gt;
&lt;p&gt;Please &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/issues&#34;&gt;submit an issue&lt;/a&gt; if you use Karpenter and have any other ideas or feedback. Or come to the &lt;a href=&#34;https://kubernetes.slack.com/?redir=%2Fmessages%2Fheadlamp&#34;&gt;Kubernetes slack headlamp channel&lt;/a&gt; for a chat.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Announcing Changed Block Tracking API support (alpha)</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/25/csi-changed-block-tracking/</link>
      <pubDate>Thu, 25 Sep 2025 05:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/25/csi-changed-block-tracking/</guid>
      <description>
        
        
        &lt;p&gt;We&#39;re excited to announce the alpha support for a &lt;em&gt;changed block tracking&lt;/em&gt; mechanism. This enhances
the Kubernetes storage ecosystem by providing an efficient way for
&lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/volumes/#csi&#34;&gt;CSI&lt;/a&gt; storage drivers to identify changed
blocks in PersistentVolume snapshots. With a driver that can use the feature, you could benefit
from faster and more resource-efficient backup operations.&lt;/p&gt;
&lt;p&gt;If you&#39;re eager to try this feature, you can &lt;a href=&#34;#getting-started&#34;&gt;skip to the Getting Started section&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-is-changed-block-tracking&#34;&gt;What is changed block tracking?&lt;/h2&gt;
&lt;p&gt;Changed block tracking enables storage systems to identify and track modifications at the block level
between snapshots, eliminating the need to scan entire volumes during backup operations. The
improvement is a change to the Container Storage Interface (CSI), and also to the storage support
in Kubernetes itself.
With the alpha feature enabled, your cluster can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identify allocated blocks within a CSI volume snapshot&lt;/li&gt;
&lt;li&gt;Determine changed blocks between two snapshots of the same volume&lt;/li&gt;
&lt;li&gt;Streamline backup operations by focusing only on changed data blocks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For Kubernetes users managing large datasets, this API enables significantly more efficient
backup processes. Backup applications can now focus only on the blocks that have changed,
rather than processing entire volumes.&lt;/p&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Note:&lt;/h4&gt;As of now, the Changed Block Tracking API is supported only for block volumes and not for
file volumes. CSI drivers that manage file-based storage systems will not be able to
implement this capability.&lt;/div&gt;

&lt;h2 id=&#34;benefits-of-changed-block-tracking-support-in-kubernetes&#34;&gt;Benefits of changed block tracking support in Kubernetes&lt;/h2&gt;
&lt;p&gt;As Kubernetes adoption grows for stateful workloads managing critical data, the need for efficient
backup solutions becomes increasingly important. Traditional full backup approaches face challenges with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Long backup windows&lt;/em&gt;: Full volume backups can take hours for large datasets, making it difficult
to complete within maintenance windows.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;High resource utilization&lt;/em&gt;: Backup operations consume substantial network bandwidth and I/O
resources, especially for large data volumes and data-intensive applications.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Increased storage costs&lt;/em&gt;: Repetitive full backups store redundant data, causing storage
requirements to grow linearly even when only a small percentage of data actually changes between
backups.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Changed Block Tracking API addresses these challenges by providing native Kubernetes support for
incremental backup capabilities through the CSI interface.&lt;/p&gt;
&lt;h2 id=&#34;key-components&#34;&gt;Key components&lt;/h2&gt;
&lt;p&gt;The implementation consists of three primary components:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;CSI SnapshotMetadata Service API&lt;/em&gt;: An API, offered by gRPC, that provides volume
snapshot and changed block data.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;SnapshotMetadataService API&lt;/em&gt;: A Kubernetes CustomResourceDefinition (CRD) that
advertises CSI driver metadata service availability and connection details to
cluster clients.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;External Snapshot Metadata Sidecar&lt;/em&gt;: An intermediary component that connects CSI
drivers to backup applications via a standardized gRPC interface.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;implementation-requirements&#34;&gt;Implementation requirements&lt;/h2&gt;
&lt;h3 id=&#34;storage-provider-responsibilities&#34;&gt;Storage provider responsibilities&lt;/h3&gt;
&lt;p&gt;If you&#39;re an author of a storage integration with Kubernetes and want to support the changed block tracking feature, you must implement specific requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Implement CSI RPCs&lt;/em&gt;: Storage providers need to implement the &lt;code&gt;SnapshotMetadata&lt;/code&gt; service as defined in the &lt;a href=&#34;https://github.com/container-storage-interface/spec/blob/master/csi.proto&#34;&gt;CSI specifications protobuf&lt;/a&gt;. This service requires server-side streaming implementations for the following RPCs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetMetadataAllocated&lt;/code&gt;: For identifying allocated blocks in a snapshot&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetMetadataDelta&lt;/code&gt;: For determining changed blocks between two snapshots&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Storage backend capabilities&lt;/em&gt;: Ensure the storage backend has the capability to track and report block-level changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Deploy external components&lt;/em&gt;: Integrate with the &lt;code&gt;external-snapshot-metadata&lt;/code&gt; sidecar to expose the snapshot metadata service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Register custom resource&lt;/em&gt;: Register the &lt;code&gt;SnapshotMetadataService&lt;/code&gt; resource using a CustomResourceDefinition and create a &lt;code&gt;SnapshotMetadataService&lt;/code&gt; custom resource that advertises the availability of the metadata service and provides connection details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Support error handling&lt;/em&gt;: Implement proper error handling for these RPCs according to the CSI specification requirements.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;backup-solution-responsibilities&#34;&gt;Backup solution responsibilities&lt;/h3&gt;
&lt;p&gt;A backup solution looking to leverage this feature must:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Set up authentication&lt;/em&gt;: The backup application must provide a Kubernetes ServiceAccount token when using the
&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3314-csi-changed-block-tracking#the-kubernetes-snapshotmetadata-service-api&#34;&gt;Kubernetes SnapshotMetadataService API&lt;/a&gt;.
Appropriate access grants, such as RBAC RoleBindings, must be established to authorize the backup application
ServiceAccount to obtain such tokens.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Implement streaming client-side code&lt;/em&gt;: Develop clients that implement the streaming gRPC APIs defined in the
&lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshot-metadata/blob/main/proto/schema.proto&#34;&gt;schema.proto&lt;/a&gt; file.
Specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement streaming client code for &lt;code&gt;GetMetadataAllocated&lt;/code&gt; and &lt;code&gt;GetMetadataDelta&lt;/code&gt; methods&lt;/li&gt;
&lt;li&gt;Handle server-side streaming responses efficiently as the metadata comes in chunks&lt;/li&gt;
&lt;li&gt;Process the &lt;code&gt;SnapshotMetadataResponse&lt;/code&gt; message format with proper error handling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;external-snapshot-metadata&lt;/code&gt; GitHub repository provides a convenient
&lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshot-metadata/tree/master/pkg/iterator&#34;&gt;iterator&lt;/a&gt;
support package to simplify client implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Handle large dataset streaming&lt;/em&gt;: Design clients to efficiently handle large streams of block metadata that
could be returned for volumes with significant changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Optimize backup processes&lt;/em&gt;: Modify backup workflows to use the changed block metadata to identify and only
transfer changed blocks to make backups more efficient, reducing both backup duration and resource consumption.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting started&lt;/h2&gt;
&lt;p&gt;To use changed block tracking in your cluster:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ensure your CSI driver supports volume snapshots and implements the snapshot metadata capabilities with the required &lt;code&gt;external-snapshot-metadata&lt;/code&gt; sidecar&lt;/li&gt;
&lt;li&gt;Make sure the SnapshotMetadataService custom resource is registered using CRD&lt;/li&gt;
&lt;li&gt;Verify the presence of a SnapshotMetadataService custom resource for your CSI driver&lt;/li&gt;
&lt;li&gt;Create clients that can access the API using appropriate authentication (via Kubernetes ServiceAccount tokens)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The API provides two main functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetMetadataAllocated&lt;/code&gt;: Lists blocks allocated in a single snapshot&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetMetadataDelta&lt;/code&gt;: Lists blocks changed between two snapshots&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;Depending on feedback and adoption, the Kubernetes developers hope to push the CSI Snapshot Metadata implementation to Beta in the future releases.&lt;/p&gt;
&lt;h2 id=&#34;where-can-i-learn-more&#34;&gt;Where can I learn more?&lt;/h2&gt;
&lt;p&gt;For those interested in trying out this new feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Official Kubernetes CSI Developer &lt;a href=&#34;https://kubernetes-csi.github.io/docs/external-snapshot-metadata.html&#34;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3314-csi-changed-block-tracking&#34;&gt;enhancement proposal&lt;/a&gt; for the snapshot metadata feature.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshot-metadata&#34;&gt;GitHub repository&lt;/a&gt; for implementation and release status of &lt;code&gt;external-snapshot-metadata&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Complete gRPC protocol definitions for snapshot metadata API: &lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshot-metadata/blob/main/proto/schema.proto&#34;&gt;schema.proto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Example snapshot metadata client implementation: &lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshot-metadata/tree/main/examples/snapshot-metadata-lister&#34;&gt;snapshot-metadata-lister&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;End-to-end example with csi-hostpath-driver: &lt;a href=&#34;https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/docs/example-ephemeral.md&#34;&gt;example documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;How do I get involved?&lt;/h2&gt;
&lt;p&gt;This project, like all of Kubernetes, is the result of hard work by many contributors from diverse backgrounds working together.
On behalf of SIG Storage, I would like to offer a huge thank you to the contributors who helped review the design and implementation of the project, including but not limited to the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ben Swartzlander (&lt;a href=&#34;https://github.com/bswartz&#34;&gt;bswartz&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Carl Braganza (&lt;a href=&#34;https://github.com/carlbraganza&#34;&gt;carlbraganza&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Daniil Fedotov (&lt;a href=&#34;https://github.com/hairyhum&#34;&gt;hairyhum&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Ivan Sim (&lt;a href=&#34;https://github.com/ihcsim&#34;&gt;ihcsim&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Nikhil Ladha (&lt;a href=&#34;https://github.com/Nikhil-Ladha&#34;&gt;Nikhil-Ladha&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Prasad Ghangal (&lt;a href=&#34;https://github.com/PrasadG193&#34;&gt;PrasadG193&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Praveen M (&lt;a href=&#34;https://github.com/iPraveenParihar&#34;&gt;iPraveenParihar&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Rakshith R (&lt;a href=&#34;https://github.com/Rakshith-R&#34;&gt;Rakshith-R&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Xing Yang (&lt;a href=&#34;https://github.com/xing-yang&#34;&gt;xing-yang&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank also to everyone who has contributed to the project, including others who helped review the
&lt;a href=&#34;https://github.com/kubernetes/enhancements/pull/4082&#34;&gt;KEP&lt;/a&gt; and the
&lt;a href=&#34;https://github.com/container-storage-interface/spec/pull/551&#34;&gt;CSI spec PR&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For those interested in getting involved with the design and development of CSI or any part of the Kubernetes Storage system,
join the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;Kubernetes Storage Special Interest Group&lt;/a&gt; (SIG).
We always welcome new contributors.&lt;/p&gt;
&lt;p&gt;The SIG also holds regular &lt;a href=&#34;https://docs.google.com/document/d/15tLCV3csvjHbKb16DVk-mfUmFry_Rlwo-2uG6KNGsfw/edit&#34;&gt;Data Protection Working Group meetings&lt;/a&gt;.
New attendees are welcome to join our discussions.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Pod Level Resources Graduated to Beta</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/22/kubernetes-v1-34-pod-level-resources/</link>
      <pubDate>Mon, 22 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/22/kubernetes-v1-34-pod-level-resources/</guid>
      <description>
        
        
        &lt;p&gt;On behalf of the Kubernetes community, I am thrilled to announce that the Pod Level Resources feature has graduated to Beta in the Kubernetes v1.34 release and is enabled by default! This significant milestone introduces a new layer of flexibility for defining and managing resource allocation for your Pods. This flexibility stems from the ability to specify CPU and memory resources for the Pod as a whole. Pod level resources can be combined with the container-level specifications to express the exact resource requirements and limits your application needs.&lt;/p&gt;
&lt;h2 id=&#34;pod-level-specification-for-resources&#34;&gt;Pod-level specification for resources&lt;/h2&gt;
&lt;p&gt;Until recently, resource specifications that applied to Pods were primarily defined
at the individual container level. While effective, this approach sometimes required
duplicating or meticulously calculating resource needs across multiple containers
within a single Pod. As a beta feature, Kubernetes allows you to specify the CPU,
memory and hugepages resources at the Pod-level. This means you can now define
resource requests and limits for an entire Pod, enabling easier resource sharing
without requiring granular, per-container management of these resources where
it&#39;s not needed.&lt;/p&gt;
&lt;h2 id=&#34;why-does-pod-level-specification-matter&#34;&gt;Why does Pod-level specification matter?&lt;/h2&gt;
&lt;p&gt;This feature enhances resource management in Kubernetes by offering &lt;em&gt;flexible resource management&lt;/em&gt; at both the Pod and container levels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It provides a consolidated approach to resource declaration, reducing the need for
meticulous, per-container management, especially for Pods with multiple
containers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pod-level resources enable containers within a pod to share unused resoures
amongst themselves, promoting efficient utilization within the pod. For example,
it prevents sidecar containers from becoming performance bottlenecks. Previously,
a sidecar (e.g., a logging agent or service mesh proxy) hitting its individual CPU
limit could be throttled and slow down the entire Pod, even if the main
application container had plenty of spare CPU. With pod-level resources, the
sidecar and the main container can share Pod&#39;s resource budget, ensuring smooth
operation during traffic spikes - either the whole Pod is throttled or all
containers work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When both pod-level and container-level resources are specified, pod-level
requests and limits take precedence. This gives you – and cluster administrators -
a powerful way to enforce overall resource boundaries for your Pods.&lt;/p&gt;
&lt;p&gt;For scheduling, if a pod-level request is explicitly defined, the scheduler uses
that specific value to find a suitable node, insteaf of the aggregated requests of
the individual containers. At runtime, the pod-level limit acts as a hard ceiling
for the combined resource usage of all containers. Crucially, this pod-level limit
is the absolute enforcer; even if the sum of the individual container limits is
higher, the total resource consumption can never exceed the pod-level limit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pod-level resources are &lt;strong&gt;prioritized&lt;/strong&gt; in influencing the Quality of Service (QoS) class of the Pod.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For Pods running on Linux nodes, the Out-Of-Memory (OOM) score adjustment
calculation considers both pod-level and container-level resources requests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pod-level resources are &lt;strong&gt;designed to be compatible with existing Kubernetes functionalities&lt;/strong&gt;, ensuring a smooth integration into your workflows.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-to-specify-resources-for-an-entire-pod&#34;&gt;How to specify resources for an entire Pod&lt;/h2&gt;
&lt;p&gt;Using &lt;code&gt;PodLevelResources&lt;/code&gt; &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;feature
gate&lt;/a&gt; requires
Kubernetes v1.34 or newer for all cluster components, including the control plane
and every node. This feature gate is in beta and enabled by default in v1.34.&lt;/p&gt;
&lt;h3 id=&#34;example-manifest&#34;&gt;Example manifest&lt;/h3&gt;
&lt;p&gt;You can specify CPU, memory and hugepages resources directly in the Pod spec manifest at the &lt;code&gt;resources&lt;/code&gt; field for the entire Pod.&lt;/p&gt;
&lt;p&gt;Here’s an example demonstrating a Pod with both CPU and memory requests and limits
defined at the Pod level:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;pod-resources-demo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;pod-resources-example&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# The &amp;#39;resources&amp;#39; field at the Pod specification level defines the overall&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# resource budget for all containers within this Pod combined.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Pod-level resources&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# &amp;#39;limits&amp;#39; specifies the maximum amount of resources the Pod is allowed to use.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# The sum of the limits of all containers in the Pod cannot exceed these values.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;limits&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# The entire Pod cannot use more than 1 CPU core.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;200Mi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# The entire Pod cannot use more than 200 MiB of memory.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# &amp;#39;requests&amp;#39; specifies the minimum amount of resources guaranteed to the Pod.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# This value is used by the Kubernetes scheduler to find a node with enough capacity.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# The Pod is guaranteed 1 CPU core when scheduled.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;100Mi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# The Pod is guaranteed 100 MiB of memory when scheduled.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;main-app-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;nginx&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;...&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# This container has no resource requests or limits specified.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;auxiliary-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;fedora&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;sleep&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;inf&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;...&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# This container has no resource requests or limits specified.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example, the &lt;code&gt;pod-resources-demo&lt;/code&gt; Pod as a whole requests 1 CPU and 100 MiB of memory, and is limited to 1 CPU and 200 MiB of memory. The containers within will operate under these overall Pod-level constraints, as explained in the next section.&lt;/p&gt;
&lt;h3 id=&#34;interaction-with-container-level-resource-requests-or-limits&#34;&gt;Interaction with container-level resource requests or limits&lt;/h3&gt;
&lt;p&gt;When both pod-level and container-level resources are specified, &lt;strong&gt;pod-level requests and limits take precedence&lt;/strong&gt;. This means the node allocates resources based on the pod-level specifications.&lt;/p&gt;
&lt;p&gt;Consider a Pod with two containers where pod-level CPU and memory requests and
limits are defined, and only one container has its own explicit resource
definitions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;pod-resources-demo&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;pod-resources-example&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;limits&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;200Mi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;100Mi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;main-app-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;nginx&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpu&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;0.5&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;50Mi&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;auxiliary-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;fedora&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;sleep&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;inf&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# This container has no resource requests or limits specified.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pod-Level Limits: The pod-level limits (cpu: &amp;quot;1&amp;quot;, memory: &amp;quot;200Mi&amp;quot;) establish an absolute boundary for the entire Pod. The sum of resources consumed by all its containers is enforced at this ceiling and cannot be surpassed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Resource Sharing and Bursting: Containers can dynamically borrow any unused capacity, allowing them to burst as needed, so long as the Pod&#39;s aggregate usage stays within the overall limit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pod-Level Requests: The pod-level requests (cpu: &amp;quot;1&amp;quot;, memory: &amp;quot;100Mi&amp;quot;) serve as the foundational resource guarantee for the entire Pod. This value informs the scheduler&#39;s placement decision and represents the minimum resources the Pod can rely on during node-level contention.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Container-Level Requests: Container-level requests create a priority system within
the Pod&#39;s guaranteed budget. Because main-app-container has an explicit request
(cpu: &amp;quot;0.5&amp;quot;, memory: &amp;quot;50Mi&amp;quot;), it is given precedence for its share of resources
under resource pressure over the auxiliary-container, which has no
such explicit claim.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;limitations&#34;&gt;Limitations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;First of all, &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/pods/#pod-update-and-replacement&#34;&gt;in-place
resize&lt;/a&gt; of pod-level
resources is &lt;strong&gt;not supported&lt;/strong&gt; for Kubernetes v1.34 (or earlier). Attempting to
modify the &lt;em&gt;pod-level&lt;/em&gt; resource limits or requests on a running Pod results in an
error: the resize is rejected. The v1.34 implementation of Pod level resources
focuses on allowing initial declaration of an overall resource envelope, that
applies to the &lt;strong&gt;entire Pod&lt;/strong&gt;. That is distinct from in-place pod resize, which
(despite what the name might suggest) allows you
to make dynamic adjustments to &lt;em&gt;container&lt;/em&gt; resource
requests and limits, within a &lt;em&gt;running&lt;/em&gt; Pod,
and potentially without a container restart. In-place resizing is also not yet a
stable feature; it graduated to Beta in the v1.33 release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Only CPU, memory, and hugepages resources can be specified at pod-level.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pod-level resources are not supported for Windows pods. If the Pod specification
explicitly targets Windows (e.g., by setting spec.os.name: &amp;quot;windows&amp;quot;), the API
server will reject the Pod during the validation step. If the Pod is not explicitly
marked for Windows but is scheduled to a Windows node (e.g., via a nodeSelector),
the Kubelet on that Windows node will reject the Pod during its admission process.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Topology Manager, Memory Manager and CPU Manager do not
align pods and containers based on pod-level resources as these resource managers
don&#39;t currently support pod-level resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;getting-started-and-providing-feedback&#34;&gt;Getting started and providing feedback&lt;/h4&gt;
&lt;p&gt;Ready to explore &lt;em&gt;Pod Level Resources&lt;/em&gt; feature? You&#39;ll need a Kubernetes cluster running version 1.34 or later. Remember to enable the &lt;code&gt;PodLevelResources&lt;/code&gt; &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;feature gate&lt;/a&gt; across your control plane and all nodes.&lt;/p&gt;
&lt;p&gt;As this feature moves through Beta, your feedback is invaluable. Please report any issues or share your experiences via the standard Kubernetes communication channels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34;&gt;Mailing list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/labels/sig%2Fnode&#34;&gt;Open Community Issues/PRs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Recovery From Volume Expansion Failure (GA)</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/19/kubernetes-v1-34-recover-expansion-failure/</link>
      <pubDate>Fri, 19 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/19/kubernetes-v1-34-recover-expansion-failure/</guid>
      <description>
        
        
        &lt;p&gt;Have you ever made a typo when expanding your persistent volumes in Kubernetes? Meant to specify &lt;code&gt;2TB&lt;/code&gt;
but specified &lt;code&gt;20TiB&lt;/code&gt;? This seemingly innocuous problem was kinda hard to fix - and took the project almost 5 years to fix.
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/storage/persistent-volumes/#recovering-from-failure-when-expanding-volumes&#34;&gt;Automated recovery from storage expansion&lt;/a&gt; has been around for a while in beta; however, with the v1.34 release, we have graduated this to
&lt;strong&gt;general availability&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;While it was always possible to recover from failing volume expansions manually, it usually required cluster-admin access and was tedious to do (See aformentioned link for more information).&lt;/p&gt;
&lt;p&gt;What if you make a mistake and then realize immediately?
With Kubernetes v1.34, you should be able to reduce the requested size of the PersistentVolumeClaim (PVC) and, as long as the expansion to previously requested
size hadn&#39;t finished, you can amend the size requested. Kubernetes will
automatically work to correct it. Any quota consumed by failed expansion will be returned to the user and the associated PersistentVolume should be resized to the
latest size you specified.&lt;/p&gt;
&lt;p&gt;I&#39;ll walk through an example of how all of this works.&lt;/p&gt;
&lt;h2 id=&#34;reducing-pvc-size-to-recover-from-failed-expansion&#34;&gt;Reducing PVC size to recover from failed expansion&lt;/h2&gt;
&lt;p&gt;Imagine that you are running out of disk space for one of your database servers, and you want to expand the PVC from previously
specified &lt;code&gt;10TB&lt;/code&gt; to &lt;code&gt;100TB&lt;/code&gt; - but you make a typo and specify &lt;code&gt;1000TB&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;PersistentVolumeClaim&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;myclaim&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;accessModes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- ReadWriteOnce&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;storage&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;1000TB&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# newly specified size - but incorrect!&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, you may be out of disk space on your disk array or simply ran out of allocated quota on your cloud-provider. But, assume that expansion to &lt;code&gt;1000TB&lt;/code&gt; is never going to succeed.&lt;/p&gt;
&lt;p&gt;In Kubernetes v1.34, you can simply correct your mistake and request a new PVC size,
that is smaller than the mistake, provided it is still larger than the original size
of the actual PersistentVolume.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;PersistentVolumeClaim&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;myclaim&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;accessModes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- ReadWriteOnce&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;storage&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;100TB&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Corrected size; has to be greater than 10TB.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;                     &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# You cannot shrink the volume below its actual size.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This requires no admin intervention. Even better, any surplus Kubernetes quota that you temporarily consumed will be automatically returned.&lt;/p&gt;
&lt;p&gt;This fault recovery mechanism does have a caveat: whatever new size you specify for the PVC, it &lt;strong&gt;must&lt;/strong&gt; be still higher than the original size in &lt;code&gt;.status.capacity&lt;/code&gt;.
Since Kubernetes doesn&#39;t support shrinking your PV objects, you can never go below the size that was originally allocated for your PVC request.&lt;/p&gt;
&lt;h2 id=&#34;improved-error-handling-and-observability-of-volume-expansion&#34;&gt;Improved error handling and observability of volume expansion&lt;/h2&gt;
&lt;p&gt;Implementing what might look like a relatively minor change also required us to almost
fully redo how volume expansion works under the hood in Kubernetes.
There are new API fields available in PVC objects which you can monitor to observe progress of volume expansion.&lt;/p&gt;
&lt;h3 id=&#34;improved-observability-of-in-progress-expansion&#34;&gt;Improved observability of in-progress expansion&lt;/h3&gt;
&lt;p&gt;You can query &lt;code&gt;.status.allocatedResourceStatus[&#39;storage&#39;]&lt;/code&gt; of a PVC to monitor progress of a volume expansion operation.
For a typical block volume, this should transition between &lt;code&gt;ControllerResizeInProgress&lt;/code&gt;, &lt;code&gt;NodeResizePending&lt;/code&gt; and &lt;code&gt;NodeResizeInProgress&lt;/code&gt; and become nil/empty when volume expansion has finished.&lt;/p&gt;
&lt;p&gt;If for some reason, volume expansion to requested size is not feasible it should accordingly be in states like - &lt;code&gt;ControllerResizeInfeasible&lt;/code&gt; or &lt;code&gt;NodeResizeInfeasible&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can also observe size towards which Kubernetes is working by watching &lt;code&gt;pvc.status.allocatedResources&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;improved-error-handling-and-reporting&#34;&gt;Improved error handling and reporting&lt;/h3&gt;
&lt;p&gt;Kubernetes should now retry your failed volume expansions at slower rate, it should make fewer requests to both storage system and Kubernetes apiserver.&lt;/p&gt;
&lt;p&gt;Errors observerd during volume expansion are now reported as condition on PVC objects and should persist unlike events. Kubernetes will now populate &lt;code&gt;pvc.status.conditions&lt;/code&gt; with error keys &lt;code&gt;ControllerResizeError&lt;/code&gt; or &lt;code&gt;NodeResizeError&lt;/code&gt; when volume expansion fails.&lt;/p&gt;
&lt;h3 id=&#34;fixes-long-standing-bugs-in-resizing-workflows&#34;&gt;Fixes long standing bugs in resizing workflows&lt;/h3&gt;
&lt;p&gt;This feature also has allowed us to fix long standing bugs in resizing workflow such as &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/115294&#34;&gt;Kubernetes issue #115294&lt;/a&gt;.
If you observe anything broken, please report your bugs to &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/new/choose&#34;&gt;https://github.com/kubernetes/kubernetes/issues&lt;/a&gt;, along with details about how to reproduce the problem.&lt;/p&gt;
&lt;p&gt;Working on this feature through its lifecycle was challenging and it wouldn&#39;t have been possible to reach GA
without feedback from &lt;a href=&#34;https://github.com/msau42&#34;&gt;@msau42&lt;/a&gt;, &lt;a href=&#34;https://github.com/jsafrane&#34;&gt;@jsafrane&lt;/a&gt; and &lt;a href=&#34;https://github.com/xing-yang&#34;&gt;@xing-yang&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All of the contributors who worked on this also appreciate the input provided by &lt;a href=&#34;https://github.com/thockin&#34;&gt;@thockin&lt;/a&gt; and &lt;a href=&#34;https://github.comliggitt&#34;&gt;@liggitt&lt;/a&gt; at various Kubernetes contributor summits.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: DRA Consumable Capacity</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/18/kubernetes-v1-34-dra-consumable-capacity/</link>
      <pubDate>Thu, 18 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/18/kubernetes-v1-34-dra-consumable-capacity/</guid>
      <description>
        
        
        &lt;p&gt;Dynamic Resource Allocation (DRA) is a Kubernetes API for managing scarce resources across Pods and containers.
It enables flexible resource requests, going beyond simply allocating &lt;em&gt;N&lt;/em&gt; number of devices to support more granular usage scenarios.
With DRA, users can request specific types of devices based on their attributes, define custom configurations tailored to their workloads, and even share the same resource among multiple containers or Pods.&lt;/p&gt;
&lt;p&gt;In this blog, we focus on the device sharing feature and dive into a new capability introduced in Kubernetes 1.34: &lt;em&gt;DRA consumable capacity&lt;/em&gt;,
which extends DRA to support finer-grained device sharing.&lt;/p&gt;
&lt;h2 id=&#34;background-device-sharing-via-resourceclaims&#34;&gt;Background: device sharing via ResourceClaims&lt;/h2&gt;
&lt;p&gt;From the beginning, DRA introduced the ability for multiple Pods to share a device by referencing the same ResourceClaim.
This design decouples resource allocation from specific hardware, allowing for more dynamic and reusable provisioning of devices.&lt;/p&gt;
&lt;p&gt;In Kubernetes 1.33, the new support for &lt;em&gt;partitionable devices&lt;/em&gt; allowed resource drivers to advertise slices of a device that are available, rather than exposing the entire device as an all-or-nothing resource.
This enabled Kubernetes to model shareable hardware more accurately.&lt;/p&gt;
&lt;p&gt;But there was still a missing piece: it didn&#39;t yet support scenarios
where the device driver manages fine-grained, dynamic portions of a device resource — like network bandwidth — based on user demand,
or to share those resources independently of ResourceClaims, which are restricted by their spec and namespace.&lt;/p&gt;
&lt;p&gt;That’s where &lt;em&gt;consumable capacity&lt;/em&gt; for DRA comes in.&lt;/p&gt;
&lt;h2 id=&#34;benefits-of-dra-consumable-capacity-support&#34;&gt;Benefits of DRA consumable capacity support&lt;/h2&gt;
&lt;p&gt;Here&#39;s a taste of what you get in a cluster with the &lt;code&gt;DRAConsumableCapacity&lt;/code&gt;
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;feature gate&lt;/a&gt; enabled.&lt;/p&gt;
&lt;h3 id=&#34;device-sharing-across-multiple-resourceclaims-or-devicerequests&#34;&gt;Device sharing across multiple ResourceClaims or DeviceRequests&lt;/h3&gt;
&lt;p&gt;Resource drivers can now support sharing the same device — or even a slice of a device — across multiple ResourceClaims or across multiple DeviceRequests.&lt;/p&gt;
&lt;p&gt;This means that Pods from different namespaces can simultaneously share the same device,
if permitted and supported by the specific DRA driver.&lt;/p&gt;
&lt;h3 id=&#34;device-resource-allocation&#34;&gt;Device resource allocation&lt;/h3&gt;
&lt;p&gt;Kubernetes extends the allocation algorithm in the scheduler to support allocating a portion of a device&#39;s resources, as defined in the &lt;code&gt;capacity&lt;/code&gt; field.
The scheduler ensures that the total allocated capacity across all consumers never exceeds the device’s total capacity, even when shared across multiple ResourceClaims or DeviceRequests.
This is very similar to the way the scheduler allows Pods and containers to share allocatable resources on Nodes;
in this case, it allows them to share allocatable (consumable) resources on Devices.&lt;/p&gt;
&lt;p&gt;This feature expands support for scenarios where the device driver is able to manage resources &lt;strong&gt;within&lt;/strong&gt; a device and on a per-process basis — for example,
allocating a specific amount of memory (e.g., 8 GiB) from a virtual GPU,
or setting bandwidth limits on virtual network interfaces allocated to specific Pods. This aims to provide safe and efficient resource sharing.&lt;/p&gt;
&lt;h3 id=&#34;distinctattribute-constraint&#34;&gt;DistinctAttribute constraint&lt;/h3&gt;
&lt;p&gt;This feature also introduces a new constraint: &lt;code&gt;DistinctAttribute&lt;/code&gt;, which is the complement of the existing  &lt;code&gt;MatchAttribute&lt;/code&gt; constraint.&lt;/p&gt;
&lt;p&gt;The primary goal of &lt;code&gt;DistinctAttribute&lt;/code&gt; is to prevent the same underlying device from being allocated multiple times within a single ResourceClaim, which could happen since we are allocating shares (or subsets) of devices.
This constraint ensures that each allocation refers to a distinct resource, even if they belong to the same device class.&lt;/p&gt;
&lt;p&gt;It is useful for use cases such as allocating network devices connecting to different subnets to expand coverage or provide redundancy across failure domains.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-consumable-capacity&#34;&gt;How to use consumable capacity?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DRAConsumableCapacity&lt;/code&gt; is introduced as an alpha feature in Kubernetes 1.34. The &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;feature gate&lt;/a&gt; &lt;code&gt;DRAConsumableCapacity&lt;/code&gt; must be enabled in kubelet, kube-apiserver, kube-scheduler and kube-controller-manager.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--feature-gates&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;...,DRAConsumableCapacity&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#a2f&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;as-a-dra-driver-developer&#34;&gt;As a DRA driver developer&lt;/h3&gt;
&lt;p&gt;As a DRA driver developer writing in Golang, you can make a device within a ResourceSlice allocatable to multiple ResourceClaims (or &lt;code&gt;devices.requests&lt;/code&gt;) by setting &lt;code&gt;AllowMultipleAllocations&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Device {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#666&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  AllowMultipleAllocations: ptr.&lt;span style=&#34;color:#00a000&#34;&gt;To&lt;/span&gt;(&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#666&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Additionally, you can define a policy to restrict how each device&#39;s &lt;code&gt;Capacity&lt;/code&gt; should be consumed by each &lt;code&gt;DeviceRequest&lt;/code&gt; by defining &lt;code&gt;RequestPolicy&lt;/code&gt; field in the &lt;code&gt;DeviceCapacity&lt;/code&gt;.
The example below shows how to define a policy that requires a GPU with 40 GiB of memory to allocate at least 5 GiB per request, with each allocation in multiples of 5 GiB.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DeviceCapacity{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Value: resource.&lt;span style=&#34;color:#00a000&#34;&gt;MustParse&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;40Gi&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  RequestPolicy: &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;CapacityRequestPolicy{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Default: ptr.&lt;span style=&#34;color:#00a000&#34;&gt;To&lt;/span&gt;(resource.&lt;span style=&#34;color:#00a000&#34;&gt;MustParse&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;5Gi&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ValidRange: &lt;span style=&#34;color:#666&#34;&gt;&amp;amp;&lt;/span&gt;CapacityRequestPolicyRange {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Min: ptr.&lt;span style=&#34;color:#00a000&#34;&gt;To&lt;/span&gt;(resource.&lt;span style=&#34;color:#00a000&#34;&gt;MustParse&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;5Gi&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Step: ptr.&lt;span style=&#34;color:#00a000&#34;&gt;To&lt;/span&gt;(resource.&lt;span style=&#34;color:#00a000&#34;&gt;MustParse&lt;/span&gt;(&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;5Gi&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will be published to the ResourceSlice, as partially shown below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;resource.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ResourceSlice&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;devices&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gpu0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;allowMultipleAllocations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;capacity&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;value&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;40Gi&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requestPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;5Gi&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;validRange&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;min&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;5Gi&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;step&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;5Gi&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;An allocated device with a specified portion of consumed capacity will have a &lt;code&gt;ShareID&lt;/code&gt; field set in the allocation status.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;claim.Status.Allocation.Devices.Results[i].ShareID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This &lt;code&gt;ShareID&lt;/code&gt; allows the driver to distinguish between different allocations that refer to the &lt;strong&gt;same device or same statically-partitioned slice&lt;/strong&gt; but come from &lt;strong&gt;different &lt;code&gt;ResourceClaim&lt;/code&gt; requests&lt;/strong&gt;.&lt;br&gt;
It acts as a unique identifier for each shared slice, enabling the driver to manage and enforce resource limits independently across multiple consumers.&lt;/p&gt;
&lt;h3 id=&#34;as-a-consumer&#34;&gt;As a consumer&lt;/h3&gt;
&lt;p&gt;As a consumer (or user), the device resource can be requested with a ResourceClaim like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;resource.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ResourceClaim&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;devices&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# for devices&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;req0&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;exactly&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;deviceClassName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;resource.example.com&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;capacity&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requests&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# for resources which must be provided by those devices&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;            &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;memory&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;10Gi&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This configuration ensures that the requested device can provide at least 10GiB of &lt;code&gt;memory&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Notably that &lt;strong&gt;any&lt;/strong&gt; &lt;code&gt;resource.example.com&lt;/code&gt; device that has at least 10GiB of memory can be allocated.
If a device that does not support multiple allocations is chosen, the allocation would consume the entire device.
To filter only devices that support multiple allocations, you can define a selector like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;selectors&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cel&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;expression&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;|-&lt;span style=&#34;color:#b44;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#b44;font-style:italic&#34;&gt;        device.allowMultipleAllocations == true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;integration-with-dra-device-status&#34;&gt;Integration with DRA device status&lt;/h2&gt;
&lt;p&gt;In device sharing, general device information is provided through the resource slice.
However, some details are set dynamically after allocation.
These can be conveyed using the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceclaim-device-status&#34;&gt;&lt;code&gt;.status.devices&lt;/code&gt;&lt;/a&gt; field of a ResourceClaim.
That field is only published in clusters where the &lt;code&gt;DRAResourceClaimDeviceStatus&lt;/code&gt;
feature gate is enabled.&lt;/p&gt;
&lt;p&gt;If you do have &lt;em&gt;device status&lt;/em&gt; support available, a driver can expose additional device-specific information beyond the &lt;code&gt;ShareID&lt;/code&gt;.
One particularly useful use case is for virtual networks, where a driver can include the assigned IP address(es) in the status.
This is valuable for both network service operations and troubleshooting.&lt;/p&gt;
&lt;p&gt;You can find more information by watching our recording at: &lt;a href=&#34;https://sched.co/1x71v&#34;&gt;KubeCon Japan 2025 - Reimagining Cloud Native Networks: The Critical Role of DRA&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-can-you-do-next&#34;&gt;What can you do next?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check out the &lt;a href=&#34;https://github.com/kubernetes-sigs/cni-dra-driver&#34;&gt;CNI DRA Driver project&lt;/a&gt;&lt;/strong&gt; for an example of DRA integration in Kubernetes networking. Try integrating with network resources like &lt;code&gt;macvlan&lt;/code&gt;, &lt;code&gt;ipvlan&lt;/code&gt;, or smart NICs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start enabling the &lt;code&gt;DRAConsumableCapacity&lt;/code&gt; feature gate and experimenting with virtualized or partitionable devices. Specify your workloads with &lt;em&gt;consumable capacity&lt;/em&gt; (for example: fractional bandwidth or memory).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let us know your feedback:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ What worked well?&lt;/li&gt;
&lt;li&gt;⚠️ What didn’t?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you encountered issues to fix or opportunities to enhance,
please &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues&#34;&gt;file a new issue&lt;/a&gt;
and reference &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5075&#34;&gt;KEP-5075&lt;/a&gt; there,
or reach out via &lt;a href=&#34;https://kubernetes.slack.com/archives/C0409NGC1TK&#34;&gt;Slack (#wg-device-management)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Consumable capacity support enhances the device sharing capability of DRA by allowing effective device sharing across namespaces, across claims, and tailored to each Pod’s actual needs.
It also empowers drivers to enforce capacity limits, improves scheduling accuracy, and unlocks new use cases like bandwidth-aware networking and multi-tenant device sharing.&lt;/p&gt;
&lt;p&gt;Try it out, experiment with consumable resources, and help shape the future of dynamic resource allocation in Kubernetes!&lt;/p&gt;
&lt;h3 id=&#34;further-reading&#34;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;DRA in the Kubernetes documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/4815-dra-partitionable-devices&#34;&gt;KEP for DRA Partitionable Devices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/4817-resource-claim-device-status&#34;&gt;KEP for DRA Device Status&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/5075-dra-consumable-capacity&#34;&gt;KEP for DRA Consumable Capacity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/release/#kubernetes-v134&#34;&gt;Kubernetes 1.34 Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Pods Report DRA Resource Health</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/17/kubernetes-v1-34-pods-report-dra-resource-health/</link>
      <pubDate>Wed, 17 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/17/kubernetes-v1-34-pods-report-dra-resource-health/</guid>
      <description>
        
        
        &lt;p&gt;The rise of AI/ML and other high-performance workloads has made specialized hardware like GPUs, TPUs, and FPGAs a critical component of many Kubernetes clusters. However, as discussed in a &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/07/03/navigating-failures-in-pods-with-devices/&#34;&gt;previous blog post about navigating failures in Pods with devices&lt;/a&gt;, when this hardware fails, it can be difficult to diagnose, leading to significant downtime. With the release of Kubernetes v1.34, we are excited to announce a new alpha feature that brings much-needed visibility into the health of these devices.&lt;/p&gt;
&lt;p&gt;This work extends the functionality of &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/4680-add-resource-health-to-pod-status&#34;&gt;KEP-4680&lt;/a&gt;, which first introduced a mechanism for reporting the health of devices managed by Device Plugins. Now, this capability is being extended to &lt;em&gt;Dynamic Resource Allocation (DRA)&lt;/em&gt;. Controlled by the &lt;code&gt;ResourceHealthStatus&lt;/code&gt; feature gate, this enhancement allows DRA drivers to report device health directly into a Pod&#39;s &lt;code&gt;.status&lt;/code&gt; field, providing crucial insights for operators and developers.&lt;/p&gt;
&lt;h2 id=&#34;why-expose-device-health-in-pod-status&#34;&gt;Why expose device health in Pod status?&lt;/h2&gt;
&lt;p&gt;For stateful applications or long-running jobs, a device failure can be disruptive and costly. By exposing device health in the &lt;code&gt;.status&lt;/code&gt; field for a Pod, Kubernetes provides a standardized way for users and automation tools to quickly diagnose issues. If a Pod is failing, you can now check its status to see if an unhealthy device is the root cause, saving valuable time that might otherwise be spent debugging application code.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;This feature introduces a new, optional communication channel between the Kubelet and DRA drivers, built on three core components.&lt;/p&gt;
&lt;h3 id=&#34;a-new-grpc-health-service&#34;&gt;A new gRPC health service&lt;/h3&gt;
&lt;p&gt;A new gRPC service, &lt;code&gt;DRAResourceHealth&lt;/code&gt;, is defined in the &lt;code&gt;dra-health/v1alpha1&lt;/code&gt; API group. DRA drivers can implement this service to stream device health updates to the Kubelet. The service includes a &lt;code&gt;NodeWatchResources&lt;/code&gt; server-streaming RPC that sends the health status (&lt;code&gt;Healthy&lt;/code&gt;, &lt;code&gt;Unhealthy&lt;/code&gt;, or &lt;code&gt;Unknown&lt;/code&gt;) for the devices it manages.&lt;/p&gt;
&lt;h3 id=&#34;kubelet-integration&#34;&gt;Kubelet integration&lt;/h3&gt;
&lt;p&gt;The Kubelet’s &lt;code&gt;DRAPluginManager&lt;/code&gt; discovers which drivers implement the health service. For each compatible driver, it starts a long-lived &lt;code&gt;NodeWatchResources&lt;/code&gt; stream to receive health updates. The DRA Manager then consumes these updates and stores them in a persistent &lt;code&gt;healthInfoCache&lt;/code&gt; that can survive Kubelet restarts.&lt;/p&gt;
&lt;h3 id=&#34;populating-the-pod-status&#34;&gt;Populating the Pod status&lt;/h3&gt;
&lt;p&gt;When a device&#39;s health changes, the DRA manager identifies all Pods affected by the change and triggers a Pod status update. A new field, &lt;code&gt;allocatedResourcesStatus&lt;/code&gt;, is now part of the &lt;code&gt;v1.ContainerStatus&lt;/code&gt; API object. The Kubelet populates this field with the current health of each device allocated to the container.&lt;/p&gt;
&lt;h2 id=&#34;a-practical-example&#34;&gt;A practical example&lt;/h2&gt;
&lt;p&gt;If a Pod is in a &lt;code&gt;CrashLoopBackOff&lt;/code&gt; state, you can use &lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;&lt;/code&gt; to inspect its status. If an allocated device has failed, the output will now include the &lt;code&gt;allocatedResourcesStatus&lt;/code&gt; field, clearly indicating the problem:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;status&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containerStatuses&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-gpu-intensive-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# ... other container statuses&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;allocatedResourcesStatus&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;claim:my-gpu-claim&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resourceID&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;example.com/gpu-a1b2-c3d4&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;health&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Unhealthy&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This explicit status makes it clear that the issue is with the underlying hardware, not the application.&lt;/p&gt;
&lt;p&gt;Now you can improve the failure detection logic to react on the unhealthy devices associated with the Pod by de-scheduling a Pod.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-this-feature&#34;&gt;How to use this feature&lt;/h2&gt;
&lt;p&gt;As this is an alpha feature in Kubernetes v1.34, you must take the following steps to use it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable the &lt;code&gt;ResourceHealthStatus&lt;/code&gt; feature gate on your kube-apiserver and kubelets.&lt;/li&gt;
&lt;li&gt;Ensure you are using a DRA driver that implements the &lt;code&gt;v1alpha1 DRAResourceHealth&lt;/code&gt; gRPC service.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;dra-drivers&#34;&gt;DRA drivers&lt;/h2&gt;
&lt;p&gt;If you are developing a DRA driver, make sure to think about device failure detection strategy and ensure that your driver is integrated with this feature. This way, your driver will improve the user experience and simplify debuggability of hardware issues.&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What&#39;s next?&lt;/h2&gt;
&lt;p&gt;This is the first step in a broader effort to improve how Kubernetes handles device failures. As we gather feedback on this alpha feature, the community is planning several key enhancements before graduating to Beta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Detailed health messages:&lt;/em&gt; To improve the troubleshooting experience, we plan to add a human-readable message field to the gRPC API. This will allow DRA drivers to provide specific context for a health status, such as &amp;quot;GPU temperature exceeds threshold&amp;quot; or &amp;quot;NVLink connection lost&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Configurable health timeouts:&lt;/em&gt; The timeout for marking a device&#39;s health as &amp;quot;Unknown&amp;quot; is currently hardcoded. We plan to make this configurable, likely on a per-driver basis, to better accommodate the different health-reporting characteristics of various hardware.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Improved post-mortem troubleshooting:&lt;/em&gt; We will address a known limitation where health updates may not be applied to pods that have already terminated. This fix will ensure that the health status of a device at the time of failure is preserved, which is crucial for troubleshooting batch jobs and other &amp;quot;run-to-completion&amp;quot; workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This feature was developed as part of &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/4680-add-resource-health-to-pod-status&#34;&gt;KEP-4680&lt;/a&gt;, and community feedback is crucial as we work toward graduating it to Beta. We have more improvements of device failure handling in k8s and encourage you to try it out and share your experiences with the SIG Node community!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Moving Volume Group Snapshots to v1beta2</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/16/kubernetes-v1-34-volume-group-snapshot-beta-2/</link>
      <pubDate>Tue, 16 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/16/kubernetes-v1-34-volume-group-snapshot-beta-2/</guid>
      <description>
        
        
        &lt;p&gt;Volume group snapshots were &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2023/05/08/kubernetes-1-27-volume-group-snapshot-alpha/&#34;&gt;introduced&lt;/a&gt;
as an Alpha feature with the Kubernetes 1.27 release and moved to &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2024/12/18/kubernetes-1-32-volume-group-snapshot-beta/&#34;&gt;Beta&lt;/a&gt; in the Kubernetes 1.32 release.
The recent release of Kubernetes v1.34 moved that support to a second beta.
The support for volume group snapshots relies on a set of
&lt;a href=&#34;https://kubernetes-csi.github.io/docs/group-snapshot-restore-feature.html#volume-group-snapshot-apis&#34;&gt;extension APIs for group snapshots&lt;/a&gt;.
These APIs allow users to take crash consistent snapshots for a set of volumes.
Behind the scenes, Kubernetes uses a label selector to group multiple PersistentVolumeClaims
for snapshotting.
A key aim is to allow you restore that set of snapshots to new volumes and
recover your workload based on a crash consistent recovery point.&lt;/p&gt;
&lt;p&gt;This new feature is only supported for &lt;a href=&#34;https://kubernetes-csi.github.io/docs/&#34;&gt;CSI&lt;/a&gt; volume drivers.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new-in-beta-2&#34;&gt;What&#39;s new in Beta 2?&lt;/h2&gt;
&lt;p&gt;While testing the beta version, we encountered an &lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshotter/issues/1271&#34;&gt;issue&lt;/a&gt; where the &lt;code&gt;restoreSize&lt;/code&gt; field is not set for individual VolumeSnapshotContents and VolumeSnapshots if CSI driver does not implement the ListSnapshots RPC call.
We evaluated various options &lt;a href=&#34;https://docs.google.com/document/d/1LLBSHcnlLTaP6ZKjugtSGQHH2LGZPndyfnNqR1YvzS4/edit?tab=t.0&#34;&gt;here&lt;/a&gt; and decided to make this change releasing a new beta for the API.&lt;/p&gt;
&lt;p&gt;Specifically, a VolumeSnapshotInfo struct is added in v1beta2, it contains information for an individual volume snapshot that is a member of a volume group snapshot.
VolumeSnapshotInfoList, a list of VolumeSnapshotInfo, is added to VolumeGroupSnapshotContentStatus, replacing VolumeSnapshotHandlePairList.
VolumeSnapshotInfoList is a list of snapshot information returned by the CSI driver to identify snapshots on the storage system.
VolumeSnapshotInfoList is populated by the csi-snapshotter sidecar based on the CSI CreateVolumeGroupSnapshotResponse returned by the CSI driver&#39;s CreateVolumeGroupSnapshot call.&lt;/p&gt;
&lt;p&gt;The existing v1beta1 API objects will be converted to the new v1beta2 API objects by a conversion webhook.&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;Depending on feedback and adoption, the Kubernetes project plans to push the volume
group snapshot implementation to general availability (GA) in a future release.&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;How can I learn more?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3476-volume-group-snapshot&#34;&gt;design spec&lt;/a&gt;
for the volume group snapshot feature.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshotter&#34;&gt;code repository&lt;/a&gt; for volume group
snapshot APIs and controller.&lt;/li&gt;
&lt;li&gt;CSI &lt;a href=&#34;https://kubernetes-csi.github.io/docs/&#34;&gt;documentation&lt;/a&gt; on the group snapshot feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;How do I get involved?&lt;/h2&gt;
&lt;p&gt;This project, like all of Kubernetes, is the result of hard work by many contributors
from diverse backgrounds working together. On behalf of SIG Storage, I would like to
offer a huge thank you to the contributors who stepped up these last few quarters
to help the project reach beta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ben Swartzlander (&lt;a href=&#34;https://github.com/bswartz&#34;&gt;bswartz&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Hemant Kumar (&lt;a href=&#34;https://github.com/gnufied&#34;&gt;gnufied&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Jan Šafránek (&lt;a href=&#34;https://github.com/jsafrane&#34;&gt;jsafrane&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Madhu Rajanna (&lt;a href=&#34;https://github.com/Madhu-1&#34;&gt;Madhu-1&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Michelle Au (&lt;a href=&#34;https://github.com/msau42&#34;&gt;msau42&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Niels de Vos (&lt;a href=&#34;https://github.com/nixpanic&#34;&gt;nixpanic&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Leonardo Cecchi (&lt;a href=&#34;https://github.com/leonardoce&#34;&gt;leonardoce&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Saad Ali (&lt;a href=&#34;https://github.com/saad-ali&#34;&gt;saad-ali&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Xing Yang (&lt;a href=&#34;https://github.com/xing-yang&#34;&gt;xing-yang&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Yati Padia (&lt;a href=&#34;https://github.com/yati1998&#34;&gt;yati1998&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For those interested in getting involved with the design and development of CSI or
any part of the Kubernetes Storage system, join the
&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;Kubernetes Storage Special Interest Group&lt;/a&gt; (SIG).
We always welcome new contributors.&lt;/p&gt;
&lt;p&gt;We also hold regular &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-data-protection&#34;&gt;Data Protection Working Group meetings&lt;/a&gt;.
New attendees are welcome to join our discussions.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Decoupled Taint Manager Is Now Stable</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/15/kubernetes-v1-34-decoupled-taint-manager-is-now-stable/</link>
      <pubDate>Mon, 15 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/15/kubernetes-v1-34-decoupled-taint-manager-is-now-stable/</guid>
      <description>
        
        
        &lt;p&gt;This enhancement separates the responsibility of managing node lifecycle and pod eviction into two distinct components.
Previously, the node lifecycle controller handled both marking nodes as unhealthy with NoExecute taints and evicting pods from them.
Now, a dedicated taint eviction controller manages the eviction process, while the node lifecycle controller focuses solely on applying taints.
This separation not only improves code organization but also makes it easier to improve taint eviction controller or build custom implementations of the taint based eviction.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new&#34;&gt;What&#39;s new?&lt;/h2&gt;
&lt;p&gt;The feature gate &lt;code&gt;SeparateTaintEvictionController&lt;/code&gt; has been promoted to GA in this release.
Users can optionally disable taint-based eviction by setting &lt;code&gt;--controllers=-taint-eviction-controller&lt;/code&gt;
in kube-controller-manager.&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;How can I learn more?&lt;/h2&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&#34;http://kep.k8s.io/3902&#34;&gt;KEP&lt;/a&gt; and to the beta announcement article: &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2023/12/19/kubernetes-1-29-taint-eviction-controller/&#34;&gt;Kubernetes 1.29: Decoupling taint manager from node lifecycle controller&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-to-get-involved&#34;&gt;How to get involved?&lt;/h2&gt;
&lt;p&gt;We offer a huge thank you to all the contributors who helped with design,
implementation, and review of this feature and helped move it from beta to stable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ed Bartosh (@bart0sh)&lt;/li&gt;
&lt;li&gt;Yuan Chen (@yuanchen8911)&lt;/li&gt;
&lt;li&gt;Aldo Culquicondor (@alculquicondor)&lt;/li&gt;
&lt;li&gt;Baofa Fan (@carlory)&lt;/li&gt;
&lt;li&gt;Sergey Kanzhelev (@SergeyKanzhelev)&lt;/li&gt;
&lt;li&gt;Tim Bannister (@lmktfy)&lt;/li&gt;
&lt;li&gt;Maciej Skoczeń (@macsko)&lt;/li&gt;
&lt;li&gt;Maciej Szulik (@soltysh)&lt;/li&gt;
&lt;li&gt;Wojciech Tyczynski (@wojtek-t)&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Autoconfiguration for Node Cgroup Driver Goes GA</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/</link>
      <pubDate>Fri, 12 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/</guid>
      <description>
        
        
        &lt;p&gt;Historically, configuring the correct cgroup driver has been a pain point for users running new
Kubernetes clusters. On Linux systems, there are two different cgroup drivers:
&lt;code&gt;cgroupfs&lt;/code&gt; and &lt;code&gt;systemd&lt;/code&gt;. In the past, both the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/kubelet/&#34;&gt;kubelet&lt;/a&gt;
and CRI implementation (like CRI-O or containerd) needed to be configured to use
the same cgroup driver, or else the kubelet would misbehave without any explicit
error message. This was a source of headaches for many cluster admins. Now, we&#39;ve
(almost) arrived at the end of that headache.&lt;/p&gt;
&lt;h2 id=&#34;automated-cgroup-driver-detection&#34;&gt;Automated cgroup driver detection&lt;/h2&gt;
&lt;p&gt;In v1.28.0, the SIG Node community introduced the feature gate
&lt;code&gt;KubeletCgroupDriverFromCRI&lt;/code&gt;, which instructs the kubelet to ask the CRI
implementation which cgroup driver to use. You can read more &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2024/08/21/cri-cgroup-driver-lookup-now-beta/&#34;&gt;here&lt;/a&gt;.
After many releases of waiting for each CRI implementation to have major versions released
and packaged in major operating systems, this feature has gone GA as of Kubernetes 1.34.0.&lt;/p&gt;
&lt;p&gt;In addition to setting the feature gate, a cluster admin needs to ensure their
CRI implementation is new enough:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;containerd: Support was added in v2.0.0&lt;/li&gt;
&lt;li&gt;CRI-O: Support was added in v1.28.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;Announcement: Kubernetes is deprecating containerd v1.y support&lt;/h2&gt;
&lt;p&gt;While CRI-O releases versions that match Kubernetes versions, and thus CRI-O
versions without this behavior are no longer supported, containerd maintains its
own release cycle. containerd support for this feature is only in v2.0 and
later, but Kubernetes 1.34 still supports containerd 1.7 and other LTS releases
of containerd.&lt;/p&gt;
&lt;p&gt;The Kubernetes SIG Node community has formally agreed upon a final support
timeline for containerd v1.y. The last Kubernetes release to offer this support
will be the last released version of v1.35, and support will be dropped in
v1.36.0. To assist administrators in managing this future transition,
a new detection mechanism is available. You are able to monitor
the &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt; metric to determine if any nodes in your cluster
are using a containerd version that will soon be outdated. The presence of
this metric with a version label of &lt;code&gt;1.36.0&lt;/code&gt; will indicate that the node&#39;s containerd
runtime is not new enough for the upcoming requirements. Consequently, an
administrator will need to upgrade containerd to v2.0 or a later version before,
or at the same time as, upgrading the kubelet to v1.36.0.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Mutable CSI Node Allocatable Graduates to Beta</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/11/kubernetes-v1-34-mutable-csi-node-allocatable-count/</link>
      <pubDate>Thu, 11 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/11/kubernetes-v1-34-mutable-csi-node-allocatable-count/</guid>
      <description>
        
        
        &lt;p&gt;The &lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;functionality for CSI drivers to update information about attachable volume count on the nodes&lt;/a&gt;, first introduced as Alpha in Kubernetes v1.33, has graduated to &lt;strong&gt;Beta&lt;/strong&gt; in the Kubernetes v1.34 release! This marks a significant milestone in enhancing the accuracy of stateful pod scheduling by reducing failures due to outdated attachable volume capacity information.&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Traditionally, Kubernetes &lt;a href=&#34;https://kubernetes-csi.github.io/docs/introduction.html&#34;&gt;CSI drivers&lt;/a&gt; report a static maximum volume attachment limit when initializing. However, actual attachment capacities can change during a node&#39;s lifecycle for various reasons, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual or external operations attaching/detaching volumes outside of Kubernetes control.&lt;/li&gt;
&lt;li&gt;Dynamically attached network interfaces or specialized hardware (GPUs, NICs, etc.) consuming available slots.&lt;/li&gt;
&lt;li&gt;Multi-driver scenarios, where one CSI driver’s operations affect available capacity reported by another.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Static reporting can cause Kubernetes to schedule pods onto nodes that appear to have capacity but don&#39;t, leading to pods stuck in a &lt;code&gt;ContainerCreating&lt;/code&gt; state.&lt;/p&gt;
&lt;h2 id=&#34;dynamically-adapting-csi-volume-limits&#34;&gt;Dynamically adapting CSI volume limits&lt;/h2&gt;
&lt;p&gt;With this new feature, Kubernetes enables CSI drivers to dynamically adjust and report node attachment capacities at runtime. This ensures that the scheduler, as well as other components relying on this information, have the most accurate, up-to-date view of node capacity.&lt;/p&gt;
&lt;h3 id=&#34;how-it-works&#34;&gt;How it works&lt;/h3&gt;
&lt;p&gt;Kubernetes supports two mechanisms for updating the reported node volume limits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Periodic Updates:&lt;/strong&gt; CSI drivers specify an interval to periodically refresh the node&#39;s allocatable capacity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reactive Updates:&lt;/strong&gt; An immediate update triggered when a volume attachment fails due to exhausted resources (&lt;code&gt;ResourceExhausted&lt;/code&gt; error).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;enabling-the-feature&#34;&gt;Enabling the feature&lt;/h3&gt;
&lt;p&gt;To use this beta feature, the &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt; feature gate must be enabled in these components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kube-apiserver&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-csi-driver-configuration&#34;&gt;Example CSI driver configuration&lt;/h3&gt;
&lt;p&gt;Below is an example of configuring a CSI driver to enable periodic updates every 60 seconds:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: example.csi.k8s.io
spec:
  nodeAllocatableUpdatePeriodSeconds: 60
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This configuration directs kubelet to periodically call the CSI driver&#39;s &lt;code&gt;NodeGetInfo&lt;/code&gt; method every 60 seconds, updating the node’s allocatable volume count. Kubernetes enforces a minimum update interval of 10 seconds to balance accuracy and resource usage.&lt;/p&gt;
&lt;h3 id=&#34;immediate-updates-on-attachment-failures&#34;&gt;Immediate updates on attachment failures&lt;/h3&gt;
&lt;p&gt;When a volume attachment operation fails due to a &lt;code&gt;ResourceExhausted&lt;/code&gt; error (gRPC code &lt;code&gt;8&lt;/code&gt;), Kubernetes immediately updates the allocatable count instead of waiting for the next periodic update. The Kubelet then marks the affected pods as Failed, enabling their controllers to recreate them. This prevents pods from getting permanently stuck in the &lt;code&gt;ContainerCreating&lt;/code&gt; state.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Getting started&lt;/h2&gt;
&lt;p&gt;To enable this feature in your Kubernetes v1.34 cluster:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enable the feature gate &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt; on the &lt;code&gt;kube-apiserver&lt;/code&gt; and &lt;code&gt;kubelet&lt;/code&gt; components.&lt;/li&gt;
&lt;li&gt;Update your CSI driver configuration by setting &lt;code&gt;nodeAllocatableUpdatePeriodSeconds&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Monitor and observe improvements in scheduling accuracy and pod placement reliability.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;This feature is currently in beta and the Kubernetes community welcomes your feedback. Test it, share your experiences, and help guide its evolution to GA stability.&lt;/p&gt;
&lt;p&gt;Join discussions in the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;Kubernetes Storage Special Interest Group (SIG-Storage)&lt;/a&gt; to shape the future of Kubernetes storage capabilities.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Use An Init Container To Define App Environment Variables</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/10/kubernetes-v1-34-env-files/</link>
      <pubDate>Wed, 10 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/10/kubernetes-v1-34-env-files/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes typically uses ConfigMaps and Secrets to set environment variables,
which introduces additional API calls and complexity,
For example, you need to separately manage the Pods of your workloads
and their configurations, while ensuring orderly
updates for both the configurations and the workload Pods.&lt;/p&gt;
&lt;p&gt;Alternatively, you might be using a vendor-supplied container
that requires environment variables (such as a license key or a one-time token),
but you don’t want to hard-code them or mount volumes just to get the job done.&lt;/p&gt;
&lt;p&gt;If that&#39;s the situation you are in, you now have a new (alpha) way to
achieve that. Provided you have the &lt;code&gt;EnvFiles&lt;/code&gt;
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;feature gate&lt;/a&gt;
enabled across your cluster, you can tell the kubelet to load a container&#39;s
environment variables from a volume (the volume must be part of the Pod that
the container belongs to).
this feature gate allows you to load environment variables directly from a file in an emptyDir volume
without actually mounting that file into the container.
It’s a simple yet elegant solution to some surprisingly common problems.&lt;/p&gt;
&lt;h2 id=&#34;what-s-this-all-about&#34;&gt;What’s this all about?&lt;/h2&gt;
&lt;p&gt;At its core, this feature allows you to point your container to a file,
one generated by an &lt;code&gt;initContainer&lt;/code&gt;,
and have Kubernetes parse that file to set your environment variables.
The file lives in an &lt;code&gt;emptyDir&lt;/code&gt; volume (a temporary storage space that lasts as long as the pod does),
Your main container doesn’t need to mount the volume.
The kubelet will read the file and inject these variables when the container starts.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How It Works&lt;/h2&gt;
&lt;p&gt;Here&#39;s a simple example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;initContainers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;generate-config&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;busybox&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sh&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;echo &amp;#34;CONFIG_VAR=HELLO&amp;#34; &amp;gt; /config/config.env&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;volumeMounts&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;config-volume&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;mountPath&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;/config&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;app-container&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gcr.io/distroless/static&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;env&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CONFIG_VAR&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;valueFrom&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;fileKeyRef&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;path&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;config.env&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;volumeName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;config-volume&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CONFIG_VAR&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;volumes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;config-volume&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;emptyDir&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;{}&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using this approach is a breeze.
You define your environment variables in the pod spec using the &lt;code&gt;fileKeyRef&lt;/code&gt; field,
which tells Kubernetes where to find the file and which key to pull.
The file itself resembles the standard for .env syntax (think KEY=VALUE),
and (for this alpha stage at least) you must ensure that it is written into
an &lt;code&gt;emptyDir&lt;/code&gt; volume. Other volume types aren&#39;t supported for this feature.
At least one init container must mount that &lt;code&gt;emptyDir&lt;/code&gt; volume (to write the file),
but the main container doesn’t need to—it just gets the variables handed to it at startup.&lt;/p&gt;
&lt;h2 id=&#34;a-word-on-security&#34;&gt;A word on security&lt;/h2&gt;
&lt;p&gt;While this feature supports handling sensitive data such as keys or tokens,
note that its implementation relies on &lt;code&gt;emptyDir&lt;/code&gt; volumes mounted into pod.
Operators with node filesystem access could therefore
easily retrieve this sensitive data through pod directory paths.&lt;/p&gt;
&lt;p&gt;If storing sensitive data like keys or tokens using this feature,
ensure your cluster security policies effectively protect nodes
against unauthorized access to prevent exposure of confidential information.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;This feature will eliminate a number of complex workarounds used today, simplifying
apps authoring, and opening doors for more use cases. Kubernetes stays flexible and
open for feedback. Tell us how you use this feature or what is missing.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Snapshottable API server cache</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/09/kubernetes-v1-34-snapshottable-api-server-cache/</link>
      <pubDate>Tue, 09 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/09/kubernetes-v1-34-snapshottable-api-server-cache/</guid>
      <description>
        
        
        &lt;p&gt;For years, the Kubernetes community has been on a mission to improve the stability and performance predictability of the API server.
A major focus of this effort has been taming &lt;strong&gt;list&lt;/strong&gt; requests, which have historically been a primary source of high memory usage and heavy load on the &lt;code&gt;etcd&lt;/code&gt; datastore.
With each release, we&#39;ve chipped away at the problem, and today, we&#39;re thrilled to announce the final major piece of this puzzle.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;snapshottable API server cache&lt;/em&gt; feature has graduated to &lt;strong&gt;Beta&lt;/strong&gt; in Kubernetes v1.34,
culminating a multi-release effort to allow virtually all read requests to be served directly from the API server&#39;s cache.&lt;/p&gt;
&lt;h2 id=&#34;evolving-the-cache-for-performance-and-stability&#34;&gt;Evolving the cache for performance and stability&lt;/h2&gt;
&lt;p&gt;The path to the current state involved several key enhancements over recent releases that paved the way for today&#39;s announcement.&lt;/p&gt;
&lt;h3 id=&#34;consistent-reads-from-cache-beta-in-v1-31&#34;&gt;Consistent reads from cache (Beta in v1.31)&lt;/h3&gt;
&lt;p&gt;While the API server has long used a cache for performance, a key milestone was guaranteeing &lt;em&gt;consistent reads of the latest data&lt;/em&gt; from it. This v1.31 enhancement allowed the watch cache to be used for strongly-consistent read requests for the first time, a huge win as it enabled &lt;em&gt;filtered collections&lt;/em&gt; (e.g. &amp;quot;a list of pods bound to this node&amp;quot;) to be safely served from the cache instead of etcd, dramatically reducing its load for common workloads.&lt;/p&gt;
&lt;h3 id=&#34;taming-large-responses-with-streaming-beta-in-v1-33&#34;&gt;Taming large responses with streaming (Beta in v1.33)&lt;/h3&gt;
&lt;p&gt;Another key improvement was tackling the problem of memory spikes when transmitting large responses. The streaming encoder, introduced in v1.33, allowed the API server to send list items one by one, rather than buffering the entire multi-gigabyte response in memory. This made the memory cost of sending a response predictable and minimal, regardless of its size.&lt;/p&gt;
&lt;h3 id=&#34;the-missing-piece&#34;&gt;The missing piece&lt;/h3&gt;
&lt;p&gt;Despite these huge improvements, a critical gap remained. Any request for a historical &lt;code&gt;LIST&lt;/code&gt;—most commonly used for paginating through large result sets—still had to bypass the cache and query &lt;code&gt;etcd&lt;/code&gt; directly. This meant that the cost of &lt;em&gt;retrieving&lt;/em&gt; the data was still unpredictable and could put significant memory pressure on the API server.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes-1-34-snapshots-complete-the-picture&#34;&gt;Kubernetes 1.34: snapshots complete the picture&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;snapshottable API server cache&lt;/em&gt; solves this final piece of the puzzle.
This feature enhances the watch cache, enabling it to generate efficient, point-in-time snapshots of its state.&lt;/p&gt;
&lt;p&gt;Here’s how it works: for each update, the cache creates a lightweight snapshot.
These snapshots are &amp;quot;lazy copies,&amp;quot; meaning they don&#39;t duplicate objects but simply store pointers, making them incredibly memory-efficient.&lt;/p&gt;
&lt;p&gt;When a &lt;strong&gt;list&lt;/strong&gt; request for a historical &lt;code&gt;resourceVersion&lt;/code&gt; arrives, the API server now finds the corresponding snapshot and serves the response directly from its memory.
This closes the final major gap, allowing paginated requests to be served entirely from the cache.&lt;/p&gt;
&lt;h2 id=&#34;a-new-era-of-api-server-performance&#34;&gt;A new era of API Server performance 🚀&lt;/h2&gt;
&lt;p&gt;With this final piece in place, the synergy of these three features ushers in a new era of API server predictability and performance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get Data from Cache&lt;/strong&gt;: &lt;em&gt;Consistent reads&lt;/em&gt; and &lt;em&gt;snapshottable cache&lt;/em&gt; work together to ensure nearly all read requests—whether for the latest data or a historical snapshot—are served from the API server&#39;s memory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Send data via stream&lt;/strong&gt;: &lt;em&gt;Streaming list responses&lt;/em&gt; ensure that sending this data to the client has a minimal and constant memory footprint.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result is a system where the resource cost of read operations is almost fully predictable and much more resiliant to spikes in request load.
This means dramatically reduced memory pressure, a lighter load on &lt;code&gt;etcd&lt;/code&gt;, and a more stable, scalable, and reliable control plane for all Kubernetes clusters.&lt;/p&gt;
&lt;h2 id=&#34;how-to-get-started&#34;&gt;How to get started&lt;/h2&gt;
&lt;p&gt;With its graduation to Beta, the &lt;code&gt;SnapshottableCache&lt;/code&gt; feature gate is &lt;strong&gt;enabled by default&lt;/strong&gt; in Kubernetes v1.34. There are no actions required to start benefiting from these performance and stability improvements.&lt;/p&gt;
&lt;h2 id=&#34;acknowledgements&#34;&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;Special thanks for designing, implementing, and reviewing these critical features go to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ahmad Zolfaghari&lt;/strong&gt; (&lt;a href=&#34;https://github.com/ah8ad3&#34;&gt;@ah8ad3&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ben Luddy&lt;/strong&gt; (&lt;a href=&#34;https://github.com/benluddy&#34;&gt;@benluddy&lt;/a&gt;) – &lt;em&gt;Red Hat&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chen Chen&lt;/strong&gt; (&lt;a href=&#34;https://github.com/z1cheng&#34;&gt;@z1cheng&lt;/a&gt;) – &lt;em&gt;Microsoft&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Davanum Srinivas&lt;/strong&gt; (&lt;a href=&#34;https://github.com/dims&#34;&gt;@dims&lt;/a&gt;) – &lt;em&gt;Nvidia&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;David Eads&lt;/strong&gt; (&lt;a href=&#34;https://github.com/deads2k&#34;&gt;@deads2k&lt;/a&gt;) – &lt;em&gt;Red Hat&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Han Kang&lt;/strong&gt; (&lt;a href=&#34;https://github.com/logicalhan&#34;&gt;@logicalhan&lt;/a&gt;) – &lt;em&gt;CoreWeave&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;haosdent&lt;/strong&gt; (&lt;a href=&#34;https://github.com/haosdent&#34;&gt;@haosdent&lt;/a&gt;) – &lt;em&gt;Shopee&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joe Betz&lt;/strong&gt; (&lt;a href=&#34;https://github.com/jpbetz&#34;&gt;@jpbetz&lt;/a&gt;) – &lt;em&gt;Google&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jordan Liggitt&lt;/strong&gt; (&lt;a href=&#34;https://github.com/liggitt&#34;&gt;@liggitt&lt;/a&gt;) – &lt;em&gt;Google&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Łukasz Szaszkiewicz&lt;/strong&gt; (&lt;a href=&#34;https://github.com/p0lyn0mial&#34;&gt;@p0lyn0mial&lt;/a&gt;) – &lt;em&gt;Red Hat&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maciej Borsz&lt;/strong&gt; (&lt;a href=&#34;https://github.com/mborsz&#34;&gt;@mborsz&lt;/a&gt;) – &lt;em&gt;Google&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Madhav Jivrajani&lt;/strong&gt; (&lt;a href=&#34;https://github.com/MadhavJivrajani&#34;&gt;@MadhavJivrajani&lt;/a&gt;) – &lt;em&gt;UIUC&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marek Siarkowicz&lt;/strong&gt; (&lt;a href=&#34;https://github.com/serathius&#34;&gt;@serathius&lt;/a&gt;) – &lt;em&gt;Google&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NKeert&lt;/strong&gt; (&lt;a href=&#34;https://github.com/NKeert&#34;&gt;@NKeert&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tim Bannister&lt;/strong&gt; (&lt;a href=&#34;https://github.com/lmktfy&#34;&gt;@lmktfy&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wei Fu&lt;/strong&gt; (&lt;a href=&#34;https://github.com/fuweid&#34;&gt;@fuweid&lt;/a&gt;) - &lt;em&gt;Microsoft&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wojtek Tyczyński&lt;/strong&gt; (&lt;a href=&#34;https://github.com/wojtek-t&#34;&gt;@wojtek-t&lt;/a&gt;) – &lt;em&gt;Google&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...and many others in SIG API Machinery. This milestone is a testament to the community&#39;s dedication to building a more scalable and robust Kubernetes.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: VolumeAttributesClass for Volume Modification GA</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/08/kubernetes-v1-34-volume-attributes-class/</link>
      <pubDate>Mon, 08 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/08/kubernetes-v1-34-volume-attributes-class/</guid>
      <description>
        
        
        &lt;p&gt;The VolumeAttributesClass API, which empowers users to dynamically modify volume attributes, has officially graduated to General Availability (GA) in Kubernetes v1.34. This marks a significant milestone, providing a robust and stable way to tune your persistent storage directly within Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;what-is-volumeattributesclass&#34;&gt;What is VolumeAttributesClass?&lt;/h2&gt;
&lt;p&gt;At its core, VolumeAttributesClass is a cluster-scoped resource that defines a set of mutable parameters for a volume. Think of it as a &amp;quot;profile&amp;quot; for your storage, allowing cluster administrators to expose different quality-of-service (QoS) levels or performance tiers.&lt;/p&gt;
&lt;p&gt;Users can then specify a &lt;code&gt;volumeAttributesClassName&lt;/code&gt; in their PersistentVolumeClaim (PVC) to indicate which class of attributes they desire. The magic happens through the Container Storage Interface (CSI): when a PVC referencing a VolumeAttributesClass is updated, the associated CSI driver interacts with the underlying storage system to apply the specified changes to the volume.&lt;/p&gt;
&lt;p&gt;This means you can now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamically scale performance: Increase IOPS or throughput for a busy database, or reduce it for a less critical application.&lt;/li&gt;
&lt;li&gt;Optimize costs: Adjust attributes on the fly to match your current needs, avoiding over-provisioning.&lt;/li&gt;
&lt;li&gt;Simplify operations: Manage volume modifications directly within the Kubernetes API, rather than relying on external tools or manual processes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-new-from-beta-to-ga&#34;&gt;What is new from Beta to GA&lt;/h2&gt;
&lt;p&gt;There are two major enhancements from beta.&lt;/p&gt;
&lt;h3 id=&#34;cancellation-support-when-errors-occur&#34;&gt;Cancellation support when errors occur&lt;/h3&gt;
&lt;p&gt;To improve resilience and user experience, the GA release introduces explicit cancel support when a requested volume modification encounters an error. If the underlying storage system or CSI driver indicates that the requested changes cannot be applied (e.g., due to invalid arguments), users can cancel the operation and revert the volume to its previous stable configuration, preventing the volume from being left in an inconsistent state.&lt;/p&gt;
&lt;h3 id=&#34;quota-support-based-on-scope&#34;&gt;Quota support based on scope&lt;/h3&gt;
&lt;p&gt;While VolumeAttributesClass doesn&#39;t add a new quota type, the Kubernetes control plane can be configured to enforce quotas on PersistentVolumeClaims that reference a specific VolumeAttributesClass.&lt;/p&gt;
&lt;p&gt;This is achieved by using the &lt;code&gt;scopeSelector&lt;/code&gt; field in a ResourceQuota to target PVCs that have &lt;code&gt;.spec.volumeAttributesClassName&lt;/code&gt; set to a particular VolumeAttributesClass name. Please see more details &lt;a href=&#34;https://kubernetes.io/docs/concepts/policy/resource-quotas/#resource-quota-per-volumeattributesclass&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;drivers-support-volumeattributesclass&#34;&gt;Drivers support VolumeAttributesClass&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Amazon EBS CSI Driver: The AWS EBS CSI driver has robust support for VolumeAttributesClass and allows you to modify parameters like volume type (e.g., gp2 to gp3, io1 to io2), IOPS, and throughput of EBS volumes dynamically.&lt;/li&gt;
&lt;li&gt;Google Compute Engine (GCE) Persistent Disk CSI Driver (pd.csi.storage.gke.io): This driver also supports dynamic modification of persistent disk attributes, including IOPS and throughput, via VolumeAttributesClass.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;contact&#34;&gt;Contact&lt;/h2&gt;
&lt;p&gt;For any inquiries or specific questions related to VolumeAttributesClass, please reach out to the &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;SIG Storage community&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Pod Replacement Policy for Jobs Goes GA</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/05/kubernetes-v1-34-pod-replacement-policy-for-jobs-goes-ga/</link>
      <pubDate>Fri, 05 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/05/kubernetes-v1-34-pod-replacement-policy-for-jobs-goes-ga/</guid>
      <description>
        
        
        &lt;p&gt;In Kubernetes v1.34, the &lt;em&gt;Pod replacement policy&lt;/em&gt; feature has reached general availability (GA).
This blog post describes the Pod replacement policy feature and how to use it in your Jobs.&lt;/p&gt;
&lt;h2 id=&#34;about-pod-replacement-policy&#34;&gt;About Pod Replacement Policy&lt;/h2&gt;
&lt;p&gt;By default, the Job controller immediately recreates Pods as soon as they fail or begin terminating (when they have a deletion timestamp).&lt;/p&gt;
&lt;p&gt;As a result, while some Pods are terminating, the total number of running Pods for a Job can temporarily exceed the specified parallelism.
For Indexed Jobs, this can even mean multiple Pods running for the same index at the same time.&lt;/p&gt;
&lt;p&gt;This behavior works fine for many workloads, but it can cause problems in certain cases.&lt;/p&gt;
&lt;p&gt;For example, popular machine learning frameworks like TensorFlow and
&lt;a href=&#34;https://jax.readthedocs.io/en/latest/&#34;&gt;JAX&lt;/a&gt; expect exactly one Pod per worker index.
If two Pods run at the same time, you might encounter errors such as:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/job:worker/task:4: Duplicate task registration with task_name=/job:worker/replica:0/task:4
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Additionally, starting replacement Pods before the old ones fully terminate can lead to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scheduling delays by kube-scheduler as the nodes remain occupied.&lt;/li&gt;
&lt;li&gt;Unnecessary cluster scale-ups to accommodate the replacement Pods.&lt;/li&gt;
&lt;li&gt;Temporary bypassing of quota checks by workload orchestrators like &lt;a href=&#34;https://kueue.sigs.k8s.io/&#34;&gt;Kueue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With Pod replacement policy, Kubernetes gives you control over when the control plane
replaces terminating Pods, helping you avoid these issues.&lt;/p&gt;
&lt;h2 id=&#34;how-pod-replacement-policy-works&#34;&gt;How Pod Replacement Policy works&lt;/h2&gt;
&lt;p&gt;This enhancement means that Jobs in Kubernetes have an optional field &lt;code&gt;.spec.podReplacementPolicy&lt;/code&gt;.&lt;br&gt;
You can choose one of two policies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TerminatingOrFailed&lt;/code&gt; (default): Replaces Pods as soon as they start terminating.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Failed&lt;/code&gt;: Replaces Pods only after they fully terminate and transition to the &lt;code&gt;Failed&lt;/code&gt; phase.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setting the policy to &lt;code&gt;Failed&lt;/code&gt; ensures that a new Pod is only created after the previous one has completely terminated.&lt;/p&gt;
&lt;p&gt;For Jobs with a Pod Failure Policy, the default &lt;code&gt;podReplacementPolicy&lt;/code&gt; is &lt;code&gt;Failed&lt;/code&gt;, and no other value is allowed.
See &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/job/#pod-failure-policy&#34;&gt;Pod Failure Policy&lt;/a&gt; to learn more about Pod Failure Policies for Jobs.&lt;/p&gt;
&lt;p&gt;You can check how many Pods are currently terminating by inspecting the Job’s &lt;code&gt;.status.terminating&lt;/code&gt; field:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get job myjob -o&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b8860b&#34;&gt;jsonpath&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;{.status.terminating}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;example&#34;&gt;Example&lt;/h2&gt;
&lt;p&gt;Here’s a Job example that executes a task two times (&lt;code&gt;spec.completions: 2&lt;/code&gt;) in parallel (&lt;code&gt;spec.parallelism: 2&lt;/code&gt;) and
replaces Pods only after they fully terminate (&lt;code&gt;spec.podReplacementPolicy: Failed&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;batch/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Job&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;example-job&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;completions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;parallelism&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;podReplacementPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Failed&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;template&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Never&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;worker&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;your-image&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If a Pod receives a SIGTERM signal (deletion, eviction, preemption...), it begins terminating.
When the container handles termination gracefully, cleanup may take some time.&lt;/p&gt;
&lt;p&gt;When the Job starts, we will see two Pods running:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                READY   STATUS    RESTARTS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-qr8kf   1/1     Running   &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          2s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-stvb4   1/1     Running   &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          2s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&#39;s delete one of the Pods (&lt;code&gt;example-job-qr8kf&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;With the &lt;code&gt;TerminatingOrFailed&lt;/code&gt; policy, as soon as one Pod (&lt;code&gt;example-job-qr8kf&lt;/code&gt;) starts terminating, the Job controller immediately creates a new Pod (&lt;code&gt;example-job-b59zk&lt;/code&gt;) to replace it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                READY   STATUS        RESTARTS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-b59zk   1/1     Running       &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          1s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-qr8kf   1/1     Terminating   &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          17s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-stvb4   1/1     Running       &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          17s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the &lt;code&gt;Failed&lt;/code&gt; policy, the new Pod (&lt;code&gt;example-job-b59zk&lt;/code&gt;) is not created while the old Pod (&lt;code&gt;example-job-qr8kf&lt;/code&gt;) is terminating.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                READY   STATUS        RESTARTS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-qr8kf   1/1     Terminating   &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          17s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-stvb4   1/1     Running       &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          17s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When the terminating Pod has fully transitioned to the &lt;code&gt;Failed&lt;/code&gt; phase, a new Pod is created:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                READY   STATUS        RESTARTS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-b59zk   1/1     Running       &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          1s
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;example-job-stvb4   1/1     Running       &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt;          25s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;how-can-you-learn-more&#34;&gt;How can you learn more?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read the user-facing documentation for &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/job/#pod-replacement-policy&#34;&gt;Pod Replacement Policy&lt;/a&gt;,
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/job/#backoff-limit-per-index&#34;&gt;Backoff Limit per Index&lt;/a&gt;, and
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/job/#pod-failure-policy&#34;&gt;Pod Failure Policy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read the KEPs for &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3939-allow-replacement-when-fully-terminated&#34;&gt;Pod Replacement Policy&lt;/a&gt;,
&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3850-backoff-limits-per-index-for-indexed-jobs&#34;&gt;Backoff Limit per Index&lt;/a&gt;, and
&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3329-retriable-and-non-retriable-failures&#34;&gt;Pod Failure Policy&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;As with any Kubernetes feature, multiple people contributed to getting this
done, from testing and filing bugs to reviewing code.&lt;/p&gt;
&lt;p&gt;As this feature moves to stable after 2 years, we would like to thank the following people:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kannon92&#34;&gt;Kevin Hannon&lt;/a&gt; - for writing the KEP and the initial implementation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mimowo&#34;&gt;Michał Woźniak&lt;/a&gt; - for guidance, mentorship, and reviews.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/alculquicondor&#34;&gt;Aldo Culquicondor&lt;/a&gt; - for guidance, mentorship, and reviews.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/soltysh&#34;&gt;Maciej Szulik&lt;/a&gt; - for guidance, mentorship, and reviews.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dejanzele&#34;&gt;Dejan Zele Pejchev&lt;/a&gt; - for taking over the feature and promoting it from Alpha through Beta to GA.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;This work was sponsored by the Kubernetes
&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-batch&#34;&gt;batch working group&lt;/a&gt;
in close collaboration with the
&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-apps&#34;&gt;SIG Apps&lt;/a&gt; community.&lt;/p&gt;
&lt;p&gt;If you are interested in working on new features in the space we recommend
subscribing to our &lt;a href=&#34;https://kubernetes.slack.com/messages/wg-batch&#34;&gt;Slack&lt;/a&gt;
channel and attending the regular community meetings.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: PSI Metrics for Kubernetes Graduates to Beta</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/04/kubernetes-v1-34-introducing-psi-metrics-beta/</link>
      <pubDate>Thu, 04 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/04/kubernetes-v1-34-introducing-psi-metrics-beta/</guid>
      <description>
        
        
        &lt;p&gt;As Kubernetes clusters grow in size and complexity, understanding the health and performance of individual nodes becomes increasingly critical. We are excited to announce that as of Kubernetes v1.34, &lt;strong&gt;Pressure Stall Information (PSI) Metrics&lt;/strong&gt; has graduated to Beta.&lt;/p&gt;
&lt;h2 id=&#34;what-is-pressure-stall-information-psi&#34;&gt;What is Pressure Stall Information (PSI)?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.kernel.org/accounting/psi.html&#34;&gt;Pressure Stall Information (PSI)&lt;/a&gt; is a feature of the Linux kernel (version 4.20 and later)
that provides a canonical way to quantify pressure on infrastructure resources,
in terms of whether demand for a resource exceeds current supply.
It moves beyond simple resource utilization metrics and instead
measures the amount of time that tasks are stalled due to resource contention.
This is a powerful way to identify and diagnose resource bottlenecks that can impact application performance.&lt;/p&gt;
&lt;p&gt;PSI exposes metrics for CPU, memory, and I/O, categorized as either &lt;code&gt;some&lt;/code&gt; or &lt;code&gt;full&lt;/code&gt; pressure:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;some&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;The percentage of time that &lt;strong&gt;at least one&lt;/strong&gt; task is stalled on a resource. This indicates some level of resource contention.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;full&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;The percentage of time that &lt;strong&gt;all&lt;/strong&gt; non-idle tasks are stalled on a resource simultaneously. This indicates a more severe resource bottleneck.&lt;/dd&gt;
&lt;/dl&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/04/kubernetes-v1-34-introducing-psi-metrics-beta/psi-metrics-some-vs-full.svg&#34;
         alt=&#34;Diagram illustrating the difference between &amp;#39;some&amp;#39; and &amp;#39;full&amp;#39; PSI pressure.&#34;/&gt; &lt;figcaption&gt;
            &lt;h4&gt;PSI: &amp;#39;Some&amp;#39; vs. &amp;#39;Full&amp;#39; Pressure&lt;/h4&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;These metrics are aggregated over 10-second, 1-minute, and 5-minute rolling windows, providing a comprehensive view of resource pressure over time.&lt;/p&gt;
&lt;h2 id=&#34;psi-metrics-in-kubernetes&#34;&gt;PSI metrics in Kubernetes&lt;/h2&gt;
&lt;p&gt;With the &lt;code&gt;KubeletPSI&lt;/code&gt; feature gate enabled, the kubelet can now collect PSI metrics from the Linux kernel and expose them through two channels: the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/node-metrics/#summary-api-source&#34;&gt;Summary API&lt;/a&gt; and the &lt;code&gt;/metrics/cadvisor&lt;/code&gt; Prometheus endpoint. This allows you to monitor and alert on resource pressure at the node, pod, and container level.&lt;/p&gt;
&lt;p&gt;The following new metrics are available in Prometheus exposition format via &lt;code&gt;/metrics/cadvisor&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;container_pressure_cpu_stalled_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_cpu_waiting_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_memory_stalled_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_memory_waiting_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_io_stalled_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_io_waiting_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These metrics, along with the data from the Summary API, provide a granular view of resource pressure, enabling you to pinpoint the source of performance issues and take corrective action. For example, you can use these metrics to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identify memory leaks:&lt;/strong&gt; A steadily increasing &lt;code&gt;some&lt;/code&gt; pressure for memory can indicate a memory leak in an application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimize resource requests and limits:&lt;/strong&gt; By understanding the resource pressure of your workloads, you can more accurately tune their resource requests and limits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autoscale workloads:&lt;/strong&gt; You can use PSI metrics to trigger autoscaling events, ensuring that your workloads have the resources they need to perform optimally.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-to-enable-psi-metrics&#34;&gt;How to enable PSI metrics&lt;/h2&gt;
&lt;p&gt;To enable PSI metrics in your Kubernetes cluster, you need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ensure your nodes are running a Linux kernel version 4.20 or later and are using cgroup v2.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable the &lt;code&gt;KubeletPSI&lt;/code&gt; feature gate on the kubelet.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once enabled, you can start scraping the &lt;code&gt;/metrics/cadvisor&lt;/code&gt; endpoint with your Prometheus-compatible monitoring solution or query the Summary API to collect and visualize the new PSI metrics. Note that PSI is a Linux-kernel feature, so these metrics are not available on Windows nodes. Your cluster can contain a mix of Linux and Windows nodes, and on the Windows nodes the kubelet does not expose PSI metrics.&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What&#39;s next?&lt;/h2&gt;
&lt;p&gt;We are excited to bring PSI metrics to the Kubernetes community and look forward to your feedback. As a beta feature, we are actively working on improving and extending this functionality towards a stable GA release. We encourage you to try it out and share your experiences with us.&lt;/p&gt;
&lt;p&gt;To learn more about PSI metrics, check out the official &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/understand-psi-metrics/&#34;&gt;Kubernetes documentation&lt;/a&gt;. You can also get involved in the conversation on the &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt; Slack channel.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Service Account Token Integration for Image Pulls Graduates to Beta</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/03/kubernetes-v1-34-sa-tokens-image-pulls-beta/</link>
      <pubDate>Wed, 03 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/03/kubernetes-v1-34-sa-tokens-image-pulls-beta/</guid>
      <description>
        
        
        &lt;p&gt;The Kubernetes community continues to advance security best practices
by reducing reliance on long-lived credentials.
Following the successful &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/05/07/kubernetes-v1-33-wi-for-image-pulls/&#34;&gt;alpha release in Kubernetes v1.33&lt;/a&gt;,
&lt;em&gt;Service Account Token Integration for Kubelet Credential Providers&lt;/em&gt;
has now graduated to &lt;strong&gt;beta&lt;/strong&gt; in Kubernetes v1.34,
bringing us closer to eliminating long-lived image pull secrets from Kubernetes clusters.&lt;/p&gt;
&lt;p&gt;This enhancement allows credential providers
to use workload-specific service account tokens to obtain registry credentials,
providing a secure, ephemeral alternative to traditional image pull secrets.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new-in-beta&#34;&gt;What&#39;s new in beta?&lt;/h2&gt;
&lt;p&gt;The beta graduation brings several important changes
that make the feature more robust and production-ready:&lt;/p&gt;
&lt;h3 id=&#34;required-cachetype-field&#34;&gt;Required &lt;code&gt;cacheType&lt;/code&gt; field&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Breaking change from alpha&lt;/strong&gt;: The &lt;code&gt;cacheType&lt;/code&gt; field is &lt;strong&gt;required&lt;/strong&gt;
in the credential provider configuration when using service account tokens.
This field is new in beta and must be specified to ensure proper caching behavior.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# CAUTION: this is not a complete configuration example, just a reference for the &amp;#39;tokenAttributes.cacheType&amp;#39; field.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tokenAttributes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;serviceAccountTokenAudience&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;my-registry-audience&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cacheType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;ServiceAccount&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Required field in beta&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requireServiceAccount&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Choose between two caching strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Token&lt;/code&gt;&lt;/strong&gt;: Cache credentials per service account token
(use when credential lifetime is tied to the token).
This is useful when the credential provider transforms the service account token into registry credentials
with the same lifetime as the token, or when registries support Kubernetes service account tokens directly.
Note: The kubelet cannot send service account tokens directly to registries;
credential provider plugins are needed to transform tokens into the username/password format expected by registries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ServiceAccount&lt;/code&gt;&lt;/strong&gt;: Cache credentials per service account identity
(use when credentials are valid for all pods using the same service account)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;isolated-image-pull-credentials&#34;&gt;Isolated image pull credentials&lt;/h3&gt;
&lt;p&gt;The beta release provides stronger security isolation for container images
when using service account tokens for image pulls.
It ensures that pods can only access images that were pulled using ServiceAccounts they&#39;re authorized to use.
This prevents unauthorized access to sensitive container images
and enables granular access control where different workloads can have different registry permissions
based on their ServiceAccount.&lt;/p&gt;
&lt;p&gt;When credential providers use service account tokens,
the system tracks ServiceAccount identity (namespace, name, and &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/overview/working-with-objects/names/#uids&#34;&gt;UID&lt;/a&gt;) for each pulled image.
When a pod attempts to use a cached image,
the system verifies that the pod&#39;s ServiceAccount matches exactly with the ServiceAccount
that was used to originally pull the image.&lt;/p&gt;
&lt;p&gt;Administrators can revoke access to previously pulled images
by deleting and recreating the ServiceAccount,
which changes the UID and invalidates cached image access.&lt;/p&gt;
&lt;p&gt;For more details about this capability,
see the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/containers/images/#ensureimagepullcredentialverification&#34;&gt;image pull credential verification&lt;/a&gt; documentation.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;h3 id=&#34;configuration&#34;&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Credential providers opt into using ServiceAccount tokens
by configuring the &lt;code&gt;tokenAttributes&lt;/code&gt; field:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# CAUTION: this is an example configuration.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#          Do not use this for your own cluster!&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubelet.config.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;CredentialProviderConfig&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;providers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-credential-provider&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;matchImages&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;*.myregistry.io/*&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;defaultCacheDuration&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;10m&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;credentialprovider.kubelet.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;tokenAttributes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;serviceAccountTokenAudience&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;my-registry-audience&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cacheType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;ServiceAccount&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# New in beta&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requireServiceAccount&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;requiredServiceAccountAnnotationKeys&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;myregistry.io/identity-id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;optionalServiceAccountAnnotationKeys&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;myregistry.io/optional-annotation&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;image-pull-flow&#34;&gt;Image pull flow&lt;/h3&gt;
&lt;p&gt;At a high level, &lt;code&gt;kubelet&lt;/code&gt; coordinates with your credential provider
and the container runtime as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When the image is not present locally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; checks its credential cache using the configured &lt;code&gt;cacheType&lt;/code&gt;
(&lt;code&gt;Token&lt;/code&gt; or &lt;code&gt;ServiceAccount&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;If needed, &lt;code&gt;kubelet&lt;/code&gt; requests a ServiceAccount token for the pod&#39;s ServiceAccount
and passes it, plus any required annotations, to the credential provider&lt;/li&gt;
&lt;li&gt;The provider exchanges that token for registry credentials
and returns them to &lt;code&gt;kubelet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; caches credentials per the &lt;code&gt;cacheType&lt;/code&gt; strategy
and pulls the image with those credentials&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; records the ServiceAccount coordinates (namespace, name, UID)
associated with the pulled image for later authorization checks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the image is already present locally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; verifies the pod&#39;s ServiceAccount coordinates
match the coordinates recorded for the cached image&lt;/li&gt;
&lt;li&gt;If they match exactly, the cached image can be used
without pulling from the registry&lt;/li&gt;
&lt;li&gt;If they differ, &lt;code&gt;kubelet&lt;/code&gt; performs a fresh pull
using credentials for the new ServiceAccount&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With image pull credential verification enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Authorization is enforced using the recorded ServiceAccount coordinates,
ensuring pods only use images pulled by a ServiceAccount
they are authorized to use&lt;/li&gt;
&lt;li&gt;Administrators can revoke access by deleting and recreating a ServiceAccount;
the UID changes and previously recorded authorization no longer matches&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;audience-restriction&#34;&gt;Audience restriction&lt;/h3&gt;
&lt;p&gt;The beta release builds on service account node audience restriction
(beta since v1.33) to ensure &lt;code&gt;kubelet&lt;/code&gt; can only request tokens for authorized audiences.
Administrators configure allowed audiences using RBAC to enable kubelet to request service account tokens for image pulls:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# CAUTION: this is an example configuration.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#          Do not use this for your own cluster!&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ClusterRole&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubelet-credential-provider-audiences&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;verbs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;request-serviceaccounts-token-audience&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiGroups&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;my-registry-audience&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resourceNames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;registry-access-sa&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;]  # Optional&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;specific SA&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;getting-started-with-beta&#34;&gt;Getting started with beta&lt;/h2&gt;
&lt;h3 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes v1.34 or later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feature gate enabled&lt;/strong&gt;:
&lt;code&gt;KubeletServiceAccountTokenForCredentialProviders=true&lt;/code&gt; (beta, enabled by default)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credential provider support&lt;/strong&gt;:
Update your credential provider to handle ServiceAccount tokens&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;migration-from-alpha&#34;&gt;Migration from alpha&lt;/h3&gt;
&lt;p&gt;If you&#39;re already using the alpha version,
the migration to beta requires minimal changes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Add &lt;code&gt;cacheType&lt;/code&gt; field&lt;/strong&gt;:
Update your credential provider configuration to include the required &lt;code&gt;cacheType&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review caching strategy&lt;/strong&gt;:
Choose between &lt;code&gt;Token&lt;/code&gt; and &lt;code&gt;ServiceAccount&lt;/code&gt; cache types based on your provider&#39;s behavior&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test audience restrictions&lt;/strong&gt;:
Ensure your RBAC configuration, or other cluster authorization rules, will properly restrict token audiences&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;example-setup&#34;&gt;Example setup&lt;/h3&gt;
&lt;p&gt;Here&#39;s a complete example
for setting up a credential provider with service account tokens
(this example assumes your cluster uses RBAC authorization):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# CAUTION: this is an example configuration.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#          Do not use this for your own cluster!&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Service Account with registry annotations&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ServiceAccount&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry-access-sa&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;namespace&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;default&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;annotations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;myregistry.io/identity-id&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;user123&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# RBAC for audience restriction&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ClusterRole&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry-audience-access&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;rules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;verbs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;request-serviceaccounts-token-audience&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiGroups&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;my-registry-audience&amp;#34;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;resourceNames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;registry-access-sa&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;]  # Optional&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;specific ServiceAccount&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io/v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ClusterRoleBinding&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubelet-registry-audience&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;roleRef&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiGroup&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ClusterRole&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry-audience-access&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;subjects&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Group&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;system:nodes&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiGroup&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rbac.authorization.k8s.io&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Pod using the ServiceAccount&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;serviceAccountName&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;registry-access-sa&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;my-app&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;myregistry.example/my-app:latest&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;what-s-next&#34;&gt;What&#39;s next?&lt;/h2&gt;
&lt;p&gt;For Kubernetes v1.35, we - Kubernetes SIG Auth - expect the feature to stay in beta,
and we will continue to solicit feedback.&lt;/p&gt;
&lt;p&gt;You can learn more about this feature
on the &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/kubelet-credential-provider/#service-account-token-for-image-pulls&#34;&gt;service account token for image pulls&lt;/a&gt;
page in the Kubernetes documentation.&lt;/p&gt;
&lt;p&gt;You can also follow along on the
&lt;a href=&#34;https://kep.k8s.io/4412&#34;&gt;KEP-4412&lt;/a&gt;
to track progress across the coming Kubernetes releases.&lt;/p&gt;
&lt;h2 id=&#34;call-to-action&#34;&gt;Call to action&lt;/h2&gt;
&lt;p&gt;In this blog post,
I have covered the beta graduation of ServiceAccount token integration
for Kubelet Credential Providers in Kubernetes v1.34.
I discussed the key improvements,
including the required &lt;code&gt;cacheType&lt;/code&gt; field
and enhanced integration with Ensure Secret Pull Images.&lt;/p&gt;
&lt;p&gt;We have been receiving positive feedback from the community during the alpha phase
and would love to hear more as we stabilize this feature for GA.
In particular, we would like feedback from credential provider implementors
as they integrate with the new beta API and caching mechanisms.
Please reach out to us on the &lt;a href=&#34;https://kubernetes.slack.com/archives/C04UMAUC4UA&#34;&gt;#sig-auth-authenticators-dev&lt;/a&gt; channel on Kubernetes Slack.&lt;/p&gt;
&lt;h2 id=&#34;how-to-get-involved&#34;&gt;How to get involved&lt;/h2&gt;
&lt;p&gt;If you are interested in getting involved in the development of this feature,
share feedback, or participate in any other ongoing SIG Auth projects,
please reach out on the &lt;a href=&#34;https://kubernetes.slack.com/archives/C0EN96KUY&#34;&gt;#sig-auth&lt;/a&gt; channel on Kubernetes Slack.&lt;/p&gt;
&lt;p&gt;You are also welcome to join the bi-weekly &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-auth/README.md#meetings&#34;&gt;SIG Auth meetings&lt;/a&gt;,
held every other Wednesday.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Introducing CPU Manager Static Policy Option for Uncore Cache Alignment</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/02/kubernetes-v1-34-prefer-align-by-uncore-cache-cpumanager-static-policy-optimization/</link>
      <pubDate>Tue, 02 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/02/kubernetes-v1-34-prefer-align-by-uncore-cache-cpumanager-static-policy-optimization/</guid>
      <description>
        
        
        &lt;p&gt;A new CPU Manager Static Policy Option called &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; was introduced in Kubernetes v1.32 as an alpha feature, and has graduated to &lt;strong&gt;beta&lt;/strong&gt; in Kubernetes v1.34.
This CPU Manager Policy Option is designed to optimize performance for specific workloads running on processors with a &lt;em&gt;split uncore cache&lt;/em&gt; architecture.
In this article, I&#39;ll explain what that means and why it&#39;s useful.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-feature&#34;&gt;Understanding the feature&lt;/h2&gt;
&lt;h3 id=&#34;what-is-uncore-cache&#34;&gt;What is uncore cache?&lt;/h3&gt;
&lt;p&gt;Until relatively recently, nearly all mainstream computer processors had a
monolithic last-level-cache cache that was shared across every core in a multiple
CPU package.
This monolithic cache is also referred to as &lt;em&gt;uncore cache&lt;/em&gt;
(because it is not linked to a specific core), or as Level 3 cache.
As well as the Level 3 cache, there is other cache, commonly called Level 1 and Level 2 cache,
that &lt;strong&gt;is&lt;/strong&gt; associated with a specific CPU core.&lt;/p&gt;
&lt;p&gt;In order to reduce access latency between the CPU cores and their cache, recent AMD64 and ARM
architecture based processors have introduced a &lt;em&gt;split uncore cache&lt;/em&gt; architecture,
where the last-level-cache is divided into multiple physical caches,
that are aligned to specific CPU groupings within the physical package.
The shorter distances within the CPU package help to reduce latency.
&lt;img alt=&#34;Diagram showing monolithic cache on the left and split cache on the right&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/02/kubernetes-v1-34-prefer-align-by-uncore-cache-cpumanager-static-policy-optimization/mono_vs_split_uncore.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Kubernetes is able to place workloads in a way that accounts for the cache
topology within the CPU package(s).&lt;/p&gt;
&lt;h3 id=&#34;cache-aware-workload-placement&#34;&gt;Cache-aware workload placement&lt;/h3&gt;
&lt;p&gt;The matrix below shows the &lt;a href=&#34;https://github.com/nviennot/core-to-core-latency&#34;&gt;CPU-to-CPU latency&lt;/a&gt; measured in nanoseconds (lower is better) when
passing a packet between CPUs, via its cache coherence protocol on a processor that
uses split uncore cache.
In this example, the processor package consists of 2 uncore caches.
Each uncore cache serves 8 CPU cores.
&lt;img alt=&#34;Table showing CPU-to-CPU latency figures&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/02/kubernetes-v1-34-prefer-align-by-uncore-cache-cpumanager-static-policy-optimization/c2c_latency.png&#34;&gt;
Blue entries in the matrix represent latency between CPUs sharing the same uncore cache, while grey entries indicate latency between CPUs corresponding to different uncore caches. Latency between CPUs that correspond to different caches are higher than the latency between CPUs that belong to the same cache.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; enabled, the
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/policy/node-resource-managers/#static-policy&#34;&gt;static CPU Manager&lt;/a&gt; attempts to allocates CPU resources for a container, such that all CPUs assigned to a container share the same uncore cache.
This policy operates on a best-effort basis, aiming to minimize the distribution of a container&#39;s CPU resources across uncore caches, based on the
container&#39;s requirements, and accounting for allocatable resources on the node.&lt;/p&gt;
&lt;p&gt;By running a workload, where it can, on a set of CPUS that use the smallest feasible number of uncore caches, applications benefit from reduced cache latency (as seen in the matrix above),
and from reduced contention against other workloads, which can result in overall higher throughput.
The benefit only shows up if your nodes use a split uncore cache topology for their processors.&lt;/p&gt;
&lt;p&gt;The following diagram below illustrates uncore cache alignment when the feature is enabled.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Diagram showing an example workload CPU assignment, default static policy, and with prefer-align-cpus-by-uncorecache&#34; src=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/02/kubernetes-v1-34-prefer-align-by-uncore-cache-cpumanager-static-policy-optimization/cache-align-diagram.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;By default, Kubernetes does not account for uncore cache topology; containers are assigned CPU resources using a packed methodology.
As a result, Container 1 and Container 2 can experience a noisy neighbor impact due to
cache access contention on Uncore Cache 0. Additionally, Container 2 will have CPUs distributed across both caches which can introduce a cross-cache latency.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; enabled, each container is isolated on an individual cache. This resolves the cache contention between the containers and minimizes the cache latency for the CPUs being utilized.&lt;/p&gt;
&lt;h2 id=&#34;use-cases&#34;&gt;Use cases&lt;/h2&gt;
&lt;p&gt;Common use cases can include telco applications like vRAN, Mobile Packet Core, and Firewalls. It&#39;s important to note that the optimization provided by &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; can be dependent on the workload. For example, applications that are memory bandwidth bound may not benefit from uncore cache alignment, as utilizing more uncore caches can increase memory bandwidth access.&lt;/p&gt;
&lt;h2 id=&#34;enabling-the-feature&#34;&gt;Enabling the feature&lt;/h2&gt;
&lt;p&gt;To enable this feature, set the CPU Manager Policy to &lt;code&gt;static&lt;/code&gt; and enable the CPU Manager Policy Options with &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For Kubernetes 1.34, the feature is in the beta stage and requires the &lt;code&gt;CPUManagerPolicyBetaOptions&lt;/code&gt;
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;feature gate&lt;/a&gt; to also be enabled.&lt;/p&gt;
&lt;p&gt;Append the following to the kubelet configuration file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;KubeletConfiguration&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubelet.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;featureGates&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;...&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;CPUManagerPolicyBetaOptions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpuManagerPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;static&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;cpuManagerPolicyOptions&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;prefer-align-cpus-by-uncorecache&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;reservedSystemCPUs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#00f;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&#39;re making this change to an existing node, remove the &lt;code&gt;cpu_manager_state&lt;/code&gt; file and then restart kubelet.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; can be enabled on nodes with a monolithic uncore cache processor. The feature will mimic a best-effort socket alignment effect and will pack CPU resources on the socket similar to the default static CPU Manager policy.&lt;/p&gt;
&lt;h2 id=&#34;further-reading&#34;&gt;Further reading&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/policy/node-resource-managers/&#34;&gt;Node Resource Managers&lt;/a&gt; to learn more about the CPU Manager and the available policies.&lt;/p&gt;
&lt;p&gt;Reference the documentation for &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/policy/node-resource-managers/#prefer-align-cpus-by-uncorecache&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please see the &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/4800-cpumanager-split-uncorecache&#34;&gt;Kubernetes Enhancement Proposal&lt;/a&gt; for more information on how &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; is implemented.&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Getting involved&lt;/h2&gt;
&lt;p&gt;This feature is driven by &lt;a href=&#34;https://github.com/Kubernetes/community/blob/master/sig-node/README.md&#34;&gt;SIG Node&lt;/a&gt;. If you are interested in helping develop this feature, sharing feedback, or participating in any other ongoing SIG Node projects, please attend the SIG Node meeting for more details.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: DRA has graduated to GA</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/01/kubernetes-v1-34-dra-updates/</link>
      <pubDate>Mon, 01 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/01/kubernetes-v1-34-dra-updates/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes 1.34 is here, and it has brought a huge wave of enhancements for Dynamic Resource Allocation (DRA)! This
release marks a major milestone with many APIs in the &lt;code&gt;resource.k8s.io&lt;/code&gt; group graduating to General Availability (GA),
unlocking the full potential of how you manage devices on Kubernetes. On top of that, several key features have
moved to beta, and a fresh batch of new alpha features promise even more expressiveness and flexibility.&lt;/p&gt;
&lt;p&gt;Let&#39;s dive into what&#39;s new for DRA in Kubernetes 1.34!&lt;/p&gt;
&lt;h2 id=&#34;the-core-of-dra-is-now-ga&#34;&gt;The core of DRA is now GA&lt;/h2&gt;
&lt;p&gt;The headline feature of the v1.34 release is that the core of DRA has graduated to General Availability.&lt;/p&gt;
&lt;p&gt;Kubernetes &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;Dynamic Resource Allocation (DRA)&lt;/a&gt; provides
a flexible framework for managing specialized hardware and infrastructure resources, such as GPUs or FPGAs. DRA
provides APIs that enable each workload to specify the properties of the devices it needs, but leaving it to the
scheduler to allocate actual devices, allowing increased reliability and improved utilization of expensive hardware.&lt;/p&gt;
&lt;p&gt;With the graduation to GA, DRA is stable and will be part of Kubernetes for the long run. The community can still
expect a steady stream of new features being added to DRA over the next several Kubernetes releases, but they will
not make any breaking changes to DRA. So users and developers of DRA drivers can start adopting DRA with confidence.&lt;/p&gt;
&lt;p&gt;Starting with Kubernetes 1.34, DRA is enabled by default; the DRA features that have reached beta are &lt;strong&gt;also&lt;/strong&gt; enabled by default.
That&#39;s because the default API version for DRA is now the stable &lt;code&gt;v1&lt;/code&gt; version, and not the earlier versions
(eg: &lt;code&gt;v1beta1&lt;/code&gt; or &lt;code&gt;v1beta2&lt;/code&gt;) that needed explicit opt in.&lt;/p&gt;
&lt;h2 id=&#34;features-promoted-to-beta&#34;&gt;Features promoted to beta&lt;/h2&gt;
&lt;p&gt;Several powerful features have been promoted to beta, adding more control, flexibility, and observability to resource
management with DRA.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#admin-access&#34;&gt;Admin access labelling&lt;/a&gt; has been updated.
In v1.34, you can restrict device support to people (or software) authorized to use it. This is meant
as a way to avoid privilege escalation if a DRA driver grants additional privileges when admin access is requested
and to avoid accessing devices which are in use by normal applications, potentially in another namespace.
The restriction works by ensuring that only users with access to a namespace with the
&lt;code&gt;resource.k8s.io/admin-access: &amp;quot;true&amp;quot;&lt;/code&gt; label are authorized to create
ResourceClaim or ResourceClaimTemplates objects with the &lt;code&gt;adminAccess&lt;/code&gt; field set to true. This ensures that non-admin users cannot misuse the feature.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#prioritized-list&#34;&gt;Prioritized list&lt;/a&gt; lets users specify
a list of acceptable devices for their workloads, rather than just a single type of device. So while the workload
might run best on a single high-performance GPU, it might also be able to run on 2 mid-level GPUs. The scheduler will
attempt to satisfy the alternatives in the list in order, so the workload will be allocated the best set of devices
available on the node.&lt;/p&gt;
&lt;p&gt;The kubelet&#39;s API has been updated to report on Pod resources allocated through DRA. This allows node monitoring agents
to know the allocated DRA resources for Pods on a node and makes it possible to use the DRA information in the PodResources API
to develop new features and integrations.&lt;/p&gt;
&lt;h2 id=&#34;new-alpha-features&#34;&gt;New alpha features&lt;/h2&gt;
&lt;p&gt;Kubernetes 1.34 also introduces several new alpha features that give us a glimpse into the future of resource management with DRA.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#extended-resource&#34;&gt;Extended resource mapping&lt;/a&gt; support in DRA allows
cluster administrators to advertise DRA-managed resources as &lt;em&gt;extended resources&lt;/em&gt;, allowing developers to consume them using
the familiar, simpler request syntax while still benefiting from dynamic allocation. This makes it possible for existing
workloads to start using DRA without modifications, simplifying the transition to DRA for both application developers and
cluster administrators.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#consumable-capacity&#34;&gt;Consumable capacity&lt;/a&gt; introduces a flexible
device sharing model where multiple, independent resource claims from unrelated
pods can each be allocated a share of the same underlying physical device. This new capability is managed through optional,
administrator-defined sharing policies that govern how a device&#39;s total capacity is divided and enforced by the platform for
each request. This allows for sharing of devices in scenarios where pre-defined partitions are not viable.&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/18/kubernetes-v1-34-dra-consumable-capacity/&#34;&gt;Kubernetes v1.34: DRA Consumable Capacity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#binding-conditions&#34;&gt;Binding conditions&lt;/a&gt; improve scheduling
reliability for certain classes of devices by allowing the Kubernetes scheduler to delay binding a pod to a node until its
required external resources, such as attachable devices or FPGAs, are confirmed to be fully prepared. This prevents premature
pod assignments that could lead to failures and ensures more robust, predictable scheduling by explicitly modeling resource
readiness before the pod is committed to a node.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Resource health status&lt;/em&gt; for DRA improves observability by exposing the health status of devices allocated to a Pod via Pod Status.
This works whether the device is allocated through DRA or Device Plugin. This makes it easier to understand the cause of an
unhealthy device and respond properly.&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/09/17/kubernetes-v1-34-pods-report-dra-resource-health/&#34;&gt;Kubernetes v1.34: Pods Report DRA Resource Health&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;While DRA got promoted to GA this cycle, the hard work on DRA doesn&#39;t stop. There are several features in alpha and beta that
we plan to bring to GA in the next couple of releases and we are looking to continue to improve performance, scalability
and reliability of DRA. So expect an equally ambitious set of features in DRA for the 1.35 release.&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Getting involved&lt;/h2&gt;
&lt;p&gt;A good starting point is joining the WG Device Management &lt;a href=&#34;https://kubernetes.slack.com/archives/C0409NGC1TK&#34;&gt;Slack channel&lt;/a&gt; and &lt;a href=&#34;https://docs.google.com/document/d/1qxI87VqGtgN7EAJlqVfxx86HGKEAc2A3SKru8nJHNkQ/edit?tab=t.0#heading=h.tgg8gganowxq&#34;&gt;meetings&lt;/a&gt;, which happen at US/EU and EU/APAC friendly time slots.&lt;/p&gt;
&lt;p&gt;Not all enhancement ideas are tracked as issues yet, so come talk to us if you want to help or have some ideas yourself! We have work to do at all levels, from difficult core changes to usability enhancements in kubectl, which could be picked up by newcomers.&lt;/p&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;A huge thanks to the new contributors to DRA this cycle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alay Patel (&lt;a href=&#34;https://github.com/alaypatel07&#34;&gt;alaypatel07&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Gaurav Kumar Ghildiyal (&lt;a href=&#34;https://github.com/gauravkghildiyal&#34;&gt;gauravkghildiyal&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;JP (&lt;a href=&#34;https://github.com/Jpsassine&#34;&gt;Jpsassine&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Kobayashi Daisuke (&lt;a href=&#34;https://github.com/KobayashiD27&#34;&gt;KobayashiD27&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Laura Lorenz (&lt;a href=&#34;https://github.com/lauralorenz&#34;&gt;lauralorenz&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Sunyanan Choochotkaew (&lt;a href=&#34;https://github.com/sunya-ch&#34;&gt;sunya-ch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Swati Gupta (&lt;a href=&#34;https://github.com/guptaNswati&#34;&gt;guptaNswati&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Yu Liao (&lt;a href=&#34;https://github.com/yliaog&#34;&gt;yliaog&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Finer-Grained Control Over Container Restarts</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/08/29/kubernetes-v1-34-per-container-restart-policy/</link>
      <pubDate>Fri, 29 Aug 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/08/29/kubernetes-v1-34-per-container-restart-policy/</guid>
      <description>
        
        
        &lt;p&gt;With the release of Kubernetes 1.34, a new alpha feature is introduced
that gives you more granular control over container restarts within a Pod. This
feature, named &lt;strong&gt;Container Restart Policy and Rules&lt;/strong&gt;, allows you to specify a
restart policy for each container individually, overriding the Pod&#39;s global
restart policy. In addition, it also allows you to conditionally restart
individual containers based on their exit codes. This feature is available
behind the alpha feature gate &lt;code&gt;ContainerRestartRules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This has been a long-requested feature. Let&#39;s dive into how it works and how you
can use it.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-with-a-single-restart-policy&#34;&gt;The problem with a single restart policy&lt;/h2&gt;
&lt;p&gt;Before this feature, the &lt;code&gt;restartPolicy&lt;/code&gt; was set at the Pod level. This meant
that all containers in a Pod shared the same restart policy (&lt;code&gt;Always&lt;/code&gt;,
&lt;code&gt;OnFailure&lt;/code&gt;, or &lt;code&gt;Never&lt;/code&gt;). While this works for many use cases, it can be
limiting in others.&lt;/p&gt;
&lt;p&gt;For example, consider a Pod with a main application container and an init
container that performs some initial setup. You might want the main container
to always restart on failure, but the init container should only run once and
never restart. With a single Pod-level restart policy, this wasn&#39;t possible.&lt;/p&gt;
&lt;h2 id=&#34;introducing-per-container-restart-policies&#34;&gt;Introducing per-container restart policies&lt;/h2&gt;
&lt;p&gt;With the new &lt;code&gt;ContainerRestartRules&lt;/code&gt; feature gate, you can now specify a
&lt;code&gt;restartPolicy&lt;/code&gt; for each container in your Pod&#39;s spec. You can also define
&lt;code&gt;restartPolicyRules&lt;/code&gt; to control restarts based on exit codes. This gives you
the fine-grained control you need to handle complex scenarios.&lt;/p&gt;
&lt;h2 id=&#34;use-cases&#34;&gt;Use cases&lt;/h2&gt;
&lt;p&gt;Let&#39;s look at some real-life use cases where per-container restart policies can
be beneficial.&lt;/p&gt;
&lt;h3 id=&#34;in-place-restarts-for-training-jobs&#34;&gt;In-place restarts for training jobs&lt;/h3&gt;
&lt;p&gt;In ML research, it&#39;s common to orchestrate a large number of long-running AI/ML
training workloads. In these scenarios, workload failures are unavoidable. When
a workload fails with a retriable exit code, you want the container to restart
quickly without rescheduling the entire Pod, which consumes a significant amount
of time and resources. Restarting the failed container &amp;quot;in-place&amp;quot; is critical
for better utilization of compute resources. The container should only restart
&amp;quot;in-place&amp;quot; if it failed due to a retriable error; otherwise, the container and
Pod should terminate and possibly be rescheduled.&lt;/p&gt;
&lt;p&gt;This can now be achieved with container-level &lt;code&gt;restartPolicyRules&lt;/code&gt;. The workload
can exit with different codes to represent retriable and non-retriable errors.
With &lt;code&gt;restartPolicyRules&lt;/code&gt;, the workload can be restarted in-place quickly, but
only when the error is retriable.&lt;/p&gt;
&lt;h3 id=&#34;try-once-init-containers&#34;&gt;Try-once init containers&lt;/h3&gt;
&lt;p&gt;Init containers are often used to perform initialization work for the main
container, such as setting up environments and credentials. Sometimes, you want
the main container to always be restarted, but you don&#39;t want to retry
initialization if it fails.&lt;/p&gt;
&lt;p&gt;With a container-level &lt;code&gt;restartPolicy&lt;/code&gt;, this is now possible. The init container
can be executed only once, and its failure would be considered a Pod failure. If
the initialization succeeds, the main container can be always restarted.&lt;/p&gt;
&lt;h3 id=&#34;pods-with-multiple-containers&#34;&gt;Pods with multiple containers&lt;/h3&gt;
&lt;p&gt;For Pods that run multiple containers, you might have different restart
requirements for each container. Some containers might have a clear definition
of success and should only be restarted on failure. Others might need to be
always restarted.&lt;/p&gt;
&lt;p&gt;This is now possible with a container-level &lt;code&gt;restartPolicy&lt;/code&gt;, allowing individual
containers to have different restart policies.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-it&#34;&gt;How to use it&lt;/h2&gt;
&lt;p&gt;To use this new feature, you need to enable the &lt;code&gt;ContainerRestartRules&lt;/code&gt; feature
gate on your Kubernetes cluster control-plane and worker nodes running
Kubernetes 1.34+. Once enabled, you can specify the &lt;code&gt;restartPolicy&lt;/code&gt; and
&lt;code&gt;restartPolicyRules&lt;/code&gt; fields in your container definitions.&lt;/p&gt;
&lt;p&gt;Here are some examples:&lt;/p&gt;
&lt;h3 id=&#34;example-1-restarting-on-specific-exit-codes&#34;&gt;Example 1: Restarting on specific exit codes&lt;/h3&gt;
&lt;p&gt;In this example, the container should restart if and only if it fails with a
retriable error, represented by exit code 42.&lt;/p&gt;
&lt;p&gt;To achieve this, the container has &lt;code&gt;restartPolicy: Never&lt;/code&gt;, and a restart
policy rule that tells Kubernetes to restart the container in-place if it exits
with code 42.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;restart-on-exit-codes&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;annotations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kubernetes.io/description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;This Pod only restart the container only when it exits with code 42.&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Never&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;restart-on-exit-codes&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;docker.io/library/busybox:1.28&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sh&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sleep 60 &amp;amp;&amp;amp; exit 0&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Never    &lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Container restart policy must be specified if rules are specified&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicyRules&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# Only restart the container if it exits with code 42&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;action&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Restart&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;exitCodes&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;operator&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;In&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;values&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#666&#34;&gt;42&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;example-2-a-try-once-init-container&#34;&gt;Example 2: A try-once init container&lt;/h3&gt;
&lt;p&gt;In this example, a Pod should always be restarted once the initialization succeeds.
However, the initialization should only be tried once.&lt;/p&gt;
&lt;p&gt;To achieve this, the Pod has an &lt;code&gt;Always&lt;/code&gt; restart policy. The &lt;code&gt;init-once&lt;/code&gt;
init container will only try once. If it fails, the Pod will fail. This allows
the Pod to fail if the initialization failed, but also keep running once the
initialization succeeds.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;fail-pod-if-init-fails&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;annotations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kubernetes.io/description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;This Pod has an init container that runs only once. After initialization succeeds, the main container will always be restarted.&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Always&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;initContainers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;init-once     &lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# This init container will only try once. If it fails, the Pod will fail.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;docker.io/library/busybox:1.28&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sh&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;echo &amp;#34;Failing initialization&amp;#34; &amp;amp;&amp;amp; sleep 10 &amp;amp;&amp;amp; exit 1&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Never&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;main-container&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# This container will always be restarted once initialization succeeds.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;docker.io/library/busybox:1.28&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sh&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sleep 1800 &amp;amp;&amp;amp; exit 0&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;example-3-containers-with-different-restart-policies&#34;&gt;Example 3: Containers with different restart policies&lt;/h3&gt;
&lt;p&gt;In this example, there are two containers with different restart requirements. One
should always be restarted, while the other should only be restarted on failure.&lt;/p&gt;
&lt;p&gt;This is achieved by using a different container-level &lt;code&gt;restartPolicy&lt;/code&gt; on each of
the two containers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;v1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;metadata&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;on&lt;/span&gt;-failure-pod&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;annotations&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kubernetes.io/description&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;This Pod has two containers with different restart policies.&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;spec&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;containers&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;restart-on-failure&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;docker.io/library/busybox:1.28&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sh&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;echo &amp;#34;Not restarting after success&amp;#34; &amp;amp;&amp;amp; sleep 10 &amp;amp;&amp;amp; exit 0&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;OnFailure&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;restart-always&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;image&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;docker.io/library/busybox:1.28&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;[&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;sh&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;-c&amp;#39;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#39;echo &amp;#34;Always restarting&amp;#34; &amp;amp;&amp;amp; sleep 1800 &amp;amp;&amp;amp; exit 0&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;restartPolicy&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Always&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;learn-more&#34;&gt;Learn more&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read the documentation for
&lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/pods/pod-lifecycle/#container-restart-rules&#34;&gt;container restart policy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Read the KEP for the
&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/5307-container-restart-policy&#34;&gt;Container Restart Rules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;roadmap&#34;&gt;Roadmap&lt;/h2&gt;
&lt;p&gt;More actions and signals to restart Pods and containers are coming! Notably,
there are plans to add support for restarting the entire Pod. Planning and
discussions on these features are in progress. Feel free to share feedback or
requests with the SIG Node community!&lt;/p&gt;
&lt;h2 id=&#34;your-feedback-is-welcome&#34;&gt;Your feedback is welcome!&lt;/h2&gt;
&lt;p&gt;This is an alpha feature, and the Kubernetes project would love to hear your feedback.
Please try it out. This feature is driven by the
&lt;a href=&#34;https://github.com/Kubernetes/community/blob/master/sig-node/README.md&#34;&gt;SIG Node&lt;/a&gt;.
If you are interested in helping develop this feature, sharing feedback, or
participating in any other ongoing SIG Node projects, please reach out to the
SIG Node community!&lt;/p&gt;
&lt;p&gt;You can reach SIG Node by several means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34;&gt;Mailing list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/labels/sig%2Fnode&#34;&gt;Open Community Issues/PRs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: User preferences (kuberc) are available for testing in kubectl 1.34</title>
      <link>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/08/28/kubernetes-v1-34-kubectl-kuberc-beta/</link>
      <pubDate>Thu, 28 Aug 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/blog/2025/08/28/kubernetes-v1-34-kubectl-kuberc-beta/</guid>
      <description>
        
        
        &lt;p&gt;Have you ever wished you could enable &lt;a href=&#34;https://kep.k8s.io/3895&#34;&gt;interactive delete&lt;/a&gt;,
by default, in &lt;code&gt;kubectl&lt;/code&gt;? Or maybe, you&#39;d like to have custom aliases defined,
but not necessarily &lt;a href=&#34;https://github.com/ahmetb/kubectl-aliases&#34;&gt;generate hundreds of them manually&lt;/a&gt;?
Look no further. &lt;a href=&#34;https://git.k8s.io/community/sig-cli/&#34;&gt;SIG-CLI&lt;/a&gt;
has been working hard to add &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;user preferences to kubectl&lt;/a&gt;,
and we are happy to announce that this functionality is reaching beta as part
of the Kubernetes v1.34 release.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;A full description of this functionality is available &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/kuberc/&#34;&gt;in our official documentation&lt;/a&gt;,
but this blog post will answer both of the questions from the beginning of this
article.&lt;/p&gt;
&lt;p&gt;Before we dive into details, let&#39;s quickly cover what the user preferences file
looks like and where to place it. By default, &lt;code&gt;kubectl&lt;/code&gt; will look for &lt;code&gt;kuberc&lt;/code&gt;
file in your default &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/concepts/configuration/organize-cluster-access-kubeconfig/&#34;&gt;kubeconfig&lt;/a&gt;
directory, which is &lt;code&gt;$HOME/.kube&lt;/code&gt;. Alternatively, you can specify this location
using &lt;code&gt;--kuberc&lt;/code&gt; option or the &lt;code&gt;KUBERC&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;p&gt;Just like every Kubernetes manifest, &lt;code&gt;kuberc&lt;/code&gt; file will start with an &lt;code&gt;apiVersion&lt;/code&gt;
and &lt;code&gt;kind&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;apiVersion&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;kubectl.config.k8s.io/v1beta1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;kind&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Preference&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# the user preferences will follow here&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;defaults&#34;&gt;Defaults&lt;/h3&gt;
&lt;p&gt;Let&#39;s start by setting default values for &lt;code&gt;kubectl&lt;/code&gt; command options. Our goal
is to always use interactive delete, which means we want the &lt;code&gt;--interactive&lt;/code&gt;
option for &lt;code&gt;kubectl delete&lt;/code&gt; to always be set to &lt;code&gt;true&lt;/code&gt;. This can be achieved
with the following addition to our &lt;code&gt;kuberc&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;defaults&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;delete&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;options&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;interactive&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the above example, I&#39;m introducing &lt;code&gt;defaults&lt;/code&gt; section, which allows users to
define default values for &lt;code&gt;kubectl&lt;/code&gt; options. In this case, we&#39;re setting the
interactive option for &lt;code&gt;kubectl delete&lt;/code&gt; to be &lt;code&gt;true&lt;/code&gt; by default. This default
can be overridden if a user explicitly provides a different value such as
&lt;code&gt;kubectl delete --interactive=false&lt;/code&gt;, in which case the explicit option takes
precedence.&lt;/p&gt;
&lt;p&gt;Another highly encouraged default from SIG-CLI, is using &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/server-side-apply/&#34;&gt;Server-Side Apply&lt;/a&gt;.
To do so, you can add the following snippet to your preferences:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# continuing defaults section&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;apply&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;options&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;server-side&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;aliases&#34;&gt;Aliases&lt;/h3&gt;
&lt;p&gt;The ability to define aliases allows us to save precious seconds when typing
commands. I bet that you most likely have one defined for &lt;code&gt;kubectl&lt;/code&gt;, because
typing seven letters is definitely longer than just pressing &lt;code&gt;k&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For this reason, the ability to define aliases was a must-have when we decided
to implement user preferences, alongside defaulting. To define an alias for any
of the built-in commands, expand your &lt;code&gt;kuberc&lt;/code&gt; file with the following addition:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;aliases&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;gns&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;get&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;prependArgs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;   &lt;/span&gt;- namespace&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;options&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;   &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;output&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;     &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;json&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There&#39;s a lot going on above, so let me break this down. First, we&#39;re introducing
a new section: &lt;code&gt;aliases&lt;/code&gt;. Here, we&#39;re defining a new alias &lt;code&gt;gns&lt;/code&gt;, which is mapped
to the command &lt;code&gt;get&lt;/code&gt; command. Next, we&#39;re defining arguments (&lt;code&gt;namespace&lt;/code&gt; resource)
that will be inserted right after the command name. Additionally, we&#39;re setting
&lt;code&gt;--output=json&lt;/code&gt; option for this alias. The structure of &lt;code&gt;options&lt;/code&gt; block is identical
to the one in the &lt;code&gt;defaults&lt;/code&gt; section.&lt;/p&gt;
&lt;p&gt;You probably noticed that we&#39;ve introduced a mechanism for prepending arguments,
and you might wonder if there is a complementary setting for appending them (in
other words, adding to the end of the command, after user-provided arguments).
This can be achieved through &lt;code&gt;appendArgs&lt;/code&gt; block, which is presented below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# continuing aliases section&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;runx&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;command&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;run&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;options&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;image&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;busybox&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- &lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;name&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;namespace&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;default&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;test-ns&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;appendArgs&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- --&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;    &lt;/span&gt;- custom-arg&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, we&#39;re introducing another alias: &lt;code&gt;runx&lt;/code&gt;, which invokes &lt;code&gt;kubectl run&lt;/code&gt; command,
passing &lt;code&gt;--image&lt;/code&gt; and &lt;code&gt;--namespace&lt;/code&gt; options with predefined values, and also
appending &lt;code&gt;--&lt;/code&gt; and &lt;code&gt;custom-arg&lt;/code&gt; at the end of the invocation.&lt;/p&gt;
&lt;h2 id=&#34;debugging&#34;&gt;Debugging&lt;/h2&gt;
&lt;p&gt;We hope that &lt;code&gt;kubectl&lt;/code&gt; user preferences will open up new possibilities for our users.
Whenever you&#39;re in doubt, feel free to run &lt;code&gt;kubectl&lt;/code&gt; with increased verbosity.
At &lt;code&gt;-v=5&lt;/code&gt;, you should get all the possible debugging information from this feature,
which will be crucial when reporting issues.&lt;/p&gt;
&lt;p&gt;To learn more, I encourage you to read through &lt;a href=&#34;https://deploy-preview-54621--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/kuberc/&#34;&gt;our official documentation&lt;/a&gt;
and the &lt;a href=&#34;https://git.k8s.io/enhancements/keps/sig-cli/3104-introduce-kuberc/README.md&#34;&gt;actual proposal&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Get involved&lt;/h2&gt;
&lt;p&gt;Kubectl user preferences feature has reached beta, and we are very interested
in your feedback. We&#39;d love to hear what you like about it and what problems
you&#39;d like to see it solve. Feel free to join &lt;a href=&#34;https://kubernetes.slack.com/archives/C2GL57FJ4&#34;&gt;SIG-CLI slack channel&lt;/a&gt;,
or open an issue against &lt;a href=&#34;https://git.k8s.io/kubectl/&#34;&gt;kubectl repository&lt;/a&gt;.
You can also join us at our &lt;a href=&#34;https://git.k8s.io/community/sig-cli/#meetings&#34;&gt;community meetings&lt;/a&gt;,
which happen every other Wednesday, and share your stories with us.&lt;/p&gt;

      </description>
    </item>
    
  </channel>
</rss>
