<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes Blog</title>
    <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/</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>uk</language>
    <image>
      <url>https://raw.githubusercontent.com/kubernetes/kubernetes/master/logo/logo.png</url>
      <title>The Kubernetes project logo</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/</link>
    </image>
    
    <atom:link href="https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/feed.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Що потрібно знати перед міграцією: пʼять несподіваних особливостей поведінки Ingress-NGINX</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/02/27/ingress-nginx-before-you-migrate/</link>
      <pubDate>Fri, 27 Feb 2026 07:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/02/27/ingress-nginx-before-you-migrate/</guid>
      <description>
        
        
        &lt;p&gt;Як було &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/11/11/ingress-nginx-retirement/&#34;&gt;оголошено&lt;/a&gt; в листопаді 2025 року, Kubernetes припинить підтримку Ingress-NGINX у березні 2026 року. Незважаючи на широке використання, Ingress-NGINX має безліч несподіваних стандартних налаштувань і побічних ефектів, які, ймовірно, присутні у вашому кластері зараз. У цьому дописі описано ці особливості, щоб ви могли безпечно здійснити міграцію та свідомо вирішити, які з них зберегти. У дописі також порівнюється Ingress-NGINX та Gateway API і показано, як зберегти особливості Ingress-NGINX у Gateway API. Ризик, що повторюється в кожному розділі, є однаковим: на перший погляд правильно виконане перетворення все одно може спричинити перебої в роботі, якщо не врахувати особливості Ingress-NGINX.&lt;/p&gt;
&lt;p&gt;Я припускаю, що ви, читачі, маєте певне уявлення про Ingress-NGINX та Ingress API. У більшості прикладів як бекенд використовується &lt;a href=&#34;https://github.com/postmanlabs/httpbin&#34;&gt;&lt;code&gt;httpbin&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Також зверніть увагу, що Ingress-NGINX і NGINX Ingress — це два окремі контролери Ingress. &lt;a href=&#34;https://github.com/kubernetes/ingress-nginx&#34;&gt;Ingress-NGINX&lt;/a&gt; — це контролер Ingress, який підтримується та керується спільнотою Kubernetes і який буде виведений з експлуатації в березні 2026 року. &lt;a href=&#34;https://docs.nginx.com/nginx-ingress-controller/&#34;&gt;NGINX Ingress&lt;/a&gt; — це контролер Ingress від F5. Обидва використовують NGINX як рівень обробки даних, але в іншому не повʼязані між собою. Відтепер у цій публікації ми будемо обговорювати лише Ingress-NGINX.&lt;/p&gt;
&lt;h2 id=&#34;1-regex-matches-are-prefix-based-and-case-insensitive&#34;&gt;1. Збіги регулярних виразів базуються на префіксах і не чутливі до регістру&lt;/h2&gt;
&lt;p&gt;Припустимо, ви хочете перенаправити всі запити зі шляхом, що складається лише з трьох великих літер, до сервісу &lt;code&gt;httpbin&lt;/code&gt;. Ви можете створити наступний Ingress з анотацією &lt;code&gt;nginx.ingress.kubernetes.io/use-regex:  &amp;quot;true&amp;quot;&lt;/code&gt; annotation and the regex pattern of &lt;code&gt;/[A-Z]{3}&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;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;Ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;regex-match-ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;nginx.ingress.kubernetes.io/use-regex&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;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;ingressClassName&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;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;host&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;regex-match.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;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:#008000;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 style=&#34;color:#b44&#34;&gt;&amp;#34;/[A-Z]{3}&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;pathType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ImplementationSpecific&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backend&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;service&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;number&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8000&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;Однак, оскільки регулярні вирази не враховують префікси та регістр, Ingress-NGINX перенаправляє будь-який запит із шляхом, що починається з будь-яких трьох літер, на httpbin:&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 -sS -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: regex-match.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;/uuid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;uuid&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;e55ef929-25a0-49e9-9175-1b6e87f40af7&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Примітка:&lt;/strong&gt; Точка доступу &lt;code&gt;/uuid&lt;/code&gt; httpbin повертає випадковий UUID. UUID у тілі відповіді означає, що запит був успішно перенаправлений до httpbin.&lt;/p&gt;
&lt;p&gt;За допомогою Gateway API ви можете використовувати &lt;a href=&#34;https://gateway-api.sigs.k8s.io/reference/spec/#httppathmatch&#34;&gt;HTTP path match&lt;/a&gt; з &lt;code&gt;type&lt;/code&gt; типу &lt;code&gt;RegularExpression&lt;/code&gt; для зіставлення шляхів за регулярним виразом. Зіставлення &lt;code&gt;RegularExpression&lt;/code&gt; залежать від конкретної реалізації, тому перевірте реалізацію Gateway API, щоб переконатися в семантиці зіставлення &lt;code&gt;RegularExpression&lt;/code&gt;. Популярні реалізації Gateway API на основі Envoy, такі як &lt;a href=&#34;https://istio.io/&#34;&gt;Istio&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, &lt;a href=&#34;https://gateway.envoyproxy.io/&#34;&gt;Envoy Gateway&lt;/a&gt; та &lt;a href=&#34;https://kgateway.dev/&#34;&gt;Kgateway&lt;/a&gt;, виконують повне співставлення з урахуванням регістру.&lt;/p&gt;
&lt;p&gt;Отже, якщо ви не знаєте, що шаблони Ingress-NGINX є префіксами і не чутливі до регістру, і, не знаючи про це, клієнти або застосунки надсилають трафік до &lt;code&gt;/uuid&lt;/code&gt; (або &lt;code&gt;/uuid/some/other/path&lt;/code&gt;), ви можете створити такий маршрут HTTP.&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;regex-match-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;hostnames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- regex-match.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;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;&amp;lt;your gateway&amp;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;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;RegularExpression&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/[A-Z]{3}&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;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;8000&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;Однак, якщо ваша реалізація Gateway API виконує повне співставлення з урахуванням регістру, вищевказаний маршрут HTTP не буде відповідати запиту зі шляхом &lt;code&gt;/uuid&lt;/code&gt;. Таким чином, вищевказаний маршрут HTTP спричинить збій, оскільки запити, які Ingress-NGINX маршрутизував до httpbin, завершаться з помилкою 404 Not Found на шлюзі.&lt;/p&gt;
&lt;p&gt;Щоб зберегти співставлення регулярних виразів без урахування регістру, ви можете використовувати наступний маршрут HTTP.&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;regex-match-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;hostnames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- regex-match.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;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;&amp;lt;your gateway&amp;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;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;RegularExpression&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/[a-zA-Z]{3}.*&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;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;8000&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;code&gt;(?i)&lt;/code&gt; для позначення збігів, нечутливих до регістру. Використовуючи цей прапорець, шаблон може бути таким: &lt;code&gt;(?i)/[a-z]{3}.*&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;2-the-nginx-ingress-kubernetes-io-use-regex-applies-to-all-paths-of-a-host-across-all-ingress-nginx-ingresses&#34;&gt;2. &lt;code&gt;nginx.ingress.kubernetes.io/use-regex&lt;/code&gt; застосовується до всіх шляхів хоста у всіх (Ingress-NGINX) Ingresses&lt;/h2&gt;
&lt;p&gt;Тепер припустимо, що у вас є Ingress з анотацією &lt;code&gt;nginx.ingress.kubernetes.io/use-regex: &amp;quot;true&amp;quot;&lt;/code&gt;, але ви хочете маршрутизувати запити з шляхом &lt;code&gt;/headers&lt;/code&gt; до &lt;code&gt;httpbin&lt;/code&gt;. На жаль, ви зробили помилку і встановили шлях &lt;code&gt;/Header&lt;/code&gt; замість &lt;code&gt;/headers&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:#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;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;Ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;regex-match-ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;nginx.ingress.kubernetes.io/use-regex&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;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;ingressClassName&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;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;host&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;regex-match.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;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:#008000;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 style=&#34;color:#b44&#34;&gt;&amp;#34;&amp;lt;some regex pattern&amp;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;pathType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;ImplementationSpecific&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backend&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;service&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;&amp;lt;your backend&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;number&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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;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;Ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;regex-match-ingress-other&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;ingressClassName&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;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;host&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;regex-match.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;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:#008000;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 style=&#34;color:#b44&#34;&gt;&amp;#34;/Header&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;# тут помилка, має бути /headers&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;pathType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backend&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;service&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;number&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8000&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;code&gt;/headers&lt;/code&gt; поверне відповідь 404 Not Found, оскільки &lt;code&gt;/headers&lt;/code&gt; не відповідає &lt;code&gt;Exact&lt;/code&gt; шляху &lt;code&gt;/Header&lt;/code&gt;. Однак, оскільки Ingress &lt;code&gt;regex-match-ingress&lt;/code&gt; має анотацію &lt;code&gt;nginx.ingress.kubernetes.io/use-regex: &amp;quot;true&amp;quot;&lt;/code&gt; і хост &lt;code&gt;regex-match.example.com&lt;/code&gt;, &lt;strong&gt;всі шляхи з хостом &lt;code&gt;regex-match.example.com&lt;/code&gt; розглядаються як регулярні вирази у всіх (Ingress-NGINX) Ingress.&lt;/strong&gt; Оскільки шаблони регулярних виразів є префіксними збігами, що не чутливі до регістру, &lt;code&gt;/headers&lt;/code&gt; збігається з шаблоном &lt;code&gt;/Header&lt;/code&gt;, і Ingress-NGINX маршрутизує такі запити до &lt;code&gt;httpbin&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sS -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: regex-match.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;/headers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#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 style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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;p&gt;&lt;strong&gt;Примітка:&lt;/strong&gt; Точка доступу &lt;code&gt;/headers&lt;/code&gt; httpbin повертає заголовки запиту. Те, що відповідь містить заголовки запиту в тілі, означає, що запит був успішно перенаправлений на httpbin.&lt;/p&gt;
&lt;p&gt;Gateway API не перетворює і не інтерпретує збіги &lt;code&gt;Exact&lt;/code&gt; і &lt;code&gt;Prefix&lt;/code&gt; як шаблони регулярних виразів. Тому, якщо ви перетворили вищезазначені Ingresses у наступний маршрут HTTP і зберегли типи помилок і збігів, запити до &lt;code&gt;/headers&lt;/code&gt; будуть відповідати кодом 404 Not Found замість 200 OK.&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;regex-match-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;hostnames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- regex-match.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;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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/Header&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;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;8000&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;/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;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;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/Header&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;/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;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;RegularExpression&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;(?i)/Header&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;/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;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;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/headers&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;h2 id=&#34;3-rewrite-target-implies-regex&#34;&gt;3. Переписування цільового обʼєкта передбачає використання регулярного виразу&lt;/h2&gt;
&lt;p&gt;У цьому випадку припустимо, що ви хочете переписати шлях запитів із &lt;code&gt;/ip&lt;/code&gt; на &lt;code&gt;/uuid&lt;/code&gt; перед їх маршрутизацією до &lt;code&gt;httpbin&lt;/code&gt;, і, як у розділі 2, ви хочете маршрутизувати запити із шляхом &lt;code&gt;/headers&lt;/code&gt; до &lt;code&gt;httpbin&lt;/code&gt;. Однак ви випадково зробили помилку і встановили шлях &lt;code&gt;/IP&lt;/code&gt; замість &lt;code&gt;/ip&lt;/code&gt; і &lt;code&gt;/Header&lt;/code&gt; замість &lt;code&gt;/headers&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:#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;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;Ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;rewrite-target-ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;nginx.ingress.kubernetes.io/rewrite-target&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;/uuid&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;ingressClassName&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;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;host&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rewrite-target.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;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:#008000;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 style=&#34;color:#b44&#34;&gt;&amp;#34;/IP&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;pathType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backend&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;service&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;number&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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;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;Ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;rewrite-target-ingress-other&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;ingressClassName&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;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;host&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;rewrite-target.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;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:#008000;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 style=&#34;color:#b44&#34;&gt;&amp;#34;/Header&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;pathType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backend&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;service&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;number&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8000&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;code&gt;nginx.ingress.kubernetes.io/rewrite-target: «/uuid»&lt;/code&gt; призводить до того, що запити, які відповідають шляхам в Ingress &lt;code&gt;rewrite-target-ingress&lt;/code&gt;, мають свої шляхи перетворені на &lt;code&gt;/uuid&lt;/code&gt; перед тим, як бути перенаправленими на бекенд.&lt;/p&gt;
&lt;p&gt;Незважаючи на те, що жоден Ingress не має анотації &lt;code&gt;nginx.ingress.kubernetes.io/use-regex: &amp;quot;true&amp;quot;&lt;/code&gt;, наявність анотації &lt;code&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/code&gt; в Ingress &lt;code&gt;rewrite-target-ingress&lt;/code&gt; призводить до того, що &lt;strong&gt;всі шляхи з хостом &lt;code&gt;rewrite-target.example.com&lt;/code&gt; розглядаються як шаблони регулярних виразів.&lt;/strong&gt; Іншими словами, &lt;code&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/code&gt; тихо додає анотацію &lt;code&gt;nginx.ingress.kubernetes.io/use-regex: &amp;quot;true&amp;quot;&lt;/code&gt;, разом з усіма побічними ефектами, описаними вище.&lt;/p&gt;
&lt;p&gt;Наприклад, шлях запиту до &lt;code&gt;/ip&lt;/code&gt; перезаписується на &lt;code&gt;/uuid&lt;/code&gt;, оскільки &lt;code&gt;/ip&lt;/code&gt; відповідає префіксу &lt;code&gt;/IP&lt;/code&gt;, що не чутливий до регістру, в Ingress &lt;code&gt;rewrite-target-ingress&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sS -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: rewrite-target.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;/ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;uuid&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;12a0def9-1adg-2943-adcd-1234aadfgc67&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Як і в прикладі &lt;code&gt;nginx.ingress.kubernetes.io/use-regex&lt;/code&gt;, Ingress-NGINX обробляє &lt;code&gt;path&lt;/code&gt; інших інгресів з хостом &lt;code&gt;rewrite-target.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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sS -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: rewrite-target.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;/headers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#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 style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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;p&gt;Ви можете налаштувати перезапис шляхів у Gateway API за допомогою &lt;a href=&#34;https://gateway-api.sigs.k8s.io/reference/spec/#httpurlrewritefilter&#34;&gt;фільтра перезапису HTTP URL&lt;/a&gt;, який не перетворює ваші збіги &lt;code&gt;Exact&lt;/code&gt; та &lt;code&gt;Prefix&lt;/code&gt; у шаблони регулярних виразів. Однак, якщо ви не знаєте про побічні ефекти анотації &lt;code&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/code&gt; і не розумієте, що &lt;code&gt;/Header&lt;/code&gt; і &lt;code&gt;/IP&lt;/code&gt; є помилками, ви можете створити такий маршрут HTTP.&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;rewrite-target-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;hostnames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- rewrite-target.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;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;&amp;lt;your-gateway&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/IP&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;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;URLRewrite&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;urlRewrite&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;ReplaceFullPath&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;replaceFullPath&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;/uuid&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;8000&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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:#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;type&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/Header&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;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;8000&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;Як і в розділі 2, оскільки &lt;code&gt;/IP&lt;/code&gt; тепер є типом збігу &lt;code&gt;Exact&lt;/code&gt; у вашому маршруті HTTP, запити до &lt;code&gt;/ip&lt;/code&gt; будуть відповідати кодом 404 Not Found замість 200 OK. Аналогічно, запити до &lt;code&gt;/headers&lt;/code&gt; також будуть відповідати кодом 404 Not Found замість 200 OK. Таким чином, цей маршрут HTTP порушить роботу застосунків і клієнтів, які покладаються на маршрути &lt;code&gt;/ip&lt;/code&gt; і &lt;code&gt;/headers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Щоб виправити це, ви можете змінити збіги в маршруті HTTP на збіги регулярних виразів і змінити шаблони шляхів на збіги префіксів, що не чутливі до регістру, як показано нижче.&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;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;RegularExpression&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;(?i)/IP.*&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;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;RegularExpression&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;(?i)/Header.*&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;code&gt;Exact&lt;/code&gt; і виправити помилки.&lt;/p&gt;
&lt;h2 id=&#34;4-requests-missing-a-trailing-slash-are-redirected-to-the-same-path-with-a-trailing-slash&#34;&gt;4. Запити, в яких відсутній кінцевий слеш, перенаправляються на той самий шлях з кінцевим слешем&lt;/h2&gt;
&lt;p&gt;Розглянемо наступний Ingress:&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;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;Ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;trailing-slash-ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;ingressClassName&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;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;host&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;trailing-slash.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;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:#008000;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 style=&#34;color:#b44&#34;&gt;&amp;#34;/my-path/&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;pathType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backend&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;service&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;&amp;lt;your-backend&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;number&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8000&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;Ви можете очікувати, що Ingress-NGINX відповість на &lt;code&gt;/my-path&lt;/code&gt; кодом 404 Not Found, оскільки &lt;code&gt;/my-path&lt;/code&gt; не збігається з &lt;code&gt;Exact&lt;/code&gt; шляхом &lt;code&gt;/my-path/&lt;/code&gt;. Однак Ingress-NGINX перенаправляє запит на &lt;code&gt;/my-path/&lt;/code&gt; з кодом 301 Moved Permanently, оскільки єдина відмінність між &lt;code&gt;/my-path&lt;/code&gt; і &lt;code&gt;/my-path/&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -isS -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: trailing-slash.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;/my-path
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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-http&#34; data-lang=&#34;http&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;HTTP&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.1&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;301&lt;/span&gt; &lt;span style=&#34;color:#d2413a;font-weight:bold&#34;&gt;Moved Permanently&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Location: http://trailing-slash.example.com/my-path/
&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;Те саме стосується випадків, коли ви змінюєте &lt;code&gt;pathType&lt;/code&gt; на &lt;code&gt;Prefix&lt;/code&gt;. Однак перенаправлення не відбувається, якщо шлях є шаблоном регулярного виразу.&lt;/p&gt;
&lt;p&gt;Сумісні реалізації Gateway API не конфігурують жодних перенаправлень без попередження. Якщо клієнти або сервіси нижчого рівня залежать від цього перенаправлення, міграція до Gateway API, який не конфігурує перенаправлення запитів явно, спричинить збій, оскільки запити до &lt;code&gt;/my-path&lt;/code&gt; тепер будуть відповідати кодом 404 Not Found замість 301 Moved Permanently. Ви можете явно налаштувати перенаправлення за допомогою &lt;a href=&#34;https://gateway-api.sigs.k8s.io/reference/spec/#httprequestredirectfilter&#34;&gt;фільтра перенаправлення HTTP-запитів&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;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;trailing-slash-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;hostnames&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;- trailing-slash.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;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;&amp;lt;your-gateway&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/my-path&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;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;requestRedirect&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;statusCode&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;301&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;ReplaceFullPath&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;replaceFullPath&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;/my-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;- &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;Exact&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#080;font-style:italic&#34;&gt;# або Prefix&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;/my-path/&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;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;&amp;lt;your-backend&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;8000&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;5-ingress-nginx-normalizes-urls&#34;&gt;5. Ingress-NGINX нормалізує URL-адреси&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Нормалізація URL-адреси&lt;/em&gt; — це процес перетворення URL-адреси в канонічну форму перед її зіставленням з правилами Ingress і маршрутизацією. Особливості нормалізації URL-адреси визначені в &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc3986#section-6.2&#34;&gt;RFC 3986, розділ 6.2&lt;/a&gt;, але ось декілька прикладів&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;видалення сегментів шляху, які є лише &lt;code&gt;.&lt;/code&gt;: &lt;code&gt;my/./path -&amp;gt; my/path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;сегмент шляху &lt;code&gt;..&lt;/code&gt; видаляє попередній сегмент: &lt;code&gt;my/../path -&amp;gt; /path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;видалення послідовних косих рисок у шляху: &lt;code&gt;my//path -&amp;gt; my/path&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ingress-NGINX нормалізує URL-адреси перед їх порівнянням з правилами Ingress. Наприклад, розглянемо наступний Ingress:&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;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;Ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;path-normalization-ingress&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;ingressClassName&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;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;host&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;path-normalization.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;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:#008000;font-weight:bold&#34;&gt;paths&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 style=&#34;color:#b44&#34;&gt;&amp;#34;/uuid&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;pathType&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;Exact&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;backend&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;          &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;service&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;httpbin&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;              &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;number&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;8000&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;Ingress-NGINX нормалізує шлях наступних запитів до &lt;code&gt;/uuid&lt;/code&gt;. Тепер, коли запит відповідає шляху &lt;code&gt;Exact&lt;/code&gt; &lt;code&gt;/uuid&lt;/code&gt;, Ingress-NGINX відповідає або кодом 200 OK, або кодом 301 Moved Permanently до &lt;code&gt;/uuid&lt;/code&gt;.&lt;/p&gt;
&lt;p&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;curl -sS -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: path-normalization.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;/uuid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sS -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: path-normalization.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;/ip/abc/../../uuid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sSi -H &lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;Host: path-normalization.example.com&amp;#34;&lt;/span&gt; http://&amp;lt;your-ingress-ip&amp;gt;////uuid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;uuid&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;29c77dfe-73ec-4449-b70a-ef328ea9dbce&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;/code&gt;&lt;/pre&gt;&lt;/div&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&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#008000;font-weight:bold&#34;&gt;&amp;#34;uuid&amp;#34;: &lt;/span&gt;&lt;span style=&#34;color:#b44&#34;&gt;&amp;#34;d20d92e8-af57-4014-80ba-cf21c0c4ffae&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;/code&gt;&lt;/pre&gt;&lt;/div&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-http&#34; data-lang=&#34;http&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;HTTP&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;1.1&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;301&lt;/span&gt; &lt;span style=&#34;color:#d2413a;font-weight:bold&#34;&gt;Moved Permanently&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Location: /uuid
&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;Ваші бекенди можуть покладатися на реалізацію API Ingress/Gateway для нормалізації URL-адрес. При цьому більшість реалізацій API Gateway мають стагжартно увімкнену функцію нормалізації шляхів. Наприклад, Istio, Envoy Gateway та Kgateway нормалізують сегменти &lt;code&gt;.&lt;/code&gt; та &lt;code&gt;..&lt;/code&gt; без додаткових налаштувань. Для отримання детальнішої інформації перегляньте документацію для кожної реалізації API Gateway, яку ви використовуєте.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Підсумок&lt;/h2&gt;
&lt;p&gt;Оскільки ми всі поспішаємо реагувати на виведення з експлуатації Ingress-NGINX, сподіваюся, що ця публікація додасть вам впевненості в тому, що ви зможете безпечно та ефективно здійснити міграцію, незважаючи на всі складнощі Ingress-NGINX.&lt;/p&gt;
&lt;p&gt;SIG Network також працює над підтримкою найпоширеніших анотацій Ingress-NGINX (та деяких несподіваних поведінок) в &lt;a href=&#34;https://github.com/kubernetes-sigs/ingress2gateway&#34;&gt;Ingress2Gateway&lt;/a&gt;, щоб допомогти вам перетворити конфігурацію Ingress-NGINX на Gateway API та запропонувати альтернативи для непідтримуваних поведінок.&lt;/p&gt;
&lt;p&gt;SIG Network випустила Gateway API 1.5 сьогодні (27 лютого 2026 року), яка вдосконалює такі функції, як &lt;a href=&#34;https://gateway-api.sigs.k8s.io/api-types/listenerset/&#34;&gt;ListenerSet&lt;/a&gt; (що дозволяє розробникам додатків краще управляти сертифікатами TLS) та фільтр HTTPRoute CORS, що дозволяє конфігурувати CORS.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Ви можете використовувати Istio виключно як контролер Gateway API без інших функцій сервісної мережі.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

      </description>
    </item>
    
    <item>
      <title>Представляємо контролер готовності вузлів</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/02/03/introducing-node-readiness-controller/</link>
      <pubDate>Tue, 03 Feb 2026 10:00:00 +0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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;Логотип контролера готовності вузла&#34; /&gt;
&lt;p&gt;У стандартній моделі Kubernetes придатність вузла для робочих навантажень залежить від єдиного бінарного стану «Ready» («Готовий»). Однак у сучасних середовищах Kubernetes вузли потребують складних інфраструктурних залежностей, таких як мережеві агенти, драйвери сховищ, прошивка GPU або спеціальні перевірки працездатності, щоб бути повністю готовими до роботи, перш ніж вони зможуть надійно обслуговувати поди.&lt;/p&gt;
&lt;p&gt;Сьогодні від імені проєкту Kubernetes я оголошую про запуск &lt;a href=&#34;https://node-readiness-controller.sigs.k8s.io/&#34;&gt;Node Readiness Controller&lt;/a&gt;. Цей проєкт впроваджує декларативну систему для управління позначками вузлів, розширюючи захисні барʼєри готовності під час завантаження вузлів за межі стандартних станів. Динамічно керуючи taints на основі спеціальних сигналів стану, контролер гарантує, що робочі навантаження розміщуються тільки на вузлах, які відповідають усім вимогам інфраструктури.&lt;/p&gt;
&lt;h2 id=&#34;why-the-node-readiness-controller&#34;&gt;Навіщо потрібен контролер готовності вузлів?&lt;/h2&gt;
&lt;p&gt;Основний статус «Ready» вузлів Kubernetes часто є недостатнім для кластерів із складними вимогами до ініціалізації. Оператори часто стикаються з труднощами, намагаючись переконатися, що певні DaemonSets або локальні сервіси працюють належним чином, перш ніж вузол потрапить до пулу планування.&lt;/p&gt;
&lt;p&gt;Контролер готовності вузлів заповнює цю прогалину, дозволяючи операторам визначати власні правила планування, адаптовані до конкретних груп вузлів. Це дозволяє застосовувати різні вимоги до готовності в гетерогенних кластерах, гарантуючи, наприклад, що вузли, оснащені GPU, приймають поди тільки після перевірки спеціалізованих драйверів, тоді як вузли загального призначення дотримуються стандартного шляху.&lt;/p&gt;
&lt;p&gt;Він надає три основні переваги:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Налаштовані визначення готовності&lt;/strong&gt;: визначте, що означає &lt;em&gt;готовий&lt;/em&gt; для вашої конкретної платформи.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Автоматизоване управління позначками&lt;/strong&gt;: контролер автоматично застосовує або видаляє позначки taint вузлів на основі стану, запобігаючи потраплянню подів на непідготовлену інфраструктуру.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Декларативна ініціалізація вузлів&lt;/strong&gt;: надійно керуйте багатоетапною ініціалізацією вузлів із чітким спостереженням за процесом ініціалізації.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;core-concepts-and-features&#34;&gt;Основні поняття та функції&lt;/h2&gt;
&lt;p&gt;Контролер базується на API NodeReadinessRule (NRR), який дозволяє визначати декларативні &lt;em&gt;gate&lt;/em&gt; для ваших вузлів.&lt;/p&gt;
&lt;h3 id=&#34;flexible-enforcement-modes&#34;&gt;Гнучкі режими виконання&lt;/h3&gt;
&lt;p&gt;Контролер підтримує два різних режими роботи:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Безперервне виконання&lt;/dt&gt;
&lt;dd&gt;Активно підтримує гарантію готовності протягом усього життєвого циклу вузла. Якщо пізніше виникає критична залежність (наприклад, драйвер пристрою), вузол негайно позначається як несправний, щоб запобігти новому плануванню.&lt;/dd&gt;
&lt;dt&gt;Виконання тільки під час завантаження&lt;/dt&gt;
&lt;dd&gt;Спеціально для одноразових кроків ініціалізації, таких як попереднє завантаження важких образів або підготовка обладнання. Після виконання умов контролер позначає завантаження як завершене і припиняє моніторинг цього конкретного правила для вузла.&lt;/dd&gt;
&lt;/dl&gt;
&lt;h3 id=&#34;condition-reporting&#34;&gt;Звіт про стан&lt;/h3&gt;
&lt;p&gt;Контролер реагує на стан вузлів, а не виконує перевірки працездатності самостійно. Така роздільна конструкція дозволяє йому безперешкодно інтегруватися з іншими інструментами, що існують в екосистемі, а також з індивідуальними рішеннями:&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;: використовуйте наявні налаштування NPD та власні скрипти для звітування про стан вузлів.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness Condition Reporter&lt;/strong&gt;: легкий агент, наданий проєктом, який можна розгорнути для періодичної перевірки локальних HTTP точок доступу та відповідного виправлення стану вузлів.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;operational-safety-with-dry-run&#34;&gt;Операційна безпека з тестовим запуском&lt;/h3&gt;
&lt;p&gt;Впровадження нових правил готовності у всьому парку обладнання несе в собі певний ризик. Щоб його зменшити, режим &lt;em&gt;тестового запуску&lt;/em&gt; (&lt;em&gt;dry run&lt;/em&gt;) дозволяє операторам спочатку змоделювати вплив на кластер. У цьому режимі контролер реєструє заплановані дії та оновлює статус правила, щоб показати вузли, на які це вплине, без застосування фактичних позначок taint, що дозволяє безпечно перевірити правило перед його впровадженням.&lt;/p&gt;
&lt;h2 id=&#34;example-cni-bootstrapping&#34;&gt;Приклад: ініціалізація CNI&lt;/h2&gt;
&lt;p&gt;Наступне правило NodeReadinessRule гарантує, що вузол залишатиметься таким, що не підлягає плануванню, доки його агент CNI не почне функціонувати. Контролер відстежує спеціальну умову &lt;code&gt;cniplugin.example.net/NetworkReady&lt;/code&gt; і видаляє позначку &lt;code&gt;readiness.k8s.io/acme.com/network-unavailable&lt;/code&gt; лише тоді, коли статус стає 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;Демо&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;Приєднуйтесь&lt;/h2&gt;
&lt;p&gt;Node Readiness Controller тільки починає свою роботу, і ми випустили перші версії [https://github.com/kubernetes-sigs/node-readiness-controller/releases/tag/v0.1.1). Зараз ми чекаємо на відгуки від спільноти, щоб вдосконалити план розвитку. Після плідних дискусій на Unconference під час KubeCon NA 2025 ми з радістю продовжимо розмову віч-на-віч.&lt;/p&gt;
&lt;p&gt;Приєднуйтесь до нас на KubeCon + CloudNativeCon Europe 2026 на сесії для розробників: &lt;em&gt;&lt;a href=&#34;https://sched.co/2EF6E&#34;&gt;Вирішення проблеми недетермінованого планування: представлення Node Readiness Controller&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Тим часом ви можете долучитися до нашої роботи або стежити за нашими досягненнями тут:&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: долучіться до обговорення в &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;Документація: &lt;a href=&#34;https://node-readiness-controller.sigs.k8s.io/&#34;&gt;Початок роботи&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Нове перетворення з cgroup v1 CPU Shares на v2 CPU Weight</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/30/new-cgroup-v1-to-v2-cpu-conversion-formula/</guid>
      <description>
        
        
        &lt;p&gt;Я радий повідомити про впровадження вдосконаленої формули перетворення з cgroup v1 CPU shares на cgroup v2 CPU weight. Це вдосконалення вирішує критичні проблеми з розподілом пріоритетів CPU для робочих навантажень Kubernetes під час роботи на системах з cgroup v2.&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Історія&lt;/h2&gt;
&lt;p&gt;Kubernetes спочатку був розроблений з урахуванням cgroup v1, де CPU shares  визначалися просто шляхом присвоєння контейнеру CPU-запитів у вигляді millicpu.&lt;/p&gt;
&lt;p&gt;Наприклад, контейнер, що запитує 1 CPU (1024m) отримає (cpu.shares = 1024).&lt;/p&gt;
&lt;p&gt;Через деякий час почалася заміна cgroup v1 на його наступника,  cgroup v2. У cgroup v2 концепція частки процесора (яка коливається від 2 до
262144, або від 2¹ до 2¹⁸) була замінена CPU weight (яка коливається від  [1, 10000], або від 10⁰ до 10⁴).&lt;/p&gt;
&lt;p&gt;З переходом на 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;  впровадив формулу перетворення для зіставлення cgroup v1 CPU shares з cgroup v2 CPU  weight. Формула перетворення була визначена як: &lt;code&gt;cpu.weight = (1 + ((cpu.shares - 2) * 9999) / 262142)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ця формула лінійно співвідносить значення від [2¹, 2¹⁸] до [10⁰, 10⁴].&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Лінійна формула перетворення&#34; src=&#34;https://deploy-preview-48551--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;Хоча цей підхід є простим, лінійне співвідношення створює кілька значних  проблем і впливає як на продуктивність, так і на ступінь деталізації конфігурації.&lt;/p&gt;
&lt;h2 id=&#34;problems-with-previous-conversion-formula&#34;&gt;Проблеми з попередньою формулою перетворення&lt;/h2&gt;
&lt;p&gt;Поточна формула перетворення створює дві основні проблеми:&lt;/p&gt;
&lt;h3 id=&#34;1-reduced-priority-against-non-kubernetes-workloads&#34;&gt;1. Зниження пріоритету порівняно з робочими навантаженнями, що не належать до Kubernetes&lt;/h3&gt;
&lt;p&gt;У cgroup v1 стандартне значення для розподілу ресурсів процесора становить &lt;code&gt;1024&lt;/code&gt;, що означає, що контейнер, який  запитує 1 процесор, має такий самий пріоритет, як і системні процеси, що знаходяться поза межами Kubernetes. Однак у cgroup v2 CPU weight у стандартних налаштуваннях становить &lt;code&gt;100&lt;/code&gt;, але поточна формула перетворює 1 CPU (1024m) лише на &lt;code&gt;≈39&lt;/code&gt; weight — менше ніж 40 % від стандартного значення.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Приклад:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Контейнер, що запитує 1 CPU (1024m)&lt;/li&gt;
&lt;li&gt;cgroup v1: &lt;code&gt;cpu.shares = 1024&lt;/code&gt; (дорівнює стандартному значенню)&lt;/li&gt;
&lt;li&gt;cgroup v2 (поточний): &lt;code&gt;cpu.weight = 39&lt;/code&gt; (значно нижче за стандартне значення 100)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це означає, що після переходу на cgroup v2 робочі навантаження Kubernetes (або OCI) фактично знизять пріоритет CPU порівняно з процесами, що не належать до Kubernetes. Проблема може бути серйозною для конфігурацій з великою кількістю системних демонів, які працюють поза межами Kubernetes і очікують, що робочі навантаження Kubernetes матимуть пріоритет, особливо в ситуаціях нестачі ресурсів.&lt;/p&gt;
&lt;h3 id=&#34;2-unmanageable-granularity&#34;&gt;2. Некерована деталізація&lt;/h3&gt;
&lt;p&gt;Поточна формула дає дуже низькі значення для невеликих запитів на використання CPU, обмежуючи можливість створювати підгрупи cgroup всередині контейнерів для детального розподілу ресурсів (що, ймовірно, стане набагато простішим у майбутньому, див. &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5474&#34;&gt;KEP #5474&lt;/a&gt; для отримання додаткової інформації).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Приклад:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Контейнер, що запитує 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 (поточна): &lt;code&gt;cpu.weight = 4&lt;/code&gt; (занадто низьке значення для конфігурації підгруп cgroup)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;З cgroup v1 запит на 100m CPU, що призвів до 102 CPU shares, був керованим у тому сенсі, що підгрупи cgroup могли бути створені всередині основного  контейнера, призначаючи детальні пріоритети CPU для різних груп процесів. Однак з cgroup v2 дуже важко розподілити 4 shares між підгрупами cgroup, оскільки це недостатньо детально.&lt;/p&gt;
&lt;p&gt;З планами дозволити &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5474&#34;&gt;записувані cgroups для контейнерів без привілеїв&lt;/a&gt;, це стає ще  більш актуальним.&lt;/p&gt;
&lt;h2 id=&#34;new-conversion-formula&#34;&gt;Нова формула перетворення&lt;/h2&gt;
&lt;h3 id=&#34;description&#34;&gt;Опис&lt;/h3&gt;
&lt;p&gt;Нова формула є більш складною, але набагато краще відображає ‍ співвідношення між cgroup v1 CPU shares та 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{ де: } L = \log_2(cpu.shares)$$&lt;/div&gt;&lt;p&gt;Ідея полягає в тому, що це квадратична функція, яка перетинає наступні значення:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(2, 1): мінімальні значення для обох діапазонів.&lt;/li&gt;
&lt;li&gt;(1024, 100): стандартні значення для обох діапазонів.&lt;/li&gt;
&lt;li&gt;(262144, 10000): максимальні значення для обох діапазонів.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Візуально нова функція виглядає наступним чином:&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-48551--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;А якщо збільшити важливу частину:&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-48551--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;Нова формула є «майже лінійною», проте вона ретельно розроблена для  розумного зіставлення діапазонів, щоб три важливі точки, зазначені вище, перетиналися.&lt;/p&gt;
&lt;h3 id=&#34;how-it-solves-the-problems&#34;&gt;Як це розвʼязує проблеми&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Кращя узгодженість пріоритетів:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Контейнер, що запитує 1 CPU (1024m) тепер отримає &lt;code&gt;cpu.weight = 102&lt;/code&gt;. Це значення близьке до стандартного значення 100 в cgroup v2. Це відновлює передбачуване співвідношення пріоритетів між робочими навантаженнями Kubernetes і системними процесами.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Покращена деталізація:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Контейнер, що запитує 100m CPU, отримає &lt;code&gt;cpu.weight = 17&lt;/code&gt;, (дивіться &lt;a href=&#34;https://go.dev/play/p/sLlAfCg54Eg&#34;&gt;тут&lt;/a&gt;). Це дозволяє краще розподіляти ресурси в контейнерах.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;adoption-and-integration&#34;&gt;Впровадження та інтеграція&lt;/h2&gt;
&lt;p&gt;Ця зміна була впроваджена на рівні OCI. Іншими словами, вона не впроваджена в самому Kubernetes, тому  впровадження нової формули перетворення залежить виключно від  впровадження OCI runtime.&lt;/p&gt;
&lt;p&gt;Наприклад:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;runc: нова формула увімкнена з версії &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: нова формула увімкнена з версії &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;Вплив на наявні розгортання&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Важливо:&lt;/strong&gt; Деякі споживачі можуть зазнати впливу, якщо вони використовують стару лінійну формулу перетворення. Застосування або інструменти моніторингу, які безпосередньо обчислюють очікувані значення CPU weight на основі попередньої формули, можуть потребувати оновлення, щоб врахувати нове квадратичне перетворення. Це особливо актуально для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Настроюваних інструментів управління ресурсами, які прогнозують значення CPU weight.&lt;/li&gt;
&lt;li&gt;Систем моніторингу, які перевіряють або очікують конкретні значення ваги.&lt;/li&gt;
&lt;li&gt;Застосунків, які програмно встановлюють або перевіряють значення CPU weight.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;У рамках проєкту Kubernetes рекомендується протестувати нову формулу перетворення в тестових середовищах перед оновленням OCI runtimes, щоб забезпечити сумісність з наявними інструментами.&lt;/p&gt;
&lt;h2 id=&#34;where-can-i-learn-more&#34;&gt;Де можна дізнатися більше?&lt;/h2&gt;
&lt;p&gt;Для тих, хто цікавиться цим вдосконаленням:&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; — Докладний технічний аналіз і приклади, включаючи обговорення та обґрунтування вибору
вищезазначеної формули.&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; — Оригінальна реалізація cgroup v2 в Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/&#34;&gt;Документація Kubernetes cgroup&lt;/a&gt; — Поточні рекомендації щодо управління ресурсами.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;Як долучитися?&lt;/h2&gt;
&lt;p&gt;Якщо ви зацікавлені у розробці функцій на рівні вузлів Kubernetes, приєднуйтесь до &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;спеціальної групи за інтересами Kubernetes Node Special Interest Group&lt;/a&gt;. Ми завжди раді новим учасникам та різноманітним поглядам на проблеми управління ресурсами.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Ingress NGINX: Заява комітетів з управління та реагування на загрози безпеки Kubernetes</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/29/ingress-nginx-statement/</link>
      <pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/29/ingress-nginx-statement/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;У березні 2026 року Kubernetes припинить підтримку Ingress NGINX, важливої інфраструктури для приблизно половини хмарних середовищ.&lt;/strong&gt; Припинення підтримки Ingress NGINX було &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/11/ingress-nginx-retirement/&#34;&gt;оголошено&lt;/a&gt; на березень 2026 року після років &lt;a href=&#34;https://groups.google.com/a/kubernetes.io/g/dev/c/rxtrKvT_Q8E/m/6_ej0c1ZBAAJ&#34;&gt;публічних попереджень&lt;/a&gt; про те, що проєкт гостро потребує учасників та супровідників. Після припинення підтримки проєкту більше не буде випусків для виправлення помилок, патчів безпеки або будь-яких оновлень. Це не можна ігнорувати, відкидати або залишати на останню хвилину. Ми не можемо переоцінити серйозність ситуації та важливість негайного початку міграції на альтернативні рішення, такі як &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/getting-started/&#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;.&lt;/p&gt;
&lt;p&gt;Щоб було абсолютно зрозуміло: рішення залишитися з Ingress NGINX після припинення його підтримки робить вас і ваших користувачів вразливими до атак. Жодна з доступних альтернатив не є прямою заміною. Це вимагатиме часу на планування та розробку. Половина з вас буде зачеплена цією проблемою. У вас залишилося два місяці на підготовку.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Поточні розгортання продовжуватимуть працювати, тому, якщо ви не перевірите це самостійно, ви можете не знати, що вас це стосується, доки ви не станете жертвою атаки.&lt;/strong&gt; У більшості випадків ви можете перевірити, чи використовуєте ви Ingress NGINX, запустивши &lt;code&gt;kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx&lt;/code&gt; з правами адміністратора кластера.&lt;/p&gt;
&lt;p&gt;Попри широку популярність і поширене використання компаніями різного розміру, а також неодноразові заклики про допомогу від розробників, проєкт Ingress NGINX так і не отримав необхідних йому учасників. Згідно з внутрішнім дослідженням Datadog, близько 50% хмарних середовищ наразі залежать від цього інструменту, проте протягом останніх кількох років його підтримували лише одна або дві особи, які працювали у вільний час. Без достатньої кількості персоналу для підтримки інструменту на рівні, який ми та наші користувачі вважаємо безпечним, відповідальним рішенням є поступова відмова від нього та переорієнтація зусиль на сучасні альтернативи, такі як &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;Це рішення було прийнято нелегко; незважаючи на незручності, які це спричинить, воно є необхідним для безпеки всіх користувачів та екосистеми в цілому. На жаль, гнучкість, з якою був розроблений Ingress NGINX, яка колись була благом, стала тягарем, який неможливо подолати. З накопиченим технічним боргом та фундаментальними проєктними рішеннями, що посилюють недоліки безпеки, продовжувати підтримувати інструмент, навіть якщо б ресурси зʼявилися, більше не є розумним і навіть можливим.&lt;/p&gt;
&lt;p&gt;Ми робимо цю заяву спільно, щоб підкреслити масштаб цієї зміни та потенційний серйозний ризик для значної частини користувачів Kubernetes, якщо цю проблему ігнорувати. Необхідно негайно перевірити свої кластери. Якщо ви покладаєтеся на Ingress NGINX, вам слід почати планувати міграцію.&lt;/p&gt;
&lt;p&gt;Дякуємо,&lt;/p&gt;
&lt;p&gt;Керівний комітет Kubernetes&lt;/p&gt;
&lt;p&gt;Комітет з реагування на загрози безпеки Kubernetes&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Експерименти з Gateway API за допомогою kind</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/28/experimenting-gateway-api-with-kind/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/28/experimenting-gateway-api-with-kind/</guid>
      <description>
        
        
        &lt;p&gt;Цей документ проведе вас через налаштування локального експериментального середовища з &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API&lt;/a&gt; з використанням &lt;a href=&#34;https://kind.sigs.k8s.io/&#34;&gt;kind&lt;/a&gt;. Це середовище розроблено для навчання та тестування. Воно допомагає вам зрозуміти концепції Gateway API без складності промислового середовища.&lt;/p&gt;
&lt;div class=&#34;alert alert-caution&#34; role=&#34;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Увага:&lt;/h4&gt;Це експериментальне навчальне середовище, яке не слід використовувати в повсякденній операційній діяльності. Компоненти, використані в цьому документі, не придатні для операційного використання. Коли ви будете готові розгорнути Gateway API в операційному середовищі, виберіть &lt;a href=&#34;https://gateway-api.sigs.k8s.io/implementations/&#34;&gt;реалізацію&lt;/a&gt;, яка відповідає вашим потребам.&lt;/div&gt;

&lt;h2 id=&#34;overview&#34;&gt;Огляд&lt;/h2&gt;
&lt;p&gt;У цьому посібнику ви:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Налаштуєте локальний кластер Kubernetes за допомогою kind (Kubernetes in Docker)&lt;/li&gt;
&lt;li&gt;Розгорнете &lt;a href=&#34;https://github.com/kubernetes-sigs/cloud-provider-kind&#34;&gt;cloud-provider-kind&lt;/a&gt;, який надає як LoadBalancer Services, так і контролер Gateway API&lt;/li&gt;
&lt;li&gt;Створите Gateway і HTTPRoute для маршрутизації трафіку до демо-застосунку&lt;/li&gt;
&lt;li&gt;Протестуєте вашу конфігурацію Gateway API локально&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це середовище ідеально підходить для навчання, розробки та експериментування з концепціями Gateway API.&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Передумови&lt;/h2&gt;
&lt;p&gt;Перед початком переконайтеся, що у вас встановлено наступне на локальному компʼютері:&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; — Необхідний для запуску kind та 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; — Інструмент командного рядка Kubernetes&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; — Необхідний для тестування маршрутів&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;creating-a-kind-cluster&#34;&gt;Створення кластера kind&lt;/h3&gt;
&lt;p&gt;Створіть новий кластер kind, запустивши:&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;Це створить одновузловий кластер Kubernetes, який працює в контейнері Docker.&lt;/p&gt;
&lt;h3 id=&#34;install-cloud-provider-kind&#34;&gt;Встановлення cloud-provider-kind&lt;/h3&gt;
&lt;p&gt;Далі вам потрібен &lt;a href=&#34;https://github.com/kubernetes-sigs/cloud-provider-kind/&#34;&gt;cloud-provider-kind&lt;/a&gt;, який надає два ключові компоненти для цього середовища:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Контролер LoadBalancer, який призначає адреси сервісам типу LoadBalancer&lt;/li&gt;
&lt;li&gt;Контролер Gateway API, який реалізує специфікацію Gateway API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Він також автоматично встановлює Custom Resource Definitions (CRDs) Gateway API у вашому кластері.&lt;/p&gt;
&lt;p&gt;Запустіть cloud-provider-kind як контейнер Docker на тому ж хості, де ви створили кластер kind:&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;Примітка:&lt;/strong&gt; На деяких системах вам може знадобитися підвищені права доступу до сокета Docker.&lt;/p&gt;
&lt;p&gt;Перевірте, що cloud-provider-kind запущений:&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;Ви повинні побачити контейнер у списку та в стані виконання. Ви також можете перевірити журнали:&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;Експериментування з Gateway API&lt;/h2&gt;
&lt;p&gt;Тепер, коли ваш кластер налаштований, ви можете почати експериментування з ресурсами Gateway API.&lt;/p&gt;
&lt;p&gt;cloud-provider-kind автоматично надає GatewayClass під назвою &lt;code&gt;cloud-provider-kind&lt;/code&gt;. Ви будете використовувати цей клас для створення вашого Gateway.&lt;/p&gt;
&lt;p&gt;Варто зауважити, що хоча kind не є хмарним провайдером, проєкт названий &lt;code&gt;cloud-provider-kind&lt;/code&gt;, оскільки він надає функції, які імітують хмарне середовище.&lt;/p&gt;
&lt;h3 id=&#34;deploying-a-gateway&#34;&gt;Розгортання Gateway&lt;/h3&gt;
&lt;p&gt;Наступний маніфест буде:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Створювати новий простір імен &lt;code&gt;gateway-infra&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Розгорнтати Gateway, який слухає на порту 80&lt;/li&gt;
&lt;li&gt;Приймати HTTPRoutes з іменами хостів, які відповідають шаблону &lt;code&gt;*.exampledomain.example&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Дозволить маршрутам з будь-якого простору імен приєднуватися до Gateway. &lt;strong&gt;Примітка&lt;/strong&gt;: У реальних кластерах використовуйте значення Same або Selector у полі &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;, щоб обмежити приєднання.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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:#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;Потім перевірте, що ваш 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-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;Очікуваний результат:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-none&#34; data-lang=&#34;none&#34;&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;Колона PROGRAMMED повинна показувати True, а поле ADDRESS повинно містити IP-адресу.&lt;/p&gt;
&lt;h3 id=&#34;deploying-a-demo-application&#34;&gt;Розгортання демо-застосунку&lt;/h3&gt;
&lt;p&gt;Далі розгорніть простий echo-застосунок, який допоможе вам протестувати конфігурацію вашого Gateway. Цей застосунок:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слухає на порту 3000&lt;/li&gt;
&lt;li&gt;Повертає деталі запиту, включаючи шлях, заголовки та змінні середовища&lt;/li&gt;
&lt;li&gt;Запускається у просторі імен &lt;code&gt;demo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;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;creating-an-httproute&#34;&gt;Створення HTTPRoute&lt;/h3&gt;
&lt;p&gt;Тепер створіть HTTPRoute для маршрутизації трафіку з вашого Gateway до echo-застосунку. Цей HTTPRoute буде:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Реагувати на запити для імені хоста &lt;code&gt;some.exampledomain.example&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Маршрутизувати трафік до echo-застосунку&lt;/li&gt;
&lt;li&gt;Приєднуватися до Gateway у просторі імен &lt;code&gt;gateway-infra&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;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;Тестування вашого маршруту&lt;/h3&gt;
&lt;p&gt;Завершальний крок — перевірка вашого маршруту за допомогою curl. Ви зробите запит на IP-адресу Gateway з іменем хоста &lt;code&gt;some.exampledomain.example&lt;/code&gt;. Наступна команда підходить тільки для POSIX shell і може потребувати налаштування для вашого середовища:&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;Ви повинні отримати JSON-відповідь подібну до цієї:&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;Якщо ви бачите цю відповідь, вітаємо! Ваше середовище Gateway API працює правильно.&lt;/p&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Усунення несправностей&lt;/h2&gt;
&lt;p&gt;Якщо щось працює не так, як очікується, ви можете усунути несправності, перевіривши стан ваших ресурсів.&lt;/p&gt;
&lt;h3 id=&#34;check-the-gateway-status&#34;&gt;Перевірка стану Gateway&lt;/h3&gt;
&lt;p&gt;Спочатку перевірте ресурс 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-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;Подивіться на розділ &lt;code&gt;status&lt;/code&gt; на стани. Ваш Gateway повинен мати:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Accepted: True&lt;/code&gt; - Gateway був прийнятий контролером&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Programmed: True&lt;/code&gt; - Gateway був успішно налаштований&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.status.addresses&lt;/code&gt; заповнений IP-адресою&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;check-the-httproute-status&#34;&gt;Перевірка стану HTTPRoute&lt;/h3&gt;
&lt;p&gt;Далі перевірте ваш 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;Перевірте розділ &lt;code&gt;status.parents&lt;/code&gt;. Поширені проблеми включають:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ResolvedRefs встановлено False з причиною &lt;code&gt;BackendNotFound&lt;/code&gt;; це означає, що сервіс бекенду не має або має неправильне імʼя&lt;/li&gt;
&lt;li&gt;Accepted встановлено False; це означає, що маршрут не міг приєднатися до Gateway (перевірте дозволи простору імен або відповідність імені хосту)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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;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;Перевірка журналів контролера&lt;/h3&gt;
&lt;p&gt;Якщо стани ресурсів не розкривають проблему, перевірте журнали cloud-provider-kind:&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;Це покаже детальні журнали як з контролерів LoadBalancer, так і Gateway API.&lt;/p&gt;
&lt;h2 id=&#34;cleanup&#34;&gt;Очищення&lt;/h2&gt;
&lt;p&gt;Коли ви закінчите з експериментами, ви можете очистити ресурси:&lt;/p&gt;
&lt;h3 id=&#34;remove-kubernetes-resources&#34;&gt;Видалення ресурсів Kubernetes&lt;/h3&gt;
&lt;p&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-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;Зупинка cloud-provider-kind&lt;/h3&gt;
&lt;p&gt;Зупиніть та видаліть контейнер cloud-provider-kind:&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;Оскільки контейнер був запущений з прапорцем &lt;code&gt;--rm&lt;/code&gt;, він буде автоматично видалений при зупинці.&lt;/p&gt;
&lt;h3 id=&#34;delete-the-kind-cluster&#34;&gt;Видалення кластера kind&lt;/h3&gt;
&lt;p&gt;Нарешті, видаліть кластер kind:&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;Наступні кроки&lt;/h2&gt;
&lt;p&gt;Тепер, коли ви поекспериментували з Gateway API локально, ви готові дослідити готові до промислової експлуатації реалізації:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Розгортання в промисловій експлуатації&lt;/strong&gt;: Переглядайте &lt;a href=&#34;https://gateway-api.sigs.k8s.io/implementations/&#34;&gt;реалізації Gateway API&lt;/a&gt;, щоб знайти контролер, який відповідає вашим вимогам до експлуатації&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Дізнайтеся більше&lt;/strong&gt;: Ознайомтесь з &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;документацію Gateway API&lt;/a&gt;, щоб дізнатися про передові функції, такі як TLS, розподіл трафіку та маніпуляція заголовками&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Розширена маршрутизація&lt;/strong&gt;: Експериментуйте з маршрутизацією на основі шляху, узгодженням заголовків, дзеркальним відображенням запитів та іншими функціями, слідуючи &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/getting-started/&#34;&gt;посібникам користувача Gateway API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;a-final-word-of-caution&#34;&gt;Фінальне попередження&lt;/h3&gt;
&lt;p&gt;Це середовище &lt;em&gt;kind&lt;/em&gt; призначене лише для розробки та навчання.
Завжди використовуйте реалізацію Gateway API промислового рівня для реальних робочих навантажень.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Cluster API v1.12: Впровадження оновлень на місці та ланцюгових оновлень</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/27/cluster-api-v1-12-release/</link>
      <pubDate>Tue, 27 Jan 2026 08:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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; забезпечує декларативне управління життєвим циклом кластерів Kubernetes, дозволяючи користувачам і командам роботи з платформами визначати бажаний стан кластерів і покладатися на контролери, які постійно узгоджують його.&lt;/p&gt;
&lt;p&gt;Подібно до того, як ви можете використовувати StatefulSets або Deployments в Kubernetes для управління групою Pods, в Cluster API ви можете використовувати KubeadmControlPlane для управління набором машин панелі упрвління або MachineDeployments для управління групою робочих вузлів.&lt;/p&gt;
&lt;p&gt;Випуск &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; розширює можливості Cluster API, зменшуючи складності у звичайних операціях життєвого циклу завдяки впровадженню оновлень на місці та ланцюгових оновлень.&lt;/p&gt;
&lt;h2 id=&#34;emphasis-on-simplicity-and-usability&#34;&gt;Акцент на простоті та зручності використання&lt;/h2&gt;
&lt;p&gt;Cluster API завжди прагнув забезпечити простий і передбачуваний процес управління життєвим циклом кластерів Kubernetes.&lt;/p&gt;
&lt;p&gt;З версією v1.12.0 проєкт Cluster API ще раз демонструє, що ця спільнота здатна запроваджувати велику кількість інновацій, одночасно мінімізуючи вплив на користувачів Cluster API.&lt;/p&gt;
&lt;p&gt;Що це означає на практиці?&lt;/p&gt;
&lt;p&gt;Користувачам просто потрібно змінити специфікацію [Cluster](&lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts&#34;&gt;https://cluster-api.sigs.k8s.io/user/concepts#&lt;/a&gt; cluster) або &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts#machine&#34;&gt;Machine&lt;/a&gt; spec (так само, як і в попередніх версіях Cluster API), і Cluster API автоматично запустить оновлення на місці або послідовні оновлення, коли це можливо і доцільно.&lt;/p&gt;
&lt;h2 id=&#34;in-place-updates&#34;&gt;Оновлення на місці&lt;/h2&gt;
&lt;p&gt;Як і Kubernetes для Pods у Deployments, коли змінюється специфікація &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts#machine&#34;&gt;Machine&lt;/a&gt;, Cluster API також виконує розгортання, створюючи нову машину та видаляючи стару.&lt;/p&gt;
&lt;p&gt;Цей підхід, навіяний принципом незмінної інфраструктури, має низку значних переваг:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Він простий для пояснення, передбачуваний, послідовний і легкий для розуміння користувачами та інженерами.&lt;/li&gt;
&lt;li&gt;Він простий у реалізації, оскільки базується лише на двох основних операціях: створенні та видаленні.&lt;/li&gt;
&lt;li&gt;Реалізація не залежить від конкретних параметрів машини, таких як ОС, механізм завантаження тощо.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В результаті розгортання машин значно зменшують кількість змінних, які потрібно враховувати під час управління життєвим циклом хост-сервера, що є хостом для Nodes.&lt;/p&gt;
&lt;p&gt;Однак, хоча переваги незмінності не підлягають обговоренню, як Kubernetes, так і Cluster API проходять подібний шлях, впроваджуючи зміни, що дозволяють користувачам мінімізувати перебої в роботі, коли це можливо.&lt;/p&gt;
&lt;p&gt;Згодом Cluster API також запровадив кілька вдосконалень до незмінних розгортань, зокрема:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Підтримка &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;поширення змін, що впливають тільки на ресурси Kubernetes&lt;/a&gt;, що дозволяє уникнути непотрібних розгортань&lt;/li&gt;
&lt;li&gt;Спосіб &lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/pull/10223&#34;&gt;позначення застарілих вузлів за допомогою PreferNoSchedule&lt;/a&gt;, що дозволяє зменшити кількість втрат Podʼів шляхом оптимізації перепланування Podʼів під час розгортань.&lt;/li&gt;
&lt;li&gt;Підтримка стратегії «спочатку видалити, потім розгорнути», що спрощує розгортання незмінних версій на фізичних серверах/у середовищах з обмеженими ресурсами.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Нова функція &lt;a href=&#34;https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240807-in-place-updates.md&#34;&gt;оновлення на місці&lt;/a&gt; в Cluster API є наступним кроком на цьому шляху.&lt;/p&gt;
&lt;p&gt;З випуском версії 1.12.0 Cluster API впроваджує підтримку &lt;a href=&#34;https://cluster-api.sigs.k8s.io/tasks/experimental-features/runtime-sdk/implement-in-place-update-hooks&#34;&gt;розширень оновлення&lt;/a&gt;, що дозволяє користувачам вносити зміни в діючі машини на місці, без видалення та повторного створення машин.&lt;/p&gt;
&lt;p&gt;Як KubeadmControlPlane, так і MachineDeployments підтримують оновлення на місці на основі нового розширення оновлення, а це означає, що межі можливостей Cluster API тепер значно змінилися.&lt;/p&gt;
&lt;p&gt;Як працюють оновлення на місці?&lt;/p&gt;
&lt;p&gt;Найпростіше пояснити це так: коли користувач запускає оновлення, змінюючи бажаний стан машин, Cluster API вибирає найкращий інструмент для досягнення бажаного стану.&lt;/p&gt;
&lt;p&gt;Новина полягає в тому, що тепер Cluster API може вибирати між незмінними розгортаннями та розширеннями оновлень на місці для виконання необхідних змін.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/27/cluster-api-v1-12-release/in-place.svg&#34;
         alt=&#34;Оновлення на місці в Cluster API&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Важливо, що це не незмінні розгортання проти оновлень на місці; Cluster API розглядає обидва варіанти як дійсні та вибирає найбільш відповідний механізм для даної зміни.&lt;/p&gt;
&lt;p&gt;З точки зору розробників Cluster API, оновлення на місці найбільш корисні для внесення змін, які не вимагають спорожнення вузла або перезапуску подів; наприклад: зміна облікових даних користувача для машини. З іншого боку, коли робоче навантаження все одно буде порушено, просто виконайте розгортання.&lt;/p&gt;
&lt;p&gt;Тим не менш, Cluster API залишається вірним своїй розширюваній природі, і кожен може створити власне розширення оновлення та вирішити, коли і як використовувати оновлення на місці, обмінявши деякі переваги незмінних розгортань.&lt;/p&gt;
&lt;p&gt;Щоб глибше ознайомитися з цією функцією, обовʼязково відвідайте сесію &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;Оновлення на місці з Cluster API: золота середина між незмінною та змінною інфраструктурою&lt;/a&gt; на KubeCon EU в Амстердамі!&lt;/p&gt;
&lt;h2 id=&#34;chained-upgrades&#34;&gt;Ланцюгові оновлення&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; та керовані топології в Cluster API спільно забезпечили потужну та ефективну структуру, яка слугує будівельним блоком для багатьох платформ, що пропонують Kubernetes-as-a-Service.&lt;/p&gt;
&lt;p&gt;Тепер, з версією v1.12.0, ця функція робить ще один важливий крок вперед, дозволяючи користувачам оновлювати більше ніж одну мінорну версію Kubernetes за одну операцію, що зазвичай називається &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;ланцюговим оновленням&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Це дозволяє користувачам вказати цільову версію Kubernetes і доручити Cluster API безпечно координувати необхідні проміжні кроки, замість того, щоб вручну керувати кожним оновленням.&lt;/p&gt;
&lt;p&gt;Найпростіший спосіб пояснити, як працюють ланцюгові оновлення, полягає в тому, що після того, як користувач запускає оновлення, змінюючи бажану версію для кластера, Cluster API обчислює план оновлення, а потім починає його виконувати. Замість того, щоб (наприклад) оновлювати кластер до v1.33.0, потім до v1.34.0, а потім до v1.35.0, перевіряючи прогрес на кожному кроці, ланцюгове оновлення дозволяє перейти безпосередньо до v1.35.0.&lt;/p&gt;
&lt;p&gt;Виконання плану оновлення означає оновлення панелі управління та робочих машин у суворо контрольованому порядку, повторюючи цей процес стільки разів, скільки потрібно для досягнення бажаного стану. Cluster API тепер здатний керувати цим за вас.&lt;/p&gt;
&lt;p&gt;Cluster API дбає про оптимізацію та мінімізацію кроків оновлення для робочих машин, і фактично робочі машини пропускатимуть оновлення до проміжних незначних випусків Kubernetes, коли це дозволяють політики розбіжності версій Kubernetes.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/27/cluster-api-v1-12-release/chained.svg&#34;
         alt=&#34;Ланцюгові оновлення в Cluster API&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Також у цьому випадку розширюваність є основою цієї функції, і &lt;a href=&#34;https://cluster-api.sigs.k8s.io/tasks/experimental-features/runtime-sdk/implement-upgrade-plan-hooks&#34;&gt;розширення виконання плану оновлення&lt;/a&gt; можуть бути використані для впливу на те, як обчислюється план оновлення; аналогічно, &lt;a href=&#34;https://cluster-api.sigs.k8s.io/tasks/experimental-features/runtime-sdk/implement-lifecycle-hooks&#34;&gt;хуки життєвого циклу&lt;/a&gt; можуть використовуватися для автоматизації інших завдань, які необхідно виконати під час оновлення, наприклад, оновлення надбудови після завершення оновлення панелі управління.&lt;/p&gt;
&lt;p&gt;На наш погляд, ланцюгові оновлення найбільш корисні для користувачів, яким важко встигати за мінорними релізами Kubernetes і які, наприклад, хочуть оновлюватися лише раз на рік, а потім оновлюватися на три версії (n-3 → n). Але майте на увазі: те, що тепер ви можете легко оновлюватися більш ніж на одну мінорну версію, не є приводом для того, щоб не оновлювати свій кластер регулярно!&lt;/p&gt;
&lt;h2 id=&#34;release-team&#34;&gt;Команда випуску&lt;/h2&gt;
&lt;p&gt;Я хотів би подякувати всім учасникам, адміністраторам та інженерам, які добровільно долучилися до команди випуску.&lt;/p&gt;
&lt;p&gt;Надійність та передбачуваність випусків Cluster API, що є однією з найбільш цінованих функцій нашими користувачами, можлива лише завдяки підтримці, відданості та наполегливій праці спільноти.&lt;/p&gt;
&lt;p&gt;Висловлюємо подяку всій спільноті Cluster API за випуск версії 1.12.0 та всі чудові випуски, представлені у 2025 році!
​​
Якщо ви зацікавлені у співпраці, ознайомтеся з
&lt;a href=&#34;https://cluster-api.sigs.k8s.io/contributing&#34;&gt;рекомендаціями щодо співпраці з Cluster API&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Якщо ви прочитаєте &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/manifesto&#34;&gt;Маніфест Cluster API&lt;/a&gt;, то побачите, як в рамках субпроєкту Cluster API проголошується право залишатися незавершеним, визнаючи необхідність постійного розвитку, вдосконалення та адаптації до мінливих потреб користувачів Cluster API та ширшої екосистеми Cloud Native.&lt;/p&gt;
&lt;p&gt;Оскільки Kubernetes продовжує розвиватися, супроєкт Cluster API буде просуватися разом з ним, зосереджуючись на безпечніших оновленнях, зменшенні перебоїв у роботі та зміцненні будівельних блоків для платформ, що управляють Kubernetes у великих масштабах.&lt;/p&gt;
&lt;p&gt;Інновації залишаються в центрі уваги Cluster API, тож чекайте на насичений подіями 2026 рік!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Корисні посилання:&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&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;Пропозиція щодо оновлення на місці&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;Пропозиція щодо ланцюгового оновлення&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Headlamp у 2025 році: ключові моменти проєкту</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/22/headlamp-in-2025-project-highlights/</link>
      <pubDate>Thu, 22 Jan 2026 10:00:00 +0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/22/headlamp-in-2025-project-highlights/</guid>
      <description>
        
        
        &lt;p&gt;&lt;em&gt;Це повідомлення є підсумком публікації, яка спочатку була &lt;a href=&#34;https://headlamp.dev/blog/2025/11/13/headlamp-in-2025&#34;&gt;опублікована&lt;/a&gt; у блозі Headlamp.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://headlamp.dev/&#34;&gt;Headlamp&lt;/a&gt; пройшов довгий шлях у 2025 році. Проєкт продовжує розвиватися — охоплює все більше команд на різних платформах, забезпечує нові робочі процеси та інтеграції за допомогою втулків, а також сприяє розширенню співпраці з боку спільноти.&lt;/p&gt;
&lt;p&gt;Ми хотіли б поділитися кількома оновленнями та розповісти про те, як Headlamp розвивався протягом останнього року.&lt;/p&gt;
&lt;h2 id=&#34;updates&#34;&gt;Оновлення&lt;/h2&gt;
&lt;h3 id=&#34;joining-kubernetes-sig-ui&#34;&gt;Приєднання до Kubernetes SIG UI&lt;/h3&gt;
&lt;p&gt;Цей рік став важливою віхою для проєкту: Headlamp тепер офіційно є частиною Kubernetes &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-ui/README.md&#34;&gt;SIG UI&lt;/a&gt;. Цей крок ще більше наближає обговорення планів розвитку та дизайну до основної спільноти Kubernetes і підкріплює роль Headlamp як сучасного, розширюваного інтерфейсу для проєкту.&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;У рамках цього ми також ділимося інформацією про те, як зробити Kubernetes доступнішим для ширшої аудиторії, зокрема &lt;a href=&#34;https://www.youtube.com/watch?v=VFOSyKVOPxs&#34;&gt;виступили в програмі Enlightening with Whitney Lee&lt;/a&gt; та &lt;a href=&#34;https://www.youtube.com/watch?v=Q7cbT2UBfE0&#34;&gt;виступ на KCD New York 2025&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;linux-foundation-mentorship&#34;&gt;Програма наставництва від Linux Foundation&lt;/h3&gt;
&lt;p&gt;Цього року ми були раді співпрацювати з кількома студентами в рамках програми наставництва від Linux Foundation, і наші підопічні вже залишили помітний слід у Headlamp:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/adwait-godbole&#34;&gt;&lt;strong&gt;Адвайте Годболе&lt;/strong&gt;&lt;/a&gt; створив втулок KEDA, додавши в Headlamp інтерфейс для перегляду та управління ресурсами KEDA, такими як ScaledObjects і ScaledJobs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/DhairyaMajmudar&#34;&gt;&lt;strong&gt;Дхарія Маджмудар&lt;/strong&gt;&lt;/a&gt; налаштував стек спостережності на основі OpenTelemetry для Headlamp, підключивши метрики, журнали та трасування, щоб спростити моніторинг та налагодження проєкту.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/in/aishwarya-ghatole-506745231/&#34;&gt;&lt;strong&gt;Айшварія Гатоле&lt;/strong&gt;&lt;/a&gt; очолила аудит UX втулків Headlamp, виявляючи проблеми зі зручністю користування та пропонуючи поліпшення дизайну та персоналії для користувачів втулків.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/SinghaAnirban005&#34;&gt;&lt;strong&gt;Анірбан Сінга&lt;/strong&gt;&lt;/a&gt; розробив втулок Karpenter, що надає Headlamp цілеспрямований огляд ресурсів та рішень Karpenter з автомасштабування.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/useradityaa&#34;&gt;&lt;strong&gt;Адтія Чаудхарі&lt;/strong&gt;&lt;/a&gt; поліпшив підтримку Gateway API, завдяки чому ви можете бачити мережеві взаємозвʼязки на мапі ресурсів, а також поліпшив підтримку багатьох нових ресурсів Gateway API.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Faakhir30&#34;&gt;&lt;strong&gt;Фаахір Захід&lt;/strong&gt;&lt;/a&gt; завершив роботу над способом легкого &lt;a href=&#34;https://headlamp.dev/docs/latest/installation/in-cluster/#plugin-management&#34;&gt;управління встановленням втулків&lt;/a&gt; за допомогою Headlamp, розгорнутого в кластерах.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/upsaurav12&#34;&gt;&lt;strong&gt;Саурав Упадхʼяй&lt;/strong&gt;&lt;/a&gt; працював над кешуванням в бекенді для викликів Kubernetes API, зменшивши навантаження на API-сервер і покращивши продуктивність Headlamp.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;new-changes&#34;&gt;Нові зміни&lt;/h2&gt;
&lt;h3 id=&#34;multi-cluster-view&#34;&gt;Перегляд декількох кластерів&lt;/h3&gt;
&lt;p&gt;Управління декількома кластерами є складним завданням: команди часто переключаються між інструментами і втрачають контекст, намагаючись зрозуміти, що де працює. Headlamp вирішує цю проблему, надаючи єдиний перегляд для порівняння кластерів поруч. Це полегшує розуміння робочих навантажень у різних середовищах і скорочує час, витрачений на пошук ресурсів.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--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;Перегляд багатокластерних робочих навантажень&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;projects&#34;&gt;Проєкти&lt;/h3&gt;
&lt;p&gt;Застосунки Kubernets часто охоплюють кілька просторів імен та типів ресурсів, що робить усунення несправностей схожим на складання пазла. Ми додали &lt;strong&gt;Проєкти&lt;/strong&gt;, щоб надати вам орієнтований на застосунки перегляд, який групує повʼязані ресурси в декількох просторах імен і навіть кластерах. Це дозволяє зменшити розростання, швидше усувати несправності та співпрацювати, не переглядаючи YAML або списки для всього кластера.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/projects-feature.png&#34;
         alt=&#34;Функція «Проєкти»&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Вигляд нової функції «Проєкти»&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Нова функція «Проєкти» для групування просторів імен у проєкти, орієнтовані на застосунки або команди&lt;/li&gt;
&lt;li&gt;Розширюваний вигляд деталей проєктів, який можна налаштувати за допомогою втулків із власними вкладками та діями&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;navigation-and-activities&#34;&gt;Навігація та дії&lt;/h3&gt;
&lt;p&gt;Повсякденна робота в Kubernetes часто означає перемикання між логами, терміналами, YAML та дашбордами в різних кластерах. Ми переробили навігацію Headlamp, щоб розглядати ці елементи як найважливіші «дії», які можна залишити відкритими та повернутися до них, а не як одноразові вікна, які зникають, щойно ви натискаєте в іншому місцц.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/new-task-bar.png&#34;
         alt=&#34;Нова панель завдань&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Вигляд нової панелі завдань&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Нова панель завдань/модель активності дозволяє закріплювати журнали, сесії виконання та деталі як поточні активності&lt;/li&gt;
&lt;li&gt;Огляд активності з дією «Закрити все» та інформацією про кластер&lt;/li&gt;
&lt;li&gt;Вибір декількох елементів та глобальні фільтри в таблицях&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Дякуємо &lt;a href=&#34;https://github.com/farodin91&#34;&gt;Яну Янсену&lt;/a&gt; та &lt;a href=&#34;https://github.com/useradityaa&#34;&gt;Адітья Чаудхарі&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;search-and-map&#34;&gt;Пошук та мапа&lt;/h3&gt;
&lt;p&gt;Коли щось ламається у робочому середовищі, перші два питання зазвичай звучать так: «Де це?» і «З чим це пов&#39;язано?». Ми оновили як пошук, так і відображення на карті, щоб ви могли набагато швидше перейти від загальних симптомів до потрібного набору об&#39;єктів.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/advanced-search.png&#34;
         alt=&#34;Розширений пошук&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Вигляд нової функції розширеного пошуку&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Розширений пошук, що підтримує розширені запити на основі виразів для обʼєктів Kubernetes&lt;/li&gt;
&lt;li&gt;Покращений глобальний пошук, що розуміє мітки та кілька пошукових елементів і навіть може оновлювати ваш поточний простір імен на основі знайденого&lt;/li&gt;
&lt;li&gt;Підтримка EndpointSlice у розділі «Мережа»&lt;/li&gt;
&lt;li&gt;Розширений вигляд мапи, що тепер включає обʼєкти Custom Resources та Gateway API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Дякуємо &lt;a href=&#34;https://github.com/faebr&#34;&gt;Фабіану&lt;/a&gt;, &lt;a href=&#34;https://github.com/alexandernorth&#34;&gt;Александру Норту&lt;/a&gt; та &lt;a href=&#34;https://github.com/victormarcolino&#34;&gt;Віктору Марколіно&lt;/a&gt; зі Swisscom, а також &lt;a href=&#34;https://github.com/useradityaa&#34;&gt;Адітья Чаудхарі&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;oidc-and-authentication&#34;&gt;OIDC та автентифікація&lt;/h3&gt;
&lt;p&gt;Ми доклали чимало зусиль, щоб зробити налаштування OIDC більш зрозумілим і надійним, особливо для розгортання в кластері.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/user-info.png&#34;
         alt=&#34;Інформація про користувача&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Перегляд інформації про користувача для кластерів OIDC&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Інформація про користувача відображається у верхній панелі для користувачів, автентифікованих за допомогою OIDC&lt;/li&gt;
&lt;li&gt;Підтримка PKCE для більш безпечних процесів автентифікації, а також зміцнене оновлення токенів&lt;/li&gt;
&lt;li&gt;Документація щодо використання токена доступу за допомогою &lt;code&gt;-oidc-use-access-token=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Покращена підтримка публічних клієнтів OIDC, таких як AKS та EKS&lt;/li&gt;
&lt;li&gt;Новий посібник із налаштування Headlamp &lt;a href=&#34;https://headlamp.dev/docs/latest/installation/in-cluster/aks-cluster-oauth/&#34;&gt;на AKS з Azure Entra-ID за допомогою OAuth2Proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Дякуємо &lt;a href=&#34;https://github.com/daviddob&#34;&gt;Девіду Добмейеру&lt;/a&gt; та &lt;a href=&#34;https://github.com/HarshSrivastava275&#34;&gt;Харшу Срівастава&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;app-catalog-and-helm&#34;&gt;Каталог застосунків та Helm&lt;/h3&gt;
&lt;p&gt;Ми розширили можливості розгортання та пошуку застосунків за допомогою Headlamp, зокрема додавши підтримку репозиторіїв Helm.&lt;/p&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Функціональніші чарти Helm з опціональною підтримкою TLS-термінації бекенду, PodDisruptionBudgets, налаштованими мітками подів тощо&lt;/li&gt;
&lt;li&gt;Покращене форматування та додавання аргументу access token, якого бракувало в чартах Helm&lt;/li&gt;
&lt;li&gt;Нова підтримка Helm у кластері з прапорцем &lt;code&gt;--enable-helm&lt;/code&gt; та проксі-сервісом&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Дякуємо &lt;a href=&#34;https://github.com/shahvrushali22&#34;&gt;Врушалі Шах&lt;/a&gt; та &lt;a href=&#34;https://github.com/muraliinformal&#34;&gt;Муралі Аннамнені&lt;/a&gt; з Oracle, а також &lt;a href=&#34;https://github.com/jcpunk&#34;&gt;Пату Ріхекі&lt;/a&gt;, &lt;a href=&#34;https://github.com/jda258&#34;&gt;Джошуа Акерсу&lt;/a&gt;, &lt;a href=&#34;https://github.com/rstribrn&#34;&gt;Ростиславу Стржибрному&lt;/a&gt;, &lt;a href=&#34;https://github.com/rickliujh&#34;&gt;Ріку Л.&lt;/a&gt; та &lt;a href=&#34;https://github.com/vnea&#34;&gt;Віктору&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;performance-accessibility-and-ux&#34;&gt;Продуктивність, доступність та UX&lt;/h3&gt;
&lt;p&gt;Нарешті, ми витратили багато часу на речі, які ви помічаєте щодня, але які не завжди згадують у новинах: час запуску, перегляд списків, переглядач журналів, доступність та маленькі деталі інтерфейсу мережевих функцій. Постійна самодіагностика доступності також допомогла нам виявити ключові проблеми та зробити Headlamp простим у використанні для всіх.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/learn-section.png&#34;
         alt=&#34;Розділ «Навчання»&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Вигляд розділу «Навчання» в документації&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Істотні вдосконалення для настільних компʼютерів: завантаження застосунків стало на 60% швидшим, а перезавантаження в режимі розробки для учасників — значно швидшим&lt;/li&gt;
&lt;li&gt;Численні вдосконалення таблиць і перегляду журналів: постійний порядок сортування, узгоджені дії з рядками, кнопки копіювання імен, кращі підказки та більш толерантні введення журналів&lt;/li&gt;
&lt;li&gt;Вдосконалення доступності та локалізації, включаючи виправлення проблем з макетом, повʼязаних із масштабуванням, кращий контраст кольорів, покращену підтримку екранного зчитувача та розширене мовне покриття&lt;/li&gt;
&lt;li&gt;Більший контроль над ресурсами, з показниками CPU/памʼяті під час роботи, більш детальною інформацією про поди та редагуванням секретів і полів CRD безпосередньо в тексті&lt;/li&gt;
&lt;li&gt;Оновлена документація та досвід роботи з втулками, включаючи розділ «Навчання» та демонстрацію втулків&lt;/li&gt;
&lt;li&gt;Більш повний інтерфейс NetworkPolicy та вдосконалення, повʼязані з мережею&lt;/li&gt;
&lt;li&gt;Нічні збірки доступні для раннього тестування&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Дякуємо &lt;a href=&#34;https://github.com/jaehanbyun&#34;&gt;Jaehan Byun&lt;/a&gt; та &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;Втулки та розширюваність&lt;/h2&gt;
&lt;p&gt;Тепер знайти втулки стало простіше — більше не потрібно переходити між Artifact Hub та різними репозиторіями GitHub. Перегляньте нашу спеціальну &lt;a href=&#34;https://headlamp.dev/plugins&#34;&gt;сторінку втулків&lt;/a&gt;, де ви знайдете добірку втулків, схвалених Headlamp, а також презентацію популярних втулків.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/plugins-page.png&#34;
         alt=&#34;Сторінка втулків&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Вигляд демонстрації втулків&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id=&#34;headlamp-ai-assistant&#34;&gt;AI-асистент Headlamp&lt;/h3&gt;
&lt;p&gt;Управління Kubernetes часто означає запамʼятовування команд і маніпулювання інструментами. Новий AI Assistant від Headlamp змінює це, додаючи вбудований в UI інтерфейс природної мови. Тепер замість того, щоб вводити &lt;code&gt;kubectl&lt;/code&gt; або порпатися в YAML, ви можете запитати: «Чи працює мій застосунок?», або «Покажи журнали для цього розгортання» і отримати відповіді в контексті, що прискорює усунення несправностей і полегшує адаптацію нових користувачів. Дізнайтеся більше про це &lt;a href=&#34;https://headlamp.dev/blog/2025/08/07/introducing-the-headlamp-ai-assistant/&#34;&gt;тут&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;Додавання нових втулків&lt;/h3&gt;
&lt;p&gt;Поряд з новим AI Assistant, ми розширюємо екосистему втулків Headlamp, щоб ви могли обʼєднати більше своїх робочих процесів в одному інтерфейсі користувача, завдяки інтеграції таких втулків, як Minikube, Karpenter та інших.&lt;/p&gt;
&lt;p&gt;Основні моменти з останніх випусків втулків:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Втулок Minikube, що забезпечує локально збережений кластер Minikube з одним вузлом&lt;/li&gt;
&lt;li&gt;Втулок Karpenter із підтримкою Azure Node Auto-Provisioning (NAP)&lt;/li&gt;
&lt;li&gt;Втулок KEDA, про який ви можете дізнатися більше &lt;a href=&#34;https://headlamp.dev/blog/2025/07/25/enabling-event-driven-autoscaling-with-the-new-keda-plugin-for-headlamp/&#34;&gt;тут&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Втулки, що підтримуються спільнотою, для &lt;a href=&#34;https://github.com/sozercan/gatekeeper-headlamp-plugin&#34;&gt;Gatekeeper&lt;/a&gt; та &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;Дякуємо &lt;a href=&#34;https://github.com/shahvrushali22&#34;&gt;Врушалі Шах&lt;/a&gt; та &lt;a href=&#34;https://github.com/muraliinformal&#34;&gt;Муралі Аннамнені&lt;/a&gt; з Oracle, а також &lt;a href=&#34;https://github.com/SinghaAnirban005&#34;&gt;Анірбану Сінзі&lt;/a&gt;, &lt;a href=&#34;https://github.com/adwait-godbole&#34;&gt;Адвайт Годболе&lt;/a&gt;, &lt;a href=&#34;https://github.com/sozercan&#34;&gt;Сертач Озеркан&lt;/a&gt;, &lt;a href=&#34;https://github.com/chewong&#34;&gt;Ернест Вонг&lt;/a&gt; та &lt;a href=&#34;https://github.com/chloe608&#34;&gt;Хлоя Лім&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;other-plugins-updates&#34;&gt;Інші оновлення втулків&lt;/h3&gt;
&lt;p&gt;Окрім нових доповнень, ми також доопрацювали втулки, якими вже користуються багато хто з вас, зосередившись на більш комфортній роботі та кращій інтеграції з основним інтерфейсом користувача.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/backstage-plugin.png&#34;
         alt=&#34;Втулок Backstage&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Вигляд втулка Backstage&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Втулок Flux&lt;/strong&gt;: оновлено для Flux v2.7, з підтримкою нових CRD, виправленнями навігації, для безперебійної роботи на останніх кластерах&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Каталог застосунків&lt;/strong&gt;: тепер підтримує репозиторії Helm на додачу до Artifact Hub, може працювати в кластері через /serviceproxy та показує як поточні, так і останні версії застосунків&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Каталог втулків&lt;/strong&gt;: покращено макет карток та доступність, а також оновлено залежність та тести Storybook&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Втулок Backstage&lt;/strong&gt;: оновлено залежність та збірку, детальніше &lt;a href=&#34;https://headlamp.dev/blog/2025/11/05/strengthening-backstage-and-headlamp-integration/&#34;&gt;тут&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;plugin-development&#34;&gt;Розробка втулків&lt;/h3&gt;
&lt;p&gt;Ми зосередилися на тому, щоб зробити процес створення, тестування та постачання втулків Headlamp швидшим і зрозумілішим, спираючись на вдосконалену документацію та легші інструменти.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2026/01/22/headlamp-in-2025-project-highlights/plugin-development.png&#34;
         alt=&#34;Розробка втулків&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Вигляд посібника з розробки втулків&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зміни:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Нові та розширені посібники з &lt;a href=&#34;https://headlamp.dev/docs/latest/development/architecture#plugins&#34;&gt;архітектури втулків&lt;/a&gt; та &lt;a href=&#34;https://headlamp.dev/docs/latest/development/plugins/getting-started&#34;&gt;розробки&lt;/a&gt;, включаючи інформацію про те, як публікувати та поширювати втулки&lt;/li&gt;
&lt;li&gt;Додано &lt;a href=&#34;https://headlamp.dev/docs/latest/development/plugins/i18n&#34;&gt;документацію щодо підтримки i18n&lt;/a&gt;, щоб втулки можна було перекладати та локалізувати&lt;/li&gt;
&lt;li&gt;Додано приклади втулків: &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; та &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;Покращено перевірку типів для API Headlamp, відновлено підтримку Storybook для тестування компонентів та зменшено кількість залежностей для пришвидшення встановлення та зменшення кількості оновлень&lt;/li&gt;
&lt;li&gt;Задокументовано місця встановлення втулків, позначки інтерфейсу користувача в налаштуваннях втулків та мітки, що розрізняють втулки, які постачаються, встановлюються через інтерфейс користувача та в режимі розробки&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;security-upgrades&#34;&gt;Оновлення безпеки&lt;/h2&gt;
&lt;p&gt;Ми також працюємо над забезпеченням безпеки Headlamp — як шляхом посилення механізмів автентифікації, так і шляхом постійного відстеження вразливостей та оновлення інструментів.&lt;/p&gt;
&lt;p&gt;Оновлення:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ми регулярно оновлюємо залежні компоненти та усуваємо проблеми безпеки, слідкуючи за оновленнями безпеки.&lt;/li&gt;
&lt;li&gt;Ми посилили стандартний контекст безпеки Helm chart і виправили регресію, яка порушувала роботу менеджера втулків.&lt;/li&gt;
&lt;li&gt;Ми поліпшили безпеку OIDC за допомогою підтримки PKCE, що допомагає розблокувати більш безпечні та сумісні зі стандартами налаштування OIDC під час розгортання Headlamp у кластері.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Висновок&lt;/h2&gt;
&lt;p&gt;Дякуємо всім, хто зробив свій внесок у Headlamp цього року — чи то за допомогою pull-requests, втулків, чи просто розповівши про те, як ви використовуєте цей проєкт. Бачити, як різні команди впроваджують і розширюють проєкт, — це те, що значною мірою спонукає нас рухатися вперед. Якщо ваша організація використовує Headlamp, розгляньте можливість додати її до нашого &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/blob/main/ADOPTERS.md&#34;&gt;списку користувачів&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Якщо ви ще не мали нагоди випробувати Headlamp, всі ці оновлення вже доступні. Ознайомтеся з останньою версією Headlamp, випробуйте нові режими перегляду, втулки та документацію, а також поділіться з нами своїми відгуками в Slack або GitHub — ваші відгуки допомагають нам визначати подальший розвиток Headlamp.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Оголошення про створення робочої групи Checkpoint/Restore Working Group</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/21/introducing-checkpoint-restore-wg/</link>
      <pubDate>Wed, 21 Jan 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/21/introducing-checkpoint-restore-wg/</guid>
      <description>
        
        
        &lt;p&gt;Спільнота навколо Kubernetes включає в себе ряд спеціальних груп за інтересами (SIG) та робочих груп (WG), які сприяють обговоренню важливих тем між зацікавленими учасниками. Сьогодні ми хотіли б оголосити про створення нової робочої групи &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-checkpoint-restore&#34;&gt;Kubernetes Checkpoint Restore WG&lt;/a&gt;, яка зосередиться на інтеграції функціоналу Checkpoint/Restore в Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;motivation-and-use-cases&#34;&gt;Мотивація та випадки використання&lt;/h2&gt;
&lt;p&gt;Робоча група обговорює кілька сценаріїв високого рівня:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Оптимізація використання ресурсів для інтерактивних робочих навантажень, таких як Jupyter notebook та чат-боти зі штучним інтелектом&lt;/li&gt;
&lt;li&gt;Прискорення запуску застосунків з тривалим часом ініціалізації, включаючи Java-застосунки та &lt;a href=&#34;https://doi.org/10.1145/3731599.3767354&#34;&gt;служби LLM-інференції&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Використання періодичних контрольних точок для забезпечення відмовостійкості довготривалих робочих навантажень, таких як розподілене навчання моделей&lt;/li&gt;
&lt;li&gt;Забезпечення &lt;a href=&#34;https://doi.org/10.1007/978-3-032-10507-3_3&#34;&gt;планування з урахуванням переривань&lt;/a&gt; з прозорою перевіркою/відновленням, що дозволяє витісняти Pod з нижчим пріоритетом, зберігаючи стан виконання застосунків&lt;/li&gt;
&lt;li&gt;Спрощення міграції Podʼів між вузлами для балансування навантаження та обслуговування без переривання робочих навантажень.&lt;/li&gt;
&lt;li&gt;Увімкнення перевірки для розслідування та аналізу інцидентів безпеки, таких як кібератаки, порушення безпеки даних та несанкціонований доступ.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;У всіх цих сценаріях мета полягає в тому, щоб сприяти обговоренню ідей між спільнотою Kubernetes та екосистемою Checkpoint/Restore in Userspace (CRIU), яка постійно розширюється. Спільнота CRIU включає кілька проєктів, що підтримують ці випадки використання, зокрема:&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; — інструмент для створення контрольних точок та відновлення запущених застосунків і контейнерів&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/checkpoint-restore/checkpointctl&#34;&gt;checkpointctl&lt;/a&gt; — інструмент для поглибленого аналізу контрольних точок контейнерів&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/checkpoint-restore/criu-coordinator&#34;&gt;criu-coordinator&lt;/a&gt; — інструмент для скоординованого створення контрольних точок/відновлення розподілених застосунків за допомогою 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; — оператор Kubernetes для управління контрольними точками&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Більше інформації про інтеграцію контрольних точок/відновлення з Kubernetes також доступно &lt;a href=&#34;https://criu.org/Kubernetes&#34;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;related-events&#34;&gt;Повʼязані події&lt;/h2&gt;
&lt;p&gt;Після нашої презентації про &lt;a href=&#34;https://sched.co/1tx7i&#34;&gt;прозорі контрольні точки&lt;/a&gt; на KubeCon EU 2025, ми раді запросити вас до участі в нашій &lt;a href=&#34;https://sched.co/2CW6P&#34;&gt;панельній дискусії&lt;/a&gt; та &lt;a href=&#34;https://sched.co/2CW7Z&#34;&gt;сесії AI + ML&lt;/a&gt; на KubeCon + CloudNativeCon Europe 2026.&lt;/p&gt;
&lt;h2 id=&#34;connect-with-us&#34;&gt;Звʼяжіться з нами&lt;/h2&gt;
&lt;p&gt;Якщо ви зацікавлені у співпраці з Kubernetes або CRIU, є кілька способів взяти участь:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Приєднуйтесь до наших зустрічей щодругого четверга о 17:00 UTC за посиланням Zoom у наших &lt;a href=&#34;https://docs.google.com/document/d/1ZMtHBibXfTw4cQerM4O4DJonzVs3W7Hp2K5ml6pTufs/edit&#34;&gt;нотатках про зустрічі&lt;/a&gt;; записи наших попередніх зустрічей доступні &lt;a href=&#34;https://www.youtube.com/playlist?list=PL69nYSiGNLP1P7F40IMVL3NsNiIm5AGos&#34;&gt;тут&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Поспілкуйтеся з нами на &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;Надішліть нам електронного листа на &lt;a href=&#34;https://groups.google.com/a/kubernetes.io/g/wg-checkpoint-restore&#34;&gt;адресу розсилки wg-checkpoint-restore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Уніфікований доступ до сервера API за допомогою clientcmd</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/19/clientcmd-apiserver-access/</link>
      <pubDate>Mon, 19 Jan 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/19/clientcmd-apiserver-access/</guid>
      <description>
        
        
        &lt;p&gt;Якщо ви коли-небудь хотіли створювати консольного клієнта для API Kubernetes, особливо якщо ви розглядали можливість використання вашого клієнта як втулка &lt;code&gt;kubectl&lt;/code&gt;, ви, можливо, замислювалися над тим, як зробити вашого клієнта звичним для користувачів &lt;code&gt;kubectl&lt;/code&gt;. Швидкий погляд на вихідні дані &lt;code&gt;kubectl options&lt;/code&gt; може вас збентежити: «Невже я повинен реалізувати всі ці опції?»&lt;/p&gt;
&lt;p&gt;Не бійтеся, інші вже зробили за вас велику частину роботи. Насправді проєкт Kubernetes надає дві бібліотеки, які допоможуть вам обробляти аргументи командного рядка в стилі &lt;code&gt;kubectl&lt;/code&gt; у програмах Go: &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; та &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; (яка використовує &lt;code&gt;clientcmd&lt;/code&gt;). У цій статті ми покажемо, як використовувати першу з них.&lt;/p&gt;
&lt;h2 id=&#34;general-philosophy&#34;&gt;Загальна філософія&lt;/h2&gt;
&lt;p&gt;Як і слід було очікувати, оскільки це частина &lt;code&gt;client-go&lt;/code&gt;, кінцевою метою &lt;code&gt;clientcmd&lt;/code&gt; є надання екземпляра &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;, який може надсилати запити до сервера API.&lt;/p&gt;
&lt;p&gt;Він дотримується семантики &lt;code&gt;kubectl&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;стандартні значення беруться з &lt;code&gt;~/.kube&lt;/code&gt; або еквівалентного файлу;&lt;/li&gt;
&lt;li&gt;файли можна вказати за допомогою змінної середовища &lt;code&gt;KUBECONFIG&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;усі вищезазначені налаштування можна додатково замінити за допомогою аргументів командного рядка.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Він не встановлює аргумент командного рядка &lt;code&gt;--kubeconfig&lt;/code&gt;, що може знадобитися для узгодження з &lt;code&gt;kubectl&lt;/code&gt;; як це зробити, ви дізнаєтеся в розділі «&lt;a href=&#34;#bind-the-flags&#34;&gt;Привʼязування прапорців&lt;/a&gt;».&lt;/p&gt;
&lt;h2 id=&#34;available-features&#34;&gt;Доступні функції&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;clientcmd&lt;/code&gt; дозволяє програмам обробляти&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;вибір &lt;code&gt;kubeconfig&lt;/code&gt; (за допомогою &lt;code&gt;KUBECONFIG&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;вибір контексту;&lt;/li&gt;
&lt;li&gt;вибір простору імен;&lt;/li&gt;
&lt;li&gt;сертифікати клієнта та приватні ключі;&lt;/li&gt;
&lt;li&gt;імітацію користувача;&lt;/li&gt;
&lt;li&gt;підтримку базової автентифікації HTTP (імʼя користувача/пароль).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-merging&#34;&gt;Обʼєднання конфігурацій&lt;/h2&gt;
&lt;p&gt;У різних сценаріях &lt;code&gt;clientcmd&lt;/code&gt; підтримує &lt;em&gt;обʼєднання&lt;/em&gt; параметрів конфігурацій: &lt;code&gt;KUBECONFIG&lt;/code&gt; може вказувати декілька файлів, вміст яких обʼєднується. Це може викликати плутанину, оскільки параметри обʼєднуються в різних напрямках залежно від того, як вони реалізовані. Якщо параметр визначений у мапі, перше визначення має пріоритет, а наступні визначення ігноруються. Якщо параметр не визначений у мапі, останнє визначення має пріоритет.&lt;/p&gt;
&lt;p&gt;Коли налаштування отримуються за допомогою &lt;code&gt;KUBECONFIG&lt;/code&gt;, відсутні файли призводять лише до попереджень. Якщо користувач явно вказує шлях (у стилі &lt;code&gt;--kubeconfig&lt;/code&gt;), повинен бути відповідний файл.&lt;/p&gt;
&lt;p&gt;Якщо &lt;code&gt;KUBECONFIG&lt;/code&gt; не визначено, замість нього використовується стандартний файл конфігурації &lt;code&gt;~/.kube/config&lt;/code&gt;, якщо він є.&lt;/p&gt;
&lt;h3 id=&#34;overall-process&#34;&gt;Загальний процес&lt;/h3&gt;
&lt;p&gt;Загальна схема використання стисло викладена в документації до пакунка &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;:&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;// якщо ви хочете змінити правила завантаження (які файли в якому порядку), ви можете зробити це тут
&lt;/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;// якщо ви хочете змінити значення перевизначення або привʼязати їх до прапорців, є методи, які допоможуть вам
&lt;/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;//Щось робимо
&lt;/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;У контексті цієї статті є шість кроків:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#configure-the-loading-rules&#34;&gt;Налаштування правил завантаження&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#configure-the-overrides&#34;&gt;Налаштування перевизначення&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#build-a-set-of-flags&#34;&gt;Створення набору прапорців&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#bind-the-flags&#34;&gt;Привʼязування прапорів&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#build-the-merged-configuration&#34;&gt;Створення обʼєднаної конфігурації&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#obtain-an-api-client&#34;&gt;Отримання клієнта API&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;configure-the-loading-rules&#34;&gt;Налаштування правил завантаження&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;clientcmd.NewDefaultClientConfigLoadingRules()&lt;/code&gt; створює правила завантаження, які будуть використовувати або вміст змінної середовища &lt;code&gt;KUBECONFIG&lt;/code&gt;, або імʼя стандартного файлу конфігурації (&lt;code&gt;~/.kube/config&lt;/code&gt;). Крім того, якщо використовується стандартний файл конфігурації, він може перенести налаштування з (дуже) старого стандартного файлу конфігурації (&lt;code&gt;~/.kube/.kubeconfig&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Ви можете створити власні &lt;code&gt;ClientConfigLoadingRules&lt;/code&gt;, але в більшості випадків стандартні налаштування підходять.&lt;/p&gt;
&lt;h3 id=&#34;configure-the-overrides&#34;&gt;Налаштування перевизначення&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;clientcmd.ConfigOverrides&lt;/code&gt; — це &lt;code&gt;структура&lt;/code&gt;, що зберігає перевизначення, які будуть застосовані до налаштувань, завантажених із конфігурації, отриманої за допомогою правил завантаження. У контексті цієї статті її основною метою є зберігання значень, отриманих з аргументів командного рядка. Вони обробляються за допомогою бібліотеки &lt;a href=&#34;https://github.com/spf13/pflag&#34;&gt;pflag&lt;/a&gt;, яка є повноцінною заміною пакунка Go &lt;a href=&#34;https://pkg.go.dev/flag&#34;&gt;&lt;code&gt;flag&lt;/code&gt;&lt;/a&gt; і додає підтримку аргументів з подвійним дефісом і довгими іменами.&lt;/p&gt;
&lt;p&gt;У більшості випадків в перевизначеннях нічого не потрібно встановлювати; я лише привʼяжу їх до прапорців.&lt;/p&gt;
&lt;h3 id=&#34;build-a-set-of-flags&#34;&gt;Створення набору прапорців&lt;/h3&gt;
&lt;p&gt;У цьому контексті прапорець є уособленням аргументу командного рядка, що вказує його повну назву (наприклад, &lt;code&gt;--namespace&lt;/code&gt;), його скорочену назву, якщо така є (наприклад, &lt;code&gt;-n&lt;/code&gt;), його стандартне значення та опис, що показується в інформації про використання. Прапорці зберігаються в екземплярах структури &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;.&lt;/p&gt;
&lt;p&gt;Доступні три набори прапорців, що представляють такі аргументи командного рядка:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;аргументи автентифікації (сертифікати, токени, імітації іншого користувача, імʼя користувача/пароль);&lt;/li&gt;
&lt;li&gt;аргументи кластера (сервер API, центр сертифікації, конфігурація TLS, проксі, стиснення)&lt;/li&gt;
&lt;li&gt;аргументи контексту (ім&#39;я кластера, імʼя користувача &lt;code&gt;kubeconfig&lt;/code&gt;, простір імен)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Рекомендований вибір включає всі три з аргументом вибору іменованого контексту та аргументом часу очікування.&lt;/p&gt;
&lt;p&gt;Всі вони доступні за допомогою функцій &lt;code&gt;Recommended…Flags&lt;/code&gt;. Функції приймають префікс, який додається до всіх довгих імен аргументів.&lt;/p&gt;
&lt;p&gt;Отже, виклик &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#RecommendedConfigOverrideFlags&#34;&gt;&lt;code&gt;clientcmd.RecommendedConfigOverrideFlags(«»)&lt;/code&gt;&lt;/a&gt; призводить до появи аргументів командного рядка, таких як &lt;code&gt;--context&lt;/code&gt;, &lt;code&gt;--namespace&lt;/code&gt; тощо. Аргументу &lt;code&gt;--timeout&lt;/code&gt; присвоюється стандартне значення 0, а аргумент &lt;code&gt;--namespace&lt;/code&gt; має відповідний короткий варіант &lt;code&gt;-n&lt;/code&gt;. Додавання префікса, наприклад &lt;code&gt;&amp;quot;from-&amp;quot;&lt;/code&gt;, призводить до появи аргументів командного рядка, таких як &lt;code&gt;--from-context&lt;/code&gt;, &lt;code&gt;--from-namespace&lt;/code&gt; тощо. Це може здатися не особливо корисним для команд, що стосуються одного сервера API, але вони стають у пригоді, коли залучено кілька серверів API, наприклад у сценаріях із кількома кластерами.&lt;/p&gt;
&lt;p&gt;Тут є потенційна проблема: префікси не змінюють коротке імʼя, тому &lt;code&gt;--namespace&lt;/code&gt; потребує певної обережності, якщо використовується кілька префіксів: лише один із префіксів може бути повʼязаний із коротким імʼям &lt;code&gt;-n&lt;/code&gt;. Вам доведеться очистити короткі імена, повʼязані з іншими префіксами &lt;code&gt;--namespace&lt;/code&gt;, або, можливо, всі префікси, якщо немає логічного звʼязку з &lt;code&gt;-n&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;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;Аналогічним чином прапорці можна повністю вимкнути, очистивши їх довге імʼя:&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;Привʼязування прапорів&lt;/h3&gt;
&lt;p&gt;Після визначення набору прапорців його можна використовувати для привʼязки аргументів командного рядка до перевизначення за допомогою &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;. Для цього потрібен &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;, а не пакунок &lt;code&gt;flag&lt;/code&gt; з Go.&lt;/p&gt;
&lt;p&gt;Якщо ви також хочете привʼязати &lt;code&gt;--kubeconfig&lt;/code&gt;, зробіть це зараз, привʼязавши &lt;code&gt;ExplicitPath&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;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;Створення обʼєднаної конфігурації&lt;/h3&gt;
&lt;p&gt;Для створення обʼєднаної конфігурації доступні дві функції:&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;Як випливає з назв, різниця між цими двома функціями полягає в тому, що перша може запитувати інформацію для автентифікації в інтерактивному режимі, використовуючи наданий зчитувач, тоді як друга працює тільки з інформацією, наданою їй викликом.&lt;/p&gt;
&lt;p&gt;Слово &amp;quot;deferred&amp;quot; (відкладене) у назвах цих функцій означає, що остаточна конфігурація буде визначена якомога пізніше. Це означає, що ці функції можна викликати до аналізу аргументів командного рядка, а в результаті конфігурація буде використовувати будь-які значення, проаналізовані на момент її фактичного створення.&lt;/p&gt;
&lt;h3 id=&#34;obtain-an-api-client&#34;&gt;Отримання клієнта API&lt;/h3&gt;
&lt;p&gt;Обʼєднана конфігурація повертається як екземпляр &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;. API-клієнт можна отримати з нього, викликавши метод &lt;code&gt;ClientConfig()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Якщо конфігурація не вказана (&lt;code&gt;KUBECONFIG&lt;/code&gt; порожній або вказує на відсутні файли, &lt;code&gt;~/.kube/config&lt;/code&gt; не існує, а конфігурація не вказана за допомогою аргументів командного рядка), стандартна настройка поверне незрозумілу помилку, що посилається на &lt;code&gt;KUBERNETES_MASTER&lt;/code&gt;. Це застаріла поведінка; було зроблено кілька спроб позбутися її, але вона збереглася для аргументів командного рядка &lt;code&gt;--local&lt;/code&gt; та &lt;code&gt;--dry-run&lt;/code&gt; у &lt;code&gt;--kubectl&lt;/code&gt;. Ви повинні перевіряти наявність помилок «порожньої конфігурації», викликаючи &lt;code&gt;clientcmd.IsEmptyConfig()&lt;/code&gt;, і надавати чіткіше повідомлення про помилку.&lt;/p&gt;
&lt;p&gt;Метод &lt;code&gt;Namespace()&lt;/code&gt; також корисний: він повертає простір імен, який слід використовувати. Він також вказує, чи був простір імен перезаписаний користувачем (за допомогою &lt;code&gt;--namespace&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;full-example&#34;&gt;Повний приклад&lt;/h2&gt;
&lt;p&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;&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;// Завантаження правил, без налаштувань
&lt;/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;// Перезапис і налаштування прапорця (аргумент командного рядка)
&lt;/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;// Створення клієнта
&lt;/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;// Як дізнатися, який простір імен використовувати
&lt;/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;// Використаємо клієнта
&lt;/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;Приємного програмування та дякуємо за ваш інтерес до впровадження інструментів зі звичними моделями використання!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: До kuberc додано обмеження щодо виконуваних файлів, які викликаються kubeconfigs через exec plugin allowList</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/09/kubernetes-v1-35-kuberc-credential-plugin-allowlist/</guid>
      <description>
        
        
        &lt;p&gt;Чи знали ви, що &lt;code&gt;kubectl&lt;/code&gt; може запускати довільні виконувані файли, включаючи скрипти оболонки, з повними правами користувача, який їх викликає, і навіть без вашого відома? Кожного разу, коли ви завантажуєте або автоматично генеруєте &lt;code&gt;kubeconfig&lt;/code&gt;, поле &lt;code&gt;users[n].exec.command&lt;/code&gt; може вказати виконуваний файл для отримання облікових даних від вашого імені. Не зрозумійте мене неправильно, це неймовірна функція, яка дозволяє вам пройти автентифікацію в кластері за допомогою зовнішніх постачальників ідентифікації. Проте, ви, мабуть, бачите проблему: чи знаєте ви точно, які виконувані файли ваш &lt;code&gt;kubeconfig&lt;/code&gt; запускає у вашій системі? Чи довіряєте ви конвеєру, який згенерував ваш &lt;code&gt;kubeconfig&lt;/code&gt;? Якщо на код, що генерує kubeconfig, було здійснено атаку на ланцюжок постачання, або якщо конвеєр генерації було скомпрометовано, зловмисник може робити неприємні речі з вашою машиною, змушуючи ваш &lt;code&gt;kubeconfig&lt;/code&gt; виконувати довільний код.&lt;/p&gt;
&lt;p&gt;Щоб надати користувачам більше контролю над тим, що виконується в їхній системі, &lt;a href=&#34;https://git.k8s.io/community/sig-auth&#34;&gt;SIG-Auth&lt;/a&gt; та &lt;a href=&#34;https://git.k8s.io/community/sig-cli&#34;&gt;SIG-CLI&lt;/a&gt; додали політику втулків для облікових даних та список дозволених елементів як бета-функцію до Kubernetes 1.35. Це доступно для всіх клієнтів, які використовують бібліотеку &lt;code&gt;client-go&lt;/code&gt;, шляхом заповнення структури &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; у конфігурації REST. Щоб розширити вплив цієї зміни, Kubernetes v1.35 також дозволяє керувати цим без написання жодної лінії програмного коду. Ви можете налаштувати &lt;code&gt;kubectl&lt;/code&gt; для застосування політики та списку дозволеного, додавши два поля до файлу конфігурації &lt;code&gt;kuberc&lt;/code&gt;: &lt;code&gt;credentialPluginPolicy&lt;/code&gt; та &lt;code&gt;credentialPluginAllowlist&lt;/code&gt;. Додавання одного або обох цих полів обмежує втулки облікових даних, які &lt;code&gt;kubectl&lt;/code&gt; може виконувати.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;Як це працює&lt;/h2&gt;
&lt;p&gt;Повний опис цієї функції доступний в нашій &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/kubectl/kuberc/&#34;&gt;офіційній документації&lt;/a&gt; до kuberc, але в цьому блозі ми надамо короткий огляд нових налаштувань безпеки. Нові функції знаходяться в стадії бета-тестування і доступні без використання будь-яких функціональних обмежень.&lt;/p&gt;
&lt;p&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Це дозволить &lt;code&gt;kubectl&lt;/code&gt; працювати як і раніше, а всі втулки будуть дозволені.&lt;/p&gt;
&lt;p&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;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;Якщо ви &lt;em&gt;не знаєте&lt;/em&gt;, чи ви використовуєте exec втулки для облікових даних, спробуйте встановити політику на &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;Якщо ви &lt;em&gt;використовуєте&lt;/em&gt; втулки для введення облікових даних, ви швидко зʼясуєте, що намагається виконати &lt;code&gt;kubectl&lt;/code&gt;. Ви отримаєте помилку, подібну до наведеної нижче.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Неможливо підключитися до сервера: отримання облікових даних: втулок «cloudco-login» не дозволений: політика встановлена на «DenyAll»&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&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;&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;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;Вибіркові дозволи для втулків&lt;/h3&gt;
&lt;p&gt;Що робити, якщо для щоденної роботи вам потрібен втулок &lt;code&gt;cloudco-login&lt;/code&gt;? Саме для цього існує третій варіант політики — &lt;code&gt;Allowlist&lt;/code&gt;. Щоб дозволити використання певного втулка, встановіть політику та додайте &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;Ви помітите, що в allowlist є два записи. Один з них вказаний повним шляхом, а інший, &lt;code&gt;get-identity&lt;/code&gt;, є лише базовим іменем. Коли ви вказуєте лише базове імʼя, повний шлях буде шукатися за допомогою &lt;code&gt;exec.LookPath&lt;/code&gt;, який не розширює globbing і не обробляє символи-замінники. Globbing наразі не підтримується. Обидві форми (базова назва та повний шлях) є прийнятними, але повний шлях є кращим, оскільки він ще більше звужує діапазон дозволених бінарних файлів.&lt;/p&gt;
&lt;h3 id=&#34;future-enhancements&#34;&gt;Майбутні вдосконалення&lt;/h3&gt;
&lt;p&gt;Наразі запис у списку дозволеного (allowlist) має лише одне поле, &lt;code&gt;name&lt;/code&gt;. У майбутньому ми (Kubernetes SIG CLI) хочемо додати інші вимоги. Однією з корисних ідей є перевірка контрольної суми, за допомогою якої, наприклад, бінарний файл можна буде запустити, тільки якщо він має суму sha256 &lt;code&gt;b9a3fad00d848ff31960c44ebb5f8b92032dc085020f857c98e32a5d5900ff9c&lt;/code&gt; &lt;strong&gt;і&lt;/strong&gt; знаходиться за адресою &lt;code&gt;/usr/bin/cloudco-login&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Інша можливість — дозволити лише бінарні файли, підписані одним із довірених ключів підпису.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Приєднуйтесь&lt;/h2&gt;
&lt;p&gt;Політика втулків автентифікації все ще перебуває на стадії розробки, і ми дуже зацікавлені у ваших відгуках. Ми хотіли б дізнатися, що вам подобається в ній і які проблеми ви хотіли б, щоб вона вирішувала. Або, якщо у вас є час, щоб долучитися до розробки одного з вищезазначених вдосконалень, це буде чудовим способом розпочати співпрацю з Kubernetes. Приєднуйтесь до обговорення в 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: Змінювана спорідненість вузлів PersistentVolume (альфа)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/08/kubernetes-v1-35-mutable-pv-nodeaffinity/</guid>
      <description>
        
        
        &lt;p&gt;API &lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/persistent-volumes/#node-affinity&#34;&gt;спорідненості вузлів&lt;/a&gt; PersistentVolume зʼявився ще в Kubernetes v1.10. Він широко використовується для позначення того, що томи можуть бути не однаково доступними для всіх вузлів у кластері. Раніше це поле було незмінним, а тепер воно стало змінюваним у Kubernets v1.35 (альфа). Ця зміна відкриває можливості для більш гнучкого управління томами в режимі онлайн.&lt;/p&gt;
&lt;h2 id=&#34;why-make-node-affinity-mutable&#34;&gt;Для чого робити спорідненість вузлів змінюваною?&lt;/h2&gt;
&lt;p&gt;Це викликає очевидне запитання: чому зараз зробити спорідненість вузлів змінюваною? Хоча робочі навантаження без збереження стану, такі як Deployments, можна вільно змінювати, і зміни будуть автоматично впроваджуватися шляхом повторного створення кожного Podʼа, PersistentVolumes (PV) мають стан і їх не можна легко створити заново без втрати даних.&lt;/p&gt;
&lt;p&gt;Однак постачальники послуг зберігання даних розвиваються, а вимоги до зберігання змінюються. Зокрема, зараз багато постачальників пропонують диски регіонального рівня. Деякі з них навіть підтримують міграцію в режимі реального часу з дискових зон на диски регіонального рівня без переривання робочих навантажень. Ця зміна може бути реалізована за допомогою API &lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/volume-attributes-classes/&#34;&gt;VolumeAttributesClass&lt;/a&gt;, який нещодавно перейшов у статус GA в версії 1.34. Однак навіть якщо том переміщено до регіонального сховища, Kubernetes все одно не дозволяє планувати Podʼи до інших зон через спорідненість вузлів, записану в обʼєкті PV. У цьому випадку можна змінити спорідненість вузлів PV з:&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;на:&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;Іншим прикладом є те, що постачальники іноді пропонують диски нового покоління. Нові диски не завжди можна додати до старих вузлів у кластері. Ця доступність також може бути представлена через спорідненість вузлів PV і гарантує, що Podʼи можна запланувати на правильні вузли. Але коли диск оновлюється, нові Podʼи, що використовують цей диск, все одно можуть бути заплановані на старі вузли. Щоб цього уникнути, можна змінити спорідненість вузлів PV з:&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;на:&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;Отже, тепер це можна змінювати, що є першим кроком до більш гнучкого управління томів онлайн. Хоча це проста зміна, яка видаляє одну перевірку з API-сервера, нам ще далеко до повної інтеграції з екосистемою Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Спробуйте&lt;/h2&gt;
&lt;p&gt;Ця функція підходить вам, якщо ви є адміністратором кластера Kubernetes, а ваш постачальник сховища дозволяє здійснювати онлайн-оновлення, якими ви хочете скористатися, але ці оновлення можуть вплинути на доступність тому.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що зміна спорідненості вузлів PV сама по собі не змінить доступність базового тому. Перед використанням цієї функції спочатку необхідно оновити базовий том у постачальника сховища та зрозуміти, які вузли матимуть доступ до тому після оновлення. Після цього можна ввімкнути цю функцію та синхронізувати спорідненість вузлів PV.&lt;/p&gt;
&lt;p&gt;Наразі ця функція перебуває в стадії альфа-тестування. Вона є стандартно вимкненою і може бути предметом змін. Щоб її випробувати, увімкніть можливість &lt;code&gt;MutablePVNodeAffinity&lt;/code&gt; в APIServer, після чого ви зможете редагувати поле PV &lt;code&gt;spec.nodeAffinity&lt;/code&gt;. Зазвичай PV можуть редагувати лише адміністратори, тому переконайтеся, що ви маєте відповідні дозволи RBAC.&lt;/p&gt;
&lt;h3 id=&#34;race-condition-between-updating-and-scheduling&#34;&gt;Гонитва між оновленням і плануванням&lt;/h3&gt;
&lt;p&gt;Існує лише кілька факторів поза межами Podʼа, які можуть вплинути на рішення щодо планування, і спорідненість вузлів PV є одним з них. Можна дозволити більшій кількості вузлів отримати доступ до тому, послабивши спорідненість вузлів, але при спробі посилити спорідненість вузлів виникає стан конкуренції: незрозуміло, як планувальник побачить змінений PV у своєму кеші, тому існує невеликий проміжок часу, коли планувальник може розмістити Pod на старому вузлі, який більше не має доступу до тому. У цьому випадку Pod застрягне в стані &lt;code&gt;ContainerCreating&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Одним зі способів усунення цієї проблеми, який зараз обговорюється, є відмова kubelet у запуску Podʼів, якщо порушується спорідненість вузлів PersistentVolume. Ця функція ще не реалізована. Тому, якщо ви пробуєте це зараз, стежте за наступними Podʼами, які використовують оновлений PV, і переконайтеся, що вони заплановані на вузли, які мають доступ до тому. Якщо ви оновлюєте PV і відразу запускаєте нові Podʼи в скрипті, це може не працювати як передбачалося.&lt;/p&gt;
&lt;h2 id=&#34;future-integration-with-csi-container-storage-interface&#34;&gt;Майбутня інтеграція з CSI (Container Storage Interface)&lt;/h2&gt;
&lt;p&gt;Наразі адміністратор кластера може змінювати як спорідненість вузлів PV, так і базовий том у постачальнику сховища. Однак ручні операції є помилковими та трудомісткими. Бажано з часом інтегрувати це з VolumeAttributesClass, щоб користувач без привілеїв міг змінювати свій PersistentVolumeClaim (PVC) для запуску оновлень на стороні сховища, а спорідненість вузлів PV оновлювалася автоматично в разі потреби без втручання адміністратора кластера.&lt;/p&gt;
&lt;h2 id=&#34;we-welcome-your-feedback-from-users-and-storage-driver-developers&#34;&gt;Ми будемо раді отримати відгуки від користувачів та розробників драйверів сховищ&lt;/h2&gt;
&lt;p&gt;Як зазначалося раніше, це лише перший крок.&lt;/p&gt;
&lt;p&gt;Якщо ви є користувачем Kubernetes, ми хотіли б дізнатися, як ви використовуєте (або будете використовувати) спорідненість вузлів PV. Чи є для вас корисним оновлення її в режимі онлайн?&lt;/p&gt;
&lt;p&gt;Якщо ви розробник драйверів CSI, чи готові ви реалізувати цю функцію? Як би ви хотіли, щоб виглядав API?&lt;/p&gt;
&lt;p&gt;Надішліть свої відгуки у:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Каналі Slack &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-storage&#34;&gt;#sig-storage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Списку розсилки &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;В тікеті KEP &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;З будь-якими запитаннями або конкретними питаннями, повʼязаними з цією функцією, звертайтеся до &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;спільноти SIG Storage&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Кращий спосіб передачі токенів службових облікових записів до драйверів CSI</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/07/kubernetes-v1-35-csi-sa-tokens-secrets-field-beta/</guid>
      <description>
        
        
        &lt;p&gt;Якщо ви підтримуєте драйвер CSI, який використовує токени службових облікових записів, Kubernetes v1.35 приносить удосконалення, про яке вам варто знати. З моменту введення функції &lt;a href=&#34;https://kubernetes-csi.github.io/docs/token-requests.html&#34;&gt;TokenRequests&lt;/a&gt;, токени службових облікових записів, запитувані драйверами CSI, передавалися їм через поле &lt;code&gt;volume_context&lt;/code&gt;. Хоча це працювало, це не ідеальне місце для конфіденційної інформації, і ми бачили випадки, коли токени випадково реєструвалися в драйверах CSI.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 вводить рішення бета-версії для вирішення цієї проблеми:
&lt;em&gt;Опція драйвера CSI для токенів службових облікових записів через поле Secrets&lt;/em&gt;.
Це дозволяє драйверам CSI отримувати токени службових облікових записів
через поле &lt;code&gt;secrets&lt;/code&gt; у &lt;code&gt;NodePublishVolumeRequest&lt;/code&gt;,
яке є відповідним місцем для конфіденційних даних у специфікації CSI.&lt;/p&gt;
&lt;h2 id=&#34;understanding-the-existing-approach&#34;&gt;Розуміння поточного підходу&lt;/h2&gt;
&lt;p&gt;Коли драйвери CSI використовують функцію &lt;a href=&#34;https://kubernetes-csi.github.io/docs/token-requests.html&#34;&gt;TokenRequests&lt;/a&gt;, вони можуть запитувати токени службових облікових записів для ідентифікації робочого навантаження, налаштовуючи поле &lt;code&gt;TokenRequests&lt;/code&gt; у специфікації CSIDriver. Ці токени передаються драйверам як частина мапи атрибутів тому, використовуючи ключ &lt;code&gt;csi.storage.k8s.io/serviceAccount.tokens&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Поле &lt;code&gt;volume_context&lt;/code&gt; працює, але воно не призначене для конфіденційних даних. Через це виникають кілька викликів:&lt;/p&gt;
&lt;p&gt;По-перше, інструмент &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;, який використовують драйвери CSI, не розглядає контекст тому як конфіденційний, тому токени службових облікових записів можуть потрапити до журналів, коли реєструються gRPC-запити. Це сталося з &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; у Secrets Store CSI Driver та &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/124759&#34;&gt;CVE-2024-3744&lt;/a&gt; у Azure File CSI Driver.&lt;/p&gt;
&lt;p&gt;По-друге, кожен драйвер CSI, який хоче уникнути цієї проблеми, повинен реалізовувати власну логіку санітізації, що призводить до неузгодженості між драйверами.&lt;/p&gt;
&lt;p&gt;Специфікація CSI вже має поле &lt;code&gt;secrets&lt;/code&gt; у &lt;code&gt;NodePublishVolumeRequest&lt;/code&gt;, яке призначене саме для такого роду конфіденційної інформації. Проблема полягає в тому, що ми не можемо просто змінити місце, де ми розміщуємо токени, без порушення роботи поточних драйверів CSI, які очікують їх у контексті тому.&lt;/p&gt;
&lt;h2 id=&#34;how-the-opt-in-mechanism-works&#34;&gt;Як працює механізм увімкнення&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 вводить механізм увімкнення, який дозволяє драйверам CSI вибирати, як вони отримують токени службових облікових записів. Таким чином, поточні драйвери продовжують працювати як і раніше, а інші драйвери можуть перейти до більш відповідного поля secrets, коли будуть готові.&lt;/p&gt;
&lt;p&gt;Драйвери CSI можуть встановити нове поле у своїй специфікації CSIDriver:&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;# УВАГА: це приклад конфігурації.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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:#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;# ... наявні поля ...&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# Нове поле для опції доставки через secrets&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# стандартно 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;Поведінка залежить від поля &lt;code&gt;serviceAccountTokenInSecrets&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;Коли встановлено &lt;code&gt;false&lt;/code&gt; (стандартно), токени розміщуються у &lt;code&gt;VolumeContext&lt;/code&gt; з ключем &lt;code&gt;csi.storage.k8s.io/serviceAccount.tokens&lt;/code&gt;, як і сьогодні.
Коли встановлено &lt;code&gt;true&lt;/code&gt;, токени розміщуються лише у полі &lt;code&gt;Secrets&lt;/code&gt; з тим самим ключем.&lt;/p&gt;
&lt;h2 id=&#34;about-the-beta-release&#34;&gt;Про бета-реліз&lt;/h2&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;CSIServiceAccountTokenSecrets&lt;/code&gt; стандартно увімкнена як для kubelet, так і для kube-apiserver. Оскільки поле &lt;code&gt;serviceAccountTokenInSecrets&lt;/code&gt; стандартно має значення &lt;code&gt;false&lt;/code&gt;, увімкнення функціональної можливості не змінює жодної поточної поведінки. Усі драйвери продовжують отримувати токени через контекст тому, якщо вони явно не оберуться. Це пояснює, чому ми почувалися комфортно, починаючи з бета-версії, а не альфа.&lt;/p&gt;
&lt;h2 id=&#34;guide-for-csi-driver-authors&#34;&gt;Посібник для авторів драйверів CSI&lt;/h2&gt;
&lt;p&gt;Якщо ви підтримуєте драйвер CSI, який використовує токени службових облікових записів, ось як запровадити цю функцію.&lt;/p&gt;
&lt;h3 id=&#34;adding-fallback-logic&#34;&gt;Додавання резервної логіки&lt;/h3&gt;
&lt;p&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;&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;// Перевірити поле secrets спочатку (нова поведінка, коли драйвер обирається)
&lt;/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;// Резерв до контексту тому (поточна поведінка)
&lt;/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;Ця резервна логіка є зворотньо сумісною та безпечною для випуску в будь-якій версії драйвера, навіть до оновлення кластерів до v1.35.&lt;/p&gt;
&lt;h3 id=&#34;rollout-sequence&#34;&gt;Послідовність розгортання&lt;/h3&gt;
&lt;p&gt;Автори драйверів CSI повинні дотримуватися певної послідовності при прийнятті цієї функції, щоб уникнути порушення наявних томів.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Підготовка драйвера&lt;/strong&gt; (може відбутися будь-коли)&lt;/p&gt;
&lt;p&gt;Ви можете почати підготовку вашого драйвера прямо зараз, додавши резервну логіку, яка перевіряє як поле secrets, так і контекст тому на наявність токенів. Ця зміна коду є зворотньо сумісною та безпечною для випуску в будь-якій версії драйвера, навіть до оновлення кластерів до v1.35. Ми заохочуємо вас додати цю логіку раніше, випускати релізи та навіть робити зворотні портування до гілок обслуговування, де це можливо.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Оновлення кластера та увімкнення функції&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Після того, як ваш драйвер має резервну логіку, ось безпечний порядок розгортання для увімкнення функції в кластері:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Завершити оновлення kube-apiserver до 1.35 або пізнішої версії&lt;/li&gt;
&lt;li&gt;Завершити оновлення kubelet до 1.35 або пізнішої версії на всіх вузлах&lt;/li&gt;
&lt;li&gt;Переконатися, що версія драйвера CSI з резервною логікою розгорнута (якщо не зроблено в фазі підготовки)&lt;/li&gt;
&lt;li&gt;Повністю завершити розгортання DaemonSet драйвера CSI на всіх вузлах&lt;/li&gt;
&lt;li&gt;Оновити ваш маніфест CSIDriver, щоб встановити &lt;code&gt;serviceAccountTokenInSecrets: true&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;important-constraints&#34;&gt;Важливі обмеження&lt;/h3&gt;
&lt;p&gt;Найважливіше, що потрібно памʼятати, — це час. Якщо ваш DaemonSet драйвера CSI та обʼєкт CSIDriver знаходяться в одному маніфесті або чарті Helm, вам потрібно два окремі оновлення. Спочатку розгорніть нову версію драйвера з резервною логікою, зачекайте завершення розгортання DaemonSet, потім оновіть специфікацію CSIDriver, щоб встановити &lt;code&gt;serviceAccountTokenInSecrets: true&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Також не оновлюйте CSIDriver перед тим, як усі поди драйвера будуть розгорнуті. Якщо ви це зробите, монтування томів зазнають невдачі на вузлах, які все ще працюють зі старою версією драйвера, оскільки ті поди перевіряють лише контекст тому.&lt;/p&gt;
&lt;h2 id=&#34;why-this-matters&#34;&gt;Чому це важливо&lt;/h2&gt;
&lt;p&gt;Прийняття цієї функції допомагає в кількох аспектах:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Це усуває ризик випадкового реєстрації токенів службових облікових записів як частини контексту тому в gRPC-запитах&lt;/li&gt;
&lt;li&gt;Вона використовує призначене поле специфікації CSI для конфіденційних даних, що є правильним&lt;/li&gt;
&lt;li&gt;Інструмент &lt;code&gt;protosanitizer&lt;/code&gt; автоматично правильно обробляє поле secrets, тому вам не потрібні специфічні для драйвера обхідні шляхи&lt;/li&gt;
&lt;li&gt;Це опціонально, тому ви можете мігрувати у власному темпі без порушення наявних розгортань&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;call-to-action&#34;&gt;Заклик до дії&lt;/h2&gt;
&lt;p&gt;Ми (Kubernetes SIG Storage) заохочуємо авторів драйверів CSI прийняти цю функцію та надати відгуки про досвід міграції. Якщо у вас є думки щодо дизайну API або виникають будь-які проблеми під час прийняття, будь ласка, зверніться до нас у каналі &lt;a href=&#34;https://kubernetes.slack.com/archives/C8EJ01Z46&#34;&gt;#csi&lt;/a&gt; на Kubernetes Slack (для запрошення відвідайте &lt;a href=&#34;https://slack.k8s.io/&#34;&gt;https://slack.k8s.io/&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ви можете стежити за &lt;a href=&#34;https://kep.k8s.io/5538&#34;&gt;KEP-5538&lt;/a&gt; щоб відстежувати прогрес у наступних релізах Kubernetes.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Розширені оператори толерантності для підтримки числових порівнянь (Alpha)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/05/kubernetes-v1-35-numeric-toleration-operators/</guid>
      <description>
        
        
        &lt;p&gt;Багато робочих кластерів Kubernetes поєднують вузли на вимогу (вищий рівень SLA) та спот-вузли/вузли з правом витіснення (нижчий рівень SLA) для оптимізації витрат при збереженні надійності критичних робочих навантажень. Команди платформи потребують безпечного стандартного варіанту, який утримує більшість робочих навантажень подалі від ризикованих потужностей, одночасно дозволяючи певним робочим навантаженням підключатися з явними пороговими значеннями, такими як «Я можу толерувати вузли з імовірністю відмови до 5%».&lt;/p&gt;
&lt;p&gt;Сьогодні Kubernetes taints і tolerations можуть відповідати точним значенням або перевіряти наявність, але вони не можуть порівнювати числові пороги. Вам потрібно буде створити дискретні категорії taint, використовувати зовнішні контролери допуску або приймати рішення про розміщення, що не є оптимальними.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 ми впроваджуємо &lt;strong&gt;розширені оператори толерантності&lt;/strong&gt; як альфа-функцію. Це вдосконалення додає оператори &lt;code&gt;Gt&lt;/code&gt; (більше ніж) і &lt;code&gt;Lt&lt;/code&gt; (менше ніж) до &lt;code&gt;spec.tolerations&lt;/code&gt;, що дозволяє приймати рішення про планування на основі порогових значень, які відкривають нові можливості для розміщення на основі SLA, оптимізації витрат і розподілу робочих навантажень з урахуванням продуктивності.&lt;/p&gt;
&lt;h2 id=&#34;the-evolution-of-tolerations&#34;&gt;Розвиток толерантностей&lt;/h2&gt;
&lt;p&gt;Історично Kubernetes підтримував два основні оператора толерантності:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Equal&lt;/code&gt;&lt;/strong&gt;: толерантність відповідає позначці taint, якщо ключ і значення є абсолютно однаковими&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Exists&lt;/code&gt;&lt;/strong&gt;: толерантність відповідає позначці taint, якщо ключ присутній, незалежно від значення&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Хоча ці функції добре працювали для категорійних сценаріїв, вони не підходили для числових порівнянь. Починаючи з версії 1.35, ми усуваємо цю прогалину.&lt;/p&gt;
&lt;p&gt;Розглянемо такі реальні ситуації:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Вимоги SLA&lt;/strong&gt;: планувати робочі навантаження з високою доступністю тільки на вузлах із ймовірністю відмови нижче певного порогу&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Оптимізація витрат&lt;/strong&gt;: Дозвольте виконувати чутливі до витрат пакетні завдання на дешевших вузлах, які перевищують певну вартість за годину&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Гарантії продуктивності&lt;/strong&gt;: Забезпечте, щоб чутливі до затримок застосунки виконувалися тільки на вузлах з дисковим IOPS або пропускною здатністю мережі вище мінімальних порогів&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Без операторів числового порівняння оператори кластерів мусили вдаватися до обхідних рішень, таких як створення декількох дискретних значень taint або використання зовнішніх контролерів допуску, жоден з яких не масштабується добре і не забезпечує гнучкості, необхідної для динамічного планування на основі порогових значень.&lt;/p&gt;
&lt;h2 id=&#34;why-extend-tolerations-instead-of-using-nodeaffinity&#34;&gt;Для чого розширювати толерантності замість використання NodeAffinity?&lt;/h2&gt;
&lt;p&gt;Ви можете запитати: NodeAffinity вже підтримує числові оператори порівняння, тож навіщо розширювати толерантності? Хоча NodeAffinity є потужним інструментом для вираження налаштувань подів, taints і tolerations надають важливі операційні переваги:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;** Орієнтованість на політику**: NodeAffinity працює для кожного окремого пода, вимагаючи, щоб кожне робоче навантаження явно відмовлялося від ризикованих вузлів. Taints інвертують контроль — вузли заявляють свій рівень ризику, і тільки поди з відповідними tolerations можуть там розміщуватися. Це забезпечує більш безпечні стандартні налаштування; більшість подів тримаються подалі від spot/preemptible вузлів, якщо вони явно не вибирають їх.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Семантика виселення&lt;/strong&gt;: NodeAffinity не має можливості виселення. Taints підтримують ефект &lt;code&gt;NoExecute&lt;/code&gt; з &lt;code&gt;tolerationSeconds&lt;/code&gt;, що дозволяє операторам виводити та виселяти поди, коли SLA вузла погіршується або спотові інстанції отримують повідомлення про припинення.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ергономіка експлуатації&lt;/strong&gt;: централізована політика на стороні вузла узгоджується з іншими безпечними taints, такими як навантаження на диск і навантаження на памʼять, що робить управління кластером більш інтуїтивним.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це вдосконалення зберігає добре зрозумілу модель безпеки позначок і толерантності, одночасно забезпечуючи розміщення на основі порогових значень для планування з урахуванням SLA.&lt;/p&gt;
&lt;h2 id=&#34;introducing-gt-and-lt-operators&#34;&gt;Представляємо оператори Gt та Lt&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 представляє два нових оператори для толерантності:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Gt&lt;/code&gt; (більше ніж)&lt;/strong&gt;: толерантність застосовується, якщо числове значення taint більше за значення толерантності&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Lt&lt;/code&gt; (менше ніж)&lt;/strong&gt;: толерантність застосовується, якщо числове значення taint менше за значення толерантності&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Коли под толерує taint з &lt;code&gt;Lt&lt;/code&gt;, це означає: «Я можу толерувати вузли, де цей показник &lt;em&gt;менший&lt;/em&gt; за мій поріг». Оскільки толерантності дозволяють планувати, под може працювати на вузлах, де значення taint більше за значення толерантності. Подумайте про це так: «Я можу працювати з вузлами, які перевищують мої мінімальні вимоги».&lt;/p&gt;
&lt;p&gt;Ці оператори працюють з числовими значеннями taint і дозволяють планувальнику приймати складні рішення щодо розміщення на основі безперервних метрик, а не дискретних категорій.&lt;/p&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка:&lt;/h4&gt;&lt;p&gt;Числові значення для операторів &lt;code&gt;Gt&lt;/code&gt; і &lt;code&gt;Lt&lt;/code&gt; повинні бути додатними 64-бітними цілими числами без нулів на початку. Наприклад, &lt;code&gt;&amp;quot;100&amp;quot;&lt;/code&gt;є дійсним, але &lt;code&gt;&amp;quot;0100&amp;quot;&lt;/code&gt; (з нулем на початку) і &lt;code&gt;&amp;quot;0&amp;quot;&lt;/code&gt; (нульове значення) не допускаються.&lt;/p&gt;
&lt;p&gt;Оператори &lt;code&gt;Gt&lt;/code&gt; і &lt;code&gt;Lt&lt;/code&gt; працюють з усіма ефектами taint: &lt;code&gt;NoSchedule&lt;/code&gt;, &lt;code&gt;NoExecute&lt;/code&gt; і &lt;code&gt;PreferNoSchedule&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;

&lt;h2 id=&#34;use-cases-and-examples&#34;&gt;Випадки використання та приклади&lt;/h2&gt;
&lt;p&gt;Давайте розглянемо, як розширені оператори толерантності вирішують реальні завдання планування.&lt;/p&gt;
&lt;h3 id=&#34;example-1-spot-instance-protection-with-sla-thresholds&#34;&gt;Приклад 1: Захист спотових інстанцій із пороговими значеннями SLA&lt;/h3&gt;
&lt;p&gt;Багато кластерів поєднують вузли на вимогу та спотові/преемптивні вузли для оптимізації витрат. Спотові вузли забезпечують значну економію, але мають вищий рівень відмов. Ви хочете, щоб більшість робочих навантажень стандартно уникало спотових вузлів, дозволяючи при цьому певним робочим навантаженням підключатися з чіткими межами SLA.&lt;/p&gt;
&lt;p&gt;Спочатку позначте спотові вузли з їхньою ймовірністю відмови (наприклад, 15% річний рівень відмов):&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;Вузли на вимогу мають набагато нижчий рівень відмов:&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;Критичні робочі навантаження можуть вимагати суворих вимог до SLA:&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;Цей под буде плануватися &lt;strong&gt;тільки&lt;/strong&gt; на вузлах з &lt;code&gt;failure-probability&lt;/code&gt; менше 5 (тобто &lt;code&gt;ondemand-node-1&lt;/code&gt; з 2%, але не &lt;code&gt;spot-node-1&lt;/code&gt; з 15%). Ефект &lt;code&gt;NoExecute&lt;/code&gt; з &lt;code&gt;tolerationSeconds: 30&lt;/code&gt; означає, що якщо SLA вузла погіршується (наприклад, хмарний провайдер змінює значення taint), под отримує 30 секунд для коректного завершення роботи перед примусовим виселенням.&lt;/p&gt;
&lt;p&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;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;Це пакетне завдання допускає вузли з імовірністю відмови до 20%, тому воно може виконуватися як на вузлах на вимогу, так і на спотових вузлах, що дозволяє максимально заощадити кошти, приймаючи при цьому більш високий ризик.&lt;/p&gt;
&lt;h3 id=&#34;example-2-ai-workload-placement-with-gpu-tiers&#34;&gt;Приклад 2: Розміщення робочих навантажень ШІ за рівнями GPU&lt;/h3&gt;
&lt;p&gt;Робочі навантаження ШІ та машинного навчання часто мають специфічні вимоги до апаратного забезпечення. За допомогою операторів розширеної толерантності ви можете створювати рівні вузлів GPU та забезпечувати розміщення робочих навантажень на апаратному забезпеченні з відповідною потужністю.&lt;/p&gt;
&lt;p&gt;Позначте вузли 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;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;Велике навантаження під час тренувань може вимагати високопродуктивних графічних процесорів:&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;Це гарантує, що под для тренування буде плануватися лише на вузлах з показником обчислювальної потужності більше 800 (наприклад, вузол A100), запобігаючи розміщенню на GPU нижчого рівня, які можуть уповільнити тренування.&lt;/p&gt;
&lt;p&gt;Тим часом, робочі навантаження для інференсу з менш вимогливими характеристиками можуть використовувати будь-який доступний 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;Приклад 3: Розміщення робочого навантаження з оптимізацією витрат&lt;/h3&gt;
&lt;p&gt;Для пакетної обробки або некритичних робочих навантажень ви можете мінімізувати витрати, запускаючи їх на дешевших вузлах, навіть якщо вони мають нижчі характеристики продуктивності.&lt;/p&gt;
&lt;p&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;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;Вразливе до вартості пакетне завдання може виражати свою толерантність до дорогих вузлів:&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;Ця пакетна задача буде плануватися на вузлах, вартість яких становить менше 100 доларів за годину, але уникатиме більш дорогих вузлів. У поєднанні з пріоритетами планування Kubernetes це дозволяє реалізувати складні стратегії розподілу витрат, за якими критичні робочі навантаження отримують преміум-вузли, а пакетні робочі навантаження ефективно використовують бюджетні ресурси.&lt;/p&gt;
&lt;h3 id=&#34;example-4-performance-based-placement&#34;&gt;Приклад 4: Розміщення на основі продуктивності&lt;/h3&gt;
&lt;p&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;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;Ця толерантність гарантує, що под планується тільки на вузлах, де &lt;code&gt;disk-iops&lt;/code&gt; перевищує 3000. Оператор &lt;code&gt;Gt&lt;/code&gt; означає «Мені потрібні вузли, які перевищують цей мінімум».&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-this-feature&#34;&gt;Як використовувати цю функцію&lt;/h2&gt;
&lt;p&gt;Розширені оператори толерантності є &lt;strong&gt;альфа-функцією&lt;/strong&gt; в Kubernetes v1.35. Щоб спробувати її:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Увімкніть функціональнe можливість&lt;/strong&gt; у вашому API-сервері та планувальнику:&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;Позначте ваші вузли&lt;/strong&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 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;Використовуйте нові оператори&lt;/strong&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:#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;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка:&lt;/h4&gt;Оскільки це альфа-функція, розширені оператори толерантності можуть змінюватися в майбутніх випусках і їх слід використовувати з обережністю в промислових середовищах. Завжди ретельно тестуйте їх у непроизводчих кластерах.&lt;/div&gt;

&lt;h2 id=&#34;what-s-next&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Ця альфа-версія — лише початок. Збираючи відгуки від спільноти, ми плануємо:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Додати підтримку &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5500&#34;&gt;виразів CEL (Common Expression Language)&lt;/a&gt; у толерантності та спорідненості вузлів для ще більш гнучкої логіки планування, включаючи семантичні порівняння версій&lt;/li&gt;
&lt;li&gt;Поліпшити інтеграцію з автоматичним масштабуванням кластерів для планування потужностей з урахуванням порогових значень&lt;/li&gt;
&lt;li&gt;Перевести функцію в бета-версію і, зрештою, в загальну доступність із стабільністю, готовою до промислового використання&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Нам особливо цікаво дізнатися про ваші випадки використання! Чи є у вас сценарії, в яких планування на основі порогових значень вирішило б проблеми? Чи є додаткові оператори або можливості, які ви хотіли б бачити?&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Як долучитися&lt;/h2&gt;
&lt;p&gt;Ця функція підтримується спільнотою &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-scheduling&#34;&gt;SIG Scheduling&lt;/a&gt;. Приєднуйтесь до нас, щоб долучитися до спільноти та поділитися своїми ідеями та відгуками щодо цієї функції та інших питань.&lt;/p&gt;
&lt;p&gt;Ви можете звʼязатися з адміністраторами цієї функції за адресою:&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; у Kubernetes Slack&lt;/li&gt;
&lt;li&gt;Список розсилки: &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;З питаннями або конкретними запитаннями, повʼязаними з операторами розширеної толерантності, звертайтеся до спільноти SIG Scheduling. Чекаємо на ваші повідомлення!&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;Як дізнатися більше?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/taint-and-toleration/&#34;&gt;Заплямованість та Толерантність&lt;/a&gt; для розуміння основних концепцій&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/taint-and-toleration/#numeric-comparison-operators&#34;&gt;Оператори числового порівняння&lt;/a&gt; для деталей використання операторів &lt;code&gt;Gt&lt;/code&gt; та &lt;code&gt;Lt&lt;/code&gt;&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: Новий рівень ефективності завдяки перезапуску Podʼів на місці</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/02/kubernetes-v1-35-restart-all-containers/</guid>
      <description>
        
        
        &lt;p&gt;У версії Kubernetes 1.35 представлено нову потужну функцію, яка забезпечує довгоочікувану можливість: можливість викликати повне перезавантаження Podʼів на місці. Ця функція, &lt;em&gt;Restart All Containers&lt;/em&gt; (альфа-версія в 1.35), дозволяє ефективно скинути стан Podʼів порівняно з ресурсоємним підходом, що передбачає видалення та повторне створення всього Podʼа. Ця функція особливо корисна для робочих навантажень AI/ML, дозволяючи розробникам застосунків зосередитися на основній логіці тренування, перекладаючи складні механізми обробки збоїв і відновлення в контейнери sidecars та декларативну конфігурацію Kubernetes. За допомогою &lt;code&gt;RestartAllContainers&lt;/code&gt; та інших запланованих вдосконалень Kubernetes продовжує додавати будівельні блоки для створення найбільш гнучких, надійних та ефективних платформ для робочих навантажень AI/ML.&lt;/p&gt;
&lt;p&gt;Ця нова функціональність доступна після увімкнення функції &lt;code&gt;RestartAllContainersOnContainerExits&lt;/code&gt;. Ця альфа-функція розширює функцію &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/pod-lifecycle/#container-restart-rules&#34;&gt;&lt;em&gt;Правила перезапуску контейнерів&lt;/em&gt;&lt;/a&gt;, яка перейшла в бета-версію в 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;Проблема: коли перезапуску одного контейнера недостатньо, а відтворення подів занадто дороге&lt;/h2&gt;
&lt;p&gt;Kubernetes вже давно підтримує політики перезапуску на рівні Podʼів (&lt;code&gt;restartPolicy&lt;/code&gt;) і, з недавнього часу, на &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/08/29/kubernetes-v1-34-per-container-restart-policy/&#34;&gt;рівні окремих контейнерів&lt;/a&gt;. Ці політики чудово підходять для обробки збоїв в одному ізольованому процесі. Однак багато сучасних застосунків мають більш складні взаємозалежності між контейнерами. Наприклад:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Контейнер init&lt;/strong&gt; готує середовище, монтуючи том або створюючи файл конфігурації. Якщо основний контейнер застосунку пошкоджує це середовище, простого перезапуску цього контейнера недостатньо. Необхідно запустити весь процес ініціалізації заново.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watcher sidecar&lt;/strong&gt; контролює стан системи. Якщо він виявляє невідновлюваний, але повторюваний стан помилки, він повинен ініціювати перезапуск основного контейнера застосунку з чистого аркуша.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sidecar&lt;/strong&gt;, який управляє віддаленим ресурсом, виходить з ладу. Навіть якщо sidecar перезапускається самостійно, основний контейнер може застрягнути, намагаючись отримати доступ до застарілого або пошкодженого зʼєднання.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;У всіх цих випадках бажаною дією є перезапуск не одного контейнера, а всіх. Раніше єдиним способом досягти цього було видалення Podʼа і створення нового за допомогою контролера (наприклад, Job або ReplicaSet). Цей процес є повільним і дорогим, оскільки передбачає залучення планувальника, розподіл ресурсів вузлів та повторну ініціалізацію мережі та сховища.&lt;/p&gt;
&lt;p&gt;Ця неефективність стає ще гіршою при обробці великомасштабних робочих навантажень AI/ML (&amp;gt;= 1000 вузлів з одним Podʼом на вузол). Загальною вимогою для цих синхронних робочих навантажень є те, що в разі виникнення збою (наприклад, аварії вузла) всі Podʼи у флотилії повинні бути створені заново, щоб скинути стан перед відновленням навчання, навіть якщо всі інші Podʼи не були безпосередньо уражені збоєм. Одночасне видалення, створення та планування тисяч Podʼів створює величезне вузьке місце. Орієнтовні витрати, повʼязані з цією несправністю, можуть становити &lt;a href=&#34;https://docs.google.com/document/d/16zexVooHKPc80F4dVtUjDYK9DOpkVPRNfSv0zRtfFpk/edit?tab=t.0#bookmark=id.qwqcnzf96avw&#34;&gt;100 000 доларів на місяць у вигляді втрачених ресурсів&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Для обробки цих збоїв у завданнях навчання AI/ML потрібна складна інтеграція, що зачіпає як навчальну платформу, так і Kubernetes, які часто є нестабільними і трудомісткими. Ця функція представляє рішення, властиве Kubernetes, що покращує надійність системи і дозволяє розробникам застосунків зосередитися на основній логіці навчання.&lt;/p&gt;
&lt;p&gt;Ще однією важливою перевагою перезапуску Podʼів на місці є те, що збереження Podʼів на призначених їм вузлах дозволяє проводити подальшу оптимізацію. Наприклад, можна реалізувати кешування на рівні вузлів, повʼязане з конкретною ідентифікацією Podʼів, що неможливо, коли Podʼи без необхідності створюються заново на різних вузлах.&lt;/p&gt;
&lt;h2 id=&#34;introducing-the-restartallcontainers-action&#34;&gt;Представляємо дію &lt;code&gt;RestartAllContainers&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Щоб вирішити цю проблему, у Kubernetes v1.35 додано нову дію до правил перезапуску контейнерів: &lt;code&gt;RestartAllContainers&lt;/code&gt;. Коли контейнер завершується у спосіб, що відповідає правилу з цією дією, kubelet ініціює швидкий перезапуск Podʼа &lt;strong&gt;на місці&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Цей перезапуск на місці є дуже ефективним, оскільки зберігає найважливіші ресурси Podʼа:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UID, IP-адресу та мережевий простір імен Podʼа.&lt;/li&gt;
&lt;li&gt;Пісочницю Podʼа та будь-які підключені пристрої.&lt;/li&gt;
&lt;li&gt;Усі томи, включаючи &lt;code&gt;emptyDir&lt;/code&gt; та томи, змонтовані з PVC.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Після завершення всіх запущених контейнерів послідовність запуску Podʼа повторно виконується з самого початку. Це означає, що всі &lt;strong&gt;init-контейнери&lt;/strong&gt; запускаються знову по порядку, а потім — sidecar-контейнери та звичайні контейнери, що забезпечує повністю новий старт у відомому надійному середовищі. За винятком ефемерних контейнерів (які завершуються), всі інші контейнери, включаючи ті, що раніше були успішними або невдалими, будуть перезапущені, незалежно від їхніх індивідуальних політик перезапуску.&lt;/p&gt;
&lt;h2 id=&#34;use-cases&#34;&gt;Випадки використання&lt;/h2&gt;
&lt;h3 id=&#34;1-efficient-restarts-for-ml-batch-jobs&#34;&gt;1. Ефективний перезапуск завдань ML/Batch&lt;/h3&gt;
&lt;p&gt;Для завдань навчання ML &lt;a href=&#34;https://deploy-preview-48551--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;перепланування робочого Pod у разі збою&lt;/a&gt; є дорогою операцією, яка марнує цінні обчислювальні ресурси. На кластері навчання з 1000 вузлів накладні витрати на перепланування можуть призвести до втрати [понад 100 000 доларів на обчислювальні ресурси щомісяця](&lt;a href=&#34;https://docs.google.com/document/d/16zexVooHKPc80F4dVtUjDYK9DOpkVPRNfSv0zRtfFpk/edit?tab=t.0#bookmark=id&#34;&gt;https://docs.google.com/document/d/16zexVooHKPc80F4dVtUjDYK9DOpkVPRNfSv0zRtfFpk/edit?tab=t.0#bookmark=id&lt;/a&gt;. qwqcnzf96avw).&lt;/p&gt;
&lt;p&gt;За допомогою дій &lt;code&gt;RestartAllContainers&lt;/code&gt; ви можете вирішити цю проблему, увімкнувши набагато швидшу гібридну стратегію відновлення: відтворюйте лише «пошкоджені» Podʼи (наприклад, ті, що знаходяться на несправних вузлах), одночасно запускаючи &lt;code&gt;RestartAllContainers&lt;/code&gt; для решти справних Podʼів. Тести показують, що це зменшує накладні витрати на відновлення &lt;a href=&#34;https://docs.google.com/document/d/16zexVooHKPc80F4dVtUjDYK9DOpkVPRNfSv0zRtfFpk/edit?tab=t.0#bookmark=id.cwkee8kar0i5&#34;&gt;з хвилин до декількох секунд&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Завдяки перезапуску на місці, watcher sidecar може контролювати основний процес навчання. Якщо він зустрічає конкретну помилку, яку можна повторити, watcher може вийти з призначеним кодом, щоб запустити швидке скидання Podʼа робітника, що дозволяє йому перезапуститися з останньої контрольної точки без залучення контролера завдань. Ця функція тепер підтримується Kubernetes.&lt;/p&gt;
&lt;p&gt;Детальніше про майбутній розвиток та функції JobSet читайте в &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;# Цей контейнер ініціалізації буде перезапускатися при кожному перезапуску на місці.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# Конкретний код виходу від watcher запускає повний перезапуск 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:#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. Повторний запуск контейнерів init для отримання чистого стану&lt;/h3&gt;
&lt;p&gt;Уявіть ситуацію, коли контейнер ініціалізації відповідає за отримання облікових даних або налаштування спільного тому. Якщо основний застосунок виходить з ладу, що призводить до пошкодження цього спільного стану, вам потрібно &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3676&#34;&gt;перезапустити контейнер ініціалізації&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Налаштувавши основний застосунок так, щоб він завершувався з певним кодом після виявлення такого пошкодження, ви можете запустити дію &lt;code&gt;RestartAllContainers&lt;/code&gt;, гарантуючи, що контейнер ініціалізації забезпечить чисте налаштування перед перезапуском застосунку.&lt;/p&gt;
&lt;h3 id=&#34;3-handling-high-rate-of-similar-tasks-execution&#34;&gt;3. Обробка великої кількості подібних завдань&lt;/h3&gt;
&lt;p&gt;Іноді завдання найкраще виконувати у вигляді Podʼів. Кожне завдання вимагає чіткого виконання. Завданням може бути бек-енд ігрової сесії або обробка елементів черги. Якщо швидкість виконання завдань висока, запуск повного циклу створення, планування та ініціалізації Podʼів є надто дорогим, особливо якщо завдання можуть бути короткими. Можливість перезапустити всі контейнери з нуля дозволяє Kubernetes обробляти такі сценарії без використання спеціальних рішень або фреймворків.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-it&#34;&gt;Як користуватися&lt;/h2&gt;
&lt;p&gt;Щоб спробувати цю функцію, ви повинні увімкнути функціональну можливість &lt;code&gt;RestartAllContainersOnContainerExits&lt;/code&gt; у компонентах кластера Kubernetes (API-сервер та kubelet), що працюють під управлінням Kubernetes v1.35+. Ця альфа-функція розширює функцію &lt;code&gt;ContainerRestartRules&lt;/code&gt;, яка перейшла в бета-версію в v1.35 та є стандартно увімкненою.&lt;/p&gt;
&lt;p&gt;Після увімкнення ви можете додати &lt;code&gt;restartPolicyRules&lt;/code&gt; до будь-якого контейнера (init, sidecar або звичайного) та використовувати дію &lt;code&gt;RestartAllContainers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Функція розроблена для зручного використання в наявних застосунках. Однак, якщо застосунок не відповідає певним рекомендаціям, це може спричинити проблеми для застосунку або інструментів спостереження. Увімкнувши цю функцію, переконайтеся, що всі контейнери є такими, що можуть бути повторно запущені, і що зовнішні інструменти готові до повторного запуску контейнерів init. Крім того, під час перезапуску всіх контейнерів kubelet не запускає хуки &lt;code&gt;preStop&lt;/code&gt;. Це означає, що контейнери повинні бути створені таким чином, щоб витримувати раптове завершення роботи, не покладаючись на хуки &lt;code&gt;preStop&lt;/code&gt; для коректного вимкнення.&lt;/p&gt;
&lt;h2 id=&#34;observing-the-restart&#34;&gt;Спостереження за перезапуском&lt;/h2&gt;
&lt;p&gt;Щоб зробити цей процес спостережуваним, до статусу Podʼа додається нова умова &lt;code&gt;AllContainersRestarting&lt;/code&gt;. Коли перезапуск ініційовано, ця умова стає &lt;code&gt;True&lt;/code&gt; і повертається до &lt;code&gt;False&lt;/code&gt;, коли всі контейнери завершили роботу і Pod готовий розпочати свій життєвий цикл заново. Це забезпечує чіткий сигнал для користувачів та інших компонентів кластера про стан Podʼа.&lt;/p&gt;
&lt;p&gt;Усі контейнери, перезапущені за допомогою цієї дії, матимуть збільшений лічильник перезапусків у статусі контейнера.&lt;/p&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Дізнайтеся більше&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Прочитайте офіційну документацію про &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/pod-lifecycle/#restart-all-containers&#34;&gt;життєвий цикл Podʼів&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Прочитайте детальну пропозицію в &lt;a href=&#34;https://kep.k8s.io/5532&#34;&gt;KEP-5532: Перезапуск усіх контейнерів при виході з контейнера&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Прочитайте пропозицію щодо перезапуску JobSet на місці в &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;Ми хочемо почути вашу думку!&lt;/h2&gt;
&lt;p&gt;Як альфа-функція, &lt;code&gt;RestartAllContainers&lt;/code&gt; готова до експериментів, і будь-які випадки використання та відгуки вітаються. Ця функція розробляється спільнотою &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-node/README.md&#34;&gt;SIG Node&lt;/a&gt;. Якщо ви зацікавлені долучитися, поділитися своїми думками або зробити внесок, будь ласка, приєднуйтеся до нас!&lt;/p&gt;
&lt;p&gt;Ви можете зв’язатися з SIG Node через:&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: Покращене відлагодження за допомогою версійованих API z-pages</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/31/kubernetes-v1-35-structured-zpages/</link>
      <pubDate>Wed, 31 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/31/kubernetes-v1-35-structured-zpages/</guid>
      <description>
        
        
        &lt;p&gt;Відлагодження компонентів панелі управління Kubernetes може бути складним завданням, особливо коли потрібно швидко зрозуміти стан компонента під час виконання або перевірити його конфігурацію. У Kubernetes 1.35 ми вдосконалюємо точки доступу z-pages для відлагодження за допомогою структурованих відповідей, які можна обробляти засобами машинного аналізу, що спрощує створення інструментів та автоматизацію робочих процесів з усунення несправностей.&lt;/p&gt;
&lt;h2 id=&#34;what-are-z-pages&#34;&gt;Що таке z-сторінки?&lt;/h2&gt;
&lt;p&gt;z-сторінки — це спеціальні точки доступу для відлагодження, які надаються компонентами панелі управління Kubernetes. Введені як альфа-функція в Kubernetes 1.32, ці точки доступу забезпечують діагностику під час виконання для таких компонентів, як &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; та &lt;code&gt;kube-proxy&lt;/code&gt;. Назва «z-сторінки» походить від домовленості про використання шляхів &lt;code&gt;/*z&lt;/code&gt; (додвання останньої літери латинської абетки до шляху) для точок доступу для налагодження.&lt;/p&gt;
&lt;p&gt;Наразі Kubernetes підтримує дві основні точки доступу z-page:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;/statusz&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;показує загальну інформацію про компоненти, включаючи інформацію про версію, час запуску, час роботи та доступні шляхи відлагодження&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;/flagz&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;показує всі аргументи командного рядка та їхні значення, що використовуються для запуску компонента (з прихованими, з міркувань безпеки, конфіденційними значеннями)&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Ці точки доступу є корисними для операторів, яким потрібно швидко перевірити стан компонента, але дотепер вони повертали лише звичайний текст, який було важко проаналізувати програмно.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new-in-kubernetes-1-35&#34;&gt;Що нового в Kubernetes 1.35?&lt;/h2&gt;
&lt;p&gt;Kubernetes 1.35 впроваджує структуровані відповіді з версіями для точок доступу &lt;code&gt;/statusz&lt;/code&gt; та &lt;code&gt;/flagz&lt;/code&gt;. Це вдосконалення зберігає зворотну сумісність з наявним форматом plain text, додаючи підтримку машиночитаних відповідей JSON.&lt;/p&gt;
&lt;h3 id=&#34;backward-compatible-design&#34;&gt;Зворотньо сумісний дизайн&lt;/h3&gt;
&lt;p&gt;Нові структуровані відповіді є опціональними. Без вказання заголовка &lt;code&gt;Accept&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ curl --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;  https://localhost:6443/statusz
&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;kube-apiserver statusz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Warning: This endpoint is not meant to be machine parseable, has no formatting compatibility guarantees and is &lt;span style=&#34;color:#a2f;font-weight:bold&#34;&gt;for&lt;/span&gt; debugging purposes only.
&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;Started: Wed Oct &lt;span style=&#34;color:#666&#34;&gt;16&lt;/span&gt; 21:03:43 UTC &lt;span style=&#34;color:#666&#34;&gt;2024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Up: &lt;span style=&#34;color:#666&#34;&gt;0&lt;/span&gt; hr &lt;span style=&#34;color:#666&#34;&gt;00&lt;/span&gt; min &lt;span style=&#34;color:#666&#34;&gt;16&lt;/span&gt; sec
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Go version: go1.23.2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Binary version: 1.35.0-alpha.0.1595
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Emulation version: 1.35
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Paths: /healthz /livez /metrics /readyz /statusz /version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;structured-json-responses&#34;&gt;Структуровані відповіді JSON&lt;/h3&gt;
&lt;p&gt;Щоб отримати структуровану відповідь, додайте відповідний заголовок &lt;code&gt;Accept&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;Accept: application/json;v=v1alpha1;g=config.k8s.io;as=Statusz
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Це поверне відповідь JSON з версією:&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;Аналогічно, &lt;code&gt;/flagz&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;Accept: application/json;v=v1alpha1;g=config.k8s.io;as=Flagz
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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-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 style=&#34;&#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;Чому структуровані відповіді мають значення&lt;/h2&gt;
&lt;p&gt;Додавання структурованих відповідей відкриває кілька нових можливостей:&lt;/p&gt;
&lt;h3 id=&#34;1-automated-health-checks-and-monitoring&#34;&gt;1. &lt;strong&gt;Автоматизовані перевірки стану та моніторинг&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Замість аналізу простого тексту, інструменти моніторингу тепер можуть легко отримувати конкретні поля. Наприклад, ви можете програмно перевірити, чи компонент працює з несподіваною емульованою версією, або переконатися, що критичні прапорці встановлені правильно.&lt;/p&gt;
&lt;h3 id=&#34;2-better-debugging-tools&#34;&gt;2. &lt;strong&gt;Кращі інструменти налагодження&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Розробники можуть створювати складні інструменти налагодження, які порівнюють конфігурації декількох компонентів або відстежують зміни конфігурації з часом. Структурований формат спрощує порівняння конфігурацій або перевірку того, чи компоненти працюють з очікуваними налаштуваннями.&lt;/p&gt;
&lt;h3 id=&#34;3-api-versioning-and-stability&#34;&gt;3. &lt;strong&gt;Версії API та стабільність&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Запровадивши версії API (починаючи з &lt;code&gt;v1alpha1&lt;/code&gt;), ми забезпечуємо чіткий шлях до стабільності. У міру дозрівання функції ми запровадимо &lt;code&gt;v1beta1&lt;/code&gt; і, зрештою, &lt;code&gt;v1&lt;/code&gt;, що дасть вам впевненість, що ваші інструменти не перестануть працювати з майбутніми версіями Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-structured-z-pages&#34;&gt;Як використовувати структуровані z-сторінки&lt;/h2&gt;
&lt;h3 id=&#34;prerequisites&#34;&gt;Необхідні умови&lt;/h3&gt;
&lt;p&gt;Для обох точок доступу необхідно ввімкнути функціональні можливості:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/statusz&lt;/code&gt;: увімкніть функціональну можливість &lt;code&gt;ComponentStatusz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/flagz&lt;/code&gt;: увімкніть функціональну можливість &lt;code&gt;ComponentFlagz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-getting-structured-responses&#34;&gt;Приклад: Отримання структурованих відповідей&lt;/h3&gt;
&lt;p&gt;Ось приклад використання &lt;code&gt;curl&lt;/code&gt; для отримання структурованих відповідей JSON від 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;# Отримання структурованої відповіді statusz&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 «Accept: application/json;&lt;span style=&#34;color:#b8860b&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;v1alpha1;&lt;span style=&#34;color:#b8860b&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;config.k8s.io;&lt;span style=&#34;color:#b8860b&#34;&gt;as&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;Statusz» &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;# Отримання структурованої відповіді flagz&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 «Accept: application/json;&lt;span style=&#34;color:#b8860b&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;v1alpha1;&lt;span style=&#34;color:#b8860b&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;config.k8s.io;&lt;span style=&#34;color:#b8860b&#34;&gt;as&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;Flagz» &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;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка:&lt;/h4&gt;У наведених вище прикладах використовується автентифікація клієнтського сертифіката та перевіряється сертифікат сервера за допомогою &lt;code&gt;--cacert&lt;/code&gt;. Якщо вам потрібно обійти перевірку сертифіката в тестовому середовищі, ви можете використовувати &lt;code&gt;--insecure&lt;/code&gt; (або &lt;code&gt;-k&lt;/code&gt;), але це ніколи не слід робити в промислових умовах, оскільки це робить вас вразливими до атак типу «зловмисник посередині» (man-in-the-middle).&lt;/div&gt;

&lt;h2 id=&#34;important-considerations&#34;&gt;Важливі зауваження&lt;/h2&gt;
&lt;h3 id=&#34;alpha-feature-status&#34;&gt;Статус альфа-функції&lt;/h3&gt;
&lt;p&gt;Структуровані відповіді z-page є &lt;strong&gt;альфа-функцією&lt;/strong&gt; в Kubernetes 1.35. Це означає:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Формат API може змінитися в майбутніх версіях&lt;/li&gt;
&lt;li&gt;Ці точки доступу призначені для відлагодження, а не для промислової автоматизації&lt;/li&gt;
&lt;li&gt;Не слід покладатися на них для критично важливих робочих процесів моніторингу, доки вони не досягнуть бета-версії або стабільного статусу&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;security-and-access-control&#34;&gt;Безпека та контроль доступу&lt;/h3&gt;
&lt;p&gt;z-сторінки розкривають інформацію про внутрішні компоненти і вимагають належного контролю доступу. Ось основні міркування щодо безпеки:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Авторизація&lt;/strong&gt;: Доступ до точок доступу z-page обмежений членами групи &lt;code&gt;system:monitoring&lt;/code&gt;, яка дотримується тієї ж моделі авторизації, що й для інших точок доступу для налагодження, таких як &lt;code&gt;/healthz&lt;/code&gt;, &lt;code&gt;/livez&lt;/code&gt; та &lt;code&gt;/readyz&lt;/code&gt;. Це гарантує, що доступ до інформації для налагодження мають лише авторизовані користувачі та службові облікові записи. Якщо ваш кластер використовує RBAC, ви можете керувати доступом, надаючи відповідні дозволи цій групі.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Автентифікація&lt;/strong&gt;: Вимоги до автентифікації для цих точок доступу залежать від конфігурації вашого кластера. Якщо для вашого кластера не ввімкнено анонімну автентифікацію, зазвичай для доступу до цих точок доступу потрібно використовувати механізми автентифікації (наприклад, сертифікати клієнта).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Розкриття інформації&lt;/strong&gt;: ці точки доступу розкривають деталі конфігурації компонентів вашого кластера, зокрема:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;версії компонентів та інформацію про збірку&lt;/li&gt;
&lt;li&gt;усі аргументи командного рядка та їхні значення (з видаленням конфіденційних значень)&lt;/li&gt;
&lt;li&gt;доступні точки доступу для налагодження&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Надавайте доступ лише надійним операторам та інструментам налагодження. Уникайте розкриття цих точок доступу неавторизованим користувачам або автоматизованим системам, які не потребують такого рівня доступу.&lt;/p&gt;
&lt;h3 id=&#34;future-evolution&#34;&gt;Майбутня еволюція&lt;/h3&gt;
&lt;p&gt;У міру дозрівання функції ми (Kubernetes SIG Instrumentation) сподіваємося:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Впровадити версії API &lt;code&gt;v1beta1&lt;/code&gt; і, зрештою, &lt;code&gt;v1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Зібрати відгуки спільноти щодо схеми відповідей.&lt;/li&gt;
&lt;li&gt;Можливо, додати додаткові точки доступу z-page на основі потреб користувачів.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Спробуйте&lt;/h2&gt;
&lt;p&gt;Ми заохочуємо вас експериментувати зі структурованими z-сторінками в тестовому середовищі:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Увімкніть функції &lt;code&gt;ComponentStatusz&lt;/code&gt; та &lt;code&gt;ComponentFlagz&lt;/code&gt; на компонентах вашої панелі управління.&lt;/li&gt;
&lt;li&gt;Спробуйте надсилати запити до точок доступу як у вигляді простого тексту, так і у структурованому форматі.&lt;/li&gt;
&lt;li&gt;Створіть простий інструмент або скрипт, який використовує структуровані дані.&lt;/li&gt;
&lt;li&gt;Поділіться своїми відгуками зі спільнотою.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Дізнайтеся більше&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/instrumentation/zpages/&#34;&gt;Документація z-pages&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: Статус компонента&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: Компонент Flagz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до обговорення в каналі &lt;a href=&#34;https://kubernetes.slack.com/archives/C20HH14P7&#34;&gt;#sig-instrumentation&lt;/a&gt; в Kubernetes Slack&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Приєднуйтесь&lt;/h2&gt;
&lt;p&gt;Ми будемо раді отримати ваші відгуки! Функція структурованих z-сторінок призначена для спрощення відлагодження та моніторингу Kubernetes. Незалежно від того, чи ви створюєте внутрішні інструменти, берете участь в проєктах з відкритим кодом або просто вивчаєте цю функцію, ваші відгуки допоможуть сформувати майбутнє спостережуваності Kubernetes.&lt;/p&gt;
&lt;p&gt;Якщо у вас є питання, пропозиції або ви зіткнулися з проблемами, звертайтеся до SIG Instrumentation. Ви можете знайти нас у Slack або на наших регулярних &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-instrumentation&#34;&gt;зустрічах спільноти&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Успішного відлагодження!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Узгодження маршрутів на основі спостереження в Cloud Controller Manager</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/30/kubernetes-v1-35-watch-based-route-reconciliation-in-ccm/</guid>
      <description>
        
        
        &lt;p&gt;До Kubernetes v1.34 включно контролер маршрутів у реалізаціях Cloud Controller Manager (CCM), створених за допомогою бібліотеки &lt;a href=&#34;https://github.com/kubernetes/cloud-provider&#34;&gt;k8s.io/cloud-provider&lt;/a&gt;, узгоджує маршрути через фіксований інтервал. Це призводить до непотрібних запитів до API хмарного провайдера, коли не відбуваються зміни маршрутів. Інші контролери, реалізовані через ту ж бібліотеку, вже використовують механізми на основі спостереження, використовуючи інформери для уникнення непотрібних викликів API. У версії v1.35 запроваджується нова функціональна можливість, яка дозволяє змінити поведінку контролера маршрутів на використання інформерів на основі спостереження.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new&#34;&gt;Що нового?&lt;/h2&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;CloudControllerManagerWatchBasedRoutesReconciliation&lt;/code&gt; була запроваджена у &lt;a href=&#34;https://github.com/kubernetes/cloud-provider&#34;&gt;k8s.io/cloud-provider&lt;/a&gt; на стадії альфа-версії &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-cloud-provider/README.md&#34;&gt;SIG Cloud Provider&lt;/a&gt;. Щоб увімкнути цю функцію, можна використовувати &lt;code&gt;--feature-gate=CloudControllerManagerWatchBasedRoutesReconciliation=true&lt;/code&gt; у реалізації CCM, яку ви використовуєте.&lt;/p&gt;
&lt;h2 id=&#34;about-the-feature-gate&#34;&gt;Про функціональну можливість&lt;/h2&gt;
&lt;p&gt;Ця функціональна можливість запустить цикл узгодження маршрутів кожного разу, коли вузол додається, видаляється або оновлюються поля &lt;code&gt;.spec.podCIDRs&lt;/code&gt; або &lt;code&gt;.status.addresses&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Додаткове узгодження виконується через випадковий інтервал від 12 до 24 годин,
який вибирається під час запуску контролера.&lt;/p&gt;
&lt;p&gt;Ця функціональна можливість не змінює логіку в циклі узгодження. Тому користувачі реалізації CCM не повинні відчувати значних змін у своїх поточних конфігураціях маршрутів.&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;Як я можу дізнатися більше?&lt;/h2&gt;
&lt;p&gt;Для отримання додаткової інформації зверніться до &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: Представляємо планування з урахуванням навантаження</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/29/kubernetes-v1-35-introducing-workload-aware-scheduling/</guid>
      <description>
        
        
        &lt;p&gt;Планування великих робочих навантажень є набагато складнішою і делікатнішою операцією, ніж планування одного Podʼа, оскільки часто вимагає врахування всіх Podʼів разом, а не планування кожного окремо. Наприклад, при плануванні пакетної задачі машинного навчання часто потрібно стратегічно розмістити кожного виконавця, наприклад, на одній стійці, щоб зробити весь процес максимально ефективним. Водночас Podʼи, що входять до такого робочого навантаження, дуже часто є ідентичними з точки зору планування, що кардинально змінює вигляд цього процесу.&lt;/p&gt;
&lt;p&gt;Існує багато спеціальних планувальників, пристосованих для ефективного планування робочих навантажень, але з огляду на те, наскільки поширеним і важливим є планування робочих навантажень для користувачів Kubernetes, особливо в епоху штучного інтелекту з дедалі більшою кількістю випадків використання, настав час зробити робочі навантаження першочерговим завданням для &lt;code&gt;kube-scheduler&lt;/code&gt; і підтримувати їх нативно.&lt;/p&gt;
&lt;h2 id=&#34;workload-aware-scheduling&#34;&gt;Планування з урахуванням навантаження&lt;/h2&gt;
&lt;p&gt;В останньому випуску Kubernetes 1.35 було представлено першу частину вдосконалень &lt;em&gt;планування з урахуванням навантаження&lt;/em&gt;. Вони є частиною ширших зусиль, спрямованих на поліпшення планування та управління навантаженнями. Ці зусилля охоплюватимуть багато SIG та версій і мають поступово розширювати можливості системи для досягнення головної мети, якою є безперебійне планування та управління робочими навантаженнями в Kubernetes, включаючи, але не обмежуючись, випередженням та автоматичним масштабуванням.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 представляє Workload API, який можна використовувати для опису бажаного вигляду, а також вимог до планування робочого навантаження. Він постачається з початковою реалізацією &lt;em&gt;планування груп&lt;/em&gt;, яка наказує &lt;code&gt;kube-scheduler&lt;/code&gt; планувати групи Podʼів за принципом &lt;em&gt;все або нічого&lt;/em&gt;. Нарешті, ми вдосконалили планування ідентичних Podʼів (які зазвичай утворюють групи) для прискорення процесу завдяки функції &lt;em&gt;ситуативного пакетування&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;workload-api&#34;&gt;Workload API&lt;/h2&gt;
&lt;p&gt;Новий ресурс Workload API є частиною &lt;code&gt;scheduling.k8s.io/v1alpha1&lt;/code&gt; &lt;a class=&#39;glossary-tooltip&#39; title=&#39;Набір повʼязаних шляхів в API Kubernetes.&#39; data-toggle=&#39;tooltip&#39; data-placement=&#39;top&#39; href=&#39;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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;. Цей ресурс діє як структуроване, машиночитане визначення вимог до планування застосунку з декількома Podʼами. У той час як робочі навантаження, орієнтовані на користувача, такі як Jobs, визначають, що потрібно запустити, ресурс Workload визначає, як слід планувати групу Podʼів і як слід керувати її розміщенням протягом усього життєвого циклу.&lt;/p&gt;
&lt;p&gt;Workload дозволяє визначити групу Podʼів і застосувати до них політику планування. Ось як виглядає конфігурація планування групи. Ви можете визначити &lt;code&gt;podGroup&lt;/code&gt; з назвою &lt;code&gt;workers&lt;/code&gt; і застосувати політику &lt;code&gt;gang&lt;/code&gt; з &lt;code&gt;minCount&lt;/code&gt;, що дорівнює 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;# Група планується лише якщо одночасно можуть працювати 4 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:#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;Коли ви створюєте свої Podʼи, ви повʼязуєте їх із цим робочим навантаженням за допомогою нового поля &lt;code&gt;workloadRef&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;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;Як працює групове планування&lt;/h2&gt;
&lt;p&gt;Політика &lt;code&gt;gang&lt;/code&gt; забезпечує розміщення за принципом «все або нічого». Без групового планування завдання може бути заплановано частково, споживаючи ресурси без можливості виконання, що призводить до марнування ресурсів і потенційних тупикових ситуацій.&lt;/p&gt;
&lt;p&gt;Коли ви створюєте Podʼи, які є частиною групи Podʼів із груповим плануванням, втулок &lt;code&gt;GangScheduling&lt;/code&gt; планувальника управляє життєвим циклом незалежно для кожної групи Podʼів (або ключа репліки):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Коли ви створюєте свої Podʼи (або контролер створює їх для вас), планувальник блокує їх планування, доки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Не буде створено обʼєкт Workload, на який є посилання.&lt;/li&gt;
&lt;li&gt;Посилання на групу Podʼів існує в Workload.&lt;/li&gt;
&lt;li&gt;Кількість очікуючих Podʼів у цій групі відповідає вашому &lt;code&gt;minCount&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Коли зʼявляється достатня кількість Podʼів, планувальник намагається їх розмістити. Однак замість того, щоб відразу привʼязувати їх до вузлів, Podʼи чекають на воротах &lt;code&gt;Permit&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Планувальник перевіряє, чи знайшов він дійсні призначення для всієї групи (принаймні &lt;code&gt;minCount&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Якщо для групи є місце, ворота відкриваються, і всі Podʼи привʼязуються до вузлів.&lt;/li&gt;
&lt;li&gt;Якщо лише частина Podʼів групи була успішно запланована протягом часу очікування (встановленого на 5 хвилин), планувальник відхиляє &lt;strong&gt;всі&lt;/strong&gt; Podʼи у групі. Вони повертаються до черги, звільняючи зарезервовані ресурси для інших робочих навантажень.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Хочемо зазначити, що хоча це перша реалізація, проєкт Kubernetes має твердий намір вдосконалити та розширити алгоритм групового планування в майбутніх версіях. Серед переваг, які ми сподіваємося досягти, — фаза планування за один цикл для всієї групи, витіснення на рівні робочого навантаження та інше, що наближає нас до нашої головної мети.&lt;/p&gt;
&lt;h2 id=&#34;opportunistic-batching&#34;&gt;Ситуативна пакетна обробка&lt;/h2&gt;
&lt;p&gt;На додачу до явного групового планування, у версії 1.35 запроваджено &lt;em&gt;ситуативну пакетну обробку&lt;/em&gt;. Це бета-функція, яка покращує затримку планування для ідентичних Podʼів.&lt;/p&gt;
&lt;p&gt;На відміну від групового планування, ця функція не вимагає Workload API або явного погодження з боку користувача. Вона працює ситуативно в рамках планувальника, ідентифікуючи Podʼи, які мають однакові вимоги до планування (образи контейнерів, запити на ресурси, спорідненість тощо). Коли планувальник обробляє Pod, він може повторно використовувати розрахунки здійсненності для наступних однакових Podʼів у черзі, що значно прискорює процес.&lt;/p&gt;
&lt;p&gt;Більшість користувачів отримають переваги від цієї оптимізації автоматично, без будь-яких спеціальних дій, за умови, що їх Podʼи відповідають наступним критеріям.&lt;/p&gt;
&lt;h3 id=&#34;restrictions&#34;&gt;Обмеження&lt;/h3&gt;
&lt;p&gt;Ситуативне пакетування працює за певних умов. Усі поля, які використовує &lt;code&gt;kube-scheduler&lt;/code&gt; для пошуку розміщення, повинні бути ідентичними між Podʼами. Крім того, використання деяких функцій вимикає механізм пакетування для цих Podʼів, щоб забезпечити правильність.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що вам може знадобитися переглянути конфігурацію &lt;code&gt;kube-scheduler&lt;/code&gt;, щоб переконатися, що вона не вимикає пакетну обробку для ваших робочих навантажень.&lt;/p&gt;
&lt;p&gt;Більш детальну інформацію про обмеження дивіться в &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/scheduler-perf-tuning/#enabling-opportunistic-batching&#34;&gt;документації&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-north-star-vision&#34;&gt;Довготривалі перспективи&lt;/h2&gt;
&lt;p&gt;Проєкт має амбітну мету — забезпечити планування з урахуванням навантаження. Ці нові API та вдосконалення планування — лише перші кроки. У найближчому майбутньому планується вирішити такі завдання:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Впровадження фази планування навантаження&lt;/li&gt;
&lt;li&gt;Покращення підтримки багатовузлового &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;DRA&lt;/a&gt; та планування з урахуванням топології&lt;/li&gt;
&lt;li&gt;Витіснення на рівні навантаження&lt;/li&gt;
&lt;li&gt;Покращення інтеграції між плануванням і автомасштабуванням&lt;/li&gt;
&lt;li&gt;Покращення взаємодії із зовнішніми планувальниками робочого навантаження&lt;/li&gt;
&lt;li&gt;Управління розміщенням робочих навантажень протягом усього їхнього життєвого циклу&lt;/li&gt;
&lt;li&gt;Моделювання планування багатозадачного робочого навантаження&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;І багато іншого. Пріоритетність і порядок реалізації цих пріоритетних напрямків можуть змінюватися. Слідкуйте за подальшими оновленнями.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Початок роботи&lt;/h2&gt;
&lt;p&gt;Щоб випробувати вдосконалення планування з урахуванням навантаження:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workload API: увімкніть функцію &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/#GenericWorkload&#34;&gt;&lt;code&gt;GenericWorkload&lt;/code&gt;&lt;/a&gt; на &lt;code&gt;kube-apiserver&lt;/code&gt; і &lt;code&gt;kube-scheduler&lt;/code&gt; та переконайтеся, що &lt;code&gt;scheduling.k8s.io/v1alpha1&lt;/code&gt;   &lt;a class=&#39;glossary-tooltip&#39; title=&#39;Набір повʼязаних шляхів в API Kubernetes.&#39; data-toggle=&#39;tooltip&#39; data-placement=&#39;top&#39; href=&#39;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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; увімкнено.&lt;/li&gt;
&lt;li&gt;Групове планування: увімкніть функцію &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/#GangScheduling&#34;&gt;&lt;code&gt;GangScheduling&lt;/code&gt;&lt;/a&gt; на &lt;code&gt;kube-scheduler&lt;/code&gt; (потрібно увімкнути Workload API).&lt;/li&gt;
&lt;li&gt;Ситуативне пакетування: як бета-функція, вона типово ввімкнена у v1.35. Ви можете вимкнути її за допомогою функціональної можливості &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/#OpportunisticBatching&#34;&gt;&lt;code&gt;OpportunisticBatching&lt;/code&gt;&lt;/a&gt; на &lt;code&gt;kube-scheduler&lt;/code&gt;, якщо потрібно.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ми рекомендуємо вам спробувати планування з урахуванням навантаження у ваших тестових кластерах і поділитися своїм досвідом, щоб допомогти сформувати майбутнє планування Kubernetes. Ви можете надіслати свої відгуки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Звернувшись через &lt;a href=&#34;https://kubernetes.slack.com/archives/C09TP78DV&#34;&gt;Slack (#sig-scheduling)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Коментуючи &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/132192&#34;&gt;проблему відстеження планування з урахуванням навантаження&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Створюючи новий &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues&#34;&gt;запит&lt;/a&gt; у репозиторії Kubernetes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Дізнайтеся більше&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Прочитайте KEP для &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; та &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/5598-opportunistic-batching&#34;&gt;Ситуативна пакетна обробка&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Слідкуйте за &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/132192&#34;&gt;Тікетом &amp;quot;Планування з урахуванням робочого навантаження&amp;quot;&lt;/a&gt; для останніх оновлень.&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Деталізоване управління допоміжними групами переходить в стан загальної доступності (GA)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/23/kubernetes-v1-35-fine-grained-supplementalgroups-control-ga/</guid>
      <description>
        
        
        &lt;p&gt;Від імені Kubernetes SIG Node, ми раді оголосити про перехід &lt;em&gt;деталізованого управління допоміжними групами&lt;/em&gt; до загальної доступності (GA) у Kubernetes v1.35!&lt;/p&gt;
&lt;p&gt;Нове поле Pod &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt; було введено як opt-in альфа-функція для Kubernetes v1.31, а потім перейшло до бета у v1.33. Тепер ця функція є загальнодоступною. Ця функція дозволяє реалізувати більш точний контроль над допоміжними групами в контейнерах Linux, що може зміцнити позицію безпеки, особливо при доступі до томів. Крім того, вона також покращує прозорість деталей UID/GID у контейнерах, забезпечуючи покращений нагляд за безпекою.&lt;/p&gt;
&lt;p&gt;Якщо ви плануєте оновити свій кластер з v1.32 або більш ранньої версії, будь ласка, зверніть увагу, що деякі зміни поведінки, що порушують сумісність, були введені з бета (v1.33). Для отримання додаткової інформації дивіться розділи &lt;a href=&#34;https://deploy-preview-48551--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;змін поведінки, введених у бета&lt;/a&gt; та &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/05/06/kubernetes-v1-33-fine-grained-supplementalgroups-control-beta/#upgrade-consideration&#34;&gt;розгляди оновлення&lt;/a&gt; у попередньому блозі про перехід до бета.&lt;/p&gt;
&lt;h2 id=&#34;motivation-implicit-group-memberships-defined-in-etc-group-in-the-container-image&#34;&gt;Мотивація: Неявні членства в групах, визначені в &lt;code&gt;/etc/group&lt;/code&gt; в образі контейнера&lt;/h2&gt;
&lt;p&gt;Навіть якщо більшість адміністраторів/користувачів кластерів Kubernetes можуть не бути обізнаними з цим, за звичай Kubernetes &lt;em&gt;обʼєднує&lt;/em&gt; інформацію про групи з Podʼа з інформацією, визначеною в &lt;code&gt;/etc/group&lt;/code&gt; в образі контейнера.&lt;/p&gt;
&lt;p&gt;Ось приклад; маніфест Podʼа, який вказує &lt;code&gt;spec.securityContext.runAsUser: 1000&lt;/code&gt;, &lt;code&gt;spec.securityContext.runAsGroup: 3000&lt;/code&gt; та &lt;code&gt;spec.securityContext.supplementalGroups: 4000&lt;/code&gt; як частину контексту безпеки Podʼа.&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;Який результат команди &lt;code&gt;id&lt;/code&gt; в контейнері &lt;code&gt;example-container&lt;/code&gt;? Вихідні дані повинні бути схожими на це:&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;Звідки в групі допоміжних ідентифікаторів (&lt;code&gt;groups&lt;/code&gt; поле) зʼявився ідентифікатор групи &lt;code&gt;50000&lt;/code&gt;, навіть якщо &lt;code&gt;50000&lt;/code&gt; взагалі не визначено в маніфесті Podʼа? Відповідь — файл &lt;code&gt;/etc/group&lt;/code&gt; в образі контейнера.&lt;/p&gt;
&lt;p&gt;Перевірка вмісту файлу &lt;code&gt;/etc/group&lt;/code&gt; в образі контейнера містить щось подібне до наступного:&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;Це показує, що первинний користувач контейнера &lt;code&gt;1000&lt;/code&gt; належить до групи &lt;code&gt;50000&lt;/code&gt; в останньому записі.&lt;/p&gt;
&lt;p&gt;Таким чином, членство в групі, визначене в &lt;code&gt;/etc/group&lt;/code&gt; в образі контейнера для первинного користувача контейнера, &lt;em&gt;неявно&lt;/em&gt; обʼєднується з інформацією з Podʼа. Будь ласка, зверніть увагу, що це було дизайнерським рішенням, яке поточні реалізації CRI успадкували від Docker, і спільнота насправді ніколи не переосмислювала це до теперішнього часу.&lt;/p&gt;
&lt;h3 id=&#34;what-s-wrong-with-it&#34;&gt;Що з цим не так?&lt;/h3&gt;
&lt;p&gt;Неявно обʼєднана інформація про групи з &lt;code&gt;/etc/group&lt;/code&gt; в образі контейнера становить ризик для безпеки. Ці неявні GID не можуть бути виявлені або перевірені механізмами політики, оскільки немає запису про них у маніфесті Podʼа. Це може призвести до несподіваних проблем з контролем доступу, особливо при доступі до томів (див. &lt;a href=&#34;https://issue.k8s.io/112879&#34;&gt;kubernetes/kubernetes#112879&lt;/a&gt; для деталей), оскільки дозволи файлів контролюються UID/GIDs в Linux.&lt;/p&gt;
&lt;h2 id=&#34;fine-grained-supplemental-groups-control-in-a-pod-supplementarygroupspolicy&#34;&gt;Деталізоване управління допоміжними групами в Pod: &lt;code&gt;supplementaryGroupsPolicy&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Щоб вирішити цю проблему, &lt;code&gt;.spec.securityContext&lt;/code&gt; Pod тепер включає поле &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Це поле дозволяє вам контролювати, як Kubernetes обчислює допоміжні групи для процесів контейнера всередині Podʼа. Доступні політики:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Merge&lt;/em&gt;: Інформація про членство в групі, визначена в &lt;code&gt;/etc/group&lt;/code&gt; для первинного користувача контейнера, буде обʼєднана. Якщо не вказано, ця політика буде застосована (тобто типова поведінка для зворотної сумісності).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Strict&lt;/em&gt;: Тільки ідентифікатори груп, вказані в &lt;code&gt;fsGroup&lt;/code&gt;, &lt;code&gt;supplementalGroups&lt;/code&gt; або &lt;code&gt;runAsGroup&lt;/code&gt;, прикріплюються як допоміжні групи до процесів контейнера. Членства в групах, визначені в &lt;code&gt;/etc/group&lt;/code&gt; для первинного користувача контейнера, ігноруються.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Я поясню, як працює політика &lt;code&gt;Strict&lt;/code&gt;. Наступний маніфест Podʼа вказує &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;Результат команди &lt;code&gt;id&lt;/code&gt; в контейнері &lt;code&gt;example-container&lt;/code&gt; повинен бути схожим на це:&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;Ви можете побачити, що політика &lt;code&gt;Strict&lt;/code&gt; може виключити групу &lt;code&gt;50000&lt;/code&gt; з &lt;code&gt;groups&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;Таким чином, забезпечення &lt;code&gt;supplementalGroupsPolicy: Strict&lt;/code&gt; (забезпечене якимось механізмом політики) допомагає запобігти неявним допоміжним групам у Podʼі.&lt;/p&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка:&lt;/h4&gt;&lt;p&gt;Контейнер з достатніми привілеями може змінити ідентичність процесу. &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt; впливає лише на початкову ідентичність процесу.&lt;/p&gt;
&lt;p&gt;Читайте далі для отримання додаткової інформації.&lt;/p&gt;
&lt;/div&gt;

&lt;h2 id=&#34;attached-process-identity-in-pod-status&#34;&gt;Приєднана ідентичність процесу в статусі Podʼа&lt;/h2&gt;
&lt;p&gt;Ця функція також відкриває ідентичність процесу, прикріплену до першого процесу контейнера через поле &lt;code&gt;.status.containerStatuses[].user.linux&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:#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;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка:&lt;/h4&gt;&lt;p&gt;Будь ласка, зверніть увагу, що значення в полі &lt;code&gt;status.containerStatuses[].user.linux&lt;/code&gt; є &lt;em&gt;спочатку приєднаною&lt;/em&gt; ідентичністю процесу до першого процесу контейнера в контейнері. Якщо контейнер має достатні привілеї для виклику системних викликів, повʼязаних з ідентичністю процесу (наприклад, &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; або &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; тощо), процес контейнера може змінити свою ідентичність. Таким чином, &lt;em&gt;фактична&lt;/em&gt; ідентичність процесу буде динамічною.&lt;/p&gt;
&lt;p&gt;Існує кілька способів обмежити ці дозволи в контейнерах. Ми пропонуємо наступні як прості рішення:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;встановлення &lt;code&gt;privilege: false&lt;/code&gt; та &lt;code&gt;allowPrivilegeEscalation: false&lt;/code&gt; у &lt;code&gt;securityContext&lt;/code&gt; вашого контейнера, або&lt;/li&gt;
&lt;li&gt;приведення вашого pod у відповідність до &lt;a href=&#34;https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted&#34;&gt;&lt;code&gt;Restricted&lt;/code&gt; політики в Pod Security Standard&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Крім того, kubelet не має видимості у втулку NRI або внутрішній роботі середовища виконання контейнера. Адміністратор кластера, що налаштовує вузли або високо привілейовані робочі навантаження з дозволу локального адміністратора, може змінити допоміжні групи для будь-якого пода. Однак це поза сферою контролю Kubernetes і не повинно бути проблемою для вузлів з посиленою безпекою.&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; вимагає оновлених середовищ виконання контейнерів&lt;/h2&gt;
&lt;p&gt;Високорівневе середовище виконання контейнера (наприклад, containerd, CRI-O) відіграє ключову роль у обчисленні допоміжних ідентифікаторів груп, які будуть прикріплені до контейнерів. Таким чином, &lt;code&gt;supplementalGroupsPolicy: Strict&lt;/code&gt; вимагає CRI-середовища, яке підтримує цю функцію. Стара поведінка (&lt;code&gt;supplementalGroupsPolicy: Merge&lt;/code&gt;) може працювати з CRI-середовищем, яке не підтримує цю функцію, тому що ця політика є повністю зворотно сумісною.&lt;/p&gt;
&lt;p&gt;Ось кілька CRI-середовищ, які підтримують цю функцію, і версії, які вам потрібно використовувати:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;containerd: v2.0 або новіше&lt;/li&gt;
&lt;li&gt;CRI-O: v1.31 або новіше&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;І ви можете побачити, чи підтримується ця функція в полі &lt;code&gt;.status.features.supplementalGroupsPolicy&lt;/code&gt; вузла. Будь ласка, зверніть увагу, що це поле відрізняється від &lt;code&gt;status.declaredFeatures&lt;/code&gt;, введеного в &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;Оскільки середовища виконання контейнерів універсально підтримують цю функцію, різні політики безпеки можуть почати забезпечувати поведінку &lt;code&gt;Strict&lt;/code&gt; як більш безпечну. Найкраща практика — переконатися, що ваші Podʼи готові до цієї вимоги, і всі допоміжні групи прозоро оголошені в специфікації Podʼа, а не в образах.&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Як долучитись&lt;/h2&gt;
&lt;p&gt;Це вдосконалення було ініційовано спільнотою &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt;. Будь ласка, приєднуйтесь до нас, щоб звʼязатися зі спільнотою та поділитися своїми ідеями та відгуками щодо вищезазначеної функції та не тільки. Ми з нетерпінням чекаємо на ваші відгуки!&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;Як дізнатися більше?&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-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/configure-pod-container/security-context/&#34;&gt;Налаштування контексту безпеки для Podʼа або контейнера&lt;/a&gt;
для отримання додаткової інформації про &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 Drop-in Directory переходить до GA</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/22/kubernetes-v1-35-kubelet-config-drop-in-directory-ga/</guid>
      <description>
        
        
        &lt;p&gt;З останнім випуском Kubernetes v1.35 стала загальнодоступною підтримка теки для конфігураційних файлів kubelet. Нова стабільна функція спрощує управління конфігурацією kubelet у великих гетерогенних кластерах.&lt;/p&gt;
&lt;p&gt;У версії 1.35 аргумент командного рядка kubelet &lt;code&gt;--config-dir&lt;/code&gt; готовий до використання у промислових умовах і повністю підтримується, що дозволяє вказати теку, яка містить файли конфігурації kubelet. Усі файли в цій теці будуть автоматично обʼєднані з основною конфігурацією kubelet. Це дозволяє адміністраторам кластерів підтримувати єдину базову конфігурацію для kubelet, одночасно забезпечуючи цільові налаштування для різних груп вузлів або випадків використання, без складних інструментів або ручного управління конфігурацією.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-managing-kubelet-configuration-at-scale&#34;&gt;Проблема: управління конфігурацією kubelet у великому масштабі&lt;/h2&gt;
&lt;p&gt;У міру того, як кластери Kubernetes стають більшими та складнішими, вони часто включають гетерогенні пули вузлів з різними апаратними можливостями, вимогами до робочого навантаження та експлуатаційними обмеженнями. Ця різноманітність вимагає різних конфігурацій kubelet у різних групах вузлів, але управління цими різноманітними конфігураціями у великому масштабі стає все більш складним завданням. Виникає кілька проблемних моментів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Дрейф конфігурації&lt;/strong&gt;: різні вузли можуть мати дещо різні конфігурації, що призводить до несумісної поведінки&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Налаштування групи вузлів&lt;/strong&gt;: вузли GPU, edge вузли та стандартні обчислювальні вузли часто вимагають різних налаштувань kubelet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Операційні накладні витрати&lt;/strong&gt;: підтримка окремих, повних файлів конфігурації для кожного типу вузла є схильною до помилок і складною для аудиту&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Управління змінами&lt;/strong&gt;: впровадження змін конфігурації в гетерогенних пулах вузлів вимагає ретельної координації&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;До того, як ця підтримка була додана до Kubernetes, адміністратори кластерів мали вибирати між використанням єдиного монолітного файлу конфігурації для всіх вузлів, ручним веденням декількох повних файлів конфігурації або використанням окремих інструментів. Кожен підхід мав свої недоліки. Перехід до стабільної версії надає адміністраторам кластерів повну підтримку fourth way to solve that challenge.&lt;/p&gt;
&lt;h2 id=&#34;example-use-cases&#34;&gt;Приклади використання&lt;/h2&gt;
&lt;h3 id=&#34;managing-heterogeneous-node-pools&#34;&gt;Управління гетерогенними пулами вузлів&lt;/h3&gt;
&lt;p&gt;Розглянемо кластер із декількома типами вузлів: стандартні обчислювальні вузли, вузли з високою продуктивністю (наприклад, із графічними процесорами або великим обʼємом памʼяті) та edge вузли зі спеціальними вимогами.&lt;/p&gt;
&lt;h4 id=&#34;base-configuration&#34;&gt;Базова конфігурація&lt;/h4&gt;
&lt;p&gt;Файл: &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;Перевизначення для вузла з високою пропускною здатністю&lt;/h4&gt;
&lt;p&gt;Файл: &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 вузлів&lt;/h4&gt;
&lt;p&gt;Файл: &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;Завдяки такій структурі вузли з високою пропускною здатністю застосовують як базову конфігурацію, так і перевизначення, що стосуються пропускної здатності, тоді як edge вузли застосовують базову конфігурацію з налаштуваннями, що стосуються edge.&lt;/p&gt;
&lt;h3 id=&#34;gradual-configuration-rollouts&#34;&gt;Поступове впровадження конфігурації&lt;/h3&gt;
&lt;p&gt;Під час впровадження змін у конфігурації ви можете:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Додати новий файл із високим числовим префіксом (наприклад, &lt;code&gt;99-new-feature.conf&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Протестувати зміни на підмножині вузлів&lt;/li&gt;
&lt;li&gt;Поступово впроваджувати зміни на інших вузлах&lt;/li&gt;
&lt;li&gt;Після стабілізації обʼєднати зміни в базову конфігурацію&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;Оскільки конфігурація тепер розподілена між декількома файлами, ви можете перевірити остаточну обʼєднану конфігурацію за допомогою точки доступу kubelet &lt;code&gt;/configz&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-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;# Запустіть 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;# В іншому терміналі завантажте обʼєднану конфігурацію&lt;/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;# Змініть замісник “&amp;lt;node-name&amp;gt;” перед запуском команди curl&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;Це показує фактичну конфігурацію, яку kubelet використовує після застосування всіх обʼєднань. Обʼєднана конфігурація також включає будь-які налаштування конфігурації, які були вказані за допомогою аргументів командного рядка kubelet.&lt;/p&gt;
&lt;p&gt;Детальні інструкції з налаштування, приклади конфігурації та поведінка злиття наведені в офіційній документації:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/administer-cluster/kubelet-config-file/#kubelet-conf-d&#34;&gt;Встановлення параметрів Kubelet за допомогою файлу конфігурації&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/node/kubelet-config-directory-merging/&#34;&gt;Злиття текстових файлів конфігурації Kubelet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;good-practices&#34;&gt;Рекомендації&lt;/h2&gt;
&lt;p&gt;При використанні теки конфігурацій kubelet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Тестуйте конфігурації поступово&lt;/strong&gt;: завжди тестуйте нові конфігурації на підмножині вузлів, перш ніж розгортати їх у всьому кластері, щоб мінімізувати ризики.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Контролюйте версії своїх конфігурацій&lt;/strong&gt;: зберігайте файли конфігурації (або джерело конфігурації, з якого вони генеруються) у системі контролю версій разом із вашою інфраструктурою як кодом, щоб відстежувати зміни та мати можливість легко повертатися до попередніх версій.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Використовуйте числові префікси для передбачуваного упорядкування&lt;/strong&gt;: називайте файли за допомогою числових префіксів (наприклад, &lt;code&gt;00-&lt;/code&gt;, &lt;code&gt;50-&lt;/code&gt;, &lt;code&gt;90-&lt;/code&gt;) для явного контролю порядку злиття та забезпечення зрозумілості шарування конфігурації для інших адміністраторів&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Звертайте увагу на тимчасові файли&lt;/strong&gt;: деякі текстові редактори під час редагування автоматично створюють резервні файли (наприклад, &lt;code&gt;.bak&lt;/code&gt;, &lt;code&gt;.swp&lt;/code&gt; або файли з розширенням &lt;code&gt;~&lt;/code&gt;) у тій самій теці. Переконайтеся, що ці тимчасові або резервні файли не залишаються в теці конфігурації, оскільки вони можуть оброблятися kubelet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Подяки&lt;/h2&gt;
&lt;p&gt;Ця функція була розроблена спільними зусиллями &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt;. Особлива подяка всім учасникам, які допомогли розробити, впровадити, протестувати та задокументувати цю функцію на всіх етапах її розвитку: від альфа-версії в v1.28, бета-версії в v1.30 до загальної доступності в v1.35.&lt;/p&gt;
&lt;p&gt;Щоб надати відгук про цю функцію, приєднайтеся до &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;Kubernetes Node Special Interest Group&lt;/a&gt;, беріть участь в обговореннях в &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;публічному каналі Slack&lt;/a&gt; (#sig-node) або подайте заявку на &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;Приєднуйтесь&lt;/h2&gt;
&lt;p&gt;Якщо у вас є відгуки чи запитання щодо управління конфігурацією kubelet або ви хочете поділитися своїм досвідом використання цієї функції, приєднуйтесь до обговорення:&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&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Kubernetes Slack&lt;/a&gt; у каналі #sig-node&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34;&gt;Список розсилки SIG Node&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SIG Node буде радий дізнатися про ваш досвід використання цієї функції у виробництві!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Уникнення зомбі-учасників кластера при оновленні до etcd v3.6</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/21/preventing-etcd-zombies/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/21/preventing-etcd-zombies/</guid>
      <description>
        
        
        &lt;p&gt;&lt;em&gt;Ця стаття була нещодавно опублікована в &lt;a href=&#34;https://etcd.io/blog/2025/zombie_members_upgrade/&#34;&gt;офіційному блозі etcd&lt;/a&gt;&lt;/em&gt;. &lt;a href=&#34;https://etcd.io/blog/2025/zombie_members_upgrade/#key-takeaway&#34;&gt;Основний висновок&lt;/a&gt;? Завжди оновлюйтеся до etcd v3.5.26 або новішої версії перед переходом до v3.6. Це гарантує автоматичне відновлення кластера та дозволяж уникати появі зомбі-учасників.&lt;/p&gt;
&lt;h2 id=&#34;issue-summary&#34;&gt;Підсумок проблеми&lt;/h2&gt;
&lt;p&gt;Нещодавно спільнота etcd вирішила проблему, яка може виникнути, коли користувачі &lt;a href=&#34;https://etcd.io/docs/v3.6/upgrades/upgrade_3_6/&#34;&gt;оновлюються з v3.5 до v3.6&lt;/a&gt;.  Цей баг може призвести до того, що кластер повідомлятиме про &amp;quot;зомбі-учасників&amp;quot;, які є вузлами etcd, що були видалені з кластера бази даних деякий час тому, і які знову зʼявляються та приєднуються до консенсусу бази даних. Кластер etcd потім стає неоперабельним, доки ці зомбі-учасники не будуть видалені.&lt;/p&gt;
&lt;p&gt;У etcd v3.5 та раніше v2store був джерелом істини для даних про членство, навіть якщо v3store також був присутній. Як частина нашого &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/12913&#34;&gt;плану припинення підтримки v2store&lt;/a&gt;, у v3.6 v3store стає джерелом істини для інформації про членство в кластері. Зі &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/20967&#34;&gt;звіту про баг&lt;/a&gt; ми дізналися, що в деяких старих кластерах v2store та v3store могли стати несумісними.  Ця несумісність проявляється після оновлення як поява старих, видалених &amp;quot;зомбі&amp;quot; учасників кластера, які знову зʼявляються в кластері.&lt;/p&gt;
&lt;h2 id=&#34;the-fix-and-upgrade-path&#34;&gt;Виправлення та шлях оновлення&lt;/h2&gt;
&lt;p&gt;Ми додали &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/20995&#34;&gt;механізм у etcd v3.5.26&lt;/a&gt; для автоматичної синхронізації v3store з v2store, гарантуючи, що уражені кластери будуть відновлені перед оновленням до 3.6.x.&lt;/p&gt;
&lt;p&gt;Щоб підтримати багатьох користувачів, які зараз оновлюються до 3.6, ми надали наступний безпечний шлях оновлення:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Оновіть ваш кластер до &lt;a href=&#34;https://github.com/etcd-io/etcd/releases/tag/v3.5.26&#34;&gt;v3.5.26&lt;/a&gt; або пізнішої версії.&lt;/li&gt;
&lt;li&gt;Зачекайте та підтвердіть, що всі учасники є справними після оновлення.&lt;/li&gt;
&lt;li&gt;Оновіться до v3.6.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ми не можемо надати безпечний обхідний шлях для користувачів, які мають перепони, що перешкоджають оновленню до v3.5.26.  Таким чином, якщо v3.5.26 недоступна з вашого джерела пакунків або постачальника, ви повинні відкласти оновлення до v3.6, доки вона не стане доступною.&lt;/p&gt;
&lt;h2 id=&#34;additional-technical-detail&#34;&gt;Додаткові технічні деталі&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Інформація нижче надається лише для довідки.  Користувачі можуть слідувати безпечному шляху оновлення без знання наступних деталей.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ця проблема виникає з кластерами, які працюють у з операційним навантаженням на etcd v3.5.25 або ранішої версії. Це побічний ефект додавання та видалення учасників з кластера або відновлення кластера після збою. Це означає, що проблема є більш імовірною, чим старішим є кластер etcd, але її не можна виключити для будь-якого користувача незалежно від віку кластера.&lt;/p&gt;
&lt;p&gt;Супроводжувачі etcd, працюючи зі авторами повідомлення про проблему, виявили три можливі причини виникнення проблеми на основі симптомів та аналізу коду та логів etcd:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Баг у &lt;code&gt;etcdctl snapshot restore&lt;/code&gt; (v3.4 та старих версіях)&lt;/strong&gt;: Під час відновлення знімка за допомогою &lt;code&gt;etcdctl snapshot restore&lt;/code&gt;, etcdctl мав видалити наявих учасників перед додаванням нових. У v3.4 через баг старі учасники не були видалені, що призвело до появи зомбі-учасників. Зверніться до &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/20967#issuecomment-3618010356&#34;&gt;коментаря щодо etcdctl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--force-new-cluster&lt;/code&gt; у v3.5 та попередніх версіях&lt;/strong&gt;: У рідкісних випадках примусове створення нового кластера з одним учасником не повністю видаляло старих учасників, залишаючи зомбі. Проблема була &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/20339&#34;&gt;вирішена&lt;/a&gt; у v3.5.22. Будь ласка, зверніться до &lt;a href=&#34;https://github.com/etcd-io/raft/pull/300&#34;&gt;цього PR&lt;/a&gt; у проєкті Raft для детальної технічної інформації.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Увімкнено --unsafe-no-sync&lt;/strong&gt;: Якщо &lt;code&gt;--unsafe-no-sync&lt;/code&gt; увімкнено, у рідкісних випадках etcd може зберегти зміну членства у v3store, але аварійно завершити роботу перед записом у WAL, спричиняючи несумісність між v2store та v3store. Це проблема для кластерів з одним учасником. Для кластерів з багатьма учасниками примусове створення нового кластера з одним учасником з даних аварійного вузла може призвести до появи зомбі-учасників.&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;Примітка&lt;/h4&gt;

    &lt;code&gt;--unsafe-no-sync&lt;/code&gt; загалом не рекомендується, оскільки може порушити гарантії, надані протоколом консенсусу.

&lt;/div&gt;

&lt;p&gt;Важливо, що можуть бути інші причини для несумісності даних членства v2store та v3store, які ми ще не виявили. Це означає, що ви не можете припустити, що ви в безпеці лише тому, що не виконували жодної з трьох дій вище. Після оновлення користувачів до etcd v3.6 v3store стає джерелом даних про членство, і подальша несумісність неможлива.&lt;/p&gt;
&lt;p&gt;Досвідчені користувачі, які хочуть перевірити сумісність між v2store та v3store, можуть слідувати крокам, описаним у цьому &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/20967#issuecomment-3590609775&#34;&gt;коментарі&lt;/a&gt;. Ця перевірка не потрібна для виправлення проблеми, і SIG etcd не рекомендує обходити оновлення v3.5.26 незалежно від результатів перевірки.&lt;/p&gt;
&lt;h2 id=&#34;key-takeaway&#34;&gt;Основний висновок&lt;/h2&gt;
&lt;p&gt;Завжди оновлюйтеся до &lt;a href=&#34;https://github.com/etcd-io/etcd/releases/tag/v3.5.26&#34;&gt;v3.5.26&lt;/a&gt; або новішої версії перед переходом до v3.6. Це гарантує автоматичне відновлення кластера та уникає появі зомбі-учасників.&lt;/p&gt;
&lt;h2 id=&#34;acknowledgements&#34;&gt;Подяки&lt;/h2&gt;
&lt;p&gt;Ми хотіли б подякувати &lt;a href=&#34;https://github.com/thechristschn&#34;&gt;Christian Baumann&lt;/a&gt; за повідомлення про цю давню проблему оновлення. Його звіт та подальша робота допомогли привернути нашу увагу до проблеми, щоб ми могли дослідити та вирішити її.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes 1.35: Зміна розміру Podʼа на місці переходить у стабільний стан</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/19/kubernetes-v1-35-in-place-pod-resize-ga/</guid>
      <description>
        
        
        &lt;p&gt;Цей випуск є важливим кроком: через понад 6 років після його первинної концепції функція &lt;strong&gt;In-Place Pod Resize&lt;/strong&gt; (також відома як In-Place Pod Vertical Scaling), вперше представлена як альфа-версія в Kubernetes v1.27 і переведена в бета-версію в Kubernetes v1.33, тепер є &lt;strong&gt;стабільною (GA)&lt;/strong&gt; в Kubernetes 1.35!&lt;/p&gt;
&lt;p&gt;Цей перехід є важливою віхою для підвищення ефективності використання ресурсів та гнучкості робочих навантажень, що виконуються на Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;what-is-in-place-pod-resize&#34;&gt;Що таке In-Place Pod Resize?&lt;/h2&gt;
&lt;p&gt;В минулому, CPU та памʼять, виділені для контейнера в Pod, були незмінними. Це означало, що зміна цих ресурсів вимагала видалення та повторного створення всього Podʼа. Для stateful сервісів, batch завдань або робочих навантажень з високою чутливістю до затримки це було надзвичайно деструктивна операція.&lt;/p&gt;
&lt;p&gt;In-Place Pod Resize робить CPU та memory requests і limits змінними, дозволяючи вам налаштовувати ці ресурси всередині запущеного Podʼа, часто без необхідності перезапуску контейнера.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ключові концепції:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Бажані ресурси:&lt;/strong&gt; Поле &lt;code&gt;spec.containers[*].resources&lt;/code&gt; контейнера тепер представляє бажані ресурси. Для CPU та памʼяті ці поля тепер змінні.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Фактичні ресурси:&lt;/strong&gt; Поле &lt;code&gt;status.containerStatuses[*].resources&lt;/code&gt; відображає ресурси, що наразі налаштовані для запущеного контейнера.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ініціювання зміни розміру:&lt;/strong&gt; Ви можете вимагати зміни розміру, оновивши бажані &lt;code&gt;requests&lt;/code&gt; і &lt;code&gt;limits&lt;/code&gt; у специфікації Pod, використовуючи новий підресурс &lt;code&gt;resize&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-can-i-start-using-in-place-pod-resize&#34;&gt;Як почати використовувати In-Place Pod Resize?&lt;/h2&gt;
&lt;p&gt;Докладні інструкції та приклади надані в офіційній документації: &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/configure-pod-container/resize-container-resources/&#34;&gt;Зміна розміру CPU та memory, призначених контейнерам&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-does-this-help-me&#34;&gt;Як це допоможе мені?&lt;/h2&gt;
&lt;p&gt;In-place Pod Resize є основою для безперебійного вертикального масштабування та покращення ефективності робочих навантажень.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ресурси, що коригуються без перебоїв&lt;/strong&gt; Ресурси робочих навантажень, чутливих до затримок або перезапусків, можуть бути змінені на місці без простоїв або втрати стану.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Більш потужне автоматичне масштабування&lt;/strong&gt; Автомасштабувальники тепер мають можливість коригувати ресурси з меншим впливом. Наприклад, режим оновлення &lt;code&gt;InPlaceOrRecreate&lt;/code&gt; Vertical Pod Autoscaler (VPA), який використовує цю функцію, перейшов у стадію бета-тестування. Це дозволяє автоматично та безперебійно коригувати ресурси на основі використання з мінімальними перебоями.
&lt;ul&gt;
&lt;li&gt;Див. &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; для отримання додаткової інформації.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Задоволення тимчасових потреб у ресурсах&lt;/strong&gt; Робочі навантаження, які тимчасово потребують більше ресурсів, можна швидко налаштувати. Це дозволяє використовувати такі функції, як CPU Startup Boost (&lt;a href=&#34;https://github.com/kubernetes/autoscaler/pull/7863&#34;&gt;AEP-7862&lt;/a&gt;), за допомогою якої програми можуть запитувати більше ресурсів процесора під час запуску, а потім автоматично зменшувати їх.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ось кілька прикладів використання:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ігровий сервер, який потребує коригування розміру відповідно до кількості гравців.&lt;/li&gt;
&lt;li&gt;Попередньо підігрітий робочий процес, який можна зменшити, коли він не використовується, але збільшити при першому запиті.&lt;/li&gt;
&lt;li&gt;Динамічне масштабування залежно від навантаження для ефективного пакування контейнерів.&lt;/li&gt;
&lt;li&gt;Збільшення ресурсів для JIT-компіляції під час запуску.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;changes-between-beta-1-33-and-stable-1-35&#34;&gt;Зміни між бета-версією (1.33) та стабільною версією (1.35)&lt;/h2&gt;
&lt;p&gt;З моменту випуску першої бета-версії v1.33 розробники зосередилися на стабілізації функції та поліпшенні її зручності використання на основі відгуків спільноти. Ось основні зміни в стабільній версії:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Зменшення обмеження памʼяті&lt;/strong&gt; Раніше зменшення обмежень памʼяті було заборонено. Це обмеження було знято, і тепер зменшення обмежень памʼяті дозволено. Kubelet намагається запобігти OOM-kills, дозволяючи зміну розміру тільки в тому випадку, якщо поточне використання памʼяті нижче нового бажаного обмеження. Однак ця перевірка є максимально ефективною і не гарантованою.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Зміна розміру за пріоритетом&lt;/strong&gt; Якщо вузол не має достатньо місця для прийняття всіх запитів на зміну розміру, &lt;em&gt;відкладені&lt;/em&gt; зміни розміру повторюються на основі такого пріоритету:
&lt;ul&gt;
&lt;li&gt;PriorityClass&lt;/li&gt;
&lt;li&gt;Клас QoS&lt;/li&gt;
&lt;li&gt;Тривалість &lt;em&gt;відкладені&lt;/em&gt;, причому старіші запити мають пріоритет.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ресурси на рівні Pod (альфа)&lt;/strong&gt; Підтримка зміни розміру Pod на місці з використанням ресурсів на рівні Podʼа була впроваджена за допомогою власної функціональної можливості, яка є альфа-версією у v1.35.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Підвищена спостережуваність&lt;/strong&gt;: Тепер є нові метрики Kubelet та події Podʼа, які спеціально повʼязані зі зміною розміру Podʼа на місці, щоб допомогти користувачам відстежувати та налагоджувати зміни ресурсів.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Перехід In-Place Pod Resize до стабільної версії відкриває можливості для потужної інтеграції в екосистемі Kubernetes. Наразі планується подальше вдосконалення в декількох напрямках.&lt;/p&gt;
&lt;h3 id=&#34;integration-with-autoscalers-and-other-projects&#34;&gt;Інтеграція з автомасштабувальниками та іншими проєктами&lt;/h3&gt;
&lt;p&gt;Планується інтеграція з декількома автомасштабувальниками та іншими проєктами для підвищення ефективності робочого навантаження в більшому масштабі. Деякі проєкти, що обговорюються:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Прискорення запуску VPA CPU (&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;): Дозволяє застосункам запитувати більше ресурсів CPU під час запуску та зменшувати їх після певного періоду часу.&lt;/li&gt;
&lt;li&gt;Підтримка VPA для оновлень на місці ([AEP-4016] (&lt;a href=&#34;https://github.com/kubernetes/autoscaler/tree/455d29039bf6b1eb9f784f498f28769a8698bc21/vertical-pod-autoscaler/enhancements/4016-in-place-updates-support))&#34;&gt;https://github.com/kubernetes/autoscaler/tree/455d29039bf6b1eb9f784f498f28769a8698bc21/vertical-pod-autoscaler/enhancements/4016-in-place-updates-support))&lt;/a&gt;: Підтримка VPA для &lt;code&gt;InPlaceOrRecreate&lt;/code&gt; нещодавно перейшла в бета-версію, а кінцевою метою є переведення функції в стабільну версію. Підтримка режиму &lt;code&gt;InPlace&lt;/code&gt; все ще знаходиться в стадії розробки; див. &lt;a href=&#34;https://github.com/kubernetes/autoscaler/pull/8818&#34;&gt;PR #8818&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Автомасштабування Ray: планується використовувати функцію In-Place Pod Resize для підвищення ефективності робочого навантаження. Дивіться &lt;a href=&#34;https://cloud.google.com/blog/products/containers-kubernetes/ray-on-gke-new-features-for-ai-scheduling-and-scaling&#34;&gt;цю публікацію в блозі Google Cloud&lt;/a&gt; для отримання додаткової інформації.&lt;/li&gt;
&lt;li&gt;Агент-пісочниця «Soft-Pause»: Дослідження можливості використання функції Pod Resize для покращення затримки. Детальніше див. &lt;a href=&#34;https://github.com/kubernetes-sigs/agent-sandbox/issues/103&#34;&gt;Github issue&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Підтримка середовища виконання: середовища виконання Java та Python не підтримують зміну розміру памʼяті без перезапуску. Триває відкрита дискусія з розробниками Java, див. &lt;a href=&#34;https://bugs.openjdk.org/browse/JDK-8359211&#34;&gt;помилку&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Якщо у вас є проєкт, який може виграти від інтеграції з функцією зміни розміру Podʼа на місці, зверніться до нас, скориставшись каналами, зазначеними в розділі зворотного звʼязку!&lt;/p&gt;
&lt;h3 id=&#34;feature-expansion&#34;&gt;Розширення функціональних можливостей&lt;/h3&gt;
&lt;p&gt;Наразі функція In-Place Pod Resize заборонена при використанні в поєднанні з: swap, статичним менеджером CPU та статичним менеджером памʼяті. Крім того, ресурси, крім CPU та памʼяті, залишаються незмінними. Розширення набору підтримуваних функцій та ресурсів розглядається в міру надходження відгуків про потреби спільноти.&lt;/p&gt;
&lt;p&gt;Також планується підтримка превентивного переривання робочого навантаження; якщо на вузлі недостатньо місця для зміни розміру під високим пріоритетом, метою є надання можливості політикам автоматично витісняти під з нижчим пріоритетом або збільшувати розмір вузла.&lt;/p&gt;
&lt;h3 id=&#34;improved-stability&#34;&gt;Покращена стабільність&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Вирішення проблем з конкуренцією між kubelet і планувальником&lt;/strong&gt; Відомі проблеми з конкуренцією між kubelet і планувальником щодо зміни розміру підсистеми на місці. Ведуться роботи з вирішення цих проблем у наступних версіях. Дивіться &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/126891&#34;&gt;проблему&lt;/a&gt; для більш детальної інформації.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Більш безпечне зменшення обмеження памʼяті&lt;/strong&gt; Перевірка Kubelet на запобігання OOM-kill може бути зроблена ще безпечнішою шляхом переміщення перевірки використання пам&#39;яті в сам контейнерний runtime. Дивіться &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/135670&#34;&gt;тікет&lt;/a&gt; для більш детальної інформації.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;providing-feedback&#34;&gt;Надання відгуків&lt;/h2&gt;
&lt;p&gt;З метою подальшого розвитку цієї базової функції, будь ласка, поділіться своїми відгуками щодо її вдосконалення та розширення. Ви можете поділитися своїми відгуками через GitHub issues, списки розсилки або канали Slack, повʼязані зі спільнотами Kubernetes &lt;a href=&#34;https://kubernetes.slack.com/archives/C0BP8PW9G&#34;&gt;#sig-node&lt;/a&gt; та &lt;a href=&#34;https://kubernetes.slack.com/archives/C09R1LV8S&#34;&gt;#sig-autoscaling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Дякуємо всім, хто долучився до реалізації цієї довгоочікуваної функції!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Завдання керовані зовнішніми контролерами переходять у загальну доступність</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/18/kubernetes-v1-35-job-managedby-for-jobs-goes-ga/</guid>
      <description>
        
        
        &lt;p&gt;У Kubernetes v1.35 можливість вказати зовнішній контролер Завдань (через &lt;code&gt;.spec.managedBy&lt;/code&gt;) переходить у загальну доступність.&lt;/p&gt;
&lt;p&gt;Ця функція дозволяє зовнішнім контролерам брати на себе повну відповідальність за узгодження Завдань (Job), відкриваючи потужні моделі планування, такі як багатокластерне диспетчеризування з &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;Навіщо делегувати узгодження Завдань?&lt;/h2&gt;
&lt;p&gt;Основною мотивацією для цієї функції є підтримка архітектур багатокластерного пакетного планування, таких як MultiKueue.&lt;/p&gt;
&lt;p&gt;Архітектура MultiKueue розрізняє кластер управління та пул робочих кластерів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Кластер управління відповідає за розподіл завдань, але не за їх виконання. Він повинен приймати обʼєкти Job для відстеження статусу, але пропускає створення та виконання Podʼів.&lt;/li&gt;
&lt;li&gt;Кластери робочих вузлів отримують розподілені Завдання та виконують фактичні Podʼи.&lt;/li&gt;
&lt;li&gt;Користувачі зазвичай взаємодіють із кластером управління. Оскільки статус автоматично передається назад, вони можуть спостерігати за прогресом Завдання «наживо» без доступу до кластерів робочих вузлів.&lt;/li&gt;
&lt;li&gt;У робочих кластерах розподілені Завдання виконуються як звичайні Завдання, що управляються вбудованим контролером Завдань, без налаштування &lt;code&gt;.spec.managedBy&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Використовуючи &lt;code&gt;.spec.managedBy&lt;/code&gt;, контролер MultiKueue в кластері управління може взяти на себе узгодження Завдання. Він копіює статус із «дзеркального» Завдання, що виконується в робочому кластері, назад до кластера управління.&lt;/p&gt;
&lt;p&gt;Чому б просто не вимкнути контролер завдань? Хоча теоретично це можна зробити, повністю вимкнувши вбудований контролер Завдань, часто це неможливо або недоцільно з двох причин:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Панелі управління, керовані постачальником: у багатьох хмарних середовищах панель управління Kubernetes заблокована, і користувачі не можуть змінювати прапорці менеджера контролера.&lt;/li&gt;
&lt;li&gt;Гібридна роль кластера: користувачам часто потрібен «гібридний» режим, в якому кластер управління надсилає деякі важкі робочі навантаження до віддалених кластерів, але все одно виконує менші завдання або завдання, повʼязані з панеллю управління, в кластері управління. &lt;code&gt;.spec.managedBy&lt;/code&gt; дозволяє таку деталізацію для кожного завдання окремо.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;how-spec-managedby-works&#34;&gt;Як працює &lt;code&gt;.spec.managedBy&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Поле &lt;code&gt;.spec.managedBy&lt;/code&gt; вказує, який контролер відповідає за Завдання. Існує два режими роботи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standard&lt;/strong&gt;: якщо не встановлено або встановлено на зарезервоване значення &lt;code&gt;kubernetes.io/job-controller&lt;/code&gt;, вбудований контролер Job узгоджує завдання як зазвичай (стандартна поведінка).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delegation&lt;/strong&gt;: якщо встановлено на будь-яке інше значення, вбудований контролер Job повністю пропускає узгодження для цього завдання.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Щоб запобігти появі осиротілих Podʼів або витоку ресурсів, це поле є незмінним. Ви не можете перенести запущене завдання з одного контролера на інший.&lt;/p&gt;
&lt;p&gt;Якщо ви плануєте впровадити зовнішній контролер, майте на увазі, що ваш контролер повинен відповідати визначенням &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/kubernetes-api/workload-resources/job-v1/&#34;&gt;Job API&lt;/a&gt;. Для забезпечення відповідності значну частину зусиль було спрямовано на впровадження розширених правил перевірки статусу завдання. Перейдіть до розділу &lt;a href=&#34;#how-can-you-learn-more&#34;&gt;Як дізнатися більше?&lt;/a&gt; для отримання додаткової інформації.&lt;/p&gt;
&lt;h2 id=&#34;ecosystem-adoption&#34;&gt;Впровадження в екосистему&lt;/h2&gt;
&lt;p&gt;Поле &lt;code&gt;.spec.managedBy&lt;/code&gt; швидко стає стандартним інтерфейсом для делегування контролю в екосистемі пакетної обробки Kubernetes.&lt;/p&gt;
&lt;p&gt;Різні власні контролери робочого навантаження додають це поле (або його еквівалент), щоб MultiKueue міг перейняти їх узгодження та координувати їх між кластерами:&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;Хоча можна використовувати &lt;code&gt;.spec.managedBy&lt;/code&gt; для реалізації власного контролера завдань з нуля, ми ще не спостерігали такого. Ця функція спеціально розроблена для підтримки моделей делегування, таких як MultiKueue, без необхідності винаходити велосипед.&lt;/p&gt;
&lt;h2 id=&#34;how-can-you-learn-more&#34;&gt;Як дізнатися більше?&lt;/h2&gt;
&lt;p&gt;Якщо ви хочете дізнатися більше:&lt;/p&gt;
&lt;p&gt;Прочитайте документацію для користувачів щодо:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/job/&#34;&gt;Завдань&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/job/#delegation-of-managing-a-job-object-to-external-controller&#34;&gt;Делегування управління обʼєктом Job зовнішньому контролеру&lt;/a&gt; та&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;Детальний огляд історії розробки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Пропозиція щодо вдосконалення Kubernetes (KEP) &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4368&#34;&gt;Механізм управління завданнями&lt;/a&gt;, включаючи впровадження розширених &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;Правил перевірки статусу завдань&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Kueue KEP для &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;Дізнайтеся, як MultiKueue використовує &lt;code&gt;.spec.managedBy&lt;/code&gt; на практиці, у посібнику з виконання завдань для &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/tasks/run/multikueue/job/&#34;&gt;виконання завдань у кластерах&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;acknowledgments&#34;&gt;Подяки&lt;/h2&gt;
&lt;p&gt;Як і у випадку з будь-якою функцією Kubernetes, багато людей допомогли сформувати цю функцію шляхом обговорень дизайну, оглядів, тестових запусків та повідомлень про помилки.&lt;/p&gt;
&lt;p&gt;Ми хотіли б особливо подякувати:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/soltysh&#34;&gt;Мацею Шуліку&lt;/a&gt; — за керівництво, наставництво та рецензії.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/atiratree&#34;&gt;Філіпу Крєпінському&lt;/a&gt; — за наставництво, допомогу та рецензії.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Приєднуйтесь&lt;/h2&gt;
&lt;p&gt;Ця робота була спонсорована Kubernetes &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-batch&#34;&gt;Batch Working Group&lt;/a&gt; у тісній співпраці з &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-apps&#34;&gt;SIG Apps&lt;/a&gt; та за активної підтримки спільноти &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-scheduling&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Якщо ви зацікавлені в пакетному плануванні, рішеннях для декількох кластерів або подальшому вдосконаленні Job API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Приєднуйтесь до нас на засіданнях Batch WG та SIG Apps.&lt;/li&gt;
&lt;li&gt;Підпишіться на &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 («Світове дерево»)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/17/kubernetes-v1-35-release/</link>
      <pubDate>Wed, 17 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/17/kubernetes-v1-35-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Редактори&lt;/strong&gt;: Aakanksha Bhende, Arujjwal Negi, Chad M. Crowell, Graziano Casto, Swathi Rao&lt;/p&gt;
&lt;p&gt;Як і попередні версії, версія Kubernetes v1.35 містить нові стабільні, бета- та альфа-функції. Постійний випуск високоякісних версій підкреслює силу нашого циклу розробки та активну підтримку з боку нашої спільноти.&lt;/p&gt;
&lt;p&gt;Цей випуск містить 60 вдосконалень, включаючи 17 стабільних, 19 бета- та 22 альфа-функції.&lt;/p&gt;
&lt;p&gt;У цьому випуску також є деякі &lt;a href=&#34;#deprecations-removals-and-community-updates&#34;&gt;застарілі та видалені функції&lt;/a&gt;; обовʼязково ознайомтеся з ними.&lt;/p&gt;
&lt;h2 id=&#34;release-theme-and-logo&#34;&gt;Тема та логотип релізу&lt;/h2&gt;


&lt;figure class=&#34;release-logo &#34;&gt;
    &lt;img src=&#34;https://deploy-preview-48551--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: шестикутний значок у вигляді ілюстрованої книги з сяючим світовим деревом, гілки якого обіймають Землю, та білим колесом Kubernetes; три веселі білки стоять нижче,  чарівник у сливовій мантії, що тримає сувій LGTM, воїн із сокирою та синім щитом Kubernetes і розбійник із ліхтарем у темно-синьому плащі, на зеленій траві над золотою стрічкою з написом World Tree Release, на тлі пагорбів та неба, вкритого хмарами.&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;2025 рік розпочався у сяйві Octarine: The Color of Magic (v1.33) і промайнув під поривами Of Wind &amp;amp; Will (v1.34). Ми завершуємо цей рік, тримаючись за Світове дерево, натхненні Іггдрасілем, деревом життя, що поєднує багато світів. Як і будь-яке велике дерево, Kubernetes росте кільце за кільцем і реліз за релізом, формуючись під опікою глобальної спільноти.&lt;/p&gt;
&lt;p&gt;У його центрі знаходиться колесо Kubernetes, що огортає Землю, яке підтримують завзяті мейнтейнери, контрибутори та користувачі. Між повсякденною роботою, змінами в житті та постійним управлінням відкритим кодом вони обрізають старі API (гілки дерева), додають нові функції та підтримують один з найбільших у світі проєктів з відкритим кодом.&lt;/p&gt;
&lt;p&gt;Три білки охороняють дерево: чарівник, що тримає сувій LGTM для рецензентів, воїн із сокирою та щитом Kubernetes для команд, що випускають нові версії та створюють нові гілки, та розбійник із ліхтарем для сортувальників, які проливають світло на темні черги проблем.&lt;/p&gt;
&lt;p&gt;Разом вони складають набагато більшу групу шукачів пригод. Kubernetes v1.35 додає ще одне кільце росту до Світового дерева, свіжий зріз, сформований багатьма руками, багатьма шляхами та спільнотою, гілки якої досягають все більших висот, а коріння — все більшої глибини.&lt;/p&gt;
&lt;h2 id=&#34;spotlight-on-key-updates&#34;&gt;Основні оновлення&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 містить безліч нових функцій та вдосконалень. Ось кілька оновлень, на які команда розробників хотіла б звернути вашу увагу!&lt;/p&gt;
&lt;h3 id=&#34;stable-in-place-update-of-pod-resources&#34;&gt;Stable: Оновлення ресурсів Podʼів на місці&lt;/h3&gt;
&lt;p&gt;Kubernetes перевів оновлення ресурсів Podʼів на місці в статус загальної доступності (GA). Ця функція дозволяє користувачам налаштовувати ресурси CPU та памʼяті без перезапуску Podʼів або контейнерів. Раніше такі зміни вимагали повторного створення Podʼів, що могло порушити робочі процеси, особливо для застосунків із збереженням стану або пакетних застосунків. У попередніх версіях Kubernetes можна було змінювати лише налаштування ресурсів інфраструктури (запити та обмеження) для поточних Podʼів. Новий функціонал дозволяє здійснювати більш плавне вертикальне масштабування без перебоїв, підвищує ефективність, а також спрощує розробку.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP #1287&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;beta-pod-certificates-for-workload-identity-and-security&#34;&gt;Beta: Сертифікати Podʼів для ідентифікації та безпеки робочого навантаження&lt;/h3&gt;
&lt;p&gt;Раніше для доставки сертифікатів до Podʼів були потрібні зовнішні контролери (cert-manager, SPIFFE/SPIRE), оркестрування CRD та управління Secret, а ротація здійснювалася за допомогою sidecarʼів або init-контейнерів. Kubernetes v1.35 забезпечує вбудовану ідентифікацію робочого навантаження з автоматизованою ротацією сертифікатів, що значно спрощує використання сервісних мереж та архітектур нульової довіри.&lt;/p&gt;
&lt;p&gt;Тепер &lt;code&gt;kubelet&lt;/code&gt; генерує ключі, запитує сертифікати через PodCertificateRequest і записує пакети облікових даних безпосередньо у файлову систему Podʼа. &lt;code&gt;kube-apiserver&lt;/code&gt; застосовує обмеження вузлів під час допуску, усуваючи найпоширенішу пастку для сторонніх підписантів: випадкове порушення меж ізоляції вузлів. Це забезпечує чисті потоки mTLS без токенів на предʼявника у шляху видачі.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4317&#34;&gt;KEP #4317&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;alpha-node-declared-features-before-scheduling&#34;&gt;Alpha: Функції, що декларуються вузлом перед плануванням&lt;/h3&gt;
&lt;p&gt;Коли панелі управління вмикають нові функції, але вузли відстають (дозволено політикою Kubernetes skew), планувальник може розміщувати podʼи, що потребують цих функцій, на несумісних старих вузлах. Фреймворк оголошення функцій вузлів дозволяє вузлам декларувати підтримувані ними функції Kubernetes. З увімкненою новою альфа-можливістю вузол повідомляє про функції, які він підтримує, публікуючи цю інформацію в панелі управління через нове поле &lt;code&gt;.status.declaredFeatures&lt;/code&gt;. Потім &lt;code&gt;kube-scheduler&lt;/code&gt;, контролери допуску та сторонні компоненти можуть використовувати ці декларації. Наприклад, ви можете застосувати обмеження планування та перевірки API, щоб гарантувати, що Podʼи працюють тільки на сумісних вузлах.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5328&#34;&gt;KEP #5328&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;features-graduating-to-stable&#34;&gt;Функції, що перейшли в стабільний стан&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Це підбірка деяких поліпшень, які тепер є стабільними після випуску версії 1.35.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;prefersamenode-traffic-distribution&#34;&gt;Розподіл трафіку PreferSameNode&lt;/h3&gt;
&lt;p&gt;Поле &lt;code&gt;trafficDistribution&lt;/code&gt; для Services було оновлено, щоб забезпечити більш чіткий контроль за маршрутизацією трафіку. Було додано нову опцію &lt;code&gt;PreferSameNode&lt;/code&gt;, яка дозволяє сервісам суворо пріоритезувати точки доступу на локальному вузлі, якщо вони доступні, а в іншому випадку переходити на віддалені точки доступу.&lt;/p&gt;
&lt;p&gt;Одночасно наявну опцію &lt;code&gt;PreferClose&lt;/code&gt; було перейменовано на &lt;code&gt;PreferSameZone&lt;/code&gt;. Ця зміна робить API зрозумілішим, чітко вказуючи, що трафік переважно проходить у межах поточної зони доступності. Хоча &lt;code&gt;PreferClose&lt;/code&gt; збережено для зворотної сумісності, &lt;code&gt;PreferSameZone&lt;/code&gt; тепер є стандартом для зональної маршрутизації, що забезпечує чітке розмежування пріоритетів на рівні вузлів і на рівні зон.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3015&#34;&gt;KEP #3015&lt;/a&gt; під керівництвом SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;job-api-managed-by-mechanism&#34;&gt;Механізм управління Job API&lt;/h3&gt;
&lt;p&gt;Job API тепер включає поле &lt;code&gt;managedBy&lt;/code&gt;, яке дозволяє зовнішньому контролеру обробляти синхронізацію статусу Job. Ця функція, яка перейшла в стабільний стан у Kubernetes v1.35, в першу чергу реалізована за допомогою &lt;a href=&#34;https://github.com/kubernetes-sigs/kueue/tree/main/keps/693-multikueue&#34;&gt;MultiKueue&lt;/a&gt; — системи диспетчеризації для декількох кластерів, в якій Job, створений в кластері управління, дзеркально відображається і виконується в робочому кластері, а оновлення статусу передаються назад. Щоб уможливити цей робочий процес, вбудований контролер Job не повинен діяти на конкретний ресурс Job, щоб контролер Kueue міг замість цього керувати оновленнями статусу.&lt;/p&gt;
&lt;p&gt;Метою є забезпечення чіткого делегування синхронізації завдань іншому контролеру. Мета не полягає в передачі власних параметрів користувачів цьому контролеру або зміні політик паралельності CronJob.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4368&#34;&gt;KEP #4368&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;reliable-pod-update-tracking-with-metadata-generation&#34;&gt;Надійне відстеження оновлень Podʼів за допомогою &lt;code&gt;.metadata.generation&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Історично, в API Pod не було поля &lt;code&gt;metadata.generation&lt;/code&gt;, яке є в інших обʼєктах Kubernetes, таких як Deployments. Через це контролери та користувачі не мали надійного способу перевірити, чи &lt;code&gt;kubelet&lt;/code&gt; дійсно обробив останні зміни в специфікації Podʼа. Ця неоднозначність була особливо проблематичною для таких функцій, як &lt;a href=&#34;#stable-in-place-update-of-pod-resources&#34;&gt;вертикальне масштабування Podʼів на місці&lt;/a&gt;, де було важко точно визначити, коли було виконано запит на зміну розміру ресурсу.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.33 було додано поля &lt;code&gt;.metadata.generation&lt;/code&gt; для Podʼів як альфа-функція. Це поле тепер є стабільним у Pod API v1.35, що означає, що кожного разу, коли оновлюється &lt;code&gt;spec&lt;/code&gt; Podʼа, значення &lt;code&gt;.metadata.generation&lt;/code&gt; збільшується. В рамках цього вдосконалення Pod API також отримав поле &lt;code&gt;.status.observedGeneration&lt;/code&gt;, яке повідомляє про покоління, яке &lt;code&gt;kubelet&lt;/code&gt; успішно побачив і обробив. Умови Podʼів також містять власне індивідуальне поле &lt;code&gt;observedGeneration&lt;/code&gt;, яке клієнти можуть повідомляти та/або спостерігати.&lt;/p&gt;
&lt;p&gt;Оскільки ця функція стала стабільною у v1.35, вона доступна для всіх робочих навантажень.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5067&#34;&gt;KEP #5067&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;configurable-numa-node-limit-for-topology-manager&#34;&gt;Настроюваний ліміт NUMA-вузлів для менеджера топології&lt;/h3&gt;
&lt;p&gt;Історично &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/policy/node-resource-managers/&#34;&gt;менеджер топології&lt;/a&gt; використовував жорстко заданий ліміт у 8 для максимальної кількості NUMA-вузлів, які він може підтримувати, запобігаючи вибуху стану під час обчислення спорідненості. (Тут є важлива деталь: &lt;em&gt;вузол NUMA&lt;/em&gt; не є тим самим, що й вузол у API Kubernetes.) Це обмеження кількості вузлів NUMA заважало Kubernetes повною мірою використовувати сучасні високопродуктивні сервери, які все частіше оснащуються архітектурами ЦП з більш ніж 8 вузлами NUMA.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.31 було введено нову опцію &lt;strong&gt;beta&lt;/strong&gt; &lt;code&gt;max-allowable-numa-nodes&lt;/code&gt; для конфігурації політики менеджера топології. У Kubernetes v1.35 ця опція є стабільною. Адміністратори кластерів, які її вмикають, можуть використовувати сервери з більш ніж 8 вузлами NUMA.&lt;/p&gt;
&lt;p&gt;Хоча опція конфігурації є стабільною, спільнота Kubernetes усвідомлює низьку продуктивність великих хостів NUMA, і існує &lt;a href=&#34;https://kep.k8s.io/5726&#34;&gt;пропозиція щодо вдосконалення&lt;/a&gt; (KEP-5726), яка має на меті її покращити. Більше про це можна дізнатися, прочитавши &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/administer-cluster/topology-manager/&#34;&gt;Політики управління топологією на вузлі&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4622&#34;&gt;KEP #4622&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-beta&#34;&gt;Нові функції в бета-версії&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Це підбірка деяких поліпшень, які зараз знаходяться в бета-версії після випуску v1.35.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;expose-node-topology-labels-via-downward-api&#34;&gt;Експонування міток топології вузлів через Downward API&lt;/h3&gt;
&lt;p&gt;Для доступу до інформації про топологію вузлів, такої як регіон і зона, зсередини Podʼа зазвичай потрібно було надсилати запит до сервера Kubernetes API. Хоча цей підхід є функціональним, він створює складності та ризики для безпеки, оскільки вимагає широких дозволів RBAC або sidecar-контейнерів лише для отримання метаданих інфраструктури. Kubernetes v1.35 просуває можливість експонування міток топології вузлів безпосередньо через Downward API до бета-версії.&lt;/p&gt;
&lt;p&gt;Тепер &lt;code&gt;kubelet&lt;/code&gt; може робити інʼєкцію стандартних міток топології, таких як &lt;code&gt;topology.kubernetes.io/zone&lt;/code&gt; та &lt;code&gt;topology.kubernetes.io/region&lt;/code&gt;, у Pod як змінні середовища або у файли спроєцьоованих томів. Основна перевага полягає в більш безпечному та ефективному способі забезпечення топологічної обізнаності робочих навантажень. Це дозволяє застосункам природно адаптуватися до своєї зони доступності або регіону без залежності від API-сервера, посилюючи безпеку завдяки дотриманню принципу мінімальних привілеїв та спрощуючи конфігурацію кластера.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Примітка:&lt;/strong&gt; Kubernetes тепер робить інʼєкцію доступних міток топології в кожен Pod, щоб їх можна було використовувати як вхідні дані для &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/downward-api/&#34;&gt;downward API&lt;/a&gt;. З оновленням до версії v1.35 більшість адміністраторів кластерів побачать кілька нових міток, доданих до кожного Podʼа; це очікується як частина дизайну.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4742&#34;&gt;KEP #4742&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;native-support-for-storage-version-migration&#34;&gt;Вбудована підтримка міграції версій сховища&lt;/h3&gt;
&lt;p&gt;У Kubernetes v1.35 вбудована підтримка міграції версій сховища перейшла в стадію бета-тестування і є типово увімкненою. Цей крок інтегрує логіку міграції безпосередньо в основну панелі управління Kubernetes («in-tree»), усуваючи залежність від зовнішніх інструментів.&lt;/p&gt;
&lt;p&gt;Раніше адміністратори покладалися на ручні «цикли читання/запису», часто підключаючи &lt;code&gt;kubectl get&lt;/code&gt; до &lt;code&gt;kubectl replace&lt;/code&gt; для оновлення схем або повторного шифрування даних у стані спокою. Цей метод був неефективним і схильним до конфліктів, особливо для великих ресурсів, таких як Secrets. У цій версії вбудований контролер автоматично обробляє конфлікти оновлень і токени узгодженості, забезпечуючи безпечний, оптимізований і надійний спосіб гарантувати актуальність збережених даних з мінімальними оперативними витратами.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4192&#34;&gt;KEP #4192&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;mutable-volume-attach-limits&#34;&gt;Обмеження приєднання змінюваних томів&lt;/h3&gt;
&lt;p&gt;Драйвер CSI (Container Storage Interface) — це втулок Kubernetes, який забезпечує послідовний спосіб підключення систем зберігання даних до контейнеризованих робочих навантажень. Обʼєкт &lt;code&gt;CSINode&lt;/code&gt; записує детальну інформацію про всі драйвери CSI, встановлені на вузлі. Однак може виникнути невідповідність між заявленою та фактичною ємністю на вузлах. Коли після запуску драйвера CSI використовуються слоти томів, &lt;code&gt;kube-scheduler&lt;/code&gt; може призначити podʼи зі збереженням стану вузлам без достатньої ємності, що в решті решт призведе до зависання в стані &lt;code&gt;ContainerCreating&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 робить &lt;code&gt;CSINode.spec.drivers[*].allocatable.count&lt;/code&gt; змінним, щоб доступна ємність підключення томів вузла могла оновлюватися динамічно. Це також дозволяє драйверам CSI контролювати частоту оновлення значення &lt;code&gt;allocatable.count&lt;/code&gt; на всіх вузлах шляхом введення настроюваного інтервалу оновлення, визначеного через обʼєкт &lt;code&gt;CSIDriver&lt;/code&gt;. Крім того, він автоматично оновлює &lt;code&gt;CSINode.spec.drivers[*].allocatable.count&lt;/code&gt; при виявленні збою в підключенні томів через недостатню ємність. Хоча ця функція перейшла в бета-версію в v1.34 з функціональною можливістю &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt;, яка є типово вимкненою, вона залишається в бета-версії для v1.35, щоб дати час для відгуків, але функціональна можливість є типово увімкненою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;KEP #4876&lt;/a&gt; під керівництвом SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;opportunistic-batching&#34;&gt;Випадкова пакетна обробка&lt;/h3&gt;
&lt;p&gt;Історично склалося так, що планувальник Kubernetes обробляє поди послідовно з часовою складністю &lt;code&gt;O(num pods × num nodes)&lt;/code&gt;, що може призвести до надмірних обчислень для сумісних подів. Цей KEP вводить механізм випадкової пакетної обробки, який має на меті покращити продуктивність шляхом ідентифікації таких сумісних подів за допомогою &lt;code&gt;Pod scheduling signature&lt;/code&gt; та їх пакетної обробки, що дозволяє застосовувати спільні результати фільтрування та оцінювання до всіх них.&lt;/p&gt;
&lt;p&gt;Підпис планування подів гарантує, що два поди з однаковим підписом є «однаковими» з точки зору планування. Він враховує не тільки атрибути подів і вузлів, але й інші поди в системі та глобальні дані про розміщення подів. Це означає, що будь-який под із заданим підписом отримає однакові результати оцінки/реалістичності від будь-якого довільного набору вузлів.&lt;/p&gt;
&lt;p&gt;Механізм обʼєднання складається з двох операцій, які можна викликати в будь-який час, коли це необхідно — &lt;em&gt;create&lt;/em&gt; та &lt;em&gt;nominate&lt;/em&gt;. Create призводить до створення нового набору інформації про пакет на основі результатів планування Podʼів, які мають дійсний підпис. Nominate використовує інформацію про пакет з create, щоб встановити імʼя номінованого вузла з нового Podʼа, підпис якого відповідає канонічному підпису Podʼа.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5598&#34;&gt;KEP #5598&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;maxunavailable-for-statefulsets&#34;&gt;&lt;code&gt;maxUnavailable&lt;/code&gt; для StatefulSets&lt;/h3&gt;
&lt;p&gt;StatefulSet запускає групу Podʼів і підтримує фіксовану ідентичність для кожного з них. Це критично важливо для робочих навантажень із збереженням стану, які вимагають стабільних мережевих ідентифікаторів або постійного зберігання. Коли &lt;code&gt;.spec.updateStrategy.&amp;lt;type&amp;gt;&lt;/code&gt; StatefulSet встановлено на &lt;code&gt;RollingUpdate&lt;/code&gt;, контролер StatefulSet видалить і перестворить кожен Pod у StatefulSet. Він буде діяти в тому ж порядку, що і при припиненні роботи Podʼів (від найбільшого порядкового номера до найменшого), оновлюючи кожен Pod по черзі.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.24 до налаштувань конфігурації &lt;code&gt;rollingUpdate&lt;/code&gt; StatefulSet додано нове поле &lt;strong&gt;alpha&lt;/strong&gt; з назвою &lt;code&gt;maxUnavailable&lt;/code&gt;. Це поле не було частиною API Kubernetes, якщо адміністратор кластера явно не вибрав його.
У Kubernetes v1.35 це поле є бета-версією і є стандартно доступним. Ви можете використовувати його для визначення максимальної кількості Podʼів, які можуть бути недоступними під час оновлення. Це налаштування є найбільш ефективним у поєднанні з &lt;code&gt;.spec.podManagementPolicy&lt;/code&gt;, встановленим на Parallel.  Ви можете встановити &lt;code&gt;maxUnavailable&lt;/code&gt; як додатне число (наприклад: 2) або відсоток від бажаної кількості Podʼів (наприклад: 10%). Якщо це поле не вказано, стандартно буде встановлено значення 1, щоб зберегти попередню поведінку оновлення лише одного пода за раз. Це вдосконалення дозволяє застосункам зі збереженням стану (які можуть терпіти відмову більше ніж одного пода) швидше завершувати оновлення.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/961&#34;&gt;KEP #961&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;configurable-credential-plugin-policy-in-kuberc&#34;&gt;Настроювана політика втулків для облікових даних у &lt;code&gt;kuberc&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Опціональний файл &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/kubectl/kuberc/&#34;&gt;&lt;code&gt;kuberc&lt;/code&gt;&lt;/a&gt; дозволяє відокремити конфігурації сервера та облікові дані кластера від налаштувань користувача, не порушуючи роботу вже запущених CI-конвеєрів несподіваними результатами.&lt;/p&gt;
&lt;p&gt;У рамках випуску v1.35 &lt;code&gt;kuberc&lt;/code&gt; отримує додаткову функціональність, яка дозволяє користувачам налаштовувати політику втулків для облікових даних. Ця зміна вводить два поля &lt;code&gt;credentialPluginPolicy&lt;/code&gt;, яке дозволяє або забороняє всі втулки, та дозволяє вказати список дозволених втулків за допомогою &lt;code&gt;credentialPluginAllowlist&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;KEP #3104&lt;/a&gt; у співпраці між SIG Auth та SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;kyaml&#34;&gt;KYAML&lt;/h3&gt;
&lt;p&gt;YAML — це формат серіалізації даних, зрозумілий для людини. У Kubernetes файли YAML використовуються для визначення та конфігурації ресурсів, таких як Pods, Services та Deployments. Однак складний YAML важко читати. Значні пробіли в YAML вимагають ретельної уваги до відступів та вкладеності, а опціональне цитування рядків може призвести до несподіваного примусового перетворення типів (див.: The Norway Bug). Хоча JSON є альтернативою, він не підтримує коментарі та має суворі вимоги до кінцевих ком та цитованих ключів.&lt;/p&gt;
&lt;p&gt;KYAML — це безпечніший та менш неоднозначний піднабір YAML, розроблений спеціально для Kubernetes. Введена як опціональна альфа-функція у версії 1.34, ця функція перейшла у бета-версію в Kubernetes 1.35 і стала стандартно увімкненою. Її можна вимкнути, встановивши змінну середовища &lt;code&gt;KUBECTL_KYAML=false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;KYAML вирішує проблеми, повʼязані як з YAML, так і з JSON. Усі файли KYAML також є дійсними файлами YAML. Це означає, що ви можете писати KYAML і передавати його як вхідні дані до будь-якої версії kubectl. Це також означає, що вам не потрібно писати в суворому KYAML, щоб вхідні дані були розібрані.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5295&#34;&gt;KEP #5295&lt;/a&gt; під керівництвом SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;configurable-tolerance-for-horizontalpodautoscalers&#34;&gt;Настроювана толерантність для HorizontalPodAutoscalers&lt;/h3&gt;
&lt;p&gt;Horizontal Pod Autoscaler (HPA) історично покладався на фіксовану глобальну толерантність 10% для дій з масштабування. Недоліком цього жорстко заданого значення було те, що робочі навантаження, які вимагають високої чутливості, наприклад ті, що потребують масштабування при збільшенні навантаження на 5%, часто блокувалися, тоді як інші могли коливатися без необхідності.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 функція настроюваної толерантності перейшла в бета-версію і є стандартно увімкненою. Це вдосконалення дозволяє користувачам визначати власне вікно толерантності для кожного ресурсу в полі HPA &lt;code&gt;behavior&lt;/code&gt;. Встановивши конкретну толерантність (наприклад, знизивши її до 0,05 для 5%), оператори отримують точний контроль над чутливістю автомасштабування, забезпечуючи швидку реакцію критичних робочих навантажень на невеликі зміни метрик без необхідності коригування конфігурації всього кластера.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4951&#34;&gt;KEP #4951&lt;/a&gt; під керівництвом SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;support-for-user-namespaces-in-pods&#34;&gt;Підтримка просторів імен користувачів у Podʼах&lt;/h3&gt;
&lt;p&gt;Kubernetes додає підтримку просторів імен користувачів, що дозволяє Podʼам працювати з ізольованими зіставленнями ідентифікаторів користувачів і груп замість спільного використання ідентифікаторів хостів. Це означає, що контейнери можуть працювати як root внутрішньо, хоча насправді вони зіставлені з непривілейованим користувачем на хості, що зменшує ризик ескалації привілеїв у разі компрометації. Ця функція покращує безпеку на рівні Podʼів і робить більш безпечним виконання робочих навантажень, які потребують прав root всередині контейнера. Згодом підтримка була розширена як на Podʼи без збереження стану, так і на Podʼи зі збереженням стану за допомогою монтування з зіставленням ідентифікаторів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP #127&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;volumesource-oci-artifact-and-or-image&#34;&gt;VolumeSource: артефакт OCI та/або образ&lt;/h3&gt;
&lt;p&gt;Під час створення Podʼа часто потрібно надати дані, бінарні файли або файли конфігурації для контейнерів. Це означало включення вмісту в основний образ контейнера або використання спеціального контейнера init для завантаження та розпакування файлів у &lt;code&gt;emptyDir&lt;/code&gt;. Обидва ці підходи залишаються дійсними. У Kubernetes v1.31 додано підтримку типу томів &lt;code&gt;image&lt;/code&gt;, що дозволяє Podʼам декларативно витягувати та розпаковувати артефакти образу контейнера OCI у том. Це дозволяє пакувати та доставляти артефакти, що містять лише дані, такі як конфігурації, бінарні файли або моделі машинного навчання, використовуючи стандартні інструменти реєстру OCI.&lt;/p&gt;
&lt;p&gt;Завдяки цій функції ви можете повністю відокремити свої дані від образу контейнера та усунути необхідність у додаткових контейнерах ініціалізації або скриптах запуску. Тип тома image перебуває в бета-версії з v1.33 і є стандартно увімкненим у v1.35. Зверніть увагу, що для використання цієї функції потрібен сумісний рушій виконання контейнерів, такий як containerd v2.1 або пізнішої версії.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4639&#34;&gt;KEP #4639&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;enforced-kubelet-credential-verification-for-cached-images&#34;&gt;Примусова перевірка облікових даних &lt;code&gt;kubelet&lt;/code&gt; для кешованих образів&lt;/h3&gt;
&lt;p&gt;Налаштування &lt;code&gt;imagePullPolicy: IfNotPresent&lt;/code&gt; наразі дозволяє Podʼу використовувати образ контейнера, який вже кешований на вузлі, навіть якщо сам Pod не має облікових даних для отримання цього образу. Недоліком такої поведінки є те, що вона створює вразливість безпеки в багатокористувацьких кластерах: якщо Pod з дійсними обліковими даними отримує конфіденційний приватний образ на вузол, наступний неавторизований Pod на тому самому вузлі може отримати доступ до цього образу, просто використовуючи локальний кеш.&lt;/p&gt;
&lt;p&gt;Цей KEP вводить механізм, за допомогою якого kubelet забезпечує перевірку облікових даних для кешованих образів. Перш ніж дозволити Podʼу використовувати локально кешований образ, kubelet перевіряє, чи має Pod дійсні облікові дані для його отримання. Це гарантує, що тільки авторизовані робочі навантаження можуть використовувати приватні образи, незалежно від того, чи вже присутні вони на вузлі, що значно посилює безпеку спільних кластерів.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 ця функція перейшла в бета-версію і є стандартно увімкненою. Користувачі все ще можуть вимкнути її, встановивши для функції &lt;code&gt;KubeletEnsureSecretPulledImages&lt;/code&gt; значення false. Крім того, прапорець &lt;code&gt;imagePullCredentialsVerificationPolicy&lt;/code&gt; дозволяє операторам налаштувати бажаний рівень безпеки, від режиму, що надає пріоритет зворотній сумісності, до режиму суворого виконання, що забезпечує максимальну безпеку.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/2535&#34;&gt;KEP #2535&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;fine-grained-container-restart-rules&#34;&gt;Деталізовані правила перезапуску контейнерів&lt;/h3&gt;
&lt;p&gt;Історично поле &lt;code&gt;restartPolicy&lt;/code&gt; визначалося суворо на рівні Podʼа, що змушувало всі контейнери в Podʼі поводитися однаково. Недоліком цього глобального налаштування була відсутність деталізації для складних робочих навантажень, таких як завдання навчання AI/ML. Вони часто вимагали &lt;code&gt;restartPolicy: Never&lt;/code&gt; для управління завершенням завдань Podʼа, але окремі контейнери могли б скористатися перевагами перезапуску на місці для конкретних помилок, які можна повторити (наприклад, збої мережі або помилки ініціалізації GPU).&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 вирішує цю проблему, увімкнувши &lt;code&gt;restartPolicy&lt;/code&gt; та &lt;code&gt;restartPolicyRules&lt;/code&gt; у самому API контейнера. Це дозволяє користувачам визначати стратегії перезапуску для окремих звичайних та ініціалізаційних контейнерів, які працюють незалежно від загальної політики Podʼа. Наприклад, контейнер тепер можна налаштувати так, щоб він автоматично перезапускався тільки в разі виходу з певним кодом помилки, що дозволяє уникнути значних витрат на перепланування всього Podʼа через тимчасові збої.&lt;/p&gt;
&lt;p&gt;У цій версії функція перейшла в бета-версію і є типово увімкненою. Користувачі можуть негайно використовувати &lt;code&gt;restartPolicyRules&lt;/code&gt; у своїх специфікаціях контейнерів, щоб оптимізувати час відновлення та використання ресурсів для довготривалих робочих навантажень, не змінюючи загальну логіку життєвого циклу своїх Podʼів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5307&#34;&gt;KEP #5307&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;csi-driver-opt-in-for-service-account-tokens-via-secrets-field&#34;&gt;Включення драйвера CSI для токенів службових облікових записів через поле секретів&lt;/h3&gt;
&lt;p&gt;Надання токенів ServiceAccount драйверам Container Storage Interface (CSI) традиційно базувалося на їх інʼєкції у поле &lt;code&gt;volume_context&lt;/code&gt;. Такий підхід становить значний ризик для безпеки, оскільки &lt;code&gt;volume_context&lt;/code&gt; призначене для нечутливих даних конфігурації і часто реєструється драйверами та інструментами налагодження у вигляді звичайного тексту, що може призвести до витоку облікових даних.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує механізм опції для драйверів CSI, що дозволяє отримувати токени ServiceAccount через спеціальне поле секретів у запиті NodePublishVolume. Тепер драйвери можуть увімкнути цю функцію, встановивши поле &lt;code&gt;serviceAccountTokenInSecrets&lt;/code&gt; на значення true у своєму обʼєкті CSIDriver, даючи вказівку &lt;code&gt;kubelet&lt;/code&gt; безпечно заповнити токен.&lt;/p&gt;
&lt;p&gt;Основна перевага полягає у запобіганні випадковому розкриттю облікових даних у журналах та повідомленнях про помилки. Ця зміна гарантує, що конфіденційні ідентифікатори робочих навантажень обробляються через відповідні безпечні канали, що відповідає найкращим практикам управління секретами, зберігаючи при цьому зворотну сумісність для наявних драйверів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5538&#34;&gt;KEP #5538&lt;/a&gt; під керівництвом SIG Auth у співпраці з SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;deployment-status-count-of-terminating-replicas&#34;&gt;Стан Deployment: кількість реплік, що завершують роботу&lt;/h3&gt;
&lt;p&gt;Раніше стан Deployment надавав детальну інформацію про доступні та оновлені репліки, але не містив чіткої інформації про Podʼи, які перебували в процесі вимкнення. Недоліком такого упущення було те, що користувачі та контролери не могли легко відрізнити стабільний Deployment від такого, в якому Podʼи все ще виконували завдання з очищення або дотримувалися тривалих пільгових періодів.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 переводить поле &lt;code&gt;terminatingReplicas&lt;/code&gt; у статусі Deployment у статус бета-версії. Це поле надає кількість Podʼів, для яких встановлено час видалення, але які ще не були видалені з системи. Ця функція є фундаментальним кроком у більш масштабній ініціативі щодо поліпшення способу обробки заміни Podʼів у Deployments, що закладає основу для майбутніх політик щодо створення нових Podʼів під час розгортання.&lt;/p&gt;
&lt;p&gt;Основною перевагою є покращення спостережуваності для інструментів управління життєвим циклом та операторів. Завдяки відображенню кількості подів, що припиняють роботу, зовнішні системи тепер можуть приймати більш обґрунтовані рішення, наприклад, чекати повного вимкнення перед продовженням наступних завдань, без необхідності вручну запитувати та фільтрувати списки окремих подів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3973&#34;&gt;KEP #3973&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-alpha&#34;&gt;Нові функції в альфа-версії&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Це підбірка деяких поліпшень, які зараз знаходяться в альфа-версії після випуску v1.35.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;gang-scheduling-support-in-kubernetes&#34;&gt;Підтримка групового планування в Kubernetes&lt;/h3&gt;
&lt;p&gt;Планування взаємозалежних робочих навантажень, таких як завдання з навчання AI/ML або HPC-симуляції, традиційно було складним завданням, оскільки стандартний планувальник Kubernetes розміщує Podʼи індивідуально. Це часто призводить до часткового планування, коли деякі Podʼи запускаються, а інші безкінечно чекають на ресурси, що призводить до тупикових ситуацій і марнування потужності кластера.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує вбудовану підтримку так званого «планування груп» за допомогою нового API робочого навантаження та концепції PodGroup. Ця функція реалізує стратегію планування «все або нічого», гарантуючи, що визначена група Podʼів планується тільки в тому випадку, якщо кластер має достатньо ресурсів для одночасного розміщення всієї групи.&lt;/p&gt;
&lt;p&gt;Основною перевагою є підвищення надійності та ефективності для пакетних і паралельних робочих навантажень. Запобігаючи частковому розгортанню, вона усуває блокування ресурсів і гарантує, що вартісні потужності кластера використовуються тільки тоді, коли можна виконати повне завдання, що значно оптимізує оркестрування завдань обробки великих обсягів даних.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4671&#34;&gt;KEP #4671&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;constrained-impersonation&#34;&gt;Обмежена імперсонізація&lt;/h3&gt;
&lt;p&gt;Історично, дієслово &lt;code&gt;impersonate&lt;/code&gt; в Kubernetes RBAC функціонувало за принципом «все або нічого»: як тільки користувач отримував дозвіл на наслідування цільової ідентичності, він отримував усі повʼязані з нею дозволи. Недоліком такого широкого дозволу було порушення принципу мінімальних привілеїв, що не дозволяло адміністраторам обмежувати дії або ресурси, доступні для імперсоніфікаторів.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує нову альфа-функцію, обмежене наслідування, яка додає вторинну перевірку авторизації до процесу наслідування. Коли ця функція вмикається через функціональну можливість &lt;code&gt;ConstrainedImpersonation&lt;/code&gt;, API-сервер перевіряє не тільки базовий дозвіл &lt;code&gt;impersonate&lt;/code&gt;, але й перевіряє, чи уповноважений імітатор на конкретну дію, використовуючи нові префікси дієслів (наприклад, &lt;code&gt;impersonate-on:&amp;lt;mode&amp;gt;:&amp;lt;verb&amp;gt;&lt;/code&gt;). Це дозволяє адміністраторам визначати детальні політики, наприклад, дозволяти інженеру технічної підтримки імітувати адміністратора кластера виключно для перегляду журналів, не надаючи повного адміністративного доступу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5284&#34;&gt;KEP #5284&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;flagz-for-kubernetes-components&#34;&gt;Flagz для компонентів Kubernetes&lt;/h3&gt;
&lt;p&gt;Для перевірки конфігурації компонентів Kubernetes, таких як API-сервер або &lt;code&gt;kubelet&lt;/code&gt;, традиційно був необхідний привілейований доступ до вузла хоста або аргументів процесу. Щоб вирішити цю проблему, було введено кінцеву точку доступу &lt;code&gt;/flagz&lt;/code&gt; для експонування опцій командного рядка через HTTP. Однак спочатку її вивід був обмежений простим текстом, що ускладнювало автоматизованим інструментам надійний аналіз і перевірку конфігурацій.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 точка доступу &lt;code&gt;/flagz&lt;/code&gt; була вдосконалена для підтримки структурованого, машиночитаного виводу JSON. Авторизовані користувачі тепер можуть запитувати версійну відповідь JSON за допомогою стандартного узгодження вмісту HTTP, тоді як оригінальний формат простого тексту залишається доступним для перевірки людиною. Це оновлення значно покращує спостережуваність і робочі процеси відповідності, дозволяючи зовнішнім системам програмно перевіряти конфігурації компонентів без нестабільного аналізу тексту або прямого доступу до інфраструктури.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4828&#34;&gt;KEP #4828&lt;/a&gt; під керівництвом SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;statusz-for-kubernetes-components&#34;&gt;Statusz для компонентів Kubernetes&lt;/h3&gt;
&lt;p&gt;Для відладки компонентів Kubernetes, таких як &lt;code&gt;kube-apiserver&lt;/code&gt; або &lt;code&gt;kubelet&lt;/code&gt;, традиційно використовувався аналіз неструктурованих журналів або текстового виводу, що було ненадійним і важким для автоматизації. Хоча попередньо існувала базова кінцева точка &lt;code&gt;/statusz&lt;/code&gt;, вона не мала стандартизованого, машиночитаного формату, що обмежувало її корисність для зовнішніх систем моніторингу.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 кінцева точка &lt;code&gt;/statusz&lt;/code&gt; була покращена для підтримки структурованого, машиночитаного JSON-виводу. Авторизовані користувачі тепер можуть запитувати цей формат за допомогою стандартного узгодження вмісту HTTP, щоб отримати точні дані про стан, такі як інформація про версію та показники справності без залежності на хрупкому аналізуванні тексту. Це покращення забезпечує надійний, узгоджений інтерфейс для автоматизованих інструментів налагодження та спостережуваності у всіх основних компонентах.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4827&#34;&gt;KEP #4827&lt;/a&gt; під керівництвом SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;ccm-watch-based-route-controller-reconciliation-using-informers&#34;&gt;CCM: узгодження контролера маршрутів на основі спостереження за допомогою інформерів&lt;/h3&gt;
&lt;p&gt;Управління мережевими маршрутами в хмарних середовищах традиційно базувалося на періодичному опитуванні API хмарного провайдера за допомогою Cloud Controller Manager (CCM) для перевірки та оновлення таблиць маршрутів. Цей підхід узгодження з фіксованим інтервалом може бути неефективним, часто генеруючи великий обсяг непотрібних викликів API та створюючи затримку між зміною стану вузла та відповідним оновленням маршруту.&lt;/p&gt;
&lt;p&gt;Для версії Kubernetes v1.35 бібліотека cloud-controller-manager впроваджує стратегію узгодження на основі спостереження для контролера маршрутів. Замість того, щоб покладатися на таймер, контролер тепер використовує інформери для спостереження за конкретними подіями вузла, такими як додавання, видалення або відповідні оновлення полів, і запускає синхронізацію маршрутів тільки тоді, коли насправді відбувається зміна.&lt;/p&gt;
&lt;p&gt;Основною перевагою є значне зменшення використання API хмарного провайдера, що знижує ризик досягнення обмежень швидкості та зменшує операційні витрати. Крім того, ця модель, керована подіями, покращує швидкість реагування мережевого рівня кластера, забезпечуючи негайне оновлення таблиць маршрутів після змін у топології кластера.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5237&#34;&gt;KEP #5237&lt;/a&gt; під керівництвом SIG Cloud Provider.&lt;/p&gt;
&lt;h3 id=&#34;extended-toleration-operators-for-threshold-based-placement&#34;&gt;Розширені оператори толерантності для розміщення на основі порогових значень&lt;/h3&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує планування з урахуванням SLA, дозволяючи робочим навантаженням формулювати вимоги до надійності. Ця функція додає оператори числового порівняння до толерантності, дозволяючи подам використовувати або уникати вузлів на основі SLA-орієнтованих позначок, таких як гарантії обслуговування або якість домену збоїв.&lt;/p&gt;
&lt;p&gt;Основна перевага полягає в удосконаленні планувальника за допомогою більш точного розміщення. Критичні робочі навантаження можуть вимагати вузлів з вищим SLA, тоді як робочі навантаження з нижчим пріоритетом можуть обирати вузли з нижчим SLA. Це покращує використання та зменшує витрати без шкоди для надійності.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5471&#34;&gt;KEP #5471&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;mutable-container-resources-when-job-is-suspended&#34;&gt;Змінні ресурси контейнера у випадку призупинення Job&lt;/h3&gt;
&lt;p&gt;Виконання пакетних робочих навантажень часто супроводжується спробами та помилками з обмеженнями ресурсів. Наразі специфікація Job є незмінною, що означає: якщо завдання Job завершується з помилкою Out of Memory (OOM) або через недостатню кількість ресурсів CPU, користувач не може просто налаштувати ресурси; він повинен видалити завдання Job і створити нове, втрачаючи історію виконання та статус.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує можливість оновлення запитів на ресурси та обмежень для Завдань, які перебувають у призупиненому стані. Ця функція, яка вмикається за допомогою функціональної можливості &lt;code&gt;MutablePodResourcesForSuspendedJobs&lt;/code&gt;, дозволяє користувачам призупиняти завдання, що завершилося збоєм, змінювати його шаблон Pod з відповідними значеннями ресурсів, а потім поновлювати виконання з виправленою конфігурацією.&lt;/p&gt;
&lt;p&gt;Основна перевага полягає в більш плавному відновленні робочого процесу для неправильно налаштованих завдань. Завдяки можливості вносити виправлення на місці під час призупинення, користувачі можуть усунути вузькі місця в ресурсах, не порушуючи ідентичності життєвого циклу завдання і не втрачаючи контроль над його статусом виконання, що значно покращує роботу розробників з пакетною обробкою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5440&#34;&gt;KEP #5440&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h2 id=&#34;other-notable-changes&#34;&gt;Інші важливі зміни&lt;/h2&gt;
&lt;h3 id=&#34;continued-innovation-in-dynamic-resource-allocation-dra&#34;&gt;Подальші інновації в динамічному розподілі ресурсів (DRA)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://kep.k8s.io/4381&#34;&gt;Основна функціональність&lt;/a&gt; була переведена в стабільний стан у версії 1.34 з можливістю її відключення. У версії 1.35 вона завжди ввімкнена. Декілька альфа-функцій також були значно вдосконалені і готові до тестування. Ми закликаємо користувачів надавати відгуки про ці можливості, щоб допомогти прокласти шлях для їх переходу в бета-версію в майбутніх релізах.&lt;/p&gt;
&lt;h4 id=&#34;extended-resource-requests-via-dra&#34;&gt;Розширені запити на ресурси через DRA&lt;/h4&gt;
&lt;p&gt;Було усунено кілька функціональних прогалин порівняно з розширеними запитами на ресурси через втулки пристроїв, наприклад, оцінка та повторне використання пристроїв в контейнерах ініціалізації.&lt;/p&gt;
&lt;h4 id=&#34;device-taints-and-tolerations&#34;&gt;Позначення та толерантність пристроїв&lt;/h4&gt;
&lt;p&gt;Новий ефект &amp;quot;None&amp;quot; можна використовувати для повідомлення про проблему без негайного впливу на планування або роботу подів. DeviceTaintRule тепер надає інформацію про стан поточного виселення. Ефект &amp;quot;None&amp;quot; можна використовувати для «пробного запуску» перед фактичним виселенням подів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Створіть DeviceTaintRule з &amp;quot;effect: None&amp;quot;.&lt;/li&gt;
&lt;li&gt;Перевірте стан, щоб побачити, скільки подів буде виселено.&lt;/li&gt;
&lt;li&gt;Замініть &amp;quot;effect: None&amp;quot; на &amp;quot;effect: NoExecute&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;partitionable-devices&#34;&gt;Пристрої, що розділяються на розділи&lt;/h4&gt;
&lt;p&gt;Пристрої, що належать до одних і тих самих пристроїв, які можна розділити, тепер можна визначати в різних ResourceSlices.
Більше інформації можна знайти в &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#partitionable-devices&#34;&gt;офіційній документації&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;consumable-capacity-device-binding-conditions&#34;&gt;Споживана ємність, умови привʼязки пристроїв&lt;/h4&gt;
&lt;p&gt;Було виправлено кілька помилок та/або додано більше тестів.
Більше інформації про &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#consumable-capacity&#34;&gt;Споживчу ємність&lt;/a&gt; та &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#device-binding-conditions&#34;&gt;Умови привʼязки&lt;/a&gt; можна знайти в офіційній документації.&lt;/p&gt;
&lt;h3 id=&#34;comparable-resource-version-semantics&#34;&gt;Семантика порівнянних версій ресурсів&lt;/h3&gt;
&lt;p&gt;У Kubernetes v1.35 змінено спосіб, у який клієнти можуть інтерпретувати &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/using-api/api-concepts/#resource-versions&#34;&gt;версії ресурсів&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;До версії v1.35 єдиним підтримуваним порівнянням, яке клієнти могли виконувати, була перевірка рівності рядків: якщо дві версії ресурсів були рівними, вони вважалися однаковими. Клієнти також могли надавати версію ресурсу серверу API і просити панель управління виконувати внутрішні порівняння, наприклад, передавати всі події з певної версії ресурсу.&lt;/p&gt;
&lt;p&gt;У версії 1.35 усі версії вбудованих ресурсів відповідають новому, більш суворому визначенню: значення є спеціальною формою десяткового числа. А оскільки їх можна порівнювати, клієнти можуть виконувати власні операції для порівняння двох різних версій ресурсів. Наприклад, це означає, що клієнт, який повторно підключається після збою, може виявити, коли він втратив оновлення, на відміну від випадку, коли було оновлення, але тим часом не було втрачених змін.&lt;/p&gt;
&lt;p&gt;Ця зміна в семантиці дозволяє реалізувати інші важливі випадки використання, такі як &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/manage-kubernetes-objects/storage-version-migration/&#34;&gt;міграція версій сховища&lt;/a&gt;, поліпшення продуктивності &lt;em&gt;informers&lt;/em&gt; (концепція допоміжного клієнта) та надійність контролера. Усі ці випадки вимагають знання того, чи є одна версія ресурсу новішою за іншу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5504&#34;&gt;KEP #5504&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-v1-35&#34;&gt;Зміна статусу, застарілі та видалені функції у версії 1.35&lt;/h2&gt;
&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Переходи до стабільної версії&lt;/h3&gt;
&lt;p&gt;Тут перелічено всі функції, які перейшли до стабільної версії (також відомої як &lt;em&gt;загальна доступність&lt;/em&gt;). Повний перелік оновлень, включаючи нові функції та переходи від альфа-версії до бета-версії, див. у примітках до випуску.&lt;/p&gt;
&lt;p&gt;Цей випуск містить загалом 15 вдосконалень, які перейшли до стабільної версії:&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;Застарілі функції, видалення та оновлення від спільноти&lt;/h3&gt;
&lt;p&gt;У міру розвитку та вдосконалення Kubernetes деякі функції можуть ставати застарілими, видалятися або замінюватися кращими для поліпшення загального стану проєкту. Докладнішу інформацію про цей процес див. у &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/using-api/deprecation-policy/&#34;&gt;політиці Kubernetes щодо застарілих та видалених функцій&lt;/a&gt;. У Kubernetes v1.35 є кілька функцій, визнаних застарілими.&lt;/p&gt;
&lt;h4 id=&#34;ingress-nginx-retirement&#34;&gt;Виведення з експлуатації Ingress NGINX&lt;/h4&gt;
&lt;p&gt;Протягом багатьох років контролер Ingress NGINX був популярним вибором для маршрутизації трафіку в кластери Kubernetes. Він був гнучким, широко використовувався і служив стандартною точкою входу для незліченних застосунків.&lt;/p&gt;
&lt;p&gt;Однак підтримка проєкту стала неможливою. Через гостру нестачу фахівців з технічної підтримки та зростаючий технічний борг, спільнота нещодавно прийняла важке рішення про його виведення з експлуатації. Це не є частиною випуску v1.35, але це настільки важлива зміна, що ми хотіли б наголосити на ній тут.&lt;/p&gt;
&lt;p&gt;Як наслідок, проєкт Kubernetes оголосив, що Ingress NGINX отримуватиме лише мінімальне обслуговування до &lt;strong&gt;березня 2026 року&lt;/strong&gt;. Після цієї дати він буде заархівований без подальших оновлень. Рекомендований варіант подальших дій — перехід на &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API&lt;/a&gt;, який пропонує більш сучасний, безпечний і розширюваний стандарт управління трафіком.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/11/ingress-nginx-retirement/&#34;&gt;офіційному дописі в блозі&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;removal-of-cgroup-v1-support&#34;&gt;Видалення підтримки cgroup v1&lt;/h4&gt;
&lt;p&gt;Що стосується управління ресурсами на вузлах Linux, Kubernetes історично покладався на cgroups (контрольні групи). Хоча оригінальний cgroup v1 був функціональним, він часто був непослідовним і обмеженим. Ось чому Kubernetes ще в версії v1.25 запровадив підтримку cgroup v2, пропонуючи набагато чистішу, уніфіковану ієрархію та кращу ізоляцію ресурсів.&lt;/p&gt;
&lt;p&gt;Оскільки cgroup v2 тепер є сучасним стандартом, Kubernetes готовий відмовитися від підтримки застарілого cgroup v1 у версії v1.35. Це важливе повідомлення для адміністраторів кластерів: якщо ви все ще використовуєте вузли на старих дистрибутивах Linux, які не підтримують cgroup v2, ваш &lt;code&gt;kubelet&lt;/code&gt; не запуститься. Щоб уникнути простою, вам потрібно буде перенести ці вузли на системи, де ввімкнено cgroup v2.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше, прочитайте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/cgroups/&#34;&gt;про cgroup v2&lt;/a&gt;;
ви також можете стежити за переходом в &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;Виведення з експлуатації режиму ipvs в kube-proxy&lt;/h4&gt;
&lt;p&gt;Кілька років тому Kubernetes застосував режим &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/networking/virtual-ips/#proxy-mode-ipvs&#34;&gt;&lt;code&gt;ipvs&lt;/code&gt;&lt;/a&gt; у &lt;code&gt;kube-proxy&lt;/code&gt;, щоб забезпечити швидше балансування навантаження, ніж стандартний режим &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/networking/virtual-ips/#proxy-mode-iptables&#34;&gt;&lt;code&gt;iptables&lt;/code&gt;&lt;/a&gt;. Хоча це забезпечило підвищення продуктивності, синхронізація з мінливими вимогами до мережі створила занадто великий технічний борг і складність.&lt;/p&gt;
&lt;p&gt;Через це навантаження на обслуговування Kubernetes v1.35 відмовляється від режиму &lt;code&gt;ipvs&lt;/code&gt;. Хоча цей режим залишається доступним у цій версії, &lt;code&gt;kube-proxy&lt;/code&gt; тепер видаватиме попередження під час запуску, якщо він налаштований на його використання. Мета полягає в оптимізації кодової бази та зосередженні уваги на сучасних стандартах. Для вузлів Linux слід почати перехід на &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/networking/virtual-ips/#proxy-mode-nftables&#34;&gt;&lt;code&gt;nftables&lt;/code&gt;&lt;/a&gt;, який зараз є рекомендованою заміною.&lt;/p&gt;
&lt;p&gt;Більше інформації можна знайти в &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;Останній дзвоник для containerd v1.X&lt;/h4&gt;
&lt;p&gt;Хоча Kubernetes v1.35 все ще підтримує containerd 1.7 та інші випуски LTS, це остання версія з такою підтримкою. Спільнота SIG Node визначила v1.35 як останній випуск, що підтримує серію containerd v1.X.&lt;/p&gt;
&lt;p&gt;Це важливе нагадування: перед оновленням до наступної версії Kubernetes ви повинні перейти на containerd 2.0 або новішу версію. Щоб визначити, які вузли потребують уваги, ви можете відстежувати метрику &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt; у своєму кластері.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/#announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;офіційному дописі в блозі&lt;/a&gt; або в &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;Покращена стабільність Podʼів під час перезапуску &lt;code&gt;kubelet&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Раніше перезапуск служби &lt;code&gt;kubelet&lt;/code&gt; часто спричиняв тимчасове порушення стану Podʼів. Під час перезапуску kubelet скидав стан контейнерів, через що справні Podʼи позначалися як &lt;code&gt;NotReady&lt;/code&gt; і видалялися з балансувальників навантаження, навіть якщо застосунок сам по собі працював належним чином.&lt;/p&gt;
&lt;p&gt;Щоб вирішити цю проблему надійності, таку поведінку було виправлено, щоб забезпечити безперебійне обслуговування вузлів. Тепер &lt;code&gt;kubelet&lt;/code&gt; правильно відновлює стан поточних контейнерів з середовища виконання під час запуску. Це гарантує, що ваші робочі навантаження залишаються в стані &lt;code&gt;Ready&lt;/code&gt;, а трафік продовжує безперебійно надходити під час перезапуску або оновлення &lt;code&gt;kubelet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &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;Примітки до випуску&lt;/h2&gt;
&lt;p&gt;Ознайомтеся з повною інформацією про випуск Kubernetes v1.35 у наших &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.35.md&#34;&gt;примітках до випуску&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;availability&#34;&gt;Доступність&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.35 доступний для завантаження на &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.35.0&#34;&gt;GitHub&lt;/a&gt; або на &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/releases/download/&#34;&gt;сторінці завантаження Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щоб розпочати роботу з Kubernetes, ознайомтеся з цими &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tutorials/&#34;&gt;інтерактивними посібниками&lt;/a&gt; або запустіть локальні кластери Kubernetes за допомогою &lt;a href=&#34;https://minikube.sigs.k8s.io/&#34;&gt;minikube&lt;/a&gt;. Ви також можете легко встановити v1.35 за допомогою &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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;Команда випуску&lt;/h2&gt;
&lt;p&gt;Kubernetes існує лише завдяки підтримці, відданості та наполегливій праці його спільноти. Кожна команда випуску складається з відданих учасників спільноти, які працюють разом над створенням багатьох компонентів, що складають випуски Kubernetes, на які ви покладаєтеся. Це вимагає спеціалізованих навичок людей з усіх куточків нашої спільноти, від самого коду до його документації та управління проєктами.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/cncf/memorials/blob/main/han-kang.md&#34;&gt;Ми вшановуємо памʼять Хана Канга&lt;/a&gt;, багаторічного учасника та шановного інженера, чия технічна досконалість та заразливий ентузіазм залишили незабутній слід у спільноті Kubernetes. Хан був значною силою в SIG Instrumentation та SIG API Machinery, отримавши &lt;a href=&#34;https://www.kubernetes.dev/community/awards/2021/&#34;&gt;нагороду Kubernetes Contributor Award 2021&lt;/a&gt; за свою важливу роботу та постійну відданість стабільності проєкту. Окрім технічного внеску, Хана глибоко поважали за його щирість як наставника та пристрасть до налагодження звʼязків між людьми. Він був відомий тим, що «відкривав двері» для інших, чи то допомагаючи новим учасникам з їхніми першими pull-request, чи то підтримуючи колег з терпінням і добротою. Спадщина Хана живе в інженерах, яких він надихнув, у надійних системах, які він допоміг створити, та в теплій атмосфері співпраці, яку він культивував у хмарній екосистемі.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати всій &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.35/release-team.md&#34;&gt;команді випуску&lt;/a&gt; за години наполегливої праці, щоб надати нашій спільноті реліз Kubernetes v1.35. Членами команди випуску є як новачки, так і досвідчені керівники команд, які мають досвід, набутий протягом декількох циклів випусків. Ми надзвичайно вдячні нашому керівнику випуску, &lt;a href=&#34;https://github.com/drewhagen&#34;&gt;Дрю Хагену&lt;/a&gt;, чиї практичні поради та енергійність не тільки допомогли нам подолати складні виклики, але й підживили дух спільноти, що стоїть за цим успішним випуском.&lt;/p&gt;
&lt;h2 id=&#34;project-velocity&#34;&gt;Швидкість проєкту&lt;/h2&gt;
&lt;p&gt;Проєкт 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; обʼєднує низку цікавих даних, повʼязаних зі швидкістю Kubernetes та різних підпроєктів. Сюди входить все, від індивідуальних внесків до кількості компаній, які роблять внески, і це ілюструє глибину та широту зусиль, що докладаються для розвитку цієї екосистеми.&lt;/p&gt;
&lt;p&gt;Під час циклу випуску версії 1.35, який тривав 14 тижнів з 15 вересня 2025 року по 17 грудня 2025 року, Kubernetes отримав внески від 85 різних компаній та 419 окремих осіб. У ширшій екосистемі хмарних технологій ця цифра зростає до 281 компанії, що налічує 1769 учасників.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що «внесок» враховується, коли хтось робить коміт, рецензує код, залишає коментар, створює тікет або PR, рецензує PR (включаючи блоги та документацію) або коментує тікети та PR.
Якщо ви зацікавлені у співпраці, відвідайте розділ &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/#getting-started&#34;&gt;Початок роботи&lt;/a&gt; на нашому веб-сайті для учасників.&lt;/p&gt;
&lt;p&gt;Джерела цих даних:&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;Огляд подій&lt;/h2&gt;
&lt;p&gt;Дізнайтеся про майбутні події, присвячені Kubernetes та хмарним технологіям, зокрема KubeCon + CloudNativeCon, KCD та інші важливі конференції по всьому світу. Будьте в курсі подій та долучайтеся до спільноти Kubernetes!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Лютий 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:  Нью-Делі&lt;/strong&gt;&lt;/a&gt;: 21 лютого 2026 року | Нью-Делі, Індія&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:  Гвадалахара&lt;/strong&gt;&lt;/a&gt;: 23 лютого 2026 р. | Гвадалахара, Мексика&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Березень 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;: 23–26 березня 2026 | Амстердам, Нідерланди&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Травень 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:  Торонто&lt;/strong&gt;&lt;/a&gt;: 13 травня 2026 р. | Торонто, Канада&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloudnativefinland.org/kcd-helsinki-2026/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes:  Гельсінкі&lt;/strong&gt;&lt;/a&gt;: 20 травня 2026 р. | Гельсінкі, Фінляндія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Червень 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;: 18-19 червня 2026 р. | Мумбаї, Індія&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:  Куала-Лумпур&lt;/strong&gt;&lt;/a&gt;: 27 червня 2026 р. | Куала-Лумпур, Малайзія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Липень 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;: 29–30 липня 2026 р. | Йокогама, Японія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Останні подробиці про подію можна знайти &lt;a href=&#34;https://community.cncf.io/events/#/list&#34;&gt;тут&lt;/a&gt;.
​&lt;/p&gt;
&lt;h2 id=&#34;upcoming-release-webinar&#34;&gt;Вебінар про майбутній реліз&lt;/h2&gt;
&lt;p&gt;Приєднуйтесь до членів команди Kubernetes v1.35 Release Team у &lt;strong&gt;середу, 14 січня 2026 року, о 17:00 (UTC)&lt;/strong&gt;, щоб дізнатися про основні особливості цього релізу. Для отримання додаткової інформації та реєстрації відвідайте &lt;a href=&#34;https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cloud-native-live-kubernetes-v135-release/&#34;&gt;сторінку події&lt;/a&gt; на сайті CNCF Online Programs.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Приєднуйтесь&lt;/h2&gt;
&lt;p&gt;Найпростіший спосіб долучитися до Kubernetes — приєднатися до однієї з численних &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-list.md&#34;&gt;спеціальних груп за інтересами&lt;/a&gt; (SIG), яка відповідає вашим інтересам. Хочете поділитися чимось із спільнотою Kubernetes? Поділіться своєю думкою на наших щотижневих &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зустрічах спільноти&lt;/a&gt; та через наведені нижче канали. Дякуємо за ваші постійні відгуки та підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами у Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@Kubernetesio&lt;/a&gt;, щоб бути в курсі останніх новин&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до обговорення спільноти у &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до спільноти в &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ставте запитання (або відповідайте на запитання) в &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про те, що відбувається з Kubernetes, у &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Попередній огляд Kubernetes v1.35</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/26/kubernetes-v1-35-sneak-peek/</link>
      <pubDate>Wed, 26 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/26/kubernetes-v1-35-sneak-peek/</guid>
      <description>
        
        
        &lt;p&gt;З наближенням випуску Kubernetes v1.35 проєкт Kubernetes продовжує розвиватися. Функції можуть визнаватись застарілими, видаленими або заміненими для поліпшення загального стану проєкту. У цьому дописі в блозі описано заплановані зміни для випуску v1.35, про які, на думку команди випуску, вам слід знати, щоб забезпечити безперебійну роботу ваших кластерів Kubernetes та бути в курсі останніх розробок. Наведена нижче інформація базується на поточному стані версії v1.35 і може бути змінена до дати остаточного випуску.&lt;/p&gt;
&lt;h2 id=&#34;deprecations-and-removals-for-kubernetes-v1-35&#34;&gt;Застарівання та видалення у версії Kubernetes v1.35&lt;/h2&gt;
&lt;h3 id=&#34;cgroup-v1-support&#34;&gt;Підтримка cgroup v1&lt;/h3&gt;
&lt;p&gt;На вузлах Linux середовища виконання контейнерів зазвичай покладаються на cgroups (скорочення від «control groups», групи контролю). Підтримка використання cgroup v2 є стабільною в Kubernetes з версії v1.25, надаючи альтернативу оригінальній підтримці cgroup v1. Хоча cgroup v1 забезпечувала початковий механізм контролю ресурсів, вона мала відомі невідповідності та обмеження. Додавання підтримки cgroup v2 дозволило використовувати уніфіковану ієрархію контрольних груп, поліпшило ізоляцію ресурсів і стало основою для сучасних функцій, що зробило підтримку застарілої cgroup v1 готовою до видалення. Видалення підтримки cgroup v1 вплине лише на адміністраторів кластерів, які використовують вузли на старих дистрибутивах Linux, що не підтримують cgroup v2; на цих вузлах &lt;code&gt;kubelet&lt;/code&gt; не зможе запуститися. Адміністратори повинні перенести свої вузли на системи з увімкненим cgroup v2. Більш детальна інформація про вимоги до сумісності буде доступна в блозі незабаром після випуску версії v1.35.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше, прочитайте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/cgroups/&#34;&gt;про cgroup v2&lt;/a&gt;; ви також можете стежити за роботою з переходу в &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;Визнання застарілим режиму ipvs в kube-proxy&lt;/h3&gt;
&lt;p&gt;Багато версій тому проєкт Kubernetes реалізував режим &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/networking/virtual-ips/#proxy-mode-ipvs&#34;&gt;ipvs&lt;/a&gt; в &lt;code&gt;kube-proxy&lt;/code&gt;. Він був прийнятий як спосіб забезпечення високоефективного балансування навантаження сервісів, з кращою продуктивністю, ніж наявний режим &lt;code&gt;iptables&lt;/code&gt;. Однак підтримка функціональної рівності між ipvs та іншими режимами kube-proxy стала складною через технічну складність та розбіжності у вимогах. Це створило значний технічний борг і зробило бекенд ipvs непрактичним для підтримки поряд з новими мережевими можливостями.&lt;/p&gt;
&lt;p&gt;Проєкт Kubernetes має намір відмовитися від режиму kube-proxy &lt;code&gt;ipvs&lt;/code&gt; у версії v1.35, щоб оптимізувати кодову базу &lt;code&gt;kube-proxy&lt;/code&gt;. Для вузлів Linux рекомендованим режимом &lt;code&gt;kube-proxy&lt;/code&gt; вже є &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/networking/virtual-ips/#proxy-mode-nftables&#34;&gt;nftables&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Більше інформації можна знайти в &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 припиняє підтримку containerd v1.y&lt;/h3&gt;
&lt;p&gt;Хоча Kubernetes v1.35 все ще підтримує containerd 1.7 та інші LTS-версії containerd, внаслідок автоматичного виявлення драйвера cgroup спільнота Kubernetes SIG Node офіційно погодила остаточний графік підтримки containerd v1.X. Kubernetes v1.35 є останньою версією, яка пропонує цю підтримку (відповідно до EOL containerd 1.7).&lt;/p&gt;
&lt;p&gt;Це останнє попередження про те, що якщо ви використовуєте containerd 1.X, ви повинні перейти на 2.0 або пізнішу версію перед оновленням Kubernetes до наступної версії. Ви можете відстежувати метрику &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt;, щоб визначити, чи використовують якісь вузли у вашому кластері версію containerd, яка незабаром перестане підтримуватися.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &lt;a href=&#34;https://deploy-preview-48551--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;офіційному блозі&lt;/a&gt; або в &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;Основні вдосконалення Kubernetes v1.35&lt;/h2&gt;
&lt;p&gt;Наступні вдосконалення є одними з тих, які, ймовірно, будуть включені до версії v1.35. Це не є зобовʼязанням, і зміст версії може бути змінений.&lt;/p&gt;
&lt;h3 id=&#34;node-declared-features&#34;&gt;Можливості, оголошені вузлами&lt;/h3&gt;
&lt;p&gt;Під час планування Podʼів Kubernetes використовує мітки вузлів, позначки taints та толерантності, щоб узгодити вимоги до робочого навантаження з можливостями вузлів. Однак управління сумісністю можливостей стає складним під час оновлення кластера через розбіжність версій між панеллю управління та вузлами. Це може призвести до планування Podʼів на вузлах, які не мають необхідних можливостей, що спричинить збої під час виконання.&lt;/p&gt;
&lt;p&gt;Фреймворк &lt;em&gt;node declared features&lt;/em&gt; запровадить стандартний механізм для вузлів, щоб вони могли оголошувати свої підтримувані функції в Kubernetes. З увімкненою новою альфа-функцією вузол повідомляє про функції, які він може підтримувати, публікуючи цю інформацію у панелі управління через нове поле &lt;code&gt;.status.declaredFeatures&lt;/code&gt;. Потім &lt;code&gt;kube-scheduler&lt;/code&gt;, контролери допуску та сторонні компоненти можуть використовувати ці оголошення. Наприклад, ви можете застосувати обмеження планування та перевірки API, гарантуючи, що Podʼи працюють тільки на сумісних вузлах.&lt;/p&gt;
&lt;p&gt;Цей підхід зменшує ручне маркування вузлів, покращує точність планування та запобігає розміщенню несумісних podʼів. Він також інтегрується з Cluster Autoscaler для обґрунтованих рішень щодо масштабування. Декларації функцій є тимчасовими та повʼязані з функціональними можливостями Kubernetes, що забезпечує безпечне впровадження та очищення.&lt;/p&gt;
&lt;p&gt;Орієнтуючись на альфа-версію в v1.35, &lt;em&gt;node declared features&lt;/em&gt; має на меті вирішити проблеми планування версій, зробивши можливості вузлів явними, підвищивши надійність і стабільність кластера в гетерогенних версійних середовищах.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше про це до опублікування офіційної документації, ви можете прочитати &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;Оновлення ресурсів Podʼів на місці&lt;/h3&gt;
&lt;p&gt;Kubernetes переводить оновлення ресурсів Podʼів на місці в статус загальної доступності (GA). Ця функція дозволяє користувачам налаштовувати ресурси &lt;code&gt;cpu&lt;/code&gt; та &lt;code&gt;memory&lt;/code&gt; без перезапуску Podʼів або Containerʼів. Раніше для таких модифікацій було потрібно перестворювати Podʼи, що могло порушити робочі навантаження, особливо для застосунків зі збереженням стану або пакетних застосунків. Попередні версії Kubernetes вже дозволяли змінювати налаштування ресурсів інфраструктури (запити та обмеження) для наявних Podʼів. Це забезпечує більш плавне &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/autoscaling/vertical-pod-autoscale/&#34;&gt;вертикальне масштабування&lt;/a&gt;, підвищує ефективність, а також може спростити розробку рішень.&lt;/p&gt;
&lt;p&gt;Також було вдосконалено інтерфейс Container Runtime Interface (CRI), розширивши API &lt;code&gt;UpdateContainerResources&lt;/code&gt; для Windows і майбутніх середовищ виконання, а також дозволивши &lt;code&gt;ContainerStatus&lt;/code&gt; повідомляти про конфігурації ресурсів у реальному часі. У сукупності ці зміни роблять масштабування в Kubernetes швидшим, гнучкішим і безперебійним. Ця функція була представлена в альфа-версії v1.27, перейшла в бета-версію v1.33 і планується до випуску в стабільній версії v1.35.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &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ʼів&lt;/h3&gt;
&lt;p&gt;Під час виконання мікросервісів Podʼи часто потребують надійної криптографічної ідентифікації для взаємної автентифікації за допомогою mutual TLS (mTLS). Хоча Kubernetes надає токени Service Account, вони призначені для автентифікації на сервері API, а не для загальної ідентифікації робочих навантажень.&lt;/p&gt;
&lt;p&gt;До цього вдосконалення оператори мали покладатися на складні зовнішні проєкти, такі як SPIFFE/SPIRE або cert-manager, для надання та ротації сертифікатів для своїх робочих навантажень. Але що якби ви могли  видавати унікальний сертифікат з коротким терміном дії для своїх Podʼів нативно і автоматично? KEP-4317 призначений для забезпечення такої нативної ідентифікації робочих навантажень. Він відкриває різні можливості для захисту комунікації між Podʼами, дозволяючи &lt;code&gt;kubelet&lt;/code&gt; запитувати і монтувати сертифікати для Podʼів через спроєцьований том.&lt;/p&gt;
&lt;p&gt;Це забезпечує вбудований механізм ідентифікації робочих навантажень, доповнений автоматичною ротацією сертифікатів, що значно спрощує налаштування сервісних мереж та інших політик мережі з нульовим рівнем довіри. Ця функція була представлена в альфа-версії v1.34 і планується до випуску в бета-версії v1.35.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &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;Числові значення для taints&lt;/h3&gt;
&lt;p&gt;Kubernetes вдосконалює &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/taint-and-toleration/&#34;&gt;позначки taint та толерантності&lt;/a&gt; шляхом додавання числових операторів порівняння, таких як &lt;code&gt;Gt&lt;/code&gt; (більше ніж) та &lt;code&gt;Lt&lt;/code&gt; (менше ніж).&lt;/p&gt;
&lt;p&gt;Раніше толерантності підтримували лише точні (&lt;code&gt;Equal&lt;/code&gt;) або збіги існування (&lt;code&gt;Exists&lt;/code&gt;), що не підходило для числових властивостей, таких як SLA надійності.&lt;/p&gt;
&lt;p&gt;Завдяки цій зміні Pod може використовувати толерантність для «підключення» до вузлів, які відповідають певному числовому порогу. Наприклад, Pod може вимагати Node з значенням SLA taint більше 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;Цей підхід є більш потужним, ніж Node Affinity, оскільки він підтримує ефект NoExecute, що дозволяє автоматично вилучати Pod, якщо числове значення вузла падає нижче допустимого порогу.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &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;Простори імен користувачів&lt;/h3&gt;
&lt;p&gt;Під час запуску Podʼів ви можете використовувати &lt;code&gt;securityContext&lt;/code&gt; для скасування привілеїв, але контейнери всередині podʼів часто все одно працюють як root (UID 0). Ця простота створює значну проблему, оскільки UID 0 контейнера безпосередньо відповідає користувачеві root хоста.&lt;/p&gt;
&lt;p&gt;До цього вдосконалення вразливість контейнера могла надати зловмиснику повний root-доступ до вузла. А що, якби ви могли динамічно перепризначити root-користувача контейнера на безпечного користувача без привілеїв на хості? KEP-127 спеціально дозволяє таку вбудовану підтримку для просторів імен користувачів Linux. Це відкриває різні можливості для безпеки podʼів, ізолюючи ідентифікатори користувачів/груп контейнера та хоста. Це дозволяє процесу мати привілеї root (UID 0) у своєму просторі імен, працюючи як непривілейований UID з високим номером на хості.&lt;/p&gt;
&lt;p&gt;Випущена в альфа-версії v1.25 і бета-версії v1.30, ця функція продовжує розвиватися в бета-версії, прокладаючи шлях для справді &amp;quot;rootless&amp;quot; контейнерів, які різко зменшують площу атаки для цілого класу вразливостей безпеки.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &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;Підтримка монтування образів OCI як томів&lt;/h3&gt;
&lt;p&gt;Під час провізування Podʼів часто потрібно обʼєднувати дані, бінарні файли або файли конфігурації для контейнерів. До цього вдосконалення такі дані часто включали безпосередньо в основний образ контейнера або вимагали спеціального контейнера init для завантаження та розпакування файлів у &lt;code&gt;emptyDir&lt;/code&gt;. Звичайно, ви все ще можете використовувати будь-який з цих підходів.&lt;/p&gt;
&lt;p&gt;Але що, якби ви могли заповнити том безпосередньо з артефакту, що містить тільки дані, в реєстрі OCI, так само, як ви завантажуєте образ контейнера? У Kubernetes v1.31 додано підтримку типу тому &lt;code&gt;image&lt;/code&gt;, що дозволяє Podʼам завантажувати та розпаковувати артефакти образів контейнерів OCI в том декларативно.&lt;/p&gt;
&lt;p&gt;Це дозволяє безперешкодно розподіляти дані, бінарні файли або ML-моделі за допомогою стандартних інструментів реєстру, повністю відокремлюючи дані від образу контейнера та усуваючи необхідність у складних контейнерах ініціалізації або скриптах запуску. Цей тип тому перебуває в бета-версії з v1.33 і, ймовірно, буде стандартно ввімкнений у v1.35.&lt;/p&gt;
&lt;p&gt;Ви можете спробувати бета-версію &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/storage/volumes/#image&#34;&gt;томів &lt;code&gt;image&lt;/code&gt;&lt;/a&gt; або дізнатися більше про плани з &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;Хочете дізнатися більше?&lt;/h2&gt;
&lt;p&gt;Нові функції та застарівання функції також оголошуються в примітках до випуску Kubernetes. Ми офіційно оголосимо про нововведення в &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.35.md&#34;&gt;Kubernetes v1.35&lt;/a&gt; у рамках CHANGELOG для цього випуску.&lt;/p&gt;
&lt;p&gt;Випуск Kubernetes v1.35 заплановано на &lt;strong&gt;17 грудня 2025 року&lt;/strong&gt;. Слідкуйте за оновленнями!&lt;/p&gt;
&lt;p&gt;Ви також можете переглянути оголошення про зміни в примітках до випуску для:&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;Долучайтеся до спільноти&lt;/h2&gt;
&lt;p&gt;Найпростіший спосіб долучитися до Kubernetes — приєднатися до однієї з численних &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-list.md&#34;&gt;спеціальних груп за інтересами&lt;/a&gt; (SIG), яка відповідає вашим інтересам. Хочете поділитися чимось із спільнотою Kubernetes? Висловіть свою думку на нашому щотижневому &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зібранні спільноти&lt;/a&gt; та у наведених нижче каналах. Дякуємо за ваші відгуки та підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами у Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@kubernetes.io&lt;/a&gt;, щоб отримувати останні оновлення&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до обговорення на &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до спільноти в &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Публікуйте питання (або відповідайте на питання) на &lt;a href=&#34;https://serverfault.com/questions/tagged/kubernetes&#34;&gt;Server Fault&lt;/a&gt; або &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про те, що відбувається в Kubernetes, у &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Рекомендації щодо конфігурації Kubernetes</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/25/configuration-good-practices/</link>
      <pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/25/configuration-good-practices/</guid>
      <description>
        
        
        &lt;p&gt;Конфігурація — це одна з тих речей у Kubernetes, яка здається незначною, доки не стає важливою. Конфігурація лежить в основі кожного робочого навантаження Kubernetes.
Відсутня лапка, неправильна версія API або неправильно розміщений відступ YAML можуть зіпсувати все розгортання.&lt;/p&gt;
&lt;p&gt;Цей пост поєднує перевірені найкращі практики конфігурації. Прості звички, які роблять налаштування Kubernetes чіткими, послідовними та простішими в управлінні. Незалежно від того, чи ви тільки починаєте, чи вже щодня розгортаєте застосунки, це дрібниці, які забезпечують стабільність кластера та збереження вашого психічного здоровʼя в майбутньому.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Цей блог створено на основі оригінальної сторінки &amp;quot;Кращі практики конфігурації&amp;quot;, яка розвивалася завдяки участі багатьох членів спільноти Kubernetes.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;general-configuration-practices&#34;&gt;Загальні практики конфігурації&lt;/h2&gt;
&lt;h3 id=&#34;use-the-latest-stable-api-version&#34;&gt;Використовуйте останню стабільну версію API&lt;/h3&gt;
&lt;p&gt;Kubernetes швидко розвивається. Старі API з часом стають застарілими і перестають працювати. Тому, коли ви визначаєте ресурси, переконайтеся, що ви використовуєте останню стабільну версію API.
Ви завжди можете перевірити це за допомогою&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;Цей простий крок вбереже вас від майбутніх проблем із сумісністю.&lt;/p&gt;
&lt;h3 id=&#34;store-configuration-in-version-control&#34;&gt;Зберігайте конфігурацію в системі контролю версій&lt;/h3&gt;
&lt;p&gt;Ніколи не застосовуйте маніфест-файли безпосередньо з робочого столу. Завжди зберігайте їх у системі контролю версій, такій як Git, це ваша страховка. Якщо щось зламається, ви зможете миттєво повернутися до попереднього коміту, порівняти зміни або відтворити налаштування кластера без паніки.&lt;/p&gt;
&lt;h3 id=&#34;write-configs-in-yaml-not-json&#34;&gt;Використовуйте YAML, а не JSON для створення конфігурацій&lt;/h3&gt;
&lt;p&gt;Використовуйте YAML, а не JSON для створення файлів конфігурації. Технічно обидва формати працюють, але YAML простіший для сприйняття. Він чіткіший, менш захаращений і широко використовується в спільноті.&lt;/p&gt;
&lt;p&gt;YAML має деякі підступні пастки з булевими значеннями: використовуйте тільки &lt;code&gt;true&lt;/code&gt; або &lt;code&gt;false&lt;/code&gt;. Не пишіть &lt;code&gt;yes&lt;/code&gt;, &lt;code&gt;no&lt;/code&gt;, &lt;code&gt;on&lt;/code&gt; або  &lt;code&gt;off&lt;/code&gt;. Вони можуть працювати в одній версії YAML, але не працювати в іншій. Щоб бути впевненим, беріть в лапки все, що виглядає як булеве значення (наприклад, &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;Зберігайте конфігурацію простою та мінімальною&lt;/h3&gt;
&lt;p&gt;Уникайте встановлення стандартних значень, які вже обробляються Kubernetes. Мінімальні маніфести легше налагоджувати, вони чіткіші для перегляду та менш схильні до поломок у майбутньому.&lt;/p&gt;
&lt;h3 id=&#34;group-related-objects-together&#34;&gt;Групуйте повʼязані обʼєкти разом&lt;/h3&gt;
&lt;p&gt;Якщо ваші Deployment, Service та ConfigMap належать до одного застосунка, розмістіть їх в одному файлі маніфесту. Так легше відстежувати зміни та застосовувати їх як єдине ціле. Приклад цієї синтаксичної конструкції дивіться у файлі &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;.&lt;/p&gt;
&lt;p&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 apply -f configs/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Одна команда — і все, що знаходиться в цій теці, розгортається.&lt;/p&gt;
&lt;h3 id=&#34;add-helpful-annotations&#34;&gt;Додайте корисні анотації&lt;/h3&gt;
&lt;p&gt;Файли маніфесту призначені не тільки для машин, але й для людей. Використовуйте анотації, щоб описати, чому щось існує або що воно робить. Короткий однорядковий коментар може заощадити години під час подальшого налагодження, а також сприяє кращій співпраці.&lt;/p&gt;
&lt;p&gt;Найкориснішим коментарем є &lt;code&gt;kubernetes.io/description&lt;/code&gt;. Він схожий на звичайний коментар, але копіюється в API, щоб усі могли його бачити навіть після розгортання.&lt;/p&gt;
&lt;h2 id=&#34;managing-workloads-pods-deployments-and-jobs&#34;&gt;Управління робочими навантаженнями: Pods, Deployments та Jobs&lt;/h2&gt;
&lt;p&gt;Поширеною помилкою на початку роботи з Kubernetes є безпосереднє створення Podʼів. Podʼи працюють, але вони не переплановують себе, якщо щось йде не так.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Naked Pods&lt;/em&gt; (Pods, які не управляються контролером, таким як &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/deployment/&#34;&gt;Deployment&lt;/a&gt; або &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/statefulset/&#34;&gt;StatefulSet&lt;/a&gt;) підходять для тестування, але в реальних умовах їх використання є ризикованим.&lt;/p&gt;
&lt;p&gt;Чому? Тому що якщо вузол, на якому розміщений цей Pod, вийде з ладу, Pod також вийде з ладу, і Kubernetes не відновить його автоматично.&lt;/p&gt;
&lt;h3 id=&#34;use-deployments-for-apps-that-should-always-be-running&#34;&gt;Використовуйте Deployments для застосунків, які повинні завжди працювати&lt;/h3&gt;
&lt;p&gt;Розгортання (Deployment), яке створює ReplicaSet для забезпечення постійної доступності необхідної кількості Podʼів і визначає стратегію заміни Podʼів (наприклад, &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/deployment/#rolling-update-deployment&#34;&gt;RollingUpdate&lt;/a&gt;), майже завжди є кращим варіантом, ніж безпосереднє створення Podʼів. Ви можете розгорнути нову версію, а якщо щось не спрацює, миттєво повернути попередню.&lt;/p&gt;
&lt;h3 id=&#34;use-jobs-for-tasks-that-should-finish&#34;&gt;Використовуйте Job для завдань, які повинні бути завершені&lt;/h3&gt;
&lt;p&gt;Job (/docs/concepts/workloads/controllers/job/) ідеально підходить, коли вам потрібно виконати щось один раз, а потім зупинити, наприклад, міграцію бази даних або пакетну обробку завдань. Він повторить спробу, якщо podʼи зазнають збою, і повідомить про успішне виконання, коли все буде готово.&lt;/p&gt;
&lt;h2 id=&#34;service-configuration-and-networking&#34;&gt;Конфігурація Services та мережа&lt;/h2&gt;
&lt;p&gt;Services — це спосіб, у який ваші робочі навантаження спілкуються між собою всередині (а іноді й поза межами) вашого кластера. Без них ваші podʼи існують, але не можуть ні з ким звʼязатися. Подбаємо про те, щоб цього не сталося.&lt;/p&gt;
&lt;h3 id=&#34;create-services-before-workloads-that-use-them&#34;&gt;Створіть Services перед робочими навантаженнями, які їх використовують&lt;/h3&gt;
&lt;p&gt;Коли Kubernetes запускає Pod, він автоматично вводить змінні середовища для наявних Services. Отже, якщо Pod залежить від Service, створіть &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/service/&#34;&gt;Service&lt;/a&gt; &lt;strong&gt;перед&lt;/strong&gt; відповідними робочими навантаженнями бекенду (Deployments або StatefulSets) і перед будь-якими робочими навантаженнями, які потребують доступу до нього.&lt;/p&gt;
&lt;p&gt;Наприклад, якщо існує Service з назвою foo, всі контейнери отримають у своєму початковому середовищі такі змінні:&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;FOO_SERVICE_HOST=&amp;lt;хост, на якому працює Service&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;FOO_SERVICE_PORT=&amp;lt;порт, на якому працює Service&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Виявлення на основі DNS не має цієї проблеми, але все одно варто дотримуватися цієї хорошої звички.&lt;/p&gt;
&lt;h3 id=&#34;use-dns-for-service-discovery&#34;&gt;Використання DNS для виявлення Service&lt;/h3&gt;
&lt;p&gt;Якщо ваш кластер має &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/cluster-administration/addons/&#34;&gt;надбудову&lt;/a&gt; DNS (як і більшість), кожен Service автоматично отримує запис DNS. Це означає, що ви можете отримати до нього доступ за назвою, а не за 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;Це одна з тих функцій, які роблять мережу Kubernetes такою чарівною.&lt;/p&gt;
&lt;h3 id=&#34;avoid-hostport-and-hostnetwork-unless-absolutely-necessary&#34;&gt;Уникайте використання &lt;code&gt;hostPort&lt;/code&gt; та &lt;code&gt;hostNetwork&lt;/code&gt;, якщо це не є абсолютно необхідним&lt;/h3&gt;
&lt;p&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;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;Але ось у чому справа:
Вони привʼязують ваші Podʼи до конкретних вузлів, що ускладнює їх планування та масштабування. Оскільки кожна комбінація &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; повинна бути унікальною. Якщо ви не вкажете &lt;code&gt;hostIP&lt;/code&gt; та &lt;code&gt;protocol&lt;/code&gt; явно, Kubernetes буде використовувати &lt;code&gt;0.0.0.0&lt;/code&gt; як типовий &lt;code&gt;hostIP&lt;/code&gt; та &lt;code&gt;TCP&lt;/code&gt; як типовий &lt;code&gt;protocol&lt;/code&gt;. Якщо ви не займаєтеся відлагодженням або створенням чогось на зразок мережевого втулка, уникайте їх.&lt;/p&gt;
&lt;p&gt;Якщо вам потрібен лише локальний доступ для тестування, спробуйте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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;Докладнішу інформацію див. у розділі &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/access-application-cluster/port-forward-access-application-cluster/&#34;&gt;Використання переадресації портів для доступу до застосунків у кластері&lt;/a&gt;. Або, якщо вам дійсно потрібен зовнішній доступ, використовуйте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/service/#type-nodeport&#34;&gt;&lt;code&gt;type: NodePort&lt;/code&gt; Service&lt;/a&gt;. Це безпечніший, природний для Kubernetes спосіб.&lt;/p&gt;
&lt;h3 id=&#34;use-headless-services-for-internal-discovery&#34;&gt;Використовуйте headless Services для внутрішнього виявлення&lt;/h3&gt;
&lt;p&gt;Іноді ви не хочете, щоб Kubernetes балансував трафік. Ви хочете спілкуватися безпосередньо з кожним Podʼом. Саме тут на допомогу приходять &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/service/#headless-services&#34;&gt;headless Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ви створюєте їх, встановивши &lt;code&gt;clusterIP: None&lt;/code&gt;. Замість однієї IP-адреси DNS надає вам список усіх IP-адрес Podʼа, що ідеально підходить для застосунків, які самостійно керують зʼєднаннями.&lt;/p&gt;
&lt;h2 id=&#34;working-with-labels-effectively&#34;&gt;Ефективна робота з мітками&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/labels/&#34;&gt;Мітки&lt;/a&gt; — це пари ключ/значення, які прикріплюються до обʼєктів, таких як Podʼи. Мітки допомагають організовувати, шукати та групувати ресурси. Самі по собі вони нічого не роблять, але завдяки їм все інше, від Services до Deployments, працює злагоджено.&lt;/p&gt;
&lt;h3 id=&#34;use-semantics-labels&#34;&gt;Використовуйте семантичні мітки&lt;/h3&gt;
&lt;p&gt;Хороші мітки допомагають зрозуміти, що до чого, навіть через кілька місяців. Визначте та використовуйте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/labels/&#34;&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-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; : що це за застосунок&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tier&lt;/code&gt; : до якого шару він належить (frontend/backend)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;phase&lt;/code&gt; : на якому етапі він знаходиться (test/prod)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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 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;Це відобразить список усіх фронтенд-подів у вашому кластері, незалежно від того, з якого розгортання вони походять. По суті, ви не вказуєте імена подів вручну, а лише описуєте, що вам потрібно. Приклади такого підходу дивіться в застосунку &lt;a href=&#34;https://github.com/kubernetes/examples/tree/master/web/guestbook/&#34;&gt;guestbook&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;use-common-kubernetes-labels&#34;&gt;Використовуйте загальні мітки Kubernetes&lt;/h3&gt;
&lt;p&gt;Kubernetes фактично рекомендує набір &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/common-labels/&#34;&gt;загальних міток&lt;/a&gt;. Це стандартизований спосіб називати обʼєкти у різних робочих навантаженнях або проєктах. Дотримання цієї домовленості робить ваші маніфести чіткішими, а це означає, що такі інструменти, як &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; або сторонні системи моніторингу, можуть автоматично розуміти, що саме працює.&lt;/p&gt;
&lt;h3 id=&#34;manipulate-labels-for-debugging&#34;&gt;Маніпулювання мітками для відлагодження&lt;/h3&gt;
&lt;p&gt;Оскільки контролери (такі як ReplicaSets або Deployments) використовують мітки для управління Podʼами, ви можете видалити мітку, щоб тимчасово «відʼєднати» Pod.&lt;/p&gt;
&lt;p&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 label pod mypod app-
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Частина &lt;code&gt;app-&lt;/code&gt; видаляє ключ мітки &lt;code&gt;app&lt;/code&gt;. Після цього контролер більше не буде керувати цим Podʼом. Це схоже на ізоляцію для перевірки, «режим карантину» для налагодження. Щоб інтерактивно видаляти або додавати мітки, використовуйте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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;Потім ви можете перевірити журнали, запустити його, а після завершення видалити вручну. Це дуже недооцінений трюк, який повинен знати кожен фахівець, який працює з Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;handy-kubectl-tips&#34;&gt;Корисні поради щодо kubectl&lt;/h2&gt;
&lt;p&gt;Ці невеликі поради значно полегшують роботу з декількома файлами маніфесту або кластерами.&lt;/p&gt;
&lt;h3 id=&#34;apply-entire-directories&#34;&gt;Застосування цілих текстових файлів&lt;/h3&gt;
&lt;p&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;&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;kubectl apply -f configs/ --server-side
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ця команда шукає файли &lt;code&gt;.yaml&lt;/code&gt;, &lt;code&gt;.yml&lt;/code&gt; та &lt;code&gt;.json&lt;/code&gt; у цій теці та застосовує їх усі разом. Це швидше, чистіше та допомагає групувати елементи за застосунками.&lt;/p&gt;
&lt;h3 id=&#34;use-label-selectors-to-get-or-delete-resources&#34;&gt;Використовуйте селектори міток для отримання або видалення ресурсів&lt;/h3&gt;
&lt;p&gt;Не завжди потрібно вводити імена ресурсів по одному. Замість цього використовуйте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/labels/#label-selectors&#34;&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 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;Це особливо корисно в конвеєрах CI/CD, де потрібно динамічно очищати тестові ресурси.&lt;/p&gt;
&lt;h3 id=&#34;quickly-create-deployments-and-services&#34;&gt;Швидке створення Deployments і Services&lt;/h3&gt;
&lt;p&gt;Для швидких експериментів не завжди потрібно писати маніфест. Ви можете запустити Deployment прямо з 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;Потім експонуйте його як 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;Це чудово підходить, коли ви просто хочете щось протестувати перед написанням повних маніфестів. Також дивіться приклад у статті &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/access-application-cluster/service-access-application-cluster/&#34;&gt;Використання Service для доступу до застосунку в кластері&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Підсумок&lt;/h2&gt;
&lt;p&gt;Чіткіша конфігурація сприяє спокійнішій роботі адміністраторів кластерів. Якщо дотримуватися кількох простих правил: робити конфігурацію простою та мінімальною, контролювати версії всього, використовувати послідовні мітки та уникати використання голих Podів, ви заощадите собі години на налагодження в майбутньому.&lt;/p&gt;
&lt;p&gt;А що найкраще? Чисті конфігурації залишаються читабельними. Навіть через кілька місяців ви або будь-хто з вашої команди зможете поглянути на них і точно зрозуміти, що відбувається.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Закінчення підтримки Ingress NGINX: що потрібно знати</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/11/ingress-nginx-retirement/</link>
      <pubDate>Tue, 11 Nov 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/11/ingress-nginx-retirement/</guid>
      <description>
        
        
        &lt;p&gt;Для забезпечення пріоритетності безпеки та захисту екосистеми, Kubernetes SIG Network та Комітет з реагування на загрози безпеки оголошують про майбутнє завершення підтримки &lt;a href=&#34;https://github.com/kubernetes/ingress-nginx/&#34;&gt;Ingress NGINX&lt;/a&gt;. Підтримка буде продовжуватися до березня 2026 року. Після цього не буде нових випусків, виправлень помилок та оновлень для усунення будь-яких виявлених вразливостей безпеки. &lt;strong&gt;Наявні розгортання Ingress NGINX продовжуватимуть функціонувати, а інсталяційні артефакти залишатимуться доступними.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ми рекомендуємо перейти на одну з багатьох альтернатив. Розгляньте можливість &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/&#34;&gt;переходу на Gateway API&lt;/a&gt;, сучасну заміну Ingress. Якщо ви мусите продовжувати використовувати Ingress, багато альтернативних контролерів Ingress &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/ingress-controllers/&#34;&gt;перелічено в документації Kubernetes&lt;/a&gt;. Далі ви знайдете додаткову інформацію про історію та поточний стан Ingress NGINX, а також про наступні кроки.&lt;/p&gt;
&lt;h2 id=&#34;about-ingress-nginx&#34;&gt;Про Ingress NGINX&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/ingress/&#34;&gt;Ingress&lt;/a&gt; — це оригінальний зручний спосіб перенаправлення мережевого трафіку на робочі навантаження, що виконуються в Kubernetes. (&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/gateway/&#34;&gt;Gateway API&lt;/a&gt; — це новіший спосіб досягнення багатьох тих самих цілей.) Щоб Ingress працював у вашому кластері, повинен бути запущений &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/ingress-controllers/&#34;&gt;Ingress controller&lt;/a&gt;. Існує багато варіантів Ingress controller, які відповідають потребам різних користувачів і випадків використання. Деякі з них призначені для конкретних хмарних провайдерів, а інші мають більш загальне застосування.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.github.com/kubernetes/ingress-nginx&#34;&gt;Ingress NGINX&lt;/a&gt; був контролером Ingress, розробленим на початку історії проєкту Kubernetes як приклад реалізації API. Він став дуже популярним завдяки своїй надзвичайній гнучкості, широкому набору функцій та незалежності від будь-якого конкретного постачальника хмарних послуг або інфраструктури. З тих пір у рамках проєкту Kubernetes спільнотами та постачальниками хмарних рішень було створено багато інших контролерів Ingress. Ingress NGINX залишається одним із найпопулярніших, його використовують у багатьох хостингових платформах Kubernetes та незліченних кластерах незалежних користувачів.&lt;/p&gt;
&lt;h2 id=&#34;history-and-challenges&#34;&gt;Історія та виклики&lt;/h2&gt;
&lt;p&gt;Широта та гнучкість Ingress NGINX спричинили проблеми з технічним обслуговуванням. Зміни в очікуваннях щодо хмарного програмного забезпечення також додали складнощів. Те, що колись вважалося корисними опціями, іноді почало розглядатися як серйозні недоліки безпеки, наприклад, можливість додавати довільні директиви конфігурації NGINX за допомогою анотацій «snippets». Вчорашня гнучкість стала сьогоднішнім непереборним технічним боргом.&lt;/p&gt;
&lt;p&gt;Незважаючи на популярність проєкту серед користувачів, Ingress NGINX завжди мав проблеми з недостатнім або ледь достатнім рівнем технічного обслуговування. Протягом багатьох років над проєктом працювали лише одна або дві особи, які займалися розробкою у вільний час, після роботи та у вихідні. Минулого року адміністратори Ingress NGINX &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;оголосили&lt;/a&gt; про свої плани припинити роботу над Ingress NGINX і розробити заміну контролера разом із спільнотою Gateway API. На жаль, навіть це оголошення не викликало додаткового інтересу до допомоги в підтримці Ingress NGINX або розробці InGate на заміну. (Розробка InGate ніколи не просунулася настільки, щоб створити зрілу заміну; її також буде припинено.)&lt;/p&gt;
&lt;h2 id=&#34;current-state-and-next-steps&#34;&gt;Поточний стан та наступні кроки&lt;/h2&gt;
&lt;p&gt;Наразі Ingress NGINX отримує максимальну підтримку. SIG Network та Комітет з реагування на загрози безпеці вичерпали всі можливості для пошуку додаткової підтримки, щоб забезпечити стабільну роботу Ingress NGINX. З метою забезпечення безпеки користувачів ми змушені припинити роботу над проєктом.&lt;/p&gt;
&lt;p&gt;У березні 2026 року технічне обслуговування Ingress NGINX буде припинено, а проєкт буде &lt;a href=&#34;https://github.com/kubernetes-retired/&#34;&gt;визнано застарілим&lt;/a&gt;. Після цього не буде нових випусків, виправлень помилок та оновлень для усунення будь-яких виявлених вразливостей безпеки. Репозиторії GitHub будуть переведені в режим «тільки для читання» і залишаться доступними для ознайомлення.&lt;/p&gt;
&lt;p&gt;Наявні розгортання Ingress NGINX не будуть порушені. Артефакти проєкту, такі як чарти Helm та образи контейнерів, залишаться доступними.&lt;/p&gt;
&lt;p&gt;У більшості випадків ви можете перевірити, чи використовуєте ви Ingress NGINX, скориставшись командою &lt;code&gt;kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx&lt;/code&gt; з правами адміністратора кластера.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати розробникам Ingress NGINX за їхню роботу над створенням та підтримкою цього проєкту — їхня відданість справі залишається вражаючою. Цей контролер Ingress обробив мільярди запитів у дата-центрах та домашніх лабораторіях по всьому світу. Багато в чому Kubernetes не був би тим, чим є зараз, без Ingress NGINX, і ми вдячні за стільки років неймовірних зусиль.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SIG Network та Комітет з реагування на загрози безпеки рекомендують усім користувачам Ingress NGINX негайно розпочати міграцію на Gateway API або інший контролер Ingress.&lt;/strong&gt; Багато варіантів перелічено в документації Kubernetes: &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/&#34;&gt;Gateway API&lt;/a&gt;, &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/ingress-controllers/&#34;&gt;Ingress&lt;/a&gt;. Додаткові варіанти можуть бути доступні у постачальників, з якими ви працюєте.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Gateway API 1.4: Нові можливості</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/06/gateway-api-v1-4/</link>
      <pubDate>Thu, 06 Nov 2025 09:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--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;Готові до революції у сфері мережевих технологій Kubernetes? Спільнота Kubernetes SIG Network представила загальнодоступну версію Gateway API (v1.4.0)! Випущена 6 жовтня 2025 року версія 1.4.0 зміцнює позиції сучасних, динамічних і розширюваних мережевих технологій у Kubernetes.&lt;/p&gt;
&lt;p&gt;Gateway API v1.4.0 приносить три нові можливості до &lt;em&gt;Стандартного каналу&lt;/em&gt; (GA-версія Gateway API):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BackendTLSPolicy для TLS між шлюзами та бекендами&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;supportedFeatures&lt;/code&gt; у статусі GatewayClass&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Іменовані правила для маршрутів&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;та вводить три нові експериментальні можливості:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ресурс Mesh для конфігурації сервісної мережі&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default gateways&lt;/strong&gt; для спрощення конфігурації&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Фільтр &lt;code&gt;externalAuth&lt;/code&gt; для HTTPRoute&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;gradualtions-to-standard-channel&#34;&gt;Перехід до Стандартного каналу&lt;/h2&gt;
&lt;h3 id=&#34;backend-tls-policy&#34;&gt;Backend TLS policy&lt;/h3&gt;
&lt;p&gt;Під проводом: &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; — це новий тип Gateway API для визначення конфігурації TLS зʼєднання між шлюзом і подами бекенду. До впровадження BackendTLSPolicy не існувало API-специфікації, яка б дозволяла шифрувати трафік на шляху від шлюзу до бекенду.&lt;/p&gt;
&lt;p&gt;Конфігурація &lt;code&gt;BackendTLSPolicy&lt;/code&gt; &lt;code&gt;validation&lt;/code&gt; вимагає імені хоста. Цей &lt;code&gt;hostname&lt;/code&gt; має два призначення. Він використовується як заголовок SNI під час підключення до бекенду, а для автентифікації сертифікат, представлений бекендом, повинен відповідати цьому імені хоста, &lt;em&gt;якщо&lt;/em&gt; &lt;code&gt;subjectAltNames&lt;/code&gt; не вказано явно.&lt;/p&gt;
&lt;p&gt;Якщо &lt;code&gt;subjectAltNames&lt;/code&gt; (SAN) вказано, &lt;code&gt;hostname&lt;/code&gt; використовується тільки для SNI, а автентифікація виконується на основі SAN. Якщо в цьому випадку все одно потрібно виконати автентифікацію на основі значення імені хоста, його НЕОБХІДНО додати до списку &lt;code&gt;subjectAltNames&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Конфігурація BackendTLSPolicy &lt;code&gt;validation&lt;/code&gt; також вимагає або &lt;code&gt;caCertificateRefs&lt;/code&gt;, або &lt;code&gt;wellKnownCACertificates&lt;/code&gt;. &lt;code&gt;caCertificateRefs&lt;/code&gt; посилається на один або декілька (до 8) пакунків сертифікатів TLS, закодованих у форматі PEM. Якщо немає конкретних сертифікатів для використання, то залежно від вашої реалізації ви можете використовувати &lt;code&gt;wellKnownCACertificates&lt;/code&gt;, встановлений у значення &amp;quot;System&amp;quot;, щоб повідомити шлюз про необхідність використання набору довірених сертифікатів CA, характерних для конкретної реалізації.&lt;/p&gt;
&lt;p&gt;У цьому прикладі BackendTLSPolicy налаштований на використання сертифікатів, визначених у ConfigMap auth-cert, для підключення до зашифрованого TLS-зʼєднання, де поди, що підтримують сервіс автентифікації, повинні надавати дійсний сертифікат для &lt;code&gt;auth.example.com&lt;/code&gt;.  Він використовує &lt;code&gt;subjectAltNames&lt;/code&gt; з типом Hostname, але ви також можете використовувати тип URI.&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;# основна група API&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;У цьому прикладі BackendTLSPolicy налаштований на використання системних сертифікатів для підключення до зашифрованого TLS бекенду, де Pods, що обслуговують Service dev, повинні надавати дійсний сертифікат для &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;Більш детальну інформацію про конфігурацію TLS в Gateway API можна знайти в статті &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;Під проводом: &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 має нове поле, &lt;code&gt;supportedFeatures&lt;/code&gt;. Це доповнення дозволяє реалізаціям оголошувати набір функцій, які вони підтримують. Це дає користувачам і інструментам чітке уявлення про можливості даного GatewayClass.&lt;/p&gt;
&lt;p&gt;Назва цієї функції для тестів на відповідність (та звітування про статус GatewayClass) — &lt;strong&gt;SupportedFeatures&lt;/strong&gt;. Реалізації повинні заповнити поле &lt;code&gt;supportedFeatures&lt;/code&gt; у &lt;code&gt;.status&lt;/code&gt; GatewayClass &lt;strong&gt;до&lt;/strong&gt; прийняття GatewayClass або в рамках тієї ж операції.&lt;/p&gt;
&lt;p&gt;Ось приклад &lt;code&gt;supportedFeatures&lt;/code&gt;, опублікованого в &lt;code&gt;.status&lt;/code&gt; GatewayClass:&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;Перехід SupportedFeatures до Standard допоміг поліпшити процес тестування відповідності для Gateway API. Набір тестів на відповідність тепер автоматично виконуватиме тести на основі функцій, визначених у статусі GatewayClass. Це створює міцний, перевірюваний звʼязок між заявленими можливостями реалізації та результатами тестування, що полегшує для розробників виконання правильних тестів на відповідність, а для користувачів — довіру до звітів про відповідність.&lt;/p&gt;
&lt;p&gt;Це означає, що коли поле SupportedFeatures заповнюється в статусі GatewayClass, не буде потреби в додаткових прапорцях тестів на відповідність, таких як &lt;code&gt;–suported-features&lt;/code&gt;, або &lt;code&gt;–exempt&lt;/code&gt;, або &lt;code&gt;–all-features&lt;/code&gt;. Важливо зазначити, що функції Mesh є винятком із цього правила і можуть бути перевірені на відповідність за допомогою &lt;em&gt;Conformance Profiles&lt;/em&gt; або шляхом ручного введення будь-якої комбінації прапорців, повʼязаних з функціями, доки спеціальний ресурс не вийде з експериментального каналу.&lt;/p&gt;
&lt;h3 id=&#34;named-rules-for-routes&#34;&gt;Іменовані правила для 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;Під проводом: &lt;a href=&#34;https://github.com/guicassolato&#34;&gt;Guilherme Cassolato&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Це вдосконалення дозволяє чітко ідентифікувати правила маршрутизації та посилатися на них у всій екосистемі Gateway API. Ось деякі з основних випадків використання:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Статус:&lt;/strong&gt; можливість посилатися на конкретні правила безпосередньо за назвою.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Спостережуваність:&lt;/strong&gt; спрощення ідентифікації окремих правил у журналах, трейсах та метриках.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Політики:&lt;/strong&gt; Дозволяє політикам (&lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-773&#34;&gt;GEP-713&lt;/a&gt;) орієнтуватися на конкретні правила маршрутизації через поле &lt;code&gt;sectionName&lt;/code&gt; у їх &lt;code&gt;targetRef[s]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Інструменти:&lt;/strong&gt; спрощення фільтрування та посилання на правила маршрутизації в таких інструментах, як &lt;code&gt;gwctl&lt;/code&gt;, &lt;code&gt;kubectl&lt;/code&gt;, а також в універсальних утилітах, таких як &lt;code&gt;jq&lt;/code&gt; та &lt;code&gt;yq&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Внутрішнє зіставлення конфігурацій:&lt;/strong&gt; спрощення генерації внутрішніх конфігурацій, які посилаються на правила маршрутизації за іменем у реалізаціях шлюзів і мереж.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це відповідає добре відпрацьованій схемі, яка вже застосовується для прослуховувачів шлюзів, портів Service, Pods (і контейнерів) та багатьох інших ресурсів Kubernetes.&lt;/p&gt;
&lt;p&gt;Хоча нове поле імені є &lt;strong&gt;необовʼязковим&lt;/strong&gt; (тож наявні ресурси залишаються дійсними), його використання &lt;strong&gt;наполегливо рекомендується&lt;/strong&gt;. Впровадження не повинні призначати стандартне значення, але можуть застосовувати обмеження, такі як незмінність.&lt;/p&gt;
&lt;p&gt;Нарешті, майте на увазі, що [формат імені](&lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-995/&#34;&gt;https://gateway-api.sigs.k8s.io/geps/gep-995/&lt;/a&gt;? h=995#format) перевіряється, а інші поля (такі як &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;) можуть накладати додаткові непрямі обмеження.&lt;/p&gt;
&lt;h2 id=&#34;experimental-channel-changes&#34;&gt;Зміни в експериментальному каналі&lt;/h2&gt;
&lt;h3 id=&#34;enabling-external-auth-for-httproute&#34;&gt;Увімкнення зовнішньої автентифікації для HTTPRoute&lt;/h3&gt;
&lt;p&gt;Надання Gateway API можливості забезпечувати автентифікацію, а можливо, і авторизацію на рівні Gateway або HTTPRoute є дуже запитуваною функцією протягом тривалого часу. (Див. &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/1494&#34;&gt;проблему GEP-1494&lt;/a&gt; для отримання додаткової інформації.)&lt;/p&gt;
&lt;p&gt;Цей реліз Gateway API додає експериментальний фільтр у HTTPRoute, який вказує реалізації Gateway API викликати зовнішній сервіс для автентифікації (а за бажанням, і авторизації) запитів.&lt;/p&gt;
&lt;p&gt;Цей фільтр базується на &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; і дозволяє спілкуватися зі службою Auth, яка використовує протокол gRPC або HTTP.&lt;/p&gt;
&lt;p&gt;Обидва методи дозволяють налаштувати, які заголовки пересилати до служби Auth, причому протокол HTTP дозволяє передавати додаткову інформацію, таку як префікс шляху.&lt;/p&gt;
&lt;p&gt;Приклад HTTP може виглядати так (зверніть увагу, що для цього прикладу потрібно встановити експериментальний канал та реалізацію, яка підтримує зовнішню автентифікацію, щоб насправді зрозуміти конфігурацію):&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;# Ці заголовки завжди надсилаються для протоколу 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;# але включені сюди для наочності.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Це дозволяє сервісу Auth на сервері використовувати надані заголовки для прийняття рішення про автентифікацію запиту.&lt;/p&gt;
&lt;p&gt;Коли запит дозволено, зовнішня служба Auth відповість кодом HTTP 200 і, за бажанням, додатковими заголовками, які будуть включені в запит, що пересилається на сервер. Коли запит відхилено, служба Auth відповість кодом HTTP 403.&lt;/p&gt;
&lt;p&gt;Оскільки заголовок Authorization використовується в багатьох методах автентифікації, цей метод можна використовувати для Basic, Oauth, JWT та інших поширених методів автентифікації та авторизації.&lt;/p&gt;
&lt;h3 id=&#34;mesh-resource&#34;&gt;Ресурси Mesh&lt;/h3&gt;
&lt;p&gt;Під проводом: &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 представляє новий експериментальний ресурс Mesh, який надає можливість налаштовувати параметри для всієї мережі та виявляти функції, що підтримуються певною реалізацією мережі. Цей ресурс аналогічний ресурсу Gateway і спочатку буде використовуватися переважно для тестування відповідності, а в майбутньому планується розширити його використання на шлюзи поза кластером.&lt;/p&gt;
&lt;p&gt;Ресурс Mesh є кластерним і, як експериментальна функція, має назву &lt;code&gt;XMesh&lt;/code&gt; і знаходиться в групі API &lt;code&gt;gateway.networking.x-k8s.io&lt;/code&gt;. Ключовим полем є controllerName, яке визначає реалізацію mesh, відповідальну за ресурс. Строка &lt;code&gt;status&lt;/code&gt; ресурсу вказує, чи прийняла його реалізація mesh, і перелічує функції, які підтримує mesh.&lt;/p&gt;
&lt;p&gt;Однією з цілей цього GEP є уникнення ускладнення для користувачів впровадження mesh. Для спрощення впровадження очікується, що реалізації mesh створюватимуть стандартний ресурс Mesh під час запуску, якщо такий з відповідним &lt;code&gt;controllerName&lt;/code&gt; ще не існує. Це усуває необхідність ручного створення ресурсу для початку використання mesh.&lt;/p&gt;
&lt;p&gt;Новий тип XMesh API в групі API gateway.networking.x-k8s.io/v1alpha1 забезпечує центральний пункт для конфігурації mesh і виявлення функцій (джерело).&lt;/p&gt;
&lt;p&gt;Мінімальний обʼєкт XMesh вказує &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;Реалізація mesh заповнює поле статусу, щоб підтвердити, що вона прийняла ресурс, і показує список підтримуваних функцій (джерело):&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;Впровадження стандартних Gateways&lt;/h3&gt;
&lt;p&gt;Під проводом: &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;Розробники застосунків часто зазначали, що необхідно явно вказувати батьківський шлюз для кожного маршруту північ-південь. Хоча така явність запобігає двозначності, вона створює додаткові труднощі, особливо для розробників, які просто хочуть відкрити свій застосунок для зовнішнього світу, не турбуючись про схему іменування базової інфраструктури. Щоб вирішити цю проблему, ми запровадили поняття &lt;strong&gt;Default Gateways&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&#34;for-application-developers-just-use-the-default&#34;&gt;Для розробників застосунків: просто «використовуйте стандартні налаштування»&lt;/h4&gt;
&lt;p&gt;Як розробник застосунків, ви часто не переймаєтеся тим, через який саме шлюз проходить ваш трафік, вам просто потрібно, щоб він працював. Завдяки цьому вдосконаленню ви тепер можете створити маршрут і просто попросити його використовувати стандартний шлюз.&lt;/p&gt;
&lt;p&gt;Для цього потрібно встановити нове поле &lt;code&gt;useDefaultGateways&lt;/code&gt; у &lt;code&gt;spec&lt;/code&gt; вашого маршруту.&lt;/p&gt;
&lt;p&gt;Ось простий &lt;code&gt;HTTPRoute&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;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;Ось і все! Більше не потрібно шукати правильну назву шлюзу для вашого середовища. Ваш маршрут тепер є «стандартним маршрутом».&lt;/p&gt;
&lt;h4 id=&#34;for-cluster-operators-youre-still-in-control&#34;&gt;Для операторів кластерів: ви все ще контролюєте ситуацію&lt;/h4&gt;
&lt;p&gt;Ця функція не забирає контроль у операторів кластерів (&amp;quot;Chihiro&amp;quot;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;). Насправді, вони мають явний контроль над тим, які шлюзи можуть діяти як стандартні. Шлюз прийме ці &lt;em&gt;стандартні маршрути&lt;/em&gt; лише в тому випадку, якщо він налаштований на це.&lt;/p&gt;
&lt;p&gt;Ви також можете використовувати ValidatingAdmissionPolicy, щоб вимагати або навіть забороняти маршрутам покладатися на стандартний Gateway.&lt;/p&gt;
&lt;p&gt;Як оператор кластера, ви можете призначити шлюз як стандартний, встановивши (нове) поле &lt;code&gt;.spec.defaultScope&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;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;# ... інша конфігурація шлюзу&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;/p&gt;
&lt;h4 id=&#34;how-it-works-and-key-details&#34;&gt;Як це працює та основні деталі&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Щоб підтримувати чистий, дружній до GitOps робочий процес, стандартний шлюз &lt;em&gt;не&lt;/em&gt; змінює &lt;code&gt;spec.parentRefs&lt;/code&gt; вашого маршруту. Натомість, звʼязок відображається у полі &lt;code&gt;status&lt;/code&gt; маршруту. Ви завжди можете перевірити розділ &lt;code&gt;status.parents&lt;/code&gt; вашого маршруту, щоб точно побачити, який шлюз або шлюзи його прийняли. Це зберігає ваш початковий намір і уникає конфліктів з інструментами CD.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Дизайн явно підтримує наявність кількох шлюзів, призначених як стандартні в межах кластера. Коли це відбувається, стандартний маршрут буде привʼязаний до &lt;em&gt;всіх&lt;/em&gt; з них. Це дозволяє операторам кластерів виконувати міграції без простоїв і тестування нових стандартних шлюзів.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ви можете створити один маршрут, який обробляє як північ-південь (трафік, що входить або виходить з кластера, через стандартний шлюз), так і схід-захід/mesh-трафік (трафік між сервісами в межах кластера), явно посилаючись на сервіс в &lt;code&gt;parentRefs&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Стандартні шлюзи представляють собою значний крок вперед у спрощенні та інтуїтивності Gateway API для повсякденних випадків використання, поєднуючи гнучкість, необхідну операторам, і простоту, бажану розробниками.&lt;/p&gt;
&lt;h3 id=&#34;configuring-client-certificate-validation&#34;&gt;Налаштування перевірки сертифіката клієнта&lt;/h3&gt;
&lt;p&gt;Під проводом: &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;Цей випуск містить оновлення для налаштування перевірки клієнтських сертифікатів, що усуває критичну вразливість безпеки, повʼязану з повторним використанням зʼєднання. Обʼєднання HTTP-зʼєднань — це оптимізація веб-продуктивності, яка дозволяє клієнту повторно використовувати наявне TLS-зʼєднання для запитів до різних доменів. Хоча це зменшує накладні витрати на встановлення нових зʼєднань, воно створює ризик для безпеки в контексті шлюзів API. Можливість повторного використання одного TLS-зʼєднання для декількох прослуховувачів вимагає впровадження спільної конфігурації клієнтських сертифікатів, щоб уникнути несанкціонованого доступу.&lt;/p&gt;
&lt;h4 id=&#34;why-sni-based-mtls-is-not-the-answer&#34;&gt;Чому mTLS на основі SNI не є рішенням&lt;/h4&gt;
&lt;p&gt;Можна було б подумати, що використання Server Name Indication (SNI) для розрізнення між прослуховувачами вирішить цю проблему. Однак TLS SNI не є надійним механізмом для забезпечення політик безпеки в сценарії обʼєднання зʼєднань. Клієнт може використовувати одне TLS-зʼєднання для кількох зʼєднань з партнерами, якщо вони всі покриті одним і тим же сертифікатом. Це означає, що клієнт може встановити зʼєднання, вказавши одну ідентичність партнера (використовуючи SNI), а потім повторно використовувати це зʼєднання для доступу до іншого віртуального хоста, який прослуховує на тій же IP-адресі та порту. Це повторне використання, яке контролюється евристикою з боку клієнта, може обійти політики взаємного TLS, які були специфічні для конфігурації другого прослуховувача.&lt;/p&gt;
&lt;p&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;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;# основна група API&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# основна група API&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Я налаштував шлюз із двома прослуховувачами, обидва з яких мають імена хостів, що перетинаються. Моя мета полягає в тому, щоб прослуховувач &lt;code&gt;foo-http&lt;/code&gt; був доступний тільки для клієнтів, які мають сертифікат &lt;code&gt;foo-example-com-cert&lt;/code&gt;. На відміну від цього, прослуховувач &lt;code&gt;wildcard-https&lt;/code&gt; повинен дозволяти доступ ширшій аудиторії, яка використовує будь-який сертифікат, дійсний для домену &lt;code&gt;*.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Розглянемо сценарій, в якому клієнт спочатку підключається до &lt;code&gt;foo.example.com&lt;/code&gt;. Сервер запитує і успішно перевіряє сертифікат &lt;code&gt;foo-example-com-cert&lt;/code&gt;, встановлюючи зʼєднання. Згодом той самий клієнт бажає отримати доступ до інших сайтів у цьому домені, таких як &lt;code&gt;bar.example.com&lt;/code&gt;, який обробляється слухачем &lt;code&gt;wildcard-https&lt;/code&gt;. Завдяки повторному використанню зʼєднання клієнти можуть отримати доступ до бекендів &lt;code&gt;wildcard-https&lt;/code&gt; без додаткового TLS-рукостискання на наявному зʼєднанні. Цей процес працює як очікується.&lt;/p&gt;
&lt;p&gt;Однак критична вразливість безпеки виникає, коли порядок доступу змінюється на протилежний. Якщо клієнт спочатку підключається до &lt;code&gt;bar.example.com&lt;/code&gt; і надає дійсний сертифікат &lt;code&gt;bar.example.com&lt;/code&gt;, зʼєднання встановлюється успішно. Якщо потім цей клієнт намагається отримати доступ до &lt;code&gt;foo.example.com&lt;/code&gt;, сертифікат клієнта наявного зʼєднання не буде повторно перевірено. Це дозволяє клієнту обійти конкретну вимогу щодо сертифіката для бекенду &lt;code&gt;foo&lt;/code&gt;, що призводить до серйозного порушення безпеки.&lt;/p&gt;
&lt;h4 id=&#34;the-solution-per-port-tls-configuration&#34;&gt;Рішення: конфігурація TLS для кожного порту&lt;/h4&gt;
&lt;p&gt;Оновлений API шлюзу отримує поле &lt;code&gt;tls&lt;/code&gt; у &lt;code&gt;.spec&lt;/code&gt; шлюзу, яке дозволяє визначити конфігурацію перевірки сертифіката клієнта за замовчуванням для всіх прослуховувачів, а потім, якщо потрібно, переоприділити її для кожного порту. Це забезпечує гнучкий і потужний спосіб управління вашими політиками TLS.&lt;/p&gt;
&lt;p&gt;Ось погляд на оновлені визначення API (показані як вихідний код Go):&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 визначає бажаний стан 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 визначає конфігурацію TLS для шлюзу.
&lt;/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 визначає конфігурацію TLS для шлюзу.
&lt;/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 визначає стандартну конфігурацію перевірки сертифіката клієнта
&lt;/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 визначає конфігурацію TLS, призначену для кожного порту.
&lt;/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 описує конфігурацію TLS для конкретного порту.
&lt;/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;// Port вказує номер порту, до якого буде застосовано конфігурацію TLS.
&lt;/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 зберігає конфігурацію, яка буде застосована до всіх прослуховувачів, що обробляють
&lt;/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-трафік і відповідають заданому порту.
&lt;/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;Істотні зміни&lt;/h2&gt;
&lt;h3 id=&#34;breaking-grpcroute&#34;&gt;Standard GRPCRoute - поле &lt;code&gt;.spec&lt;/code&gt; обовʼязкове (технічний аспект)&lt;/h3&gt;
&lt;p&gt;Переведення GRPCRoute до статусу Standard вносить незначну, але технічно важливу зміну щодо наявності поля верхнього рівня &lt;code&gt;.spec&lt;/code&gt;. В рамках досягнення статусу Standard, Gateway API посилив перевірку схеми OpenAPI в GRPCRoute CustomResourceDefinition (CRD), щоб чітко забезпечити необхідність поля spec для всіх ресурсів GRPCRoute. Ця зміна забезпечує більш суворе дотримання стандартів обʼєктів Kubernetes та підвищує стабільність і передбачуваність ресурсу. Хоча дуже малоймовірно, що користувачі намагалися визначити GRPCRoute без будь-яких специфікацій, будь-які наявні автоматизації або маніфести, які могли покладатися на вільну інтерпретацію, що дозволяла повну відсутність поля &lt;code&gt;spec&lt;/code&gt;, тепер не пройдуть перевірку і &lt;strong&gt;повинні&lt;/strong&gt; бути оновлені, щоб включити поле &lt;code&gt;.spec&lt;/code&gt;, навіть якщо воно порожнє.&lt;/p&gt;
&lt;h3 id=&#34;breaking-httproute&#34;&gt;Експериментальна підтримка CORS в HTTPRoute — кардинальна зміна для поля &lt;code&gt;allowCredentials&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;В рамках підпроєкту Gateway API було внесено істотні зміни до експериментальної підтримки CORS в HTTPRoute, що стосуються поля &lt;code&gt;allowCredentials&lt;/code&gt; в політиці CORS. Визначення цього поля було приведене у повну відповідність до специфікації CORS, яка вимагає, щоб відповідний заголовок &lt;code&gt;Access-Control-Allow-Credentials&lt;/code&gt; мав булеве значення. Раніше реалізація могла бути надто дозвільною, потенційно приймаючи нестандартні або рядкові представлення, такі як &lt;code&gt;true&lt;/code&gt;, через послаблення перевірки схеми. Користувачі, які налаштовували правила CORS, тепер повинні переглянути свої маніфести та переконатися, що значення &lt;code&gt;allowCredentials&lt;/code&gt; суворо відповідає новій, більш обмежувальній схемі. Будь-які наявні визначення HTTPRoute, які не відповідають цій більш суворій перевірці, тепер будуть відхилені сервером API, що вимагатиме оновлення конфігурації для збереження функціональності.&lt;/p&gt;
&lt;h2 id=&#34;improving-the-development-and-usage-experience&#34;&gt;Поліпшення досвіду розробки та використання&lt;/h2&gt;
&lt;p&gt;В рамках цього випуску ми вдосконалили деякі робочі процеси для розробників:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Додано &lt;a href=&#34;https://github.com/kubernetes-sigs/kube-api-linter&#34;&gt;Kube API Linter&lt;/a&gt; до конвеєрів CI/CD, що зменшує навантаження на рецензентів API, а також зменшує кількість типових помилок.&lt;/li&gt;
&lt;li&gt;Покращено час виконання тестів CRD за допомогою &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;Крім того, в рамках зусиль, спрямованих на поліпшення досвіду використання Gateway API, було зроблено деякі кроки для усунення неоднозначностей та старих технічних боргів з нашого вебсайту з документацією:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Тепер у довідці API чітко вказано, коли поле є &lt;code&gt;experimental&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Навігаційна панель GEP (GatewayAPI Enhancement Proposal) генерується автоматично, показуючи реальний стан вдосконалень.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Спробуйте&lt;/h2&gt;
&lt;p&gt;На відміну від інших API Kubernetes, вам не потрібно оновлюватися до останньої версії Kubernetes, щоб отримати останню версію Gateway API. Якщо ви використовуєте Kubernetes 1.26 або новішу версію, ви зможете швидко розпочати роботу з цією версією Gateway API.&lt;/p&gt;
&lt;p&gt;Щоб спробувати API, дотримуйтесь &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/&#34;&gt;Посібника для початківців&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На момент написання цієї статті сім реалізацій вже відповідають Gateway API v1.4.0. В алфавітному порядку:&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;Долучайтеся&lt;/h2&gt;
&lt;p&gt;Цікавитесь, коли буде додано нову функцію? Є багато можливостей долучитися та допомогти визначити майбутнє API маршрутизації Kubernetes як для вхідного трафіку, так і для сервісної мережі.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ознайомтеся з &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides&#34;&gt;посібниками для користувачів&lt;/a&gt;, щоб дізнатися, які випадки використання можна вирішити.&lt;/li&gt;
&lt;li&gt;Спробуйте один з &lt;a href=&#34;https://gateway-api.sigs.k8s.io/implementations/&#34;&gt;наявних контролерів Gateway&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Або &lt;a href=&#34;https://gateway-api.sigs.k8s.io/contributing/&#34;&gt;долучайтеся до нашої спільноти&lt;/a&gt; та допоможіть нам разом створити майбутнє Gateway API!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Учасники проекту хотіли б подякувати &lt;em&gt;усім&lt;/em&gt;, хто долучився до Gateway API, чи то через коміти в репозиторії, обговорення, ідеї чи загальну підтримку. Ми ніколи не змогли б досягти такого прогресу без підтримки цієї відданої та активної спільноти.&lt;/p&gt;
&lt;h2 id=&#34;related-kubernetes-blog-articles&#34;&gt;Схожі статті блогу Kubernetes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--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; (червень 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--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; (листопад 2024)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--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; (травень 2024)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--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; (листопад 2023)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2023/10/31/gateway-api-ga/&#34;&gt;Gateway API v1.0: GA Release&lt;/a&gt; (жовтень 2023)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Чіхіро — японське імʼя, яке має кілька значень залежно від використовуваного кандзі, найчастіше перекладається як «тисяча питань» або «тисяча ліктів».&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

      </description>
    </item>
    
    <item>
      <title>7 типових помилок Kubernetes (і як я навчився їх уникати)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/10/20/seven-kubernetes-pitfalls-and-how-to-avoid/</guid>
      <description>
        
        
        &lt;p&gt;Не секрет, що Kubernetes може бути як потужним, так і іноді викликати розчарування. Коли я вперше почав займатися оркеструванням контейнерів, я зробив більше ніж достатньо помилок, щоб скласти цілий список підводних каменів. У цій публікації я хочу розглянути сім основних підводних каменів, з якими я стикався (або бачив, як стикалися інші), і поділитися кількома порадами, як їх уникнути. Незалежно від того, чи ви тільки починаєте знайомитися з Kubernetes, чи вже керуєте кластерами у промисловій експлуатації, сподіваюся, ці поради допоможуть вам уникнути зайвого стресу.&lt;/p&gt;
&lt;h2 id=&#34;1-skipping-resource-requests-and-limits&#34;&gt;1. Оминання запитів на ресурси та обмежень&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: відсутність вказання вимог до CPU та памʼяті в специфікаціях Pod. Зазвичай це відбувається тому, що Kubernetes не вимагає заповнення цих полів, а робочі навантаження часто можуть запускатися та працювати без них, що робить цей пропуск таким, який легко пропустити на ранніх етапах конфігурації або під час швидких циклів розгортання.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Контекст&lt;/strong&gt;:
У Kubernetes запити та обмеження ресурсів є критично важливими для ефективного управління кластерами. Запити ресурсів гарантують, що планувальник зарезервує відповідну кількість CPU та памʼяті для кожного пода, гарантуючи, що він має необхідні ресурси для роботи. Обмеження ресурсів обмежують кількість CPU та памʼяті, яку може використовувати под, запобігаючи тому, щоб жоден окремий под не споживав надмірні ресурси та потенційно не позбавляв інші поди ресурсів. Коли запити та обмеження ресурсів не встановлені:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Нестача ресурсів: Поди можуть отримувати недостатньо ресурсів, що призводить до зниження продуктивності або збоїв. Це відбувається тому, що Kubernetes планує поди на основі цих запитів. Без них планувальник може розмістити занадто багато подів на одному вузлі, що призводить до конкуренції за ресурси та вузьких місць у продуктивності.&lt;/li&gt;
&lt;li&gt;Привласнення ресурсів: З іншого боку, без обмежень под може споживати більше, ніж йому належить, впливаючи на продуктивність і стабільність інших подів на тому ж вузлі. Це може призвести до таких проблем, як виселення або знищення інших подів за допомогою Out-Of-Memory (OOM) killer через брак доступної памʼяті.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;how-to-avoid-it&#34;&gt;Як уникнути цього:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Почніть з помірних &lt;code&gt;requests&lt;/code&gt; (наприклад, &lt;code&gt;100m&lt;/code&gt; CPU, &lt;code&gt;128Mi&lt;/code&gt; памʼяті) і подивіться, як ваш застосунок поводиться.&lt;/li&gt;
&lt;li&gt;Моніторте реальне використання та уточнюйте свої значення; &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/docs/tasks/run-application/horizontal-pod-autoscale/&#34;&gt;HorizontalPodAutoscaler&lt;/a&gt; може допомогти автоматизувати масштабування на основі метрик.&lt;/li&gt;
&lt;li&gt;Слідкуйте за &lt;code&gt;kubectl top pods&lt;/code&gt; або вашим інструментом логування/моніторингу, щоб підтвердити, що ви не перевищуєте або недопостачаєте ресурси.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Перевірка життям&lt;/strong&gt;: На початку я ніколи не думав про обмеження памʼяті. Здавалося, що все гаразд на моєму локальному кластері. Потім, у більшому середовищі, Pods отримали &lt;em&gt;OOMKilled&lt;/em&gt; зліва і справа. Урок засвоєно. Для отримання детальних інструкцій щодо налаштування запитів і обмежень ресурсів для ваших контейнерів, будь ласка, зверніться до &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/configure-pod-container/assign-memory-resource/&#34;&gt;Призначення ресурсів памʼяті для контейнерів і подів&lt;/a&gt; (частина офіційної документації Kubernetes).&lt;/p&gt;
&lt;h2 id=&#34;2-underestimating-liveness-and-readiness-probes&#34;&gt;2. Недооцінка перевірок життєздатності та готовності&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: Розгортання контейнерів без явного визначення того, як Kubernetes повинен перевіряти їхню справність або готовність. Це зазвичай відбувається тому, що Kubernetes вважає контейнер &amp;quot;запущеним&amp;quot;, поки процес всередині не завершився. Без додаткових сигналів Kubernetes припускає, що робоче навантаження функціонує, навіть якщо застосунок всередині не відповідає, ініціалізується або застряг.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Контекст&lt;/strong&gt;:
Перевірки життєздатності, готовності та запуску — це механізми, які Kubernetes використовує для моніторингу стану контейнерів та їх доступності.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Liveness probes&lt;/strong&gt; визначають, чи все ще працює застосунок. Якщо перевірка життєздатності не проходить, контейнер перезапускається.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readiness probes&lt;/strong&gt; контролюють, чи готовий контейнер обслуговувати трафік. Поки перевірка готовності не пройде, контейнер видаляється з точок доступу Service.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Startup probes&lt;/strong&gt; допомагають відрізнити тривалі часи запуску від фактичних збоїв.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;how-to-avoid-it-1&#34;&gt;Як уникнути цього:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Додайте просту HTTP &lt;code&gt;livenessProbe&lt;/code&gt;, щоб перевірити точку доступу справності (наприклад, &lt;code&gt;/healthz&lt;/code&gt;), щоб Kubernetes міг перезапустити контейнер, якщо він перестане відповідати.&lt;/li&gt;
&lt;li&gt;Використовуйте &lt;code&gt;readinessProbe&lt;/code&gt;, щоб забезпечити, те що трафік не досягає вашого застосунку, поки він не буде готовий.&lt;/li&gt;
&lt;li&gt;Зберігайте перевірки простими. Надто складні перевірки можуть створити хибні сповіщення та непотрібні перезапуски.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Перевірка життям&lt;/strong&gt;: Одного разу я забув про перевірку готовності для вебсервісу, який потребував деякого часу для завантаження. Користувачі зверталися до нього передчасно, отримували дивні тайм-аути, і я витратив години на роздуми. Три рядки перевірки готовності врятували б ситуацію.&lt;/p&gt;
&lt;p&gt;Детальні інструкції щодо налаштування тестів на життєздатність, готовність та запуск для контейнерів див. у розділі &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/&#34;&gt;Налаштування проб життєздатності, готовності та запуску&lt;/a&gt; в офіційній документації Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;3-we-ll-just-look-at-container-logs-famous-last-words&#34;&gt;3. «Ми просто переглянемо журнали контейнерів» (відомі останні слова)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: Покладатися виключно на журнали контейнерів, отримані за допомогою &lt;code&gt;kubectl logs&lt;/code&gt;. Це часто відбувається тому, що команда є швидкою та зручною, і в багатьох налаштуваннях журнали здаються доступними під час розробки або раннього усунення несправностей. Однак &lt;code&gt;kubectl logs&lt;/code&gt; лише отримує журнали з поточних або нещодавно завершених контейнерів, а ці журнали зберігаються на локальному диску вузла. Як тільки контейнер видаляється, виселяється або вузол перезавантажується, файли журналів можуть бути видалені або назавжди втрачені.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-2&#34;&gt;Як уникнути цього:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Централізуйте журнали&lt;/strong&gt; за допомогою інструментів CNCF, таких як &lt;a href=&#34;https://kubernetes.io/docs/concepts/cluster-administration/logging/#sidecar-container-with-a-logging-agent&#34;&gt;Fluentd&lt;/a&gt; або &lt;a href=&#34;https://fluentbit.io/&#34;&gt;Fluent Bit&lt;/a&gt;, щоб агрегувати вихідні дані з усіх Podʼів.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Використовуйте OpenTelemetry&lt;/strong&gt; для унфікованого перегляду журналів, метрик і (за потреби) трейсів. Це дозволяє виявляти кореляції між подіями інфраструктури та поведінкою на рівні застосунків.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Поєднуйте журнали з метриками Prometheus&lt;/strong&gt;, щоб відстежувати дані на рівні кластера разом із журналами застосунків. Якщо вам потрібне розподілене трасування, розгляньте проекти CNCF, такі як &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;Перевірка життям&lt;/strong&gt;: Коли я вперше втратив журнали Pod через швидкий перезапуск, я зрозумів, наскільки ненадійним може бути «kubectl logs» сам по собі. З того часу я налаштував належний конвеєр для кожного кластера, щоб уникнути втрати важливих підказок.&lt;/p&gt;
&lt;h2 id=&#34;4-treating-dev-and-prod-exactly-the-same&#34;&gt;4. Однакове ставлення до оточень розробки та промислової експлуатації&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: Розгортання тих самих маніфестів Kubernetes з ідентичними налаштуваннями в середовищах розробки, тестування та промислової експлуатації. Це часто відбувається, коли команди прагнуть до узгодженості та повторного використання, але не враховують, що специфічні для середовища фактори — такі як шаблони трафіку, доступність ресурсів, потреби в масштабуванні або контроль доступу, які можуть суттєво відрізнятися. Без налаштування конфігурації, оптимізовані для одного середовища, можуть викликати нестабільність, погану продуктивність або прогалини в безпеці в іншому.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-3&#34;&gt;Як уникнути цього:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Використовуйте оверлеї або &lt;a href=&#34;https://kustomize.io/&#34;&gt;kustomize&lt;/a&gt;, щоб підтримувати спільну базу, налаштовуючи запити ресурсів, репліки або конфігурацію для кожного середовища.&lt;/li&gt;
&lt;li&gt;Витягніть специфічну для середовища конфігурацію в ConfigMaps і / або Secrets. Ви можете використовувати спеціалізований інструмент, такий як &lt;a href=&#34;https://github.com/bitnami-labs/sealed-secrets&#34;&gt;Sealed Secrets&lt;/a&gt;, для управління конфіденційними даними.&lt;/li&gt;
&lt;li&gt;Плануйте масштабування в промисловому середовищі. Ваш кластер розробки, ймовірно, може обійтися мінімальними ресурсами CPU/памʼяті, але промислове середовище може потребувати значно більше.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Перевірка життям&lt;/strong&gt;: Одного разу я збільшив &lt;code&gt;replicaCount&lt;/code&gt; з 2 до 10 у невеликому середовищі розробки, просто щоб «перевірити». Я швидко вичерпав ресурси і півдня витратив на подолання наслідків. Ой.&lt;/p&gt;
&lt;h2 id=&#34;5-leaving-old-stuff-floating-around&#34;&gt;5. Коли старі речі залишаються на місці&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: У кластері залишаються невикористані або застарілі ресурси, такі як Deployments, Services, ConfigMaps або PersistentVolumeClaims. Це часто відбувається тому, що Kubernetes не видаляє ресурси автоматично, якщо не вказано явно, і немає вбудованого механізму для відстеження приналежності або терміну придатності. З часом ці забуті обʼєкти можуть накопичуватися, споживаючи ресурси кластера, збільшуючи витрати на хостинг у хмарі та створюючи операційну плутанину, особливо коли застарілі Services або LoadBalancers продовжують маршрутизувати трафік.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-4&#34;&gt;Як уникнути цього:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Позначте все&lt;/strong&gt; мітками з метою або власником. Таким чином, ви зможете легко знайти ресурси, які вам більше не потрібні.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Регулярно перевіряйте&lt;/strong&gt; свій кластер: запустіть &lt;code&gt;kubectl get all -n &amp;lt;namespace&amp;gt;&lt;/code&gt;, щоб побачити, що насправді працює, і підтвердити, що все це так має бути.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Використовуйте збір сміття в Kubernetes&lt;/strong&gt;: &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/docs/concepts/workloads/controllers/garbage-collection/&#34;&gt;документація K8s&lt;/a&gt; показує, як автоматично видаляти залежні обʼєкти.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Використовуйте автоматизацію політики&lt;/strong&gt;: Інструменти, такі як &lt;a href=&#34;https://kyverno.io/&#34;&gt;Kyverno&lt;/a&gt;, можуть автоматично видаляти або блокувати застарілі ресурси після певного періоду, або впроваджувати політики життєвого циклу, щоб вам не доводилося памʼятати про кожен окремий крок очищення.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Перевірка життям&lt;/strong&gt;: Після хакатону я забув знести “test-svc”, привʼязаний до зовнішнього балансувальника навантаження. Три тижні потому я зрозумів, що платив за цей балансувальник навантаження весь цей час. Facepalm.&lt;/p&gt;
&lt;h2 id=&#34;6-diving-too-deep-into-networking-too-soon&#34;&gt;6. Занадто глибоке занурення в мережу занадто рано&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: Впровадження розширених мережевих рішень, таких як сервісні мережі, власні втулки CNI або міжкластерна комунікація, до повного розуміння рідних мережевих примітивів Kubernetes. Це часто трапляється, коли команди реалізують такі функції, як маршрутизація трафіку, спостережуваність або mTLS, використовуючи зовнішні інструменти, не освоївши спочатку, як працює основна мережа Kubernetes: включаючи Pod-to-Pod комунікацію, ClusterIP сервіси, DNS-резолюцію та базову обробку вхідного трафіку. В результаті проблеми, повʼязані з мережею, стають важчими для усунення, особливо коли оверлеї вводять додаткові абстракції та точки відмови.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-5&#34;&gt;Як уникнути цього:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Почніть з малого: Deployment, Service та базовий контролер вхідного трафіку, наприклад, на основі NGINX (наприклад, Ingress-NGINX).&lt;/li&gt;
&lt;li&gt;Переконайтеся, що ви розумієте, як трафік проходить у кластері, як працює виявлення сервісів і як налаштована DNS.&lt;/li&gt;
&lt;li&gt;Переходьте до повноцінної мережі або розширених функцій CNI лише тоді, коли це дійсно необхідно, оскільки складна мережа додає накладні витрати.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Перевірка життям&lt;/strong&gt;: Я спробував Istio на невеликому внутрішньому застосунку, а потім витратив більше часу на налагодження самого Istio, ніж на сам застосунок. Врешті-решт, я відступив, видалив Istio, і все запрацювало нормально.&lt;/p&gt;
&lt;h2 id=&#34;7-going-too-light-on-security-and-rbac&#34;&gt;7. Занадто легковажне ставлення до безпеки та RBAC&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: Розгортання робочих навантажень з ненадійними конфігураціями, такими як запуск контейнерів від імені користувача root, використання теґу обрахів &lt;code&gt;latest&lt;/code&gt;, відключення контекстів безпеки або призначення надто широких ролей RBAC, таких як &lt;code&gt;cluster-admin&lt;/code&gt;. Ці практики зберігаються, оскільки Kubernetes не забезпечує суворі стандартні налаштування безпеки, а платформа розроблена для гнучкості, а не для жорстких обмежень. Без явних політик безпеки кластери можуть залишатися вразливими до ризиків, таких як втеча контейнерів, несанкціоноване підвищення привілеїв або випадкові зміни в промисловому середовищі через незафіксовані образи.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-6&#34;&gt;Як уникнути цього:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Використовуйте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/access-authn-authz/rbac/&#34;&gt;RBAC&lt;/a&gt; для визначення ролей і дозволів у Kubernetes. Хоча RBAC є стандартним і найширше підтримуваним механізмом авторизації, Kubernetes також дозволяє використовувати альтернативні авторизатори. Для більш складних або зовнішніх потреб у політиці розгляньте рішення, такі як &lt;a href=&#34;https://open-policy-agent.github.io/gatekeeper/&#34;&gt;OPA Gatekeeper&lt;/a&gt; (на основі Rego), &lt;a href=&#34;https://kyverno.io/&#34;&gt;Kyverno&lt;/a&gt; або користувацькі вебхуки з використанням мов політики, таких як CEL або &lt;a href=&#34;https://cedarpolicy.com/&#34;&gt;Cedar&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Привʼяжіть образи до конкретних версій (більше ніякого &lt;code&gt;:latest&lt;/code&gt;!). Це допоможе вам знати, що насправді розгорнуто.&lt;/li&gt;
&lt;li&gt;Розгляньте &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/security/pod-security-admission/&#34;&gt;Pod Security Admission&lt;/a&gt; (або інші рішення, такі як Kyverno), щоб забезпечити використання контейнерів без прав root, файлових систем лише для читання тощо.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Перевірка життям&lt;/strong&gt;: Я ніколи не стикався з серйозними порушеннями безпеки, але чув безліч застережливих історій. Якщо не посилити заходи безпеки, то це лише питання часу, коли щось піде не так.&lt;/p&gt;
&lt;h2 id=&#34;final-thoughts&#34;&gt;І на останок&lt;/h2&gt;
&lt;p&gt;Kubernetes дивовижний, але він не є провидцем, він не зробить магічно правильні речі, якщо ви не скажете йому, що вам потрібно. Памʼятаючи про ці пастки, ви уникнете головного болю та марної трати часу. Помилки трапляються (повірте, я зробив свою частку), але кожна з них — це можливість дізнатися більше про те, як Kubernetes насправді працює під капотом. Якщо ви хочете заглибитися, &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/home/&#34;&gt;офіційна документація&lt;/a&gt; та &lt;a href=&#34;http://slack.kubernetes.io/&#34;&gt;спільнота Slack&lt;/a&gt; є відмінними наступними кроками. І, звичайно, не соромтеся ділитися своїми жахливими історіями або порадами щодо успіху, адже в кінцевому підсумку ми всі разом у цій пригоді з хмарними технологіями.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Щасливої подорожі!&lt;/strong&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Представляємо втулок Headlamp для Karpenter — масштабування та видимість</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/</link>
      <pubDate>Mon, 06 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/10/06/introducing-headlamp-plugin-for-karpenter/</guid>
      <description>
        
        
        &lt;p&gt;Headlamp — це відкритий, розширюваний проєкт Kubernetes SIG UI, призначений для того, щоб ви могли досліджувати, керувати та налагоджувати ресурси кластера.&lt;/p&gt;
&lt;p&gt;Karpenter — це проєкт Kubernetes Autoscaling SIG для виділення вузлів, який допомагає кластерам швидко та ефективно масштабуватися. Він запускає нові вузли за лічені секунди, добираючи відповідні типи екземплярів для навантажень і керує повним життєвим циклом вузлів, включаючи зменшення масштабу.&lt;/p&gt;
&lt;p&gt;Новий втулок Headlamp Karpenter додає можливість перегляду активності Karpenter у реальному часі безпосередньо з інтерфейсу Headlamp. Він показує, які ресурси Karpenter відповідають обʼєктам Kubernetes, виводить метрики в реальному часі та демонструє події масштабування в міру їх виникнення. Ви можете здійснювати перевірку подів, що очікують на обробку, переглядати рішення щодо масштабування та редагувати ресурси, що керуються Karpenter, за допомогою вбудованої функції перевірки. Втулок Karpenter був створений у рамках проєкту за підтримки LFX.&lt;/p&gt;
&lt;p&gt;Втулок Karpenter для Headlamp має на меті спростити розуміння, налагодження та тонке налаштування поведінки автоматичного масштабування в кластерах Kubernetes. Тепер ми проведемо короткий тур по втулку Headlamp.&lt;/p&gt;
&lt;h2 id=&#34;map-view-of-karpenter-resources-and-how-they-relate-to-kubernetes-resources&#34;&gt;Мапа ресурсів Karpenter та їх звʼязки з ресурсами Kubernetes&lt;/h2&gt;
&lt;p&gt;Легко побачити, як ресурси Karpenter, такі як NodeClasses, NodePool і NodeClaims, повʼязані з основними ресурсами Kubernetes, такими як Pods, Nodes тощо.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Map view showing relationships between resources&#34; src=&#34;https://deploy-preview-48551--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;Візуалізація метрик Karpenter&lt;/h2&gt;
&lt;p&gt;Отримайте миттєву інформацію про Resource Usage v/s Limits, Allowed disruptions, Pending Pods, Provisioning Latency та багато іншого.&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-48551--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-48551--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;Рішення щодо масштабування&lt;/h2&gt;
&lt;p&gt;Показує, які екземпляри виділяються для ваших навантажень, і допомагає зрозуміти причину, чому Karpenter прийняв ці рішення. Корисно під час налагодження.&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-48551--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-48551--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;Редактор конфігурацій з підтримкою валідації&lt;/h2&gt;
&lt;p&gt;Робіть зміни в конфігурації Karpenter в реальному часі. Редактор включає попередній перегляд змін і валідацію ресурсів для безпечніших налаштувань.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Config editor with validation support&#34; src=&#34;https://deploy-preview-48551--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-views-of-karpenter-resources&#34;&gt;Перегляд ресурсів Karpenter у реальному часі&lt;/h2&gt;
&lt;p&gt;Переглядайте та відстежуйте специфічні ресурси Karpenter у реальному часі, такі як &amp;quot;NodeClaims&amp;quot;, коли ваш кластер масштабується вгору та вниз.&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-48551--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-48551--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-48551--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;Панель інструментів для подів в очікуванні&lt;/h2&gt;
&lt;p&gt;Переглядайте всі поди в очікуванні з невиконаними вимогами до планування/не вдалося запланувати, підкреслюючи причини, чому їх не вдалося запланувати.&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-48551--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;Цей втулок повинен працювати з більшістю постачальників Karpenter, але наразі був протестований лише на тих, що наведені в таблиці. Крім того, кожен постачальник надає деяку додаткову інформацію, і ті, що наведені в таблиці нижче, відображаються втулком.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Постачальник&lt;/th&gt;
&lt;th&gt;Перевірено&lt;/th&gt;
&lt;th&gt;Підтримується додаткова інформація&lt;br/&gt;про конкретного постачальника&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;Будь ласка, &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/issues&#34;&gt;стовріть тікет&lt;/a&gt; якщо ви протестуєте одного з неперевірених постачальників або якщо ви хочете підтримку для цього постачальника (PRs також з радістю приймаються).&lt;/p&gt;
&lt;h2 id=&#34;how-to-use&#34;&gt;Як користуватися&lt;/h2&gt;
&lt;p&gt;Будь ласка, ознайомтеся з &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/karpenter&#34;&gt;plugins/karpenter/README.md&lt;/a&gt; для отримання інструкцій щодо використання.&lt;/p&gt;
&lt;h2 id=&#34;feedback-and-questions&#34;&gt;Відгуки та запитання&lt;/h2&gt;
&lt;p&gt;Будь ласка, &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/issues&#34;&gt;стовріть тікет&lt;/a&gt; якщо ви використовуєте Karpenter і маєте будь-які інші ідеї або відгуки. Або приєднуйтесь до каналу &lt;a href=&#34;https://kubernetes.slack.com/?redir=%2Fmessages%2Fheadlamp&#34;&gt;Kubernetes slack headlamp&lt;/a&gt; для спілкування.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Оголошення про підтримку Changed Block Tracking API (альфа)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/25/csi-changed-block-tracking/</link>
      <pubDate>Thu, 25 Sep 2025 05:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/25/csi-changed-block-tracking/</guid>
      <description>
        
        
        &lt;p&gt;Ми раді оголосити про альфа-підтримку механізму &lt;em&gt;відстеження змінених блоків&lt;/em&gt;. Це покращує екосистему зберігання даних Kubernetes, надаючи ефективний спосіб для драйверів зберігання даних &lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/volumes/#csi&#34;&gt;CSI&lt;/a&gt; ідентифікувати змінені блоки в знімках (snapshot) PersistentVolume. За допомогою драйвера, який може використовувати цю функцію, ви зможете скористатися швидшими та більш ефективними з точки зору використання ресурсів операціями резервного копіювання.&lt;/p&gt;
&lt;p&gt;Якщо ви хочете спробувати цю функцію, перейдіть до розділу &lt;a href=&#34;#getting-started&#34;&gt;Початок роботи&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;what-is-changed-block-tracking&#34;&gt;Що таке відстеження змінених блоків?&lt;/h2&gt;
&lt;p&gt;Відстеження змінених блоків дозволяє системам зберігання даних ідентифікувати та відстежувати зміни на рівні блоків між моментальними знімками, усуваючи необхідність сканування цілих томів під час операцій резервного копіювання. Це вдосконалення є зміною в інтерфейсі Container Storage Interface (CSI), а також у підтримці зберігання даних у самій системі Kubernetes. З увімкненою альфа-функцією ваш кластер може:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ідентифікувати виділені блоки в знімку тому CSI&lt;/li&gt;
&lt;li&gt;Визначати змінені блоки між двома знімками одного тому&lt;/li&gt;
&lt;li&gt;Оптимізувати операції резервного копіювання, зосередившись лише на змінених блоках даних&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для користувачів Kubernetes, які керують великими наборами даних, цей API забезпечує значно ефективніші процеси резервного копіювання. Тепер програми резервного копіювання можуть зосередитися лише на змінених блоках, а не обробляти цілі томи.&lt;/p&gt;

&lt;div class=&#34;alert alert-info&#34; role=&#34;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка:&lt;/h4&gt;На даний момент Changed Block Tracking  API підтримується тільки для блокових томів, а не для файлових томів. Драйвери CSI, які керують файловими системами зберігання даних, не зможуть реалізувати цю функцію.&lt;/div&gt;

&lt;h2 id=&#34;benefits-of-changed-block-tracking-support-in-kubernetes&#34;&gt;Переваги підтримки відстеження змінених блоків у Kubernetes&lt;/h2&gt;
&lt;p&gt;У міру зростання популярності Kubernetes для управління критичними даними зі збереженням стану (stateful), потреба в ефективних рішеннях для резервного копіювання стає все більш важливою. Традиційні підходи до повного резервного копіювання стикаються з такими проблемами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Довгі вікна резервного копіювання&lt;/em&gt;: повне резервне копіювання великих обсягів даних може займати години, що ускладнює його виконання в межах вікон технічного обслуговування.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Високе використання ресурсів&lt;/em&gt;: операції резервного копіювання споживають значну пропускну здатність мережі та ресурси вводу-виводу, особливо для великих обсягів даних і застосунків, що інтенсивно використовують дані.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Збільшення витрат на зберігання&lt;/em&gt;: Повторні повні резервні копії зберігають надлишкові дані, що призводить до лінійного зростання вимог до зберігання, навіть якщо між резервними копіями фактично змінюється лише невеликий відсоток даних.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changed Block Tracking API вирішує ці проблеми, надаючи вбудовану підтримку Kubernetes для інкрементних резервних копій через інтерфейс CSI.&lt;/p&gt;
&lt;h2 id=&#34;key-components&#34;&gt;Ключові компоненти&lt;/h2&gt;
&lt;p&gt;Реалізація складається з трьох основних компонентів:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;CSI SnapshotMetadata Service API&lt;/em&gt;: API, що пропонується gRPC, який надає знімки томів та дані про змінені блоки.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;SnapshotMetadataService API&lt;/em&gt;: Kubernetes CustomResourceDefinition (CRD), який повідомляє про доступність служби метаданих драйвера CSI та деталі підключення до клієнтів кластера.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;External Snapshot Metadata Sidecar&lt;/em&gt;: проміжний компонент, який підключає драйвери CSI до застосунків резервного копіювання через стандартизований інтерфейс gRPC.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;implementation-requirements&#34;&gt;Вимоги до впровадження&lt;/h2&gt;
&lt;h3 id=&#34;storage-provider-responsibilities&#34;&gt;Обовʼязки постачальника послуг зберігання&lt;/h3&gt;
&lt;p&gt;Якщо ви є автором інтеграції сховища з Kubernetes і хочете підтримати функцію відстеження змінених блоків, ви повинні виконати певні вимоги:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Впровадити CSI RPC&lt;/em&gt;: Постачальники систем зберігання даних повинні впровадити сервіс &lt;code&gt;SnapshotMetadata&lt;/code&gt;, як визначено в &lt;a href=&#34;https://github.com/container-storage-interface/spec/blob/master/csi.proto&#34;&gt;специфікаціях CSI protobuf&lt;/a&gt;. Цей сервіс вимагає впровадження серверного потокового передавання для таких RPC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetMetadataAllocated&lt;/code&gt;: для ідентифікації виділених блоків у знімку&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetMetadataDelta&lt;/code&gt;: для визначення змінених блоків між двома знімками&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Можливості бекенду сховища&lt;/em&gt;: переконайтеся, що бекенд сховища має можливість відстежувати та повідомляти про зміни на рівні блоків.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Розгортання зовнішніх компонентів&lt;/em&gt;: інтегруйте з sidecar &lt;code&gt;external-snapshot-metadata&lt;/code&gt;, щоб відкрити доступ до сервісу метаданих знімків.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Реєстрація власного ресурсу&lt;/em&gt;: зареєструйте ресурс &lt;code&gt;SnapshotMetadataService&lt;/code&gt; за допомогою CustomResourceDefinition і створіть власний ресурс &lt;code&gt;SnapshotMetadataService&lt;/code&gt;, який повідомляє про доступність служби метаданих і надає деталі підключення.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Підтримка обробки помилок&lt;/em&gt;: реалізуйте належну обробку помилок для цих RPC відповідно до вимог специфікації CSI.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;backup-solution-responsibilities&#34;&gt;Відповідальність за рішення щодо резервного копіювання&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;Налаштування автентифікації&lt;/em&gt;: Програма резервного копіювання повинна надавати токен Kubernetes ServiceAccount під час використання &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;. Необхідно встановити відповідні права доступу, такі як RBAC RoleBindings, щоб авторизувати ServiceAccount програми резервного копіювання для отримання таких токенів.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Впровадити код потокового передавання на стороні клієнта&lt;/em&gt;: Розробити клієнти, які впроваджують API потокового передавання gRPC, визначені у файлі &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;/p&gt;
&lt;ul&gt;
&lt;li&gt;Впровадити код клієнта для потокового передавання для методів &lt;code&gt;GetMetadataAllocated&lt;/code&gt; та &lt;code&gt;GetMetadataDelta&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ефективно обробляти відповіді сервера для потокового передавання, оскільки метадані надходять частинами.&lt;/li&gt;
&lt;li&gt;Обробляти формат повідомлення &lt;code&gt;SnapshotMetadataResponse&lt;/code&gt; з належним обробленням помилок.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Репозиторій GitHub &lt;code&gt;external-snapshot-metadata&lt;/code&gt; надає зручний пакет підтримки &lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshot-metadata/tree/master/pkg/iterator&#34;&gt;ітератора&lt;/a&gt; для спрощення реалізації клієнта.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Обробка великих потоків даних&lt;/em&gt;: Розробка клієнтів для ефективної обробки великих потоків метаданих блоків, які можуть бути повернуті для томів із значними змінами.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Оптимізація процесів резервного копіювання&lt;/em&gt;: Модифікація робочих процесів резервного копіювання для використання змінених метаданих блоків з метою ідентифікації та передачі лише змінених блоків, щоб зробити резервне копіювання більш ефективним, скоротивши тривалість резервного копіювання та споживання ресурсів.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Початок роботи&lt;/h2&gt;
&lt;p&gt;Щоб використовувати відстеження змінених блоків у кластері:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Переконайтеся, що драйвер CSI підтримує знімки томів і реалізує можливості метаданих знімків за допомогою необхідного sidecar &lt;code&gt;external-snapshot-metadata&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Переконайтеся, що власний ресурс SnapshotMetadataService зареєстрований за допомогою CRD.&lt;/li&gt;
&lt;li&gt;Перевірте наявність власного ресурсу SnapshotMetadataService для драйвера CSI.&lt;/li&gt;
&lt;li&gt;Створіть клієнтів, які можуть отримати доступ до API за допомогою відповідної автентифікації (через токени Kubernetes ServiceAccount).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;API надає дві основні функції:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GetMetadataAllocated&lt;/code&gt;: перелічує блоки, виділені в одному знімку.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetMetadataDelta&lt;/code&gt;: перелічує блоки, змінені між двома знімками.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Залежно від відгуків та прийняття, розробники Kubernetes сподіваються перевести реалізацію CSI Snapshot Metadata в бета-версію в майбутніх релізах.&lt;/p&gt;
&lt;h2 id=&#34;where-can-i-learn-more&#34;&gt;Де я можу дізнатися більше?&lt;/h2&gt;
&lt;p&gt;Для тих, хто зацікавлений у випробуванні цієї нової функції:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Офіційна &lt;a href=&#34;https://kubernetes-csi.github.io/docs/external-snapshot-metadata.html&#34;&gt;документація&lt;/a&gt; для розробників Kubernetes CSI&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3314-csi-changed-block-tracking&#34;&gt;Пропозиція щодо вдосконалення&lt;/a&gt; функції метаданих знімків.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshot-metadata&#34;&gt;Репозиторій GitHub&lt;/a&gt; для реалізації та статусу випуску &lt;code&gt;external-snapshot-metadata&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Повні визначення протоколу gRPC для 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;Приклад реалізації клієнта метаданих знімків: &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;Приклад комплексного рішення з csi-hostpath-driver: &lt;a href=&#34;https://github.com/kubernetes-csi/csi-driver-host-path/blob/master/docs/example-ephemeral.md&#34;&gt;документація з прикладом&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;Як я можу долучитися?&lt;/h2&gt;
&lt;p&gt;Цей проєкт, як і всі проєкти Kubernetes, є результатом наполегливої праці багатьох учасників з різних сфер, які працювали разом. Від імені SIG Storage я хотів би висловити величезну подяку учасникам, які допомогли переглянути дизайн та реалізацію проєкту, зокрема, але не виключно, наступним особам:&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;Дякуємо також усім, хто долучився до проєкту, зокрема тим, хто допоміг рецензувати &lt;a href=&#34;https://github.com/kubernetes/enhancements/pull/4082&#34;&gt;KEP&lt;/a&gt; та &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;Ті, хто зацікавлений у розробці та розвитку CSI або будь-якої частини системи зберігання даних Kubernetes, можуть приєднатися до &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;Kubernetes Storage Special Interest Group&lt;/a&gt; (SIG). Ми завжди раді новим учасникам.&lt;/p&gt;
&lt;p&gt;SIG також проводить регулярні &lt;a href=&#34;https://docs.google.com/document/d/15tLCV3csvjHbKb16DVk-mfUmFry_Rlwo-2uG6KNGsfw/edit&#34;&gt;зустрічі Data Protection Working Group&lt;/a&gt;. Нові учасники можуть долучитися до наших дискусій.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Ресурси рівня Pod перейшли в стадію бета</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/22/kubernetes-v1-34-pod-level-resources/</guid>
      <description>
        
        
        &lt;p&gt;Від імені спільноти Kubernetes я з радістю повідомляю, що функція Pod Level Resources (Ресурси рівня Pod) перейшла в стадію бета у версії Kubernetes v1.34 і є стандартно увімкненою! Ця важлива подія відкриває нові можливості для визначення та управління розподілом ресурсів для ваших Podʼів. Така гнучкість зумовлена можливістю вказати ресурси CPU та памʼяті для Podʼа в цілому. Ресурси на рівні Podʼа можна поєднувати зі специфікаціями на рівні контейнера, щоб точно визначити вимоги до ресурсів та обмеження, необхідні для вашого застосунку.&lt;/p&gt;
&lt;h2 id=&#34;специфікація-ресурсів-на-рівні-podʼа&#34;&gt;Специфікація ресурсів на рівні Podʼа&lt;/h2&gt;
&lt;p&gt;До недавнього часу специфікації ресурсів, що застосовувалися до Podʼа, визначалися переважно на рівні окремих контейнерів. Хоча такий підхід був ефективним, іноді він вимагав дублювання або ретельного розрахунку потреб у ресурсах для декількох контейнерів в одному Podʼі. У якості бета-функції Kubernetes дозволяє визначати ресурси CPU, памʼяті та hugepages на рівні Podʼа. Це означає, що тепер ви можете визначати запити та обмеження ресурсів для всього Podʼа, що спрощує спільне використання ресурсів без необхідності детального управління цими ресурсами для кожного контейнера, де це не потрібно.&lt;/p&gt;
&lt;h2 id=&#34;чому-важливі-специфікації-на-рівні-podʼа&#34;&gt;Чому важливі специфікації на рівні Podʼа?&lt;/h2&gt;
&lt;p&gt;Ця функція покращує управління ресурсами в Kubernetes, пропонуючи &lt;em&gt;гнучке управління ресурсами&lt;/em&gt; як на рівні Podʼів, так і на рівні контейнерів.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Вона забезпечує консолідований підхід до оголошення ресурсів, зменшуючи необхідність ретельного управління кожним контейнером окремо, особливо для Podʼів з декількома контейнерами.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ресурси на рівні Podʼа дозволяють контейнерам у Podʼі обмінюватися між собою невикористаними ресурсами, сприяючи ефективному використанню ресурсів у Podʼі. Наприклад, це запобігає перетворенню контейнерів-sidecar на вузькі місця, що обмежують продуктивність. Раніше sidecar (наприклад, агент логування або проксі сервісної мережі), що досягали свого індивідуального обмеження CPU, могли бути стишені і сповільнювати роботу всього Podʼа, навіть якщо основний контейнер застосунку мав достатньо вільного CPU. За допомогою ресурсів на рівні Podʼа sidecarʼи та основний контейнер можуть спільно використовувати ресурси Podʼа, забезпечуючи безперебійну роботу під час пікових навантажень — або весь Pod стишується, або всі контейнери працюють.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Коли вказані ресурси як на рівні подів, так і на рівні контейнерів, пріоритет мають запити та обмеження на рівні подів. Це надає вам та адміністраторам кластерів потужний засіб для забезпечення загальних обмежень ресурсів для ваших Podʼів.&lt;/p&gt;
&lt;p&gt;Для планування, якщо запит на рівні подів явно визначений, планувальник використовує це конкретне значення для пошуку відповідного вузла, а не сукупні запити окремих контейнерів. Під час виконання обмеження на рівні подів діє як жорстка верхня межа для сукупного використання ресурсів усіма контейнерами. Важливо, що це обмеження на рівні подів є абсолютним; навіть якщо сума індивідуальних обмежень контейнерів є вищою, загальне споживання ресурсів ніколи не може перевищити обмеження на рівні подів.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ресурси на рівні Podʼів мають &lt;strong&gt;пріоритет&lt;/strong&gt; у впливі на клас якості обслуговування (QoS) Podʼа.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Для Podʼів, що працюють на вузлах Linux, при розрахунку коригування показника Out-Of-Memory (OOM) враховуються запити на ресурси як на рівні Podʼа, так і на рівні контейнера.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ресурси на рівні Pod &lt;strong&gt;спроєктовані для сумісності з наявними функціональними можливостями Kubernetes&lt;/strong&gt;, що забезпечує плавну інтеграцію у ваші робочі процеси.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;як-вказати-ресурси-для-всього-pod&#34;&gt;Як вказати ресурси для всього Pod&lt;/h2&gt;
&lt;p&gt;Використання &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;функціональної можливості&lt;/a&gt; &lt;code&gt;PodLevelResources&lt;/code&gt; вимагає Kubernetes v1.34 або новішої версії для всіх компонентів кластера, включаючи панель управління та кожен вузол. Ця функція знаходиться в бета-версії та є стандартно увімкненою у v1.34.&lt;/p&gt;
&lt;h3 id=&#34;приклад-маніфесту&#34;&gt;Приклад маніфесту&lt;/h3&gt;
&lt;p&gt;Ви можете вказати ресурси CPU, памʼяті та hugepages безпосередньо в маніфесті специфікації Podʼа у полі &lt;code&gt;resources&lt;/code&gt; для всього Podʼа.&lt;/p&gt;
&lt;p&gt;Ось приклад, що демонструє Pod із запитами та обмеженнями CPU та памʼяті, визначеними на рівні Pod:&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;# Поле &amp;#39;resources&amp;#39; на рівні специфікації 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;# бюджет ресурсів для всіх контейнерів у цьому 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:#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ʼа&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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; визначає максимальну кількість ресурсів, яку може використовувати 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;# Сума обмежень усіх контейнерів у 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:#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;# Весь Pod не може використовувати більше 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;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;# Весь Pod не може використовувати більше 200 МБ памʼяті.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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; визначає мінімальний обсяг ресурсів, гарантований 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;# Це значення використовується планувальником Kubernetes для пошуку вузла з достатньою ємністю.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# Pod гарантовано отримує 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;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;# При плануванні Pod гарантується 100 МБ памʼяті.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# Для цього контейнера не вказано жодних запитів на ресурси або обмежень.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# Для цього контейнера не вказано жодних запитів на ресурси або обмежень.&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;У цьому прикладі Pod &lt;code&gt;pod-resources-demo&lt;/code&gt; в цілому запитує 1 CPU і 100 MiB памʼяті, і обмежений 1 CPU і 200 MiB памʼяті. Контейнери всередині будуть працювати в рамках цих загальних обмежень на рівні Podʼа, як пояснено в наступному розділі.&lt;/p&gt;
&lt;h3 id=&#34;взаємодія-з-запитами-або-обмеженнями-ресурсів-на-рівні-контейнера&#34;&gt;Взаємодія з запитами або обмеженнями ресурсів на рівні контейнера&lt;/h3&gt;
&lt;p&gt;Коли вказані ресурси як на рівні Podʼа, так і на рівні контейнера, &lt;strong&gt;запити та обмеження на рівні podʼа мають пріоритет&lt;/strong&gt;. Це означає, що вузол розподіляє ресурси на основі специфікацій на рівні pod.&lt;/p&gt;
&lt;p&gt;Розглянемо Pod з двома контейнерами, де визначені запити та обмеження на рівні podʼа щодо CPU та памʼяті, і лише один контейнер має власні явні визначення ресурсів:&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;# Для цього контейнера не вказано жодних запитів на ресурси або обмежень.&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ʼа: Обмеження на рівні Podʼа (cpu: &amp;quot;1&amp;quot;, memory: &amp;quot;200Mi&amp;quot;) встановлюють абсолютну межу для всього Podʼа. Сума ресурсів, що споживаються всіма його контейнерами, обмежується цією межею і не може бути перевищена.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Спільне використання та перевищення ресурсів: контейнери можуть динамічно запозичувати будь-яку невикористану потужність, що дозволяє їм перевищувати обмеження за потреби, якщо сукупне використання Podʼа залишається в межах загального обмеження.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Запити на рівні Pod: запити на рівні Pod (cpu: &amp;quot;1&amp;quot;, memory: &amp;quot;100Mi&amp;quot;) слугують основою для гарантування ресурсів для всього Podʼа. Це значення впливає на рішення планувальника щодо розміщення і представляє мінімальні ресурси, на які Pod може розраховувати під час конфлікту на рівні вузла.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Запити на рівні контейнера: запити на рівні контейнера створюють систему пріоритетів у межах гарантованого бюджету Podʼа. Оскільки main-app-container має явний запит (cpu: &amp;quot;0.5&amp;quot;, memory: &amp;quot;50Mi&amp;quot;), йому надається пріоритет у розподілі ресурсів під тиском ресурсів над auxiliary-container, який не має такого явного запиту.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;обмеження&#34;&gt;Обмеження&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;По-перше, &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/#pod-update-and-replacement&#34;&gt;зміна на місці&lt;/a&gt; розміру ресурсів на рівні pod &lt;strong&gt;не підтримується&lt;/strong&gt; для Kubernetes v1.34 (або раніше). Спроба змінити обмеження або запити ресурсів на рівні podʼа для працюючого Podʼа призводить до помилки: зміна розміру відхиляється. Реалізація ресурсів на рівні Podʼа у версії v1.34 зосереджена на тому, щоб дозволити початкове оголошення загального ресурсного конверту, який застосовується до &lt;strong&gt;всього Podʼа&lt;/strong&gt;. Це відрізняється від зміни розміру на місці, яка (незважаючи на те, що може натякати назва) дозволяє динамічно коригувати запити та обмеження ресурсів &lt;em&gt;контейнера&lt;/em&gt; в &lt;em&gt;працюючому&lt;/em&gt; Podʼі і, можливо, без перезапуску контейнера. Зміна розміру на місці також ще не є стабільною функцією; вона перейшла в стадію бета у версії v1.33.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;На рівні pod можна вказати лише ресурси CPU, памʼяті та великі сторінки (hugepages).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ресурси на рівні pod не підтримуються для podʼів Windows. Якщо специфікація Podʼа явно націлена на Windows (наприклад, шляхом встановлення spec.os.name: &amp;quot;windows&amp;quot;), сервер API відхилить Pod під час етапу перевірки. Якщо под явно не позначений для Windows, але запланований для вузла Windows (наприклад, за допомогою nodeSelector), Kubelet на цьому вузлі Windows відхилить под під час процесу допуску.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Менеджер топології, менеджер памʼяті та менеджер процесора не вирівнюють под і контейнери на основі ресурсів на рівні пода, оскільки ці менеджери ресурсів наразі не підтримують ресурси на рівні пода.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;початок-роботи-та-надання-відгуків&#34;&gt;Початок роботи та надання відгуків&lt;/h4&gt;
&lt;p&gt;Готові ознайомитися з функцією &lt;em&gt;Pod Level Resources&lt;/em&gt;? Вам знадобиться кластер Kubernetes з версією 1.34 або пізнішою. Не забудьте увімкнути &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;функціональну можливість&lt;/a&gt; &lt;code&gt;PodLevelResources&lt;/code&gt; у вашій панелі управління та на всіх вузлах.&lt;/p&gt;
&lt;p&gt;Оскільки ця функція перебуває на стадії бета-тестування, ваші відгуки є надзвичайно цінними. Будь ласка, повідомляйте про будь-які проблеми або діліться своїм досвідом через стандартні канали комунікації Kubernetes:&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;Список розсилки&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/labels/sig%2Fnode&#34;&gt;Відкриті тікети спільноти/PR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Відновлення після збою розширення тому (GA)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/19/kubernetes-v1-34-recover-expansion-failure/</guid>
      <description>
        
        
        &lt;p&gt;Чи робили ви коли-небудь помилку при розширенні ваших постійних томів у Kubernetes? Хотіли вказати &lt;code&gt;2TB&lt;/code&gt;, але вказали &lt;code&gt;20TiB&lt;/code&gt;? Ця, здавалося б, незначна проблема була досить важкою для виправлення, і проєкту знадобилося майже 5 років, щоб її виправити. &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/storage/persistent-volumes/#recovering-from-failure-when-expanding-volumes&#34;&gt;Автоматичне відновлення після розширення сховища&lt;/a&gt; існує вже деякий час у бета-версії; однак, з випуском v1.34, ми перевели її в &lt;strong&gt;загальну доступність&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Хоча завжди було можливо відновитися після збою розширення томів вручну, зазвичай це вимагало доступу адміністратора кластера і було нудно робити (див. вказане посилання для отримання додаткової інформації).&lt;/p&gt;
&lt;p&gt;Що, якщо ви зробите помилку, а потім відразу усвідомите це? З Kubernetes v1.34 ви повинні мати можливість зменшити запитуваний розмір PersistentVolumeClaim (PVC) і, якщо розширення до раніше запитуваного розміру не завершилося, ви можете змінити запитуваний розмір. Kubernetes автоматично працюватиме над його виправленням. Будь-яка квота, спожита невдалим розширенням, буде повернена користувачу, а повʼязаний PersistentVolume повинен бути змінений на останній вказаний вами розмір.&lt;/p&gt;
&lt;p&gt;Я пройду через приклад того, як все це працює.&lt;/p&gt;
&lt;h2 id=&#34;зменшення-розміру-pvc-для-відновлення-після-невдалого-розширення&#34;&gt;Зменшення розміру PVC для відновлення після невдалого розширення&lt;/h2&gt;
&lt;p&gt;Уявіть, що у вас закінчується місце на диску для одного з ваших серверів бази даних, і ви хочете розширити PVC з раніше вказаного &lt;code&gt;10TB&lt;/code&gt; до &lt;code&gt;100TB&lt;/code&gt;, але ви зробили помилку і вказали &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;# новий вказаний розмір - але неправильний!&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;code&gt;1000TB&lt;/code&gt; ніколи не відбудеться.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.34 ви можете просто виправити свою помилку і запитати новий розмір PVC, який менший за помилку, за умови, що він все ще більший за початковий розмір фактичного 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;# Правильний розмір; має бути більшим за 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;# Ви не можете зменшити обсяг нижче його фактичного розміру.&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;Це не вимагає втручання адміністратора. Ще краще, будь-яка надлишкова квота Kubernetes, яку ви тимчасово спожили, буде автоматично повернена.&lt;/p&gt;
&lt;p&gt;Цей механізм відновлення після збоїв має одну умову: будь-який новий розмір, який ви вказуєте для PVC, &lt;strong&gt;повинен&lt;/strong&gt; бути все ще більшим за початковий розмір у &lt;code&gt;.status.capacity&lt;/code&gt;. Оскільки Kubernetes не підтримує зменшення ваших обʼєктів PV, ви ніколи не зможете зменшити їх до розміру, який спочатку був виділений для вашого запиту PVC.&lt;/p&gt;
&lt;h2 id=&#34;поліпшене-оброблення-помилок-і-спостережуваність-розширення-томів&#34;&gt;Поліпшене оброблення помилок і спостережуваність розширення томів&lt;/h2&gt;
&lt;p&gt;Реалізація того, що може виглядати як відносно незначна зміна, також вимагала від нас майже повністю переробити те, як працює розширення томів під капотом у Kubernetes. Існують нові поля API, доступні в обʼєктах PVC, які ви можете контролювати, щоб спостерігати за прогресом розширення томів.&lt;/p&gt;
&lt;h3 id=&#34;поліпшена-спостережуваність-за-розширенням-у-процесі&#34;&gt;Поліпшена спостережуваність за розширенням у процесі&lt;/h3&gt;
&lt;p&gt;Ви можете запитати &lt;code&gt;.status.allocatedResourceStatus[&#39;storage&#39;]&lt;/code&gt; PVC, щоб відстежувати прогрес операції розширення томів. Для типового блочного тому це має переходити між &lt;code&gt;ControllerResizeInProgress&lt;/code&gt;, &lt;code&gt;NodeResizePending&lt;/code&gt; і &lt;code&gt;NodeResizeInProgress&lt;/code&gt; і ставати nil/порожнім, коли розширення томів завершено.&lt;/p&gt;
&lt;p&gt;Якщо з якоїсь причини розширення томів до запитаного розміру неможливе, воно повинно відповідно перебувати в станах, таких як &lt;code&gt;ControllerResizeInfeasible&lt;/code&gt; або &lt;code&gt;NodeResizeInfeasible&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ви також можете спостерігати за розміром, до якого Kubernetes працює, спостерігаючи за &lt;code&gt;pvc.status.allocatedResources&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;поліпшене-оброблення-помилок-і-звітність&#34;&gt;Поліпшене оброблення помилок і звітність&lt;/h3&gt;
&lt;p&gt;Kubernetes тепер повинен повторно спробувати ваші невдалі розширення томів повільніше, він повинен робити менше запитів як до системи зберігання, так і до Kubernetes apiserver.&lt;/p&gt;
&lt;p&gt;Помилки, виявлені під час розширення томів, тепер повідомляються як стан на обʼєктах PVC і повинні зберігатися на відміну від подій. Kubernetes тепер заповнить &lt;code&gt;pvc.status.conditions&lt;/code&gt; ключами помилок &lt;code&gt;ControllerResizeError&lt;/code&gt; або &lt;code&gt;NodeResizeError&lt;/code&gt;, коли розширення томів не вдається.&lt;/p&gt;
&lt;h3 id=&#34;виправлення-давніх-помилок-у-робочих-процесах-зміни-розміру&#34;&gt;Виправлення давніх помилок у робочих процесах зміни розміру&lt;/h3&gt;
&lt;p&gt;Ця функція також дозволила нам виправити давні помилки в робочих процесах зміни розміру, такі як &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/115294&#34;&gt;Kubernetes issue #115294&lt;/a&gt;. Якщо ви спостерігаєте щось зламане, будь ласка, повідомте про свої помилки на &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/new/choose&#34;&gt;https://github.com/kubernetes/kubernetes/issues&lt;/a&gt;, разом з деталями про те, як відтворити проблему.&lt;/p&gt;
&lt;p&gt;Робота над цією функцією протягом її життєвого циклу була складною, і було б неможливо досягти GA без зворотного звʼязку від &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; і &lt;a href=&#34;https://github.com/xing-yang&#34;&gt;@xing-yang&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Всі учасники, які працювали над цим, також цінують внесок, наданий &lt;a href=&#34;https://github.com/thockin&#34;&gt;@thockin&lt;/a&gt; і &lt;a href=&#34;https://github.com/liggitt&#34;&gt;@liggitt&lt;/a&gt; на різних самітах контрибʼюторів Kubernetes.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Споживча ємність DRA</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/18/kubernetes-v1-34-dra-consumable-capacity/</guid>
      <description>
        
        
        &lt;p&gt;Динамічне виділення ресурсів (Dynamic Resource Allocation, DRA) — це API Kubernetes для управління дефіцитними ресурсами Podʼів та контейнерів. Він дозволяє гнучкі запити ресурсів, виходячи за межі простого виділення &lt;em&gt;N&lt;/em&gt; кількості пристроїв, щоб підтримувати більш детальні сценарії використання. З DRA користувачі можуть запитувати специфічні типи пристроїв на основі їх атрибутів, визначати власні конфігурації, адаптовані до їх робочих навантажень, і навіть ділитися одним і тим же ресурсом між кількома контейнерами або Podʼами.&lt;/p&gt;
&lt;p&gt;Тут ми зосередимося на функції спільного використання пристроїв і заглибимось в нову можливість, представлену в Kubernetes 1.34: &lt;em&gt;споживча ємність DRA&lt;/em&gt;, яка розширює DRA для підтримки більш тонкого спільного використання пристроїв.&lt;/p&gt;
&lt;h2 id=&#34;передумови-спільне-використання-пристроїв-через-resourceclaims&#34;&gt;Передумови: спільне використання пристроїв через ResourceClaims&lt;/h2&gt;
&lt;p&gt;З самого початку DRA представила можливість для кількох Podʼів ділитися пристроєм, посилаючись на один і той же ResourceClaim. Цей дизайн відокремлює виділення ресурсів від конкретного обладнання, що дозволяє більш динамічне та повторне використання пристроїв.&lt;/p&gt;
&lt;p&gt;У Kubernetes 1.33 нова підтримка &lt;em&gt;розділювальних пристроїв (partitionable devices)&lt;/em&gt; дозволила драйверам ресурсів оголошувати частини пристрою, які доступні, а не виставляти весь пристрій як ресурс &amp;quot;все або нічого&amp;quot;. Це дозволило Kubernetes більш точно моделювати обладнання спільного використання.&lt;/p&gt;
&lt;p&gt;Але все ще залишалася одна відсутня частина: він ще не підтримував сценарії, коли драйвер пристрою керує тонкими, динамічними частинами ресурсу пристрою, такими як пропускна здатність мережі, на основі запитів користувачів, або для спільного використання цих ресурсів незалежно від ResourceClaims, які обмежені їх специфікацією та простором імен.&lt;/p&gt;
&lt;p&gt;Саме тут зʼявляється &lt;em&gt;споживча ємність&lt;/em&gt; для DRA.&lt;/p&gt;
&lt;h2 id=&#34;переваги-підтримки-споживчої-ємності-dra&#34;&gt;Переваги підтримки споживчої ємності DRA&lt;/h2&gt;
&lt;p&gt;Ось короткий огляд того, що ви отримуєте в кластері з увімкненою &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;функціональною можливістю&lt;/a&gt; &lt;code&gt;DRAConsumableCapacity&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;спільне-використання-пристроїв-між-кількома-resourceclaims-або-devicerequests&#34;&gt;Спільне використання пристроїв між кількома ResourceClaims або DeviceRequests&lt;/h3&gt;
&lt;p&gt;Тепер драйвери ресурсів можуть підтримувати спільне використання одного й того ж пристрою, або навіть частини пристрою, між кількома ResourceClaims або між кількома DeviceRequests.&lt;/p&gt;
&lt;p&gt;Це означає, що Podʼи з різних просторів імен можуть одночасно ділитися одним і тим же пристроєм, якщо це дозволено та підтримується конкретним драйвером DRA.&lt;/p&gt;
&lt;h3 id=&#34;виділення-ресурсів-пристроїв&#34;&gt;Виділення ресурсів пристроїв&lt;/h3&gt;
&lt;p&gt;Kubernetes розширює алгоритм виділення в планувальнику, щоб підтримувати виділення частини ресурсів пристрою, як визначено в полі &lt;code&gt;capacity&lt;/code&gt;. Планувальник забезпечує, щоб загальна виділена ємність для всіх споживачів ніколи не перевищувала загальну ємність пристрою, навіть коли вона ділиться між кількома ResourceClaims або DeviceRequests. Це дуже схоже на те, як планувальник дозволяє Podʼам і контейнерам ділитися виділеними ресурсами на вузлах; в цьому випадку він дозволяє їм ділитися виділеними ресурсами на пристроях.&lt;/p&gt;
&lt;p&gt;Ця функція розширює підтримку сценаріїв, де драйвер пристрою може керувати ресурсами &lt;strong&gt;всередині&lt;/strong&gt; пристрою та на основі кожного процесу — наприклад, виділення певної кількості памʼяті (наприклад, 8 ГіБ) з віртуального GPU, або встановлення обмежень пропускної здатності на віртуальні мережеві інтерфейси, виділені конкретним Podʼам. Це має на меті забезпечити безпечне та ефективне спільне використання ресурсів.&lt;/p&gt;
&lt;h3 id=&#34;обмеження-distinctattribute&#34;&gt;Обмеження DistinctAttribute&lt;/h3&gt;
&lt;p&gt;Ця функція також вводить нове обмеження: &lt;code&gt;DistinctAttribute&lt;/code&gt;, яке є доповненням до наявного обмеження &lt;code&gt;MatchAttribute&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Основна мета &lt;code&gt;DistinctAttribute&lt;/code&gt; полягає в тому, щоб запобігти багаторазовому виділенню одного й того ж базового пристрою в межах одного ResourceClaim, що може статися, оскільки ми виділяємо частки (або підмножини) пристроїв. Це обмеження забезпечує, щоб кожне виділення посилалося на окремий ресурс, навіть якщо вони належать до одного й того ж класу пристроїв.&lt;/p&gt;
&lt;p&gt;Це корисно для таких випадків, як виділення мережевих пристроїв, що підключаються до різних підмереж, щоб розширити покриття або забезпечити резервування в різних зонах відмов.&lt;/p&gt;
&lt;h2 id=&#34;як-використовувати-споживчу-ємність&#34;&gt;Як використовувати споживчу ємність?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;DRAConsumableCapacity&lt;/code&gt; була представлена як альфа-функція в Kubernetes 1.34. &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;Функціональна можливість&lt;/a&gt; &lt;code&gt;DRAConsumableCapacity&lt;/code&gt; має бути увімкнена в kubelet, kube-apiserver, kube-scheduler і 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;як-розробник-драйвера-dra&#34;&gt;Як розробник драйвера DRA&lt;/h3&gt;
&lt;p&gt;Як розробник драйвера DRA, що пише на Golang, ви можете зробити пристрій у межах ResourceSlice доступним для кількох ResourceClaims (або &lt;code&gt;devices.requests&lt;/code&gt;), встановивши &lt;code&gt;AllowMultipleAllocations&lt;/code&gt; на &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;Додатково, ви можете визначити політику, щоб обмежити те, як кожен &lt;code&gt;DeviceRequest&lt;/code&gt; повинен споживати &lt;code&gt;Capacity&lt;/code&gt; кожного пристрою, визначивши поле &lt;code&gt;RequestPolicy&lt;/code&gt; у &lt;code&gt;DeviceCapacity&lt;/code&gt;. Приклад нижче показує, як визначити політику, яка вимагає, щоб GPU з 40 ГіБ памʼяті виділяв щонайменше 5 ГіБ на запит, при цьому кожне виділення має бути кратним 5 ГіБ.&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;Це буде опубліковано в ResourceSlice, як частково показано нижче:&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;Віділений пристрій з певною часткою спожитої ємності матиме поле &lt;code&gt;ShareID&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;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;Цей &lt;code&gt;ShareID&lt;/code&gt; дозволяє драйверу розрізняти різні віділення, які посилаються на &lt;strong&gt;той самий пристрій або той самий статично виділений сегмент&lt;/strong&gt;, але походять з &lt;strong&gt;різних запитів &lt;code&gt;ResourceClaim&lt;/code&gt;&lt;/strong&gt;. Він діє як унікальний ідентифікатор для кожного спільного сегмента, дозволяючи драйверу незалежно керувати та застосовувати обмеження ресурсів для декількох споживачів.&lt;/p&gt;
&lt;h3 id=&#34;як-споживач&#34;&gt;Як споживач&lt;/h3&gt;
&lt;p&gt;Як споживач (або користувач), ресурс пристрою можна запитати за допомогою ResourceClaim, як показано нижче:&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;# для пристроїв&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# для ресурсів, які повинні бути надані цими пристроями&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Ця конфігурація забезпечує, що запитуваний пристрій може надати щонайменше 10ГіБ памʼяті.&lt;/p&gt;
&lt;p&gt;Зокрема, &lt;strong&gt;будь-який&lt;/strong&gt; пристрій &lt;code&gt;resource.example.com&lt;/code&gt;, який має щонайменше 10ГіБ памʼяті, може бути виділений. Якщо вибрано пристрій, який не підтримує кілька виділень, виділення використовуватиме весь пристрій. Щоб відфільтрувати лише пристрої, які підтримують кілька виділень, ви можете визначити селектор, як показано нижче:&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;інтеграція-зі-статусом-пристроїв-dra&#34;&gt;Інтеграція зі статусом пристроїв DRA&lt;/h2&gt;
&lt;p&gt;У спільному використанні пристроїв загальна інформація про пристрій надається через ресурсний зріз. Однак деякі деталі встановлюються динамічно після виділення. Ці дані можна передати за допомогою поля &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceclaim-device-status&#34;&gt;&lt;code&gt;.status.devices&lt;/code&gt;&lt;/a&gt; у ResourceClaim. Це поле публікується лише в кластерах, де увімкнено &lt;code&gt;DRAResourceClaimDeviceStatus&lt;/code&gt; feature gate.&lt;/p&gt;
&lt;p&gt;Якщо у вас є підтримка &lt;em&gt;статусу пристроїв&lt;/em&gt;, драйвер може надати додаткову інформацію про пристрій, виходячи за межі &lt;code&gt;ShareID&lt;/code&gt;. Одним із особливо корисних випадків є віртуальні мережі, де драйвер може включити призначену IP-адресу(и) у статус. Це цінно як для операцій мережевих служб, так і для усунення несправностей.&lt;/p&gt;
&lt;p&gt;Ви можете знайти більше інформації, переглянувши нашу запис: &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;що-ви-можете-зробити-далі&#34;&gt;Що ви можете зробити далі?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Перегляньте проєкт &lt;a href=&#34;https://github.com/kubernetes-sigs/cni-dra-driver&#34;&gt;CNI DRA Driver&lt;/a&gt;&lt;/strong&gt; для прикладу інтеграції DRA в мережі Kubernetes. Спробуйте інтегруватися з мережевими ресурсами, такими як &lt;code&gt;macvlan&lt;/code&gt;, &lt;code&gt;ipvlan&lt;/code&gt; або смарт NIC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Увімкніть функціональну можливість &lt;code&gt;DRAConsumableCapacity&lt;/code&gt; та експериментуйте з віртуалізованими або роздільними пристроями. Визначте свої робочі навантаження з &lt;em&gt;споживаною ємністю&lt;/em&gt; (наприклад: дробова пропускна здатність або памʼять).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Дайте нам знати вашу думку:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Що спрацювало добре?&lt;/li&gt;
&lt;li&gt;⚠️ Що не спрацювало?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Якщо ви зіткнулися з проблемами, які потрібно виправити, або можливостями для вдосконалення, будь ласка, &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues&#34;&gt;створіть новий тікет&lt;/a&gt; і посилайтеся та пошліться на &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/5075&#34;&gt;KEP-5075&lt;/a&gt; там, або звʼяжіться з нами через &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;висновок&#34;&gt;Висновок&lt;/h3&gt;
&lt;p&gt;Підтримка споживчої ємності покращує можливості спільного використання пристроїв DRA, дозволяючи ефективне спільне використання пристроїв між просторами імен, між запитами та адаптуючи їх до фактичних потреб кожного Podʼа. Це також надає драйверам можливість забезпечувати обмеження ємності, покращує точність планування та відкриває нові випадки використання, такі як обізнаність про пропускну здатність мережі та спільне використання пристроїв у багатокористувацькому середовищі.&lt;/p&gt;
&lt;p&gt;Спробуйте це, експериментуйте зі споживаними ресурсами та допоможіть сформувати майбутнє динамічного виділення ресурсів у Kubernetes!&lt;/p&gt;
&lt;h3 id=&#34;додатково-ознайомтеся-з&#34;&gt;Додатково ознайомтеся з&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;Документація DRA в Kubernetes&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 для 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 для 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 для 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: Звіт про стан ресурсів DRA в Podʼах</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/17/kubernetes-v1-34-pods-report-dra-resource-health/</guid>
      <description>
        
        
        &lt;p&gt;Зростання популярності штучного інтелекту (AI) та машинного навчання (ML) та інших високопродуктивних робочих навантажень зробило спеціалізоване обладнання, таке як графічні процесори (GPU), процесори для обробки даних (TPU) та програмовані логічні матриці (FPGA), критично важливим компонентом багатьох кластерів Kubernetes. Однак, як обговорювалося в &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/07/03/navigating-failures-in-pods-with-devices/&#34;&gt;попередньому блозі про пошук збоїв у Podʼах з пристроями&lt;/a&gt;, коли це обладнання виходить з ладу, його може бути важко діагностувати, що призводить до значного часу простою. З випуском Kubernetes v1.34 ми раді оголосити про нову альфа-функцію, яка забезпечує необхідну видимість стану цих пристроїв.&lt;/p&gt;
&lt;p&gt;Ця робота розширює функціональність &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;, яка вперше представила механізм для звітування про стан пристроїв, що керуються втулками пристроїв. Тепер ця можливість розширюється на &lt;em&gt;Динамічне виділення ресурсів (DRA)&lt;/em&gt;. Контрольована через функціональну можливість &lt;code&gt;ResourceHealthStatus&lt;/code&gt;, це вдосконалення дозволяє драйверам DRA звітувати про стан пристроїв безпосередньо в поле &lt;code&gt;.status&lt;/code&gt; Podʼа, надаючи важливу інформацію для операторів і розробників.&lt;/p&gt;
&lt;h2 id=&#34;чому-важливо-показувати-стан-пристроїв-у-статусі-podʼа&#34;&gt;Чому важливо показувати стан пристроїв у статусі Podʼа?&lt;/h2&gt;
&lt;p&gt;Для стану застосунків або тривалих завдань збій пристрою може бути руйнівним і витратним. Експонуючи стан пристроїв у полі &lt;code&gt;.status&lt;/code&gt; для Podʼа, Kubernetes надає стандартизований спосіб для користувачів і автоматизованих інструментів швидко діагностувати проблеми. Якщо Pod зазнає збою, ви тепер можете перевірити його статус, щоб дізнатися, чи є несправний пристрій основною причиною, заощаджуючи цінний час, який інакше міг би бути витрачений на налагодження коду застосунку.&lt;/p&gt;
&lt;h2 id=&#34;як-це-працює&#34;&gt;Як це працює&lt;/h2&gt;
&lt;p&gt;Ця функція вводить новий, необовʼязковий канал звʼязку між Kubelet і драйверами DRA, побудований на трьох основних компонентах.&lt;/p&gt;
&lt;h3 id=&#34;новий-grpc-сервіс-перевірки-справності&#34;&gt;Новий gRPC сервіс перевірки справності&lt;/h3&gt;
&lt;p&gt;Новий gRPC сервіс, &lt;code&gt;DRAResourceHealth&lt;/code&gt;, визначено в групі API &lt;code&gt;dra-health/v1alpha1&lt;/code&gt;. Драйвери DRA можуть реалізувати цей сервіс для потокової передачі оновлень стану пристроїв до Kubelet. Сервіс включає серверний стрім RPC &lt;code&gt;NodeWatchResources&lt;/code&gt;, який надсилає статус справності (&lt;code&gt;Healthy&lt;/code&gt;, &lt;code&gt;Unhealthy&lt;/code&gt; або &lt;code&gt;Unknown&lt;/code&gt;) для пристроїв, якими він керує.&lt;/p&gt;
&lt;h3 id=&#34;інтеграція-з-kubelet&#34;&gt;Інтеграція з Kubelet&lt;/h3&gt;
&lt;p&gt;Менеджер втулків DRA в Kubelet виявляє, які драйвери реалізують сервіс перевірки справності. Для кожного сумісного драйвера він запускає довготривалий стрім &lt;code&gt;NodeWatchResources&lt;/code&gt;, щоб отримувати оновлення стану. Менеджер DRA потім споживає ці оновлення та зберігає їх у постійному кеші &lt;code&gt;healthInfoCache&lt;/code&gt;, який може пережити перезавантаження Kubelet.&lt;/p&gt;
&lt;h3 id=&#34;заповнення-статусу-podʼа&#34;&gt;Заповнення статусу Podʼа&lt;/h3&gt;
&lt;p&gt;Коли стан пристрою змінюється, менеджер DRA ідентифікує всі Podʼи, на які вплинула зміна, і ініціює оновлення статусу Podʼа. Нове поле, &lt;code&gt;allocatedResourcesStatus&lt;/code&gt;, тепер є частиною обʼєкта API &lt;code&gt;v1.ContainerStatus&lt;/code&gt;. Kubelet заповнює це поле поточним станом кожного пристрою, виділеного контейнеру.&lt;/p&gt;
&lt;h2 id=&#34;практичний-приклад&#34;&gt;Практичний приклад&lt;/h2&gt;
&lt;p&gt;Якщо Pod знаходиться в стані &lt;code&gt;CrashLoopBackOff&lt;/code&gt;, ви можете використовувати &lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt;&lt;/code&gt;, щоб перевірити його статус. Якщо виділений пристрій зазнав збою, вивід тепер включатиме поле &lt;code&gt;allocatedResourcesStatus&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;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;# ... інші стани контейнерів&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Цей явний статус чітко вказує на те, що проблема полягає в апаратному забезпеченні, а не в застосунку.&lt;/p&gt;
&lt;p&gt;Тепер ви можете вдосконалити логіку виявлення збоїв, щоб реагувати на несправні пристрої, повʼязані з Podʼом, скасування планування Podʼа.&lt;/p&gt;
&lt;h2 id=&#34;як-використовувати-цю-функцію&#34;&gt;Як використовувати цю функцію&lt;/h2&gt;
&lt;p&gt;Оскільки це альфа-функція в Kubernetes v1.34, ви повинні виконати такі кроки, щоб використовувати її:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Увімкніть функціональну можливість &lt;code&gt;ResourceHealthStatus&lt;/code&gt; на вашому kube-apiserver та kubelet.&lt;/li&gt;
&lt;li&gt;Переконайтеся, що ви використовуєте драйвер DRA, який реалізує gRPC сервіс &lt;code&gt;v1alpha1 DRAResourceHealth&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;драйвери-dra&#34;&gt;Драйвери DRA&lt;/h2&gt;
&lt;p&gt;Якщо ви розробляєте драйвер DRA, обовʼязково подумайте про стратегію виявлення збоїв пристроїв і переконайтеся, що ваш драйвер інтегрований з цією функцією. Таким чином, ваш драйвер покращить досвід використання користувачами і спростить налагодження проблем з апаратним забезпеченням.&lt;/p&gt;
&lt;h2 id=&#34;що-далі&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Це перший крок у більш широких зусиллях щодо покращення обробки збоїв пристроїв у Kubernetes. Збираючи відгуки про цю альфа-функцію, спільнота планує кілька ключових вдосконалень перед переходом до бета-версії:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Детальні повідомлення про стан справності:&lt;/em&gt; Щоб покращити досвід налагодження, ми плануємо додати поле з повідомленням зрозумілими людям до gRPC API. Це дозволить драйверам DRA надавати конкретний контекст для стану справності, наприклад, &amp;quot;Температура GPU перевищує поріг&amp;quot; або &amp;quot;Зʼєднання NVLink втрачено&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Конфігуровані тайм-аути перевірки справності:&lt;/em&gt; Тайм-аут для позначення стану справності пристрою як &amp;quot;Unknown&amp;quot; наразі жорстко прописаним у коді. Ми плануємо зробити це конфігурованим, ймовірно, на основі кожного драйвера, щоб краще врахувати різні характеристики звітності про стан справності різного апаратного забезпечення.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Покращене усунення несправностей після виходу з ладу:&lt;/em&gt; Ми вирішимо відому обмеженість, коли оновлення стану справності можуть не застосовуватися до Podʼів, які вже завершили свою роботу. Це виправлення забезпечить збереження стану справності пристрою на момент збою, що є критично важливим для налагодження пакетних завдань та інших &amp;quot;завдань, що виконуються до завершення&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ця функція була розроблена в рамках &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;, і відгуки спільноти є критично важливими, оскільки ми працюємо над її переходом до бета-версії. Ми маємо більше вдосконалень обробки збоїв пристроїв у k8s і закликаємо вас спробувати це та поділитися своїм досвідом з спільнотою SIG Node!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Volume Group Snapshots переходить в v1beta2</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/16/kubernetes-v1-34-volume-group-snapshot-beta-2/</guid>
      <description>
        
        
        &lt;p&gt;Volume group snapshots було &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2023/05/08/kubernetes-1-27-volume-group-snapshot-alpha/&#34;&gt;представлено&lt;/a&gt; як функцію Alpha у випуску Kubernetes 1.27, зміна у &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2024/12/18/kubernetes-1-32-volume-group-snapshot-beta/&#34;&gt;Beta&lt;/a&gt; — у випуску Kubernetes 1.32. Останній випуск Kubernetes v1.34 переніс цю підтримку на другий бета-етап. Підтримка знімків групи томів спирається на набір &lt;a href=&#34;https://kubernetes-csi.github.io/docs/group-snapshot-restore-feature.html#volume-group-snapshot-apis&#34;&gt;додаткових API для групових знімків&lt;/a&gt;. Ці API дозволяють користувачам робити знімки, що відповідають аварійним ситуаціям, для набору томів. За лаштунками Kubernetes використовує селектор міток для групування кількох PersistentVolumeClaims для знімків. Основна мета полягає в тому, щоб дозволити вам відновити цей набір знімків на нові томи та відновити вашу роботу на основі точки відновлення, що відповідає аварійним ситуаціям.&lt;/p&gt;
&lt;p&gt;Ця нова функція підтримується лише для &lt;a href=&#34;https://kubernetes-csi.github.io/docs/&#34;&gt;CSI&lt;/a&gt; драйверів томів.&lt;/p&gt;
&lt;h2 id=&#34;що-нового-в-beta-2&#34;&gt;Що нового в Beta 2?&lt;/h2&gt;
&lt;p&gt;Під час тестування бета-версії ми зіткнулися з &lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshotter/issues/1271&#34;&gt;проблемою&lt;/a&gt;, коли поле &lt;code&gt;restoreSize&lt;/code&gt; не встановлюється для окремих VolumeSnapshotContents і VolumeSnapshots, якщо драйвер CSI не реалізує виклик RPC ListSnapshots. Ми оцінили різні варіанти &lt;a href=&#34;https://docs.google.com/document/d/1LLBSHcnlLTaP6ZKjugtSGQHH2LGZPndyfnNqR1YvzS4/edit?tab=t.0&#34;&gt;тут&lt;/a&gt; і вирішили внести цю зміну, випустивши нову бета-версію для API.&lt;/p&gt;
&lt;p&gt;Конкретно, у v1beta2 додано структуру VolumeSnapshotInfo, яка містить інформацію про окремий знімок тома, що є членом знімка групи томів. VolumeSnapshotInfoList, список VolumeSnapshotInfo, додано до VolumeGroupSnapshotContentStatus, замінюючи VolumeSnapshotHandlePairList. VolumeSnapshotInfoList — це список інформації про знімки, повернутий драйвером CSI для ідентифікації знімків у системі зберігання. VolumeSnapshotInfoList заповнюється бічним контейнером csi-snapshotter на основі відповіді CSI CreateVolumeGroupSnapshotResponse, поверненої викликом CreateVolumeGroupSnapshot драйвера CSI.&lt;/p&gt;
&lt;p&gt;Наявні обʼєкти API v1beta1 будуть перетворені на нові обʼєкти API v1beta2 за допомогою вебхука перетворення.&lt;/p&gt;
&lt;h2 id=&#34;що-далі&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Залежно від відгуків та впровадження, проєкт Kubernetes планує перенести реалізацію знімків групи томів у загальну доступність (GA) у майбутньому випуску.&lt;/p&gt;
&lt;h2 id=&#34;як-дізнатися-більше&#34;&gt;Як дізнатися більше?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3476-volume-group-snapshot&#34;&gt;Дизайн-специфікація&lt;/a&gt;
для функції знімків групи томів.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshotter&#34;&gt;Репозиторій коду&lt;/a&gt; для API знімків групи томів
та контролера.&lt;/li&gt;
&lt;li&gt;CSI &lt;a href=&#34;https://kubernetes-csi.github.io/docs/&#34;&gt;документація&lt;/a&gt; про функцію знімків групи.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;як-взяти-участь&#34;&gt;Як взяти участь?&lt;/h2&gt;
&lt;p&gt;Цей проєкт, як і весь Kubernetes, є результатом наполегливої роботи багатьох учасників з різним досвідом, які працюють разом. Від імені SIG Storage я хотів би висловити величезну подяку всім учасникам, які допомогли проєкту досягти бета-версії за останні кілька кварталів:&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;Якщо ви зацікавлені взяти участь у проєктуванні та розробці CSI або будь-якої частини системи зберігання Kubernetes, приєднуйтесь до &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;Kubernetes Storage Special Interest Group&lt;/a&gt; (SIG). Ми завжди раді новим учасникам.&lt;/p&gt;
&lt;p&gt;Ми також проводимо регулярні &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-data-protection&#34;&gt;Data Protection Working Group meetings&lt;/a&gt;. Нові учасники завжди можуть приєднатися до наших обговорень.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Виділений Taint Manager тепер Stable</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/15/kubernetes-v1-34-decoupled-taint-manager-is-now-stable/</guid>
      <description>
        
        
        &lt;p&gt;Ця функція відокремлює відповідальність за управління життєвим циклом вузлів і виселенням podʼів на два окремі компоненти. Раніше контролер життєвого циклу вузлів обробляв як позначення вузлів як несправних з позначкам (taints) NoExecute, так і виселення podʼів з них. Тепер спеціалізований контролер виселення на основі позначок taint керує процесом, тоді як контролер життєвого циклу вузлів зосереджується виключно на проставлянні taintʼів. Це відокремлення не тільки покращує організацію коду, але й спрощує вдосконалення контролера виселення або створення власних реалізацій виселення на основі позначок.&lt;/p&gt;
&lt;h2 id=&#34;що-нового&#34;&gt;Що нового?&lt;/h2&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;SeparateTaintEvictionController&lt;/code&gt; була підвищена до GA в цьому випуску. Користувачі можуть за бажанням вимкнути виселення на основі taintʼів, встановивши &lt;code&gt;--controllers=-taint-eviction-controller&lt;/code&gt; в kube-controller-manager.&lt;/p&gt;
&lt;h2 id=&#34;як-дізнатися-більше&#34;&gt;Як дізнатися більше?&lt;/h2&gt;
&lt;p&gt;Для отримання додаткової інформації зверніться до &lt;a href=&#34;http://kep.k8s.io/3902&#34;&gt;KEP&lt;/a&gt; та до статті про бета-версію: &lt;a href=&#34;https://deploy-preview-48551--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;як-взяти-участь&#34;&gt;Як взяти участь?&lt;/h2&gt;
&lt;p&gt;Ми висловлюємо величезну подяку всім учасникам, які допомогли з проєктуванням, реалізацією та рецензуванням цієї функції та допомогли перевести її з бета-версії в стабільну:&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 1.34: Автоконфігурація для драйвера Node Cgroup переходить у стадію загальної доступності (GA)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/</guid>
      <description>
        
        
        &lt;p&gt;Історично, налаштування правильного драйвера cgroup було болючою точкою для користувачів, які запускали нові кластери Kubernetes. В системах Linux існують два різні драйвери cgroup: &lt;code&gt;cgroupfs&lt;/code&gt; і &lt;code&gt;systemd&lt;/code&gt;. У минулому як &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/kubelet/&#34;&gt;kubelet&lt;/a&gt;, так і реалізація CRI (така як CRI-O або containerd) повинні були бути налаштовані на використання одного й того ж драйвера cgroup, інакше kubelet поводився б неправильно без жодного явного повідомлення про помилку. Це було джерелом головного болю для багатьох адміністраторів кластерів. Тепер ми (майже) поклали край цьому головному болю.&lt;/p&gt;
&lt;h2 id=&#34;автоматичне-виявлення-драйвера-cgroup&#34;&gt;Автоматичне виявлення драйвера cgroup&lt;/h2&gt;
&lt;p&gt;У v1.28.0 спільнота SIG Node представила функціональну можливість &lt;code&gt;KubeletCgroupDriverFromCRI&lt;/code&gt;, яка вказує kubelet запитувати у реалізації CRI, який драйвер cgroup використовувати. Ви можете прочитати більше &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2024/08/21/cri-cgroup-driver-lookup-now-beta/&#34;&gt;тут&lt;/a&gt;. Після багатьох випусків очікування, поки кожна реалізація CRI випустить основні версії та упакує їх у основні операційні системи, ця функція стала загальнодоступною (GA) з Kubernetes 1.34.0.&lt;/p&gt;
&lt;p&gt;На додачу до налаштування функціональної можливості, адміністратори кластерів повинні переконатися, що їх реалізації CRI є достатньо новими:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;containerd: Підтримка була додана в v2.0.0&lt;/li&gt;
&lt;li&gt;CRI-O: Підтримка була додана в v1.28.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;Оголошення: Kubernetes припиняє підтримку containerd v1.y&lt;/h2&gt;
&lt;p&gt;Хоча CRI-O випускає версії, які відповідають версіям Kubernetes, і, отже, версії CRI-O без цієї поведінки більше не підтримуються, containerd підтримує свій власний цикл випуску. Підтримка containerd для цієї функції доступна лише в v2.0 і пізніших версіях, але Kubernetes 1.34 все ще підтримує containerd 1.7 та інші LTS випуски containerd.&lt;/p&gt;
&lt;p&gt;Спільнота Kubernetes SIG Node формально погодилася на остаточний графік підтримки для containerd v1.y. Останній випуск Kubernetes, який запропонує цю підтримку, буде останньою випущеною версією v1.35, а підтримка буде припинена у v1.36.0. Щоб допомогти адміністраторам у керуванні цією майбутньою трансформацією, доступний новий механізм виявлення. Ви можете моніторити метрику &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt;, щоб визначити, чи використовують будь-які вузли у вашому кластері версію containerd, яка незабаром стане застарілою. Наявність цієї метрики з міткою версії &lt;code&gt;1.36.0&lt;/code&gt; вказуватиме на те, що рушій виконання контейнерів вузла недостатньо новий для майбутніх вимог. Відповідно, адміністратору потрібно буде оновити containerd до v2.0 або пізнішої версії до або одночасно з оновленням kubelet до v1.36.0.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Mutable CSI Node Allocatable переходить в Beta</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/11/kubernetes-v1-34-mutable-csi-node-allocatable-count/</guid>
      <description>
        
        
        &lt;p&gt;Функція &lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;для драйверів CSI, що дозволяє оновлювати інформацію про кількість підключених томів на вузлах&lt;/a&gt;, вперше представлена в альфа-версії Kubernetes v1.33, перейшла в &lt;strong&gt;бета-версію&lt;/strong&gt; у випуску Kubernetes v1.34! Це є важливою віхою у підвищенні точності планування podʼівв із збереженням стану шляхом зменшення кількості збоїв, спричинених застарілою інформацією про ємність підключених томів.&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Традиційно, &lt;a href=&#34;https://kubernetes-csi.github.io/docs/introduction.html&#34;&gt;CSI драйвери&lt;/a&gt; Kubernetes повідомляють про статичний максимальний ліміт підключення томів під час ініціалізації. Однак фактичні ємності підключення можуть змінюватися протягом життєвого циклу вузла з різних причин, таких як:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ручні або зовнішні операції з підключення/відключення томів поза контролем Kubernetes.&lt;/li&gt;
&lt;li&gt;Динамічно підключені мережеві інтерфейси або спеціалізоване обладнання (GPU, NIC тощо), що споживає доступні слоти.&lt;/li&gt;
&lt;li&gt;Сценарії з кількома драйверами, коли операції одного драйвера CSI впливають на доступну ємність, про яку повідомляє інший.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Статичне звітування може призвести до того, що Kubernetes запланує поди на вузлах, які, здається, мають ємність, але насправді не мають, що призводить до зависання подів у стані &lt;code&gt;ContainerCreating&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;динамічна-адаптація-лімітів-томів-csi&#34;&gt;Динамічна адаптація лімітів томів CSI&lt;/h2&gt;
&lt;p&gt;Завдяки цій новій функції Kubernetes дозволяє драйверам CSI динамічно налаштовувати та повідомляти про ємності підключення вузлів під час виконання. Це забезпечує наявність у планувальника, а також інших компонентів, які покладаються на цю інформацію, найбільш точної та актуальної інформації про ємність вузлів.&lt;/p&gt;
&lt;h3 id=&#34;як-це-працює&#34;&gt;Як це працює&lt;/h3&gt;
&lt;p&gt;Kubernetes підтримує два механізми для оновлення інформації про ліміти томів вузлів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Періодичні оновлення:&lt;/strong&gt; Драйвери CSI вказують інтервал для періодичного оновлення виділеної ємності вузла.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Реактивні оновлення:&lt;/strong&gt; Негайне оновлення, яке викликається, коли операція підключення тому не вдається через вичерпані ресурси (помилка &lt;code&gt;ResourceExhausted&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;увімкнення-функції&#34;&gt;Увімкнення функції&lt;/h3&gt;
&lt;p&gt;Щоб використовувати цю бета-функцію, необхідно увімкнути функціональну можливість &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt; в компонентах:&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;приклад-конфігурації-драйвера-csi&#34;&gt;Приклад конфігурації драйвера CSI&lt;/h3&gt;
&lt;p&gt;Нижче наведено приклад конфігурації драйвера CSI для увімкнення періодичних оновлень кожні 60 секунд:&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;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.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;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;nodeAllocatableUpdatePeriodSeconds&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;60&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;Ця конфігурація вказує kubelet періодично викликати метод &lt;code&gt;NodeGetInfo&lt;/code&gt; драйвера CSI кожні 60 секунд, оновлюючи кількість виділених томів вузла. Kubernetes забезпечує мінімальний інтервал оновлення в 10 секунд, щоб збалансувати точність і використання ресурсів.&lt;/p&gt;
&lt;h3 id=&#34;негайні-оновлення-при-збоях-підключення&#34;&gt;Негайні оновлення при збоях підключення&lt;/h3&gt;
&lt;p&gt;Коли операція підключення тому не вдається через помилку &lt;code&gt;ResourceExhausted&lt;/code&gt; (код gRPC &lt;code&gt;8&lt;/code&gt;), Kubernetes негайно оновлює кількість виділених томів замість того, щоб чекати наступного періодичного оновлення. Kubelet потім позначає постраждалі поди як Failed, що дозволяє їх контролерам відтворити їх. Це запобігає зависанню подів у стані &lt;code&gt;ContainerCreating&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;як-почати-використовувати&#34;&gt;Як почати використовувати&lt;/h2&gt;
&lt;p&gt;Щоб увімкнути цю функцію у вашому кластері Kubernetes v1.34:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Увімкніть функціональну можливість &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt; в компонентах &lt;code&gt;kube-apiserver&lt;/code&gt; та &lt;code&gt;kubelet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Оновіть конфігурацію вашого драйвера CSI, встановивши &lt;code&gt;nodeAllocatableUpdatePeriodSeconds&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Моніторте та спостерігайте за покращеннями в точності планування та надійності розміщення подів.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;наступні-кроки&#34;&gt;Наступні кроки&lt;/h2&gt;
&lt;p&gt;Ця функція наразі знаходиться на стадії бета-тестування, і спільнота Kubernetes вітає ваші відгуки. Тестуйте її, діліться своїм досвідом і допомагайте спрямовувати її еволюцію до стабільності GA.&lt;/p&gt;
&lt;p&gt;Приєднуйтесь до обговорень у &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;, щоб сформувати майбутнє можливостей зберігання Kubernetes.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Використання контейнера ініціалізації для визначення змінних середовища застосунку</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/10/kubernetes-v1-34-env-files/</link>
      <pubDate>Wed, 10 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/10/kubernetes-v1-34-env-files/</guid>
      <description>
        
        
        &lt;p&gt;Зазвичай Kubernetes використовує ConfigMaps і Secrets для встановлення змінних середовища, що призводить до додаткових викликів API та складності. Наприклад, вам потрібно окремо керувати Podʼами ваших робочих навантажень і їх конфігураціями, забезпечуючи при цьому впорядковані оновлення як для конфігурацій, так і для Podʼів робочих навантажень.&lt;/p&gt;
&lt;p&gt;Альтернативно, ви можете використовувати контейнер, наданий постачальником, який вимагає змінних середовища (таких як ліцензійний ключ або одноразовий токен), але ви не хочете їх жорстко прописувати в коді або монтувати томи лише для того, щоб виконати завдання.&lt;/p&gt;
&lt;p&gt;Якщо ви опинилися в такій ситуації, у вас тепер є новий (альфа) спосіб досягти цього. За умови, що у вас увімкнено &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;функціональну можливість&lt;/a&gt; &lt;code&gt;EnvFiles&lt;/code&gt; у вашому кластері, ви можете вказати kubelet завантажити змінні середовища контейнера з тому (цей том повинен бути частиною Podʼа, до якого належить контейнер). Ця функціональна можливість дозволяє вам завантажувати змінні середовища безпосередньо з файлу з тома emptyDir без фактичного монтування цього файлу в контейнер. Це просте, але елегантне рішення для деяких дивовижно поширених проблем.&lt;/p&gt;
&lt;h2 id=&#34;що-це-все-означає&#34;&gt;Що це все означає?&lt;/h2&gt;
&lt;p&gt;В основі цієї функціональності лежить можливість вказати контейнеру файл, який генерується &lt;code&gt;initContainer&lt;/code&gt;, і дозволити Kubernetes розкласти цей файл на складники для встановлення змінних середовища. Файл розташовується в томі &lt;code&gt;emptyDir&lt;/code&gt; (тимчасовому сховищі, яке існує так довго, як існує pod), ваш основний контейнер не потребує монтування тому. Kubelet прочитає файл і впровадить ці змінні, коли контейнер запуститься.&lt;/p&gt;
&lt;h2 id=&#34;як-це-працює&#34;&gt;Як це працює&lt;/h2&gt;
&lt;p&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;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;Використання цього підходу дуже просте. Ви визначаєте свої змінні середовища в специфікації podʼа, використовуючи поле &lt;code&gt;fileKeyRef&lt;/code&gt;, яке вказує Kubernetes, де знайти файл і який ключ витягти. Сам файл нагадує стандарт для синтаксису .env (подумайте про KEY=VALUE), і (принаймні у цій альфа-стадії) ви повинні переконатися, що він записується в том &lt;code&gt;emptyDir&lt;/code&gt;. Інші типи томів не підтримуються для цієї функції. Принаймні один контейнер ініціалізації повинен змонтувати цей том &lt;code&gt;emptyDir&lt;/code&gt; (щоб записати файл), але основний контейнер не потребує цього — він просто отримує змінні, передані йому під час запуску.&lt;/p&gt;
&lt;h2 id=&#34;слово-про-безпеку&#34;&gt;Слово про безпеку&lt;/h2&gt;
&lt;p&gt;Хоча ця функція підтримує обробку чутливих даних, таких як ключі або токени, слід зазначити, що її реалізація спирається на томи &lt;code&gt;emptyDir&lt;/code&gt;, змонтовані в pod. Оператори з доступом до файлової системи вузлів можуть легко отримати ці чутливі дані через шляхи тек podʼа.&lt;/p&gt;
&lt;p&gt;Якщо ви зберігаєте чутливі дані, такі як ключі або токени, за допомогою цієї функції, переконайтеся, що політики безпеки вашого кластера ефективно захищають вузли від несанкціонованого доступу, щоб запобігти витоку конфіденційної інформації.&lt;/p&gt;
&lt;h2 id=&#34;підсумок&#34;&gt;Підсумок&lt;/h2&gt;
&lt;p&gt;Ця функція усуне ряд складних обхідних шляхів, які використовуються сьогодні, спростивши створення застосунків і відкриваючи нові можливості для використання. Kubernetes залишається гнучким і відкритим для відгуків. Скажіть нам, як ви використовуєте цю функцію або що її бракує.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Кеш сервера API, що підтримує створення знімків стану</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/09/kubernetes-v1-34-snapshottable-api-server-cache/</guid>
      <description>
        
        
        &lt;p&gt;Роками спільнота Kubernetes працює над поліпшенням стабільності та передбачуваності продуктивності сервера API. Основна увага в цих зусиллях була зосереджена на обробці запитів &lt;strong&gt;list&lt;/strong&gt;, які історично були основним джерелом високого використання памʼяті та великого навантаження на сховище &lt;code&gt;etcd&lt;/code&gt;. З кожним випуском ми поступово розвʼязували цю проблему, і сьогодні ми раді оголосити про завершення останнього великого етапу цього процесу.&lt;/p&gt;
&lt;p&gt;Функція &lt;em&gt;кешу сервера API, що підтримує створення знімків&lt;/em&gt;, перейшла в &lt;strong&gt;бета-версію&lt;/strong&gt; в Kubernetes v1.34, що стало кульмінацією зусиль впродовж кількох випусків, спрямованих на те, щоб практично всі запити на читання могли обслуговуватися безпосередньо з кешу сервера API.&lt;/p&gt;
&lt;h2 id=&#34;еволюція-кешу-для-продуктивності-та-стабільності&#34;&gt;Еволюція кешу для продуктивності та стабільності&lt;/h2&gt;
&lt;p&gt;Шлях до поточного стану включав кілька ключових вдосконалень у недавніх випусках, які проклали шлях для сьогоднішнього оголошення.&lt;/p&gt;
&lt;h3 id=&#34;послідовні-читання-з-кешу-бета-в-v1-31&#34;&gt;Послідовні читання з кешу (бета в v1.31)&lt;/h3&gt;
&lt;p&gt;Хоча сервер API вже давно використовує кеш для підвищення продуктивності, ключовим етапом стало забезпечення &lt;em&gt;послідовних читань останніх даних&lt;/em&gt; з нього. Це вдосконалення v1.31 дозволило вперше використовувати кеш спостереження для запитів на читання з високою узгодженістю, що стало величезним досягненням, оскільки це дозволило безпечно обслуговувати &lt;em&gt;фільтровані колекції&lt;/em&gt; (наприклад, &amp;quot;список подів, привʼязаних до цього вузла&amp;quot;) з кешу замість etcd, що різко зменшило навантаження на нього для звичайних робочих навантажень.&lt;/p&gt;
&lt;h3 id=&#34;упорядкування-великих-відповідей-за-допомогою-потокової-передачі-бета-в-v1-33&#34;&gt;Упорядкування великих відповідей за допомогою потокової передачі (бета в v1.33)&lt;/h3&gt;
&lt;p&gt;Ще одним ключовим вдосконаленням стало вирішення проблеми сплесків памʼяті під час передачі великих відповідей. Потоковий кодувальник, представлений у v1.33, дозволив серверу API надсилати елементи списку по одному, а не буферизувати всю багатогігабайтну відповідь у пам&#39;яті. Це зробило витрати памʼяті на надсилання відповіді передбачуваними та мінімальними, незалежно від її розміру.&lt;/p&gt;
&lt;h3 id=&#34;відсутня-частина&#34;&gt;Відсутня частина&lt;/h3&gt;
&lt;p&gt;Незважаючи на ці величезні вдосконалення, критичний розрив залишався. Будь-який запит на історичний &lt;code&gt;LIST&lt;/code&gt;, найчастіше використовуваний для пагінації через великі набори результатів, все ще повинен був обійти кеш і безпосередньо запитати &lt;code&gt;etcd&lt;/code&gt;. Це означало, що вартість &lt;em&gt;отримання&lt;/em&gt; даних все ще була непередбачуваною і могла створити значний тиск на памʼять сервера API.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes-1-34-створення-знімків-довершує-картину&#34;&gt;Kubernetes 1.34: створення знімків довершує картину&lt;/h2&gt;
&lt;p&gt;Кеш сервера API, що підтримує створення знімків, розвʼязує цю останню частину головоломки. Ця функція покращує кеш спостереження, дозволяючи йому генерувати ефективні, точкові знімки свого стану.&lt;/p&gt;
&lt;p&gt;Ось як це працює: для кожного оновлення кеш створює легкий знімок. Ці знімки є &amp;quot;лінивими (lazy) копіями&amp;quot;, що означає, що вони не дублюють обʼєкти, а просто зберігають вказівники, що робить їх неймовірно ефективними з точки зору памʼяті.&lt;/p&gt;
&lt;p&gt;Коли надходить запит &lt;strong&gt;LIST&lt;/strong&gt; на історичний &lt;code&gt;resourceVersion&lt;/code&gt;, сервер API тепер знаходить відповідний знімок і обслуговує відповідь безпосередньо з памʼяті. Це закриває останній великий розрив, дозволяючи обслуговувати запити на пагінацію повністю з кешу.&lt;/p&gt;
&lt;h2 id=&#34;нова-ера-продуктивності-сервера-api&#34;&gt;Нова ера продуктивності сервера API 🚀&lt;/h2&gt;
&lt;p&gt;З цим останнім елементом на місці синергія цих трьох функцій відкриває нову еру передбачуваності та продуктивності сервера API:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Отримання даних з кешу&lt;/strong&gt;: &lt;em&gt;Послідовні читання&lt;/em&gt; та &lt;em&gt;кеш, що підтримує створення знімків&lt;/em&gt;, працюють разом, щоб забезпечити обслуговування майже всіх запитів на читання, незалежно від того, чи йдеться про останні дані або історичний знімок, безпосередньо з памʼяті сервера API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Надсилання даних через потік&lt;/strong&gt;: &lt;em&gt;Потокова передача спискових відповідей&lt;/em&gt; забезпечує мінімальний і постійний обсяг памʼяті при відправці цих даних клієнту.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Результатом є система, в якій ресурсні витрати на операції читання майже повністю передбачувані і набагато більш стійкі до сплесків навантаження запитів. Це означає різке зменшення тиску на памʼять, менше навантаження на &lt;code&gt;etcd&lt;/code&gt; і більш стабільну, масштабовану та надійну панель управління для всіх кластерів Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;як-почати&#34;&gt;Як почати&lt;/h2&gt;
&lt;p&gt;З моментом переходу в бета-версію функціональність &lt;code&gt;SnapshottableCache&lt;/code&gt; є &lt;strong&gt;стандартно увімкненою&lt;/strong&gt; у Kubernetes v1.34. Необхідних дій для початку використання цих покращень продуктивності та стабільності не потрібно.&lt;/p&gt;
&lt;h2 id=&#34;подяки&#34;&gt;Подяки&lt;/h2&gt;
&lt;p&gt;Особлива подяка за проєктування, впровадження та рецензування цих критичних функцій належить:&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;… та багато інших у SIG API Machinery. Ця віха є свідченням відданості спільноти побудові більш масштабованого та надійного Kubernetes.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: VolumeAttributesClass для зміни атрибутів томів тепер GA</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/08/kubernetes-v1-34-volume-attributes-class/</guid>
      <description>
        
        
        &lt;p&gt;API VolumeAttributesClass, який надає можливість користувачам динамічно змінювати атрибути томів, офіційно перейшов у стадію загальної доступності (GA) у Kubernetes v1.34. Це важлива віхa, яка забезпечує надійний і стабільний спосіб налаштування вашого постійного сховища безпосередньо в Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;what-is-volumeattributesclass&#34;&gt;Що таке VolumeAttributesClass?&lt;/h2&gt;
&lt;p&gt;По суті, VolumeAttributesClass — це ресурс, що охоплює кластер, який визначає набір змінних параметрів для тому. Розглядайте це як &amp;quot;профіль&amp;quot; для вашого сховища, що дозволяє адміністраторам кластерів експонувати різні рівні якості обслуговування (QoS) або продуктивності.&lt;/p&gt;
&lt;p&gt;Користувачі можуть вказати &lt;code&gt;volumeAttributesClassName&lt;/code&gt; у своїх PersistentVolumeClaim (PVC), щоб вказати, який клас атрибутів вони бажають. Чарівність відбувається через Container Storage Interface (CSI): коли PVC, що посилається на VolumeAttributesClass, оновлюється, відповідний драйвер CSI взаємодіє з відповідною системою зберігання, щоб застосувати вказані зміни до тому.&lt;/p&gt;
&lt;p&gt;Це означає, що ви тепер можете:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Динамічно масштабувати продуктивність: збільшити IOPS або пропускну здатність для завантаженої бази даних або зменшити її для менш критичного застосунку.&lt;/li&gt;
&lt;li&gt;Оптимізувати витрати: налаштовувати атрибути на льоту, щоб відповідати вашим поточним потребам, уникаючи надмірного постачання.&lt;/li&gt;
&lt;li&gt;Спростити операції: керувати змінами томів безпосередньо в API Kubernetes, а не покладатися на зовнішні інструменти або ручні процеси.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-new-from-beta-to-ga&#34;&gt;Що нового в GA порівняно з бета&lt;/h2&gt;
&lt;p&gt;Є два основних вдосконалення порівняно з бета.&lt;/p&gt;
&lt;h3 id=&#34;cancellation-support-when-errors-occur&#34;&gt;Підтримка скасування у разі виникнення помилок&lt;/h3&gt;
&lt;p&gt;Щоб покращити стійкість і зручність використання, випуск GA вводить явну підтримку скасування, коли під час запиту на зміну тома виникає помилка. Якщо відповідна система зберігання або драйвер CSI вказує, що запитувані зміни не можуть бути застосовані (наприклад, через недійсні аргументи), користувачі можуть скасувати операцію і повернути том до його попередньої стабільної конфігурації, запобігаючи залишенню тому в несумісному стані.&lt;/p&gt;
&lt;h3 id=&#34;quota-support-based-on-scope&#34;&gt;Підтримка квот на основі області дії&lt;/h3&gt;
&lt;p&gt;Хоча VolumeAttributesClass не додає нового типу квот, панель управління Kubernetes може бути налаштована для примусового дотримання квот на PersistentVolumeClaims, які посилаються на конкретний VolumeAttributesClass.&lt;/p&gt;
&lt;p&gt;Це досягається за допомогою поля &lt;code&gt;scopeSelector&lt;/code&gt; в ResourceQuota для націлювання на PVC, які мають &lt;code&gt;.spec.volumeAttributesClassName&lt;/code&gt;, встановлене на конкретне імʼя VolumeAttributesClass. Будь ласка, дивіться більше деталей &lt;a href=&#34;https://kubernetes.io/docs/concepts/policy/resource-quotas/#resource-quota-per-volumeattributesclass&#34;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;drivers-support-volumeattributesclass&#34;&gt;Підтримка драйверами VolumeAttributesClass&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Драйвер Amazon EBS CSI: Драйвер AWS EBS CSI має надійну підтримку VolumeAttributesClass і дозволяє динамічно змінювати такі параметри, як тип тому (наприклад, gp2 на gp3, io1 на io2), IOPS і пропускну здатність томів EBS.&lt;/li&gt;
&lt;li&gt;Драйвер Google Compute Engine (GCE) Persistent Disk CSI (pd.csi.storage.gke.io): цей драйвер також підтримує динамічну зміну атрибутів постійного диска, включаючи IOPS і пропускну здатність, за допомогою VolumeAttributesClass.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;contact&#34;&gt;Контакти&lt;/h2&gt;
&lt;p&gt;Якщо у вас є запитання або конкретні запити, повʼязані з VolumeAttributesClass, будь ласка, звертайтеся до &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 для Jobs переходить у GA</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/05/kubernetes-v1-34-pod-replacement-policy-for-jobs-goes-ga/</guid>
      <description>
        
        
        &lt;p&gt;В Kubernetes v1.34, функція &lt;em&gt;Політика заміни Pod&lt;/em&gt; досягла загальної доступності (GA). Ця стаття описує функцію політики заміни Pod і те, як її використовувати у ваших Jobs.&lt;/p&gt;
&lt;h2 id=&#34;про-політику-заміни-pod&#34;&gt;Про політику заміни Pod&lt;/h2&gt;
&lt;p&gt;Стандартно контролер Job негайно відтворює Podʼи, як тільки вони виходять з ладу або починають завершувати роботу (коли вони мають мітку часу видалення).&lt;/p&gt;
&lt;p&gt;В результаті, хоча деякі Podʼи припиняють роботу, загальна кількість працюючих Podʼів для завдання може тимчасово перевищувати заданий рівень паралельності. Для індексованих Jobs це може навіть означати, що кілька Podʼів працюють для одного й того ж індексу одночасно.&lt;/p&gt;
&lt;p&gt;Ця поведінка добре працює для багатьох робочих навантажень, але в певних випадках може викликати проблеми.&lt;/p&gt;
&lt;p&gt;Наприклад, популярні фреймворки машинного навчання, такі як TensorFlow та &lt;a href=&#34;https://jax.readthedocs.io/en/latest/&#34;&gt;JAX&lt;/a&gt;, очікують, що для кожного індексу виконавця буде точно один Pod. Якщо два Podʼа працюють одночасно, ви можете зіткнутися з такими помилками:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-none&#34; data-lang=&#34;none&#34;&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;Крім того, запуск замінних Podʼів до повного завершення старих може призвести до:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Затримок у плануванні з боку kube-scheduler, оскільки вузли залишаються зайнятими.&lt;/li&gt;
&lt;li&gt;Непотрібного масштабування кластера для розміщення замінних Podʼів.&lt;/li&gt;
&lt;li&gt;Тимчасового обходу перевірок квот з боку оркестраторів робочих навантажень, таких як &lt;a href=&#34;https://kueue.sigs.k8s.io/&#34;&gt;Kueue&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;З політикою заміни Podʼів Kubernetes надає вам контроль над тим, коли панель управління замінює Podʼи, що завершуються, допомагаючи уникнути цих проблем.&lt;/p&gt;
&lt;h2 id=&#34;як-працює-політика-заміни-pod&#34;&gt;Як працює політика заміни Pod&lt;/h2&gt;
&lt;p&gt;Це вдосконалення означає, що Jobs у Kubernetes мають необовʼязкове поле &lt;code&gt;.spec.podReplacementPolicy&lt;/code&gt;. Ви можете вибрати одну з двох політик:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TerminatingOrFailed&lt;/code&gt; (стандартно): Замінює Podʼи, щойно вони починають завершуватися.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Failed&lt;/code&gt;: Замінює Podʼи лише після того, як вони повністю завершаться і перейдуть у фазу &lt;code&gt;Failed&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Встановлення політики на &lt;code&gt;Failed&lt;/code&gt; забезпечує створення нового Pod лише після повного завершення попереднього.&lt;/p&gt;
&lt;p&gt;Для Jobs з політикою відмови Podʼів (Pod Failure Policy), стандартне значення для &lt;code&gt;podReplacementPolicy&lt;/code&gt; — &lt;code&gt;Failed&lt;/code&gt;, і жодне інше значення не дозволяється. Дивіться &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/job/#pod-failure-policy&#34;&gt;Політика відмови Podʼів&lt;/a&gt;, щоб дізнатися більше про політики відмови Podʼів для Jobs.&lt;/p&gt;
&lt;p&gt;Ви можете перевірити, скільки Podʼів наразі завершуються, перевіривши поле &lt;code&gt;.status.terminating&lt;/code&gt; Job:&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;приклад&#34;&gt;Приклад&lt;/h2&gt;
&lt;p&gt;Ось приклад Job, який виконує завдання двічі (&lt;code&gt;spec.completions: 2&lt;/code&gt;) паралельно (&lt;code&gt;spec.parallelism: 2&lt;/code&gt;) і замінює Podʼи лише після їх повного завершення (&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;Якщо Pod отримує сигнал SIGTERM (видалення, виселення, примусове завершення…), він починає завершувати роботу. Коли контейнер обробляє завершення роботи відповідним чином, очищення може зайняти деякий час.&lt;/p&gt;
&lt;p&gt;Коли Job починається, ми побачимо два Podʼа, які працюють:&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;Видалимо один з Podʼів (&lt;code&gt;example-job-qr8kf&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;З політикою &lt;code&gt;TerminatingOrFailed&lt;/code&gt;, як тільки один Pod (&lt;code&gt;example-job-qr8kf&lt;/code&gt;) починає завершуватися, контролер Job негайно створює новий Pod (&lt;code&gt;example-job-b59zk&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-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;З політикою &lt;code&gt;Failed&lt;/code&gt;, новий Pod (&lt;code&gt;example-job-b59zk&lt;/code&gt;) не створюється, поки старий Pod (&lt;code&gt;example-job-qr8kf&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-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;Коли Pod, що завершується, повністю переходить у фазу &lt;code&gt;Failed&lt;/code&gt;, створюється новий Pod:&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;як-ви-можете-дізнатися-більше&#34;&gt;Як ви можете дізнатися більше?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ознайомтесь з документацією для користувачів про &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/job/#pod-replacement-policy&#34;&gt;Політику замини Podʼів&lt;/a&gt;, &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/job/#backoff-limit-per-index&#34;&gt;Ліміт затримки для кожного індексу&lt;/a&gt;, та &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/job/#pod-failure-policy&#34;&gt;Політику відмови Podʼів&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ознайомтесь з KEP для &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3939-allow-replacement-when-fully-terminated&#34;&gt;Політики замини Podʼів&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;Ліміту затримки для кожного індексу&lt;/a&gt;, та &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3329-retriable-and-non-retriable-failures&#34;&gt;Політики відмови Podʼів&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;подяки&#34;&gt;Подяки&lt;/h2&gt;
&lt;p&gt;Як і з будь-якою функцією Kubernetes, багато людей внесли свій вклад у реалізацію цієї функції, від тестування та подання помилок до перегляду коду.&lt;/p&gt;
&lt;p&gt;Оскільки ця функція переходить у стабільний стан після 2 років, ми хотіли б подякувати наступним людям:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kannon92&#34;&gt;Kevin Hannon&lt;/a&gt; - за написання KEP та початкову реалізацію.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mimowo&#34;&gt;Michał Woźniak&lt;/a&gt; - за керівництво, менторство та рецензії.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/alculquicondor&#34;&gt;Aldo Culquicondor&lt;/a&gt; - за керівництво, менторство та рецензії.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/soltysh&#34;&gt;Maciej Szulik&lt;/a&gt; - за керівництво, менторство та рецензії.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/dejanzele&#34;&gt;Dejan Zele Pejchev&lt;/a&gt; - за те, що взяв на себе цю функцію та просував її з Alpha через Beta до GA.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;долучайтесь&#34;&gt;Долучайтесь&lt;/h2&gt;
&lt;p&gt;Ця робота була підтримана групою &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-batch&#34;&gt;batch working group&lt;/a&gt;
в тісній співпраці з &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-apps&#34;&gt;SIG Apps&lt;/a&gt; спільнотою.&lt;/p&gt;
&lt;p&gt;Якщо ви зацікавлені в роботі над новими функціями в цій області, ми рекомендуємо підписатися на наш &lt;a href=&#34;https://kubernetes.slack.com/messages/wg-batch&#34;&gt;Slack&lt;/a&gt; канал і відвідувати регулярні зустрічі спільноти.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Метрики PSI для Kubernetes переходять у бета-версію</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/04/kubernetes-v1-34-introducing-psi-metrics-beta/</guid>
      <description>
        
        
        &lt;p&gt;У міру зростання розміру та складності кластерів Kubernetes розуміння стану та продуктивності окремих вузлів стає все більш важливим. Ми раді оголосити, що з Kubernetes v1.34 &lt;strong&gt;Метрики інформації про затримки (PSI)&lt;/strong&gt; перейшли в бета-версію.&lt;/p&gt;
&lt;h2 id=&#34;що-таке-інформація-про-затримки-psi&#34;&gt;Що таке інформація про затримки (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; є функцією ядра Linux (версія 4.20 і новіші), яка забезпечує канонічний спосіб кількісно оцінити тиск на інфраструктурні ресурси з точки зору того, чи перевищує попит на ресурс поточну пропозицію. Вона виходить за межі простих метрик використання ресурсів і натомість вимірює кількість часу, протягом якого завдання затримуються через конкуренцію за ресурси. Це потужний спосіб виявлення та діагностування вузьких місць у ресурсах, які можуть вплинути на продуктивність застосунків.&lt;/p&gt;
&lt;p&gt;PSI надає метрики для CPU, памʼяті та I/O, які класифікуються як &lt;code&gt;some&lt;/code&gt; або &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;Відсоток часу, протягом якого &lt;strong&gt;принаймні одне&lt;/strong&gt; завдання затримується на ресурсі. Це вказує на певний рівень конкуренції за ресурси.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;full&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Відсоток часу, протягом якого &lt;strong&gt;всі&lt;/strong&gt; не простоюючі завдання затримуються на ресурсі одночасно. Це вказує на більш серйозне вузьке місце в ресурсах.&lt;/dd&gt;
&lt;/dl&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-48551--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;Діаграма, що ілюструє різницю між `some` та `full` тиском PSI.&#34;/&gt; &lt;figcaption&gt;
            &lt;h4&gt;PSI: Тиск &amp;#39;Some&amp;#39; та &amp;#39;Full&amp;#39;&lt;/h4&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ці метрики агрегуються за 10-секундними, 1-хвилинними та 5-хвилинними ковзаючими вікнами, що забезпечує всебічний огляд тиску на ресурси з часом.&lt;/p&gt;
&lt;h2 id=&#34;метрики-psi-в-kubernetes&#34;&gt;Метрики PSI в Kubernetes&lt;/h2&gt;
&lt;p&gt;З увімкненою функціональною можливістю &lt;code&gt;KubeletPSI&lt;/code&gt;, kubelet тепер може збирати метрики PSI з ядра Linux і надавати їх через два канали: &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/instrumentation/node-metrics/#summary-api-source&#34;&gt;Summary API&lt;/a&gt; та точку доступу &lt;code&gt;/metrics/cadvisor&lt;/code&gt; Prometheus. Це дозволяє вам відстежувати та отримувати сповіщення про тиск на ресурси на рівні вузла, пода та контейнера.&lt;/p&gt;
&lt;p&gt;Наступні нові метрики доступні у форматі експозиції Prometheus через &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;Ці метрики, разом з даними з Summary API, забезпечують детальний огляд тиску на ресурси, що дозволяє вам точно визначити джерело проблем з продуктивністю та вжити коригувальних заходів. Наприклад, ви можете використовувати ці метрики для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Виявлення витоків памʼяті:&lt;/strong&gt; Постійно зростаючий тиск &lt;code&gt;some&lt;/code&gt; для памʼяті може вказувати на витік памʼяті в застосунку.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Оптимізація запитів та обмежень ресурсів:&lt;/strong&gt; Розуміючи тиск на ресурси ваших робочих навантажень, ви можете точніше налаштувати їх запити та обмеження ресурсів.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Автоматичне масштабування робочих навантажень:&lt;/strong&gt; Ви можете використовувати метрики PSI для ініціювання подій автоматичного масштабування, забезпечуючи, щоб ваші робочі навантаження мали ресурси, необхідні для оптимальної роботи.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;як-увімкнути-метрики-psi&#34;&gt;Як увімкнути метрики PSI&lt;/h2&gt;
&lt;p&gt;Щоб увімкнути метрики PSI у вашому кластері Kubernetes, вам потрібно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Переконатися, що ваші вузли працюють на версії ядра Linux 4.20 або новішій та використовують cgroup v2.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Увімкнути функціональну можливість &lt;code&gt;KubeletPSI&lt;/code&gt; у kubelet.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Після увімкнення ви можете почати збирати дані з точки доступу &lt;code&gt;/metrics/cadvisor&lt;/code&gt; за допомогою вашого рішення для моніторингу, сумісного з Prometheus, або запитувати Summary API для збору та візуалізації нових метрик PSI. Зверніть увагу, що PSI є функцією ядра Linux, тому ці метрики недоступні на вузлах Windows. Ваш кластер може містити комбінацію вузлів Linux та Windows, але на вузлах Windows kubelet не надає метрики PSI.&lt;/p&gt;
&lt;h2 id=&#34;що-далі&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Ми раді представити метрики PSI спільноті Kubernetes і чекаємо на ваші відгуки. Як функція бета-версії, ми активно працюємо над поліпшенням і розширенням цієї функціональності до стабільного випуску GA. Ми закликаємо вас спробувати її та поділитися своїм досвідом з нами.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше про метрики PSI, ознайомтеся з офіційною &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/instrumentation/understand-psi-metrics/&#34;&gt;документацією Kubernetes&lt;/a&gt;. Ви також можете долучитися до обговорення на каналі &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt; в Slack.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Інтеграція токенів службових облікових записів для витягування образів контейнерів переходить у стадію бета</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/03/kubernetes-v1-34-sa-tokens-image-pulls-beta/</guid>
      <description>
        
        
        &lt;p&gt;Спільнота Kubernetes продовжує вдосконалювати найкращі практики безпеки, зменшуючи залежність від довготривалих облікових даних. Після успішного &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/05/07/kubernetes-v1-33-wi-for-image-pulls/&#34;&gt;випуску альфа-версії в Kubernetes v1.33&lt;/a&gt;, &lt;em&gt;Інтеграція токенів службових облікових записів для постачальників облікових даних Kubelet&lt;/em&gt; перейшла на &lt;strong&gt;бета-версію&lt;/strong&gt; в Kubernetes v1.34, що наблизило нас до усунення довготривалих секретів витягування образів контейнерів із кластерів Kubernetes.&lt;/p&gt;
&lt;p&gt;Це вдосконалення дозволяє постачальникам облікових даних використовувати токени службових облікових записів, специфічні для робочих навантажень, для отримання облікових даних реєстру, забезпечуючи безпечну, короткотривалу ефемерну альтернативу традиційним секретам для витягування образів.&lt;/p&gt;
&lt;h2 id=&#34;що-нового-в-бета-версії&#34;&gt;Що нового в бета-версії?&lt;/h2&gt;
&lt;p&gt;Перехід у бета-версію приносить кілька важливих змін, які роблять цю функцію більш надійною та готовою до промислової експлуатації:&lt;/p&gt;
&lt;h3 id=&#34;обовʼязкове-поле-cachetype&#34;&gt;Обовʼязкове поле &lt;code&gt;cacheType&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Істотна зміна порівняно з альфа-версією&lt;/strong&gt;: поле &lt;code&gt;cacheType&lt;/code&gt; є &lt;strong&gt;обовʼязковим&lt;/strong&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:#080;font-style:italic&#34;&gt;# УВАГА: це не повний приклад конфігурації, а лише посилання на поле &amp;#39;tokenAttributes.cacheType&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;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;Обирайте поміж двома стратегіями кешування:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Token&lt;/code&gt;&lt;/strong&gt;: Робіть кешування облікових даних для кожного токена службового облікового запису (використовуйте, коли термін дії облікових даних повʼязаний із токеном). Це корисно, коли постачальник облікових даних перетворює токен службового облікового запису на облікові дані реєстру з таким же терміном дії, як і токен, або коли реєстри безпосередньо підтримують токени службових облікових записів Kubernetes. Примітка: Kubelet не може безпосередньо надсилати токени службових облікових записів до реєстрів; для перетворення токенів у формат імені користувача/пароля, очікуваний реєстрами, потрібні втулки постачальників облікових даних.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ServiceAccount&lt;/code&gt;&lt;/strong&gt;: Кешуйте облікові дані для кожної ідентичності службового облікового запису (використовуйте, коли облікові дані дійсні для всіх подів, які використовують один і той же службовий обліковий запис)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ізольовані-облікові-дані-для-витягування-образів&#34;&gt;Ізольовані облікові дані для витягування образів&lt;/h3&gt;
&lt;p&gt;Бета-версія забезпечує сильнішу ізоляцію безпеки для образів контейнерів при використанні токенів службових облікових записів для витягування образів. Вона гарантує, що поди можуть отримувати доступ лише до образів, які були витягнуті за допомогою службових облікових записів, до яких вони мають право доступу. Це запобігає несанкціонованому доступу до чутливих образів контейнерів і дозволяє здійснювати детальний контроль доступу, де різні робочі навантаження можуть мати різні дозволи реєстрації на основі їх службового облікового запису.&lt;/p&gt;
&lt;p&gt;Коли постачальники облікових даних використовують токени службових облікових записів, система відстежує ідентичність службового облікового запису (простір імен, імʼя та &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/names/#uids&#34;&gt;UID&lt;/a&gt;) для кожного витягнутого образу. Коли под намагається використовувати кешований образ, система перевіряє, що службовий обліковий запис пода точно збігається з службовим обліковим записом, який був використаний для початкового витягування образу.&lt;/p&gt;
&lt;p&gt;Адміністратори можуть відкликати доступ до раніше витягнутих образів, видаливши та створивши наново ServiceAccount, що змінює UID і робить недоступним кешований доступ до образів.&lt;/p&gt;
&lt;p&gt;Для отримання додаткової інформації про цю можливість дивіться документацію &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/containers/images/#ensureimagepullcredentialverification&#34;&gt;перевірки облікових даних для витягування образів&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;як-це-працює&#34;&gt;Як це працює&lt;/h2&gt;
&lt;h3 id=&#34;конфігурація&#34;&gt;Конфігурація&lt;/h3&gt;
&lt;p&gt;Постачальники облікових даних використовують токени службових облікових записів за допомогою поля &lt;code&gt;tokenAttributes&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:#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;# УВАГА: це не повний приклад конфігурації, а лише посилання на поле &amp;#39;tokenAttributes&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:#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;порядок-отримання-образів&#34;&gt;Порядок отримання образів&lt;/h3&gt;
&lt;p&gt;На високому рівні, &lt;code&gt;kubelet&lt;/code&gt; координує свою роботу з постачальником облікових даних та середовищем виконання контейнерів наступним чином:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Коли образ відсутній локально:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; перевіряє свій кеш облікових даних, використовуючи налаштований &lt;code&gt;cacheType&lt;/code&gt; (&lt;code&gt;Token&lt;/code&gt; або &lt;code&gt;ServiceAccount&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Якщо потрібно, &lt;code&gt;kubelet&lt;/code&gt; запитує токен ServiceAccount для ServiceAccount пода і передає його, а також будь-які необхідні анотації, постачальнику облікових даних&lt;/li&gt;
&lt;li&gt;Постачальник обмінює цей токен на облікові дані реєстру і повертає їх &lt;code&gt;kubelet&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; кешує облікові дані відповідно до стратегії &lt;code&gt;cacheType&lt;/code&gt; і витягує образ з цими обліковими даними&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; записує координати ServiceAccount (простір імен, імʼя, UID) повʼязані з витягнутим образом для подальших перевірок авторизації&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Коли образ вже присутній локально:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt; перевіряє координати ServiceAccount пода на відповідність обліковим даним, записаним для кешованого образу&lt;/li&gt;
&lt;li&gt;Якщо вони точно збігаються, можна використовувати кешований образ без витягування з реєстру&lt;/li&gt;
&lt;li&gt;Якщо вони відрізняються, &lt;code&gt;kubelet&lt;/code&gt; виконує нове витягування з використанням облікових даних для нового ServiceAccount&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;З увімкненою перевіркою облікових даних для витягування образів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Авторизація виконується з використанням записаних облікових даних ServiceAccount, що забезпечує використання подами лише образів, витягнутих за допомогою ServiceAccount, до яких вони мають право доступу&lt;/li&gt;
&lt;li&gt;Адміністратори можуть відкликати доступ, видаливши та створивши наново ServiceAccount; UID змінюється, і раніше записана авторизація більше не збігається&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;обмеження-аудиторії&#34;&gt;Обмеження аудиторії&lt;/h3&gt;
&lt;p&gt;Бета-реліз базується на обмеженнях аудиторії вузлів службових облікових записів (бета з v1.33), щоб забезпечити можливість &lt;code&gt;kubelet&lt;/code&gt; запитувати токени лише для авторизованих аудиторій. Адміністратори налаштовують дозволені аудиторії за допомогою RBAC, щоб дозволити &lt;code&gt;kubelet&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:#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;# УВАГА: це лише приклад конфігурації.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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:#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;]  # Опціонально&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;конкретний 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;початок-роботи-з-бета-версією&#34;&gt;Початок роботи з бета-версією&lt;/h2&gt;
&lt;h3 id=&#34;необхідні-умови&#34;&gt;Необхідні умови&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes v1.34 або пізніше&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Увімкнено функціональні можливості&lt;/strong&gt;: &lt;code&gt;KubeletServiceAccountTokenForCredentialProviders=true&lt;/code&gt; (бета, стандартно увімкнено)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Підтримка постачальника облікових даних&lt;/strong&gt;: Update your credential provider to handle ServiceAccount tokens&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;міграція-з-альфа-версії&#34;&gt;Міграція з альфа-версії&lt;/h3&gt;
&lt;p&gt;У випадку, якщо ви вже використовуєте альфа-версію, міграція на бета-версію вимагає мінімальних змін:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Додайте поле &lt;code&gt;cacheType&lt;/code&gt;&lt;/strong&gt;:
Оновіть конфігурацію вашого постачальника облікових даних, щоб включити необхідне поле &lt;code&gt;cacheType&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Перегляньте стратегію кешування&lt;/strong&gt;:
Виберіть між типами кешу &lt;code&gt;Token&lt;/code&gt; і &lt;code&gt;ServiceAccount&lt;/code&gt; на основі поведінки вашого постачальника&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Перевірте обмеження аудиторії&lt;/strong&gt;:
Переконайтеся, що ваша конфігурація RBAC або інші правила авторизації кластера правильно обмежують аудиторії токенів&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;приклад-налаштування&#34;&gt;Приклад налаштування&lt;/h3&gt;
&lt;p&gt;Ось повний приклад налаштування постачальника облікових даних з токенами службових облікових записів (цей приклад передбачає, що ваш кластер використовує авторизацію RBAC):&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;# УВАГА: це лише приклад конфігурації.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#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:#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 з анотаціями реєстру&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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 для обмеження аудиторії&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;]  # Опціонально&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:#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 що використовує 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;що-далі&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Для Kubernetes v1.35 ми, Kubernetes SIG Auth, очікуємо, що функція залишиться в бета-версії, і ми будемо продовжувати збирати відгуки.&lt;/p&gt;
&lt;p&gt;Ви можете дізнатися більше про цю функцію на сторінці &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/administer-cluster/kubelet-credential-provider/#service-account-token-for-image-pulls&#34;&gt;токена службового облікового запису для витягування зображень&lt;/a&gt; в документації Kubernetes.&lt;/p&gt;
&lt;p&gt;Ви також можете стежити за &lt;a href=&#34;https://kep.k8s.io/4412&#34;&gt;KEP-4412&lt;/a&gt;, щоб відстежувати прогрес у майбутніх випусках Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;дійте&#34;&gt;Дійте&lt;/h2&gt;
&lt;p&gt;У цьому блозі ми висвітлили бета-випуск інтеграції токенів службових облікових записів для Kubelet Credential Providers в Kubernetes v1.34. Ми розглянули ключові поліпшення, включаючи необхідне поле &lt;code&gt;cacheType&lt;/code&gt; та вдосконалену інтеграцію з Ensure Secret Pull Images.&lt;/p&gt;
&lt;p&gt;Ми отримали позитивні відгуки від спільноти під час альфа-фази і хотіли б почути більше, оскільки ми стабілізуємо цю функцію для GA. Зокрема, ми хотіли б отримати відгуки від розробників постачальників облікових даних під час інтеграції з новим бета-API та механізмами кешування. Будь ласка, звʼяжіться з нами в каналі &lt;a href=&#34;https://kubernetes.slack.com/archives/C04UMAUC4UA&#34;&gt;#sig-auth-authenticators-dev&lt;/a&gt; на Kubernetes Slack.&lt;/p&gt;
&lt;h2 id=&#34;як-взяти-участь&#34;&gt;Як взяти участь&lt;/h2&gt;
&lt;p&gt;Якщо ви зацікавлені в участі в розробці цієї функції, поділіться відгуками або візьміть участь в інших поточних проектах SIG Auth, будь ласка, зв&#39;яжіться з нами в каналі &lt;a href=&#34;https://kubernetes.slack.com/archives/C0EN96KUY&#34;&gt;#sig-auth&lt;/a&gt; на Kubernetes Slack.&lt;/p&gt;
&lt;p&gt;Ви також можете приєднатися до двотижневих &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-auth/README.md#meetings&#34;&gt;зборів SIG Auth&lt;/a&gt;, які проходять кожну другу середу.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Впровадження опції статичної політики менеджера CPU для розподілу кешу Uncore</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/02/kubernetes-v1-34-prefer-align-by-uncore-cache-cpumanager-static-policy-optimization/</guid>
      <description>
        
        
        &lt;p&gt;Нова опція статичної політики менеджера CPU під назвою &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; була представлена в Kubernetes v1.32 як альфа-функція, а в Kubernetes v1.34 вона перейшла в &lt;strong&gt;бета&lt;/strong&gt;-стадію. Ця опція політики менеджера CPU призначена для оптимізації продуктивності конкретних робочих навантажень, що працюють на процесорах з архітектурою &lt;em&gt;розділеного кешу uncore&lt;/em&gt;. У цій статті пояснюється, що це означає і чому це корисно.&lt;/p&gt;
&lt;h2 id=&#34;розуміння-функції&#34;&gt;Розуміння функції&lt;/h2&gt;
&lt;h3 id=&#34;що-таке-кеш-uncore&#34;&gt;Що таке кеш uncore?&lt;/h3&gt;
&lt;p&gt;До відносно недавнього часу майже всі сучасні компʼютерні процесори мали монолітний кеш останнього рівня, який ділився між усіма ядрами в багатопроцесорному пакеті. Цей монолітний кеш також називається &lt;em&gt;кешем uncore&lt;/em&gt; (оскільки він не повʼязаний з конкретним ядром) або кешем третього рівня. Крім кешу третього рівня, існує інший кеш, який зазвичай називають кешем першого і другого рівня, який &lt;strong&gt;повʼязаний&lt;/strong&gt; з конкретним ядром процесора.&lt;/p&gt;
&lt;p&gt;Для зменшення затримки доступу між ядрами процесора та їх кешем нещодавно процесори на базі архітектури AMD64 та ARM впровадили архітектуру &lt;em&gt;розділеного кешу uncore&lt;/em&gt;, де кеш останнього рівня ділиться на кілька фізичних кешів, які розділені відповідно до конкретних груп ядер у фізичному пакеті. Коротші відстані в межах пакета процесора допомагають зменшити затримку.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Діаграма, що показує монолітний кеш зліва і розділений кеш справа&#34; src=&#34;https://deploy-preview-48551--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 може розміщувати робочі навантаження таким чином, щоб враховувати топологію кешу в межах пакета CPU.&lt;/p&gt;
&lt;h3 id=&#34;розміщення-робочих-навантажень-з-урахуванням-кешу&#34;&gt;Розміщення робочих навантажень з урахуванням кешу&lt;/h3&gt;
&lt;p&gt;Матриця нижче показує &lt;a href=&#34;https://github.com/nviennot/core-to-core-latency&#34;&gt;затримку між CPU&lt;/a&gt;, виміряну в наносекундах (менше — краще) при передачі пакета між CPU через протокол когерентності кешу на процесорі, який використовує розділений кеш uncore. У цьому прикладі пакет процесора складається з 2 кешів uncore. Кожен кеш uncore обслуговує 8 ядер CPU.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Таблиця, що показує показники латентності між CPU&#34; src=&#34;https://deploy-preview-48551--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;&lt;/p&gt;
&lt;p&gt;Сині елементи в матриці представляють затримку між CPU, які ділять один і той же кеш uncore, тоді як сірі елементи вказують на затримку між CPU, які відповідають різним кешам uncore. Затримка між CPU, які відповідають різним кешам, вища, ніж затримка між CPU, які належать до одного і того ж кешу.&lt;/p&gt;
&lt;p&gt;З увімкненим &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt;, &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/policy/node-resource-managers/#static-policy&#34;&gt;статичний Менеджер CPU&lt;/a&gt; намагається виділити ресурси CPU для контейнера таким чином, щоб всі CPU, призначені контейнеру, ділили один і той же кеш uncore. Ця політика працює на основі найкращих зусиль, прагнучи мінімізувати розподіл ресурсів CPU контейнера між кешами uncore, виходячи з вимог контейнера та враховуючи ресурси, які можна виділити на вузлі.&lt;/p&gt;
&lt;p&gt;Запускаючи робоче навантаження, де це можливо, на наборі CPU, які використовують найменшу можливу кількість кешів uncore, програми отримують вигоду від зменшення затримки кешу (як видно з матриці вище) і зменшення конкуренції з іншими робочими навантаженнями, що може призвести до загального підвищення пропускної здатності. Перевага проявляється лише в тому випадку, якщо ваші вузли використовують топологію розділеного кешу uncore для своїх процесорів.&lt;/p&gt;
&lt;p&gt;Наступна діаграма ілюструє розподіл кешу uncore, коли функція увімкнена.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Діаграма, що показує приклад розподілу навантаження на процесор, стандартну статичну політику та політику prefer-align-cpus-by-uncorecache&#34; src=&#34;https://deploy-preview-48551--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;Стандартно Kubernetes не враховує топологію кешу uncore; контейнери отримують ресурси CPU за допомогою методології упаковки. Як наслідок, Контейнер 1 і Контейнер 2 можуть зазнати впливу &amp;quot;галасливого сусіда&amp;quot; через конкуренцію за доступ до кешу на Uncore Cache 0. Крім того, Контейнер 2 матиме CPU, розподілені між обома кешами, що може призвести до затримки між кешами.&lt;/p&gt;
&lt;p&gt;З увімкненим &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt;, кожен контейнер ізольований на окремому кеші. Це вирішує проблему конкуренції за кеш між контейнерами та мінімізує латентність кешу для використовуваних CPU.&lt;/p&gt;
&lt;h2 id=&#34;використання&#34;&gt;Використання&lt;/h2&gt;
&lt;p&gt;Звичайні випадки використання можуть включати телекомунікаційні програми, такі як vRAN, Mobile Packet Core та брандмауери. Важливо зазначити, що оптимізація, надана &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt;, може залежати від робочого навантаження. Наприклад, програми, які обмежені пропускною здатністю памʼяті, можуть не отримати вигоду від розподілу кешу uncore, оскільки використання більшої кількості кешів uncore може збільшити доступ до пропускної здатності памʼяті.&lt;/p&gt;
&lt;h2 id=&#34;увімкнення-функції&#34;&gt;Увімкнення функції&lt;/h2&gt;
&lt;p&gt;Щоб увімкнути цю функцію, потрібно встановити політику менеджера CPU на &lt;code&gt;static&lt;/code&gt; та увімкнути параметри політики менеджера CPU за допомогою &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Для Kubernetes 1.34 функція знаходиться на стадії бета-тестування і вимагає також увімкнення &lt;a href=&#34;https://docs/reference/command-line-tools-reference/feature-gates/&#34;&gt;функціональних можливостей&lt;/a&gt; &lt;code&gt;CPUManagerPolicyBetaOptions&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Додайте наступне до файлу конфігурації kubelet:&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;Якщо ви вносите цю зміну до вже наявного вузла, видаліть файл &lt;code&gt;cpu_manager_state&lt;/code&gt;, а потім перезапустіть kubelet.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt; може бути увімкнено на вузлах з монолітним кешем uncore. Ця функція імітуватиме ефект розподілу сокетів з найкращими зусиллями та упакує ресурси CPU на сокеті, подібно до стандартної статичної політики менеджера CPU.&lt;/p&gt;
&lt;h2 id=&#34;додаткова-інформація&#34;&gt;Додаткова інформація&lt;/h2&gt;
&lt;p&gt;Дивіться статтю &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/policy/node-resource-managers/&#34;&gt;Менеджери ресурсів вузлів&lt;/a&gt; щоб дізнатися більше про менеджер CPU та доступні політики.&lt;/p&gt;
&lt;p&gt;Ознайомтеся з &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/policy/node-resource-managers/#prefer-align-cpus-by-uncorecache&#34;&gt;документацією&lt;/a&gt; до &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Дивіться &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; для отримання додаткової інформації про те, як реалізовано &lt;code&gt;prefer-align-cpus-by-uncorecache&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;долучайтеся&#34;&gt;Долучайтеся&lt;/h2&gt;
&lt;p&gt;Ця функція розробляється &lt;a href=&#34;https://github.com/Kubernetes/community/blob/master/sig-node/README.md&#34;&gt;SIG Node&lt;/a&gt;. Якщо ви зацікавлені в допомозі в розробці цієї функції, наданні відгуків або участі в будь-яких інших поточних проектах SIG Node, будь ласка, відвідайте зустріч SIG Node для отримання додаткової інформації.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: DRA отримав статус GA</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/01/kubernetes-v1-34-dra-updates/</link>
      <pubDate>Mon, 01 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/01/kubernetes-v1-34-dra-updates/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes 1.34 вже тут, і він приніс величезну хвилю вдосконалень для Dynamic Resource Allocation (DRA)! Цей реліз знаменує важливу віху: багато API в групі &lt;code&gt;resource.k8s.io&lt;/code&gt; отримали статус General Availability (GA), розкриваючи повний потенціал управління пристроями в Kubernetes. Крім того, кілька ключових функцій перейшли до бети, а нова порція альфа-функцій обіцяє ще більше виразності та гнучкості.&lt;/p&gt;
&lt;p&gt;Давайте розглянемо, що нового для DRA в Kubernetes 1.34!&lt;/p&gt;
&lt;h2 id=&#34;the-core-dra-is-now-ga&#34;&gt;Ядро DRA тепер має статус GA&lt;/h2&gt;
&lt;p&gt;Головною особливістю релізу v1.34 є те, що ядро DRA отримало статус General Availability.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;Dynamic Resource Allocation (DRA)&lt;/a&gt; у Kubernetes надає гнучкий фреймворк для управління спеціалізованим апаратним та інфраструктурним забезпеченням, таким як GPU або FPGA. DRA надає API, які дозволяють кожному робочому навантаженню вказувати властивості потрібних пристроїв, залишаючи планувальнику завдання розподілу реальних пристроїв, що дозволяє підвищити надійність та покращити використання дорогого обладнання.&lt;/p&gt;
&lt;p&gt;З отриманням статусу GA, DRA стає стабільним і буде частиною Kubernetes на довгий час. Спільнота все ще може очікувати постійний потік нових функцій, що додаються до DRA протягом наступних кількох релізів Kubernetes, але вони не внесуть жодних руйнівних змін до DRA. Тож користувачі та розробники драйверів DRA можуть починати впевнено використовувати DRA.&lt;/p&gt;
&lt;p&gt;Починаючи з Kubernetes 1.34, DRA є стандартно увімкненими; функції DRA, які досягли бети, &lt;strong&gt;також&lt;/strong&gt; стандартно увімкнені. Це тому, що стандартною версією API для DRA тепер є стабільна версія &lt;code&gt;v1&lt;/code&gt;, а не попередні версії (наприклад: &lt;code&gt;v1beta1&lt;/code&gt; або &lt;code&gt;v1beta2&lt;/code&gt;), які потребували явного увімкнення функції.&lt;/p&gt;
&lt;h2 id=&#34;features-promoted-to-beta&#34;&gt;Функції які, перейшли в бета&lt;/h2&gt;
&lt;p&gt;Кілька потужних функцій були підвищені до бети, додаючи більше контролю, гнучкості та спостережуваності до управління
ресурсами з DRA.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#admin-access&#34;&gt;Позначення мітками адміністративного доступу&lt;/a&gt; було оновлено. У v1.34 ви можете обмежити підтримку пристроїв для людей (або застосунків), уповноважених їх використовувати. Це використовується як спосіб уникнути підвищення привілеїв, якщо драйвер DRA надає додаткові привілеї при запиті адміністративного доступу, та уникнути доступу до пристроїв, які використовуються звичайними застосунками, потенційно в іншому просторі імен. Обмеження працює, гарантуючи, що лише користувачі з доступом до простору імен з міткою &lt;code&gt;resource.k8s.io/admin-access: &amp;quot;true&amp;quot;&lt;/code&gt; мають право створювати об&#39;єкти ResourceClaim або ResourceClaimTemplates з полем &lt;code&gt;adminAccess&lt;/code&gt;, встановленим як true. Це гарантує, що користувачі без прав адміністратора не зможуть зловживати цією функцією.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#prioritized-list&#34;&gt;Список пріоритетів&lt;/a&gt; дозволяє користувачам вказувати список прийнятних пристроїв для їхніх робочих навантажень, а не лише один тип пристрою. Тож хоча робоче навантаження може працювати найкраще на одному високопродуктивному GPU, воно також може працювати на 2 GPU середнього рівня. Планувальник спробує задовольнити альтернативи у списку по порядку, тож робоче навантаження отримає найкращий набір доступних пристроїв на вузлі.&lt;/p&gt;
&lt;p&gt;API kubelet було оновлено для звітування про ресурси подів, виділені через DRA. Це дозволяє агентам моніторингу вузлів знати про виділені ресурси DRA для подів на вузлі і робить можливим використання інформації DRA в API PodResources для розробки нових функцій та інтеграцій.&lt;/p&gt;
&lt;h2 id=&#34;new-alpha-features&#34;&gt;Нові альфа-функції&lt;/h2&gt;
&lt;p&gt;Kubernetes 1.34 також представляє кілька нових альфа-функцій, які дають нам уявлення про майбутнє управління ресурсами з DRA.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#extended-resource&#34;&gt;Розподіл розширених ресурсів&lt;/a&gt; в DRA дозволяє адміністраторам кластера оголошувати ресурси, керовані DRA, як &lt;em&gt;розширені ресурси&lt;/em&gt;, дозволяючи розробникам використовувати їх за допомогою знайомого, простішого синтаксису запитів, все ще отримуючи переваги динамічного розподілу. Це дозволяє наявним робочим навантаженням почати використовувати DRA без модифікацій, спрощуючи перехід до DRA як для розробників застосунків, так і для адміністраторів кластера.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#consumable-capacity&#34;&gt;Споживана ємність&lt;/a&gt; представляє гнучку модель спільного використання пристроїв, де кілька незалежних запитів ресурсів від неповʼязаних подів можуть отримати частку одного і того ж фізичного пристрою. Ця нова можливість керується через необовʼязкові, визначені адміністратором політики спільного використання, які регулюють, як загальна ємність пристрою розподіляється та контролюється платформою для кожного запиту. Це дозволяє спільно використовувати пристрої в сценаріях, де попередньо визначені розділи не є життєздатними.&lt;/p&gt;
&lt;p&gt;Дивіться &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/09/18/kubernetes-v1-34-dra-consumable-capacity/&#34;&gt;Kubernetes v1.34: Споживча ємність DRA&lt;/a&gt; для отримання додаткової інформації.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#binding-conditions&#34;&gt;Умови прив&#39;язки&lt;/a&gt; покращують надійність планування для певних класів пристроїв, дозволяючи планувальнику Kubernetes відкладати привʼязку пода до вузла, доки його необхідні зовнішні ресурси, такі як приєднувані пристрої або FPGA, не будуть підтверджені як повністю підготовлені. Це запобігає передчасному призначенню подів, яке могло б призвести до збоїв, і забезпечує більш надійне, передбачуване планування шляхом явного моделювання готовності ресурсів перед тим, як под буде прив&#39;язаний до вузла.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Статус справності ресурсу&lt;/em&gt; для DRA покращує спостережуваність, показуючи статус справності пристроїв, виділених для пода через Pod Status. Це працює незалежно від того, чи пристрій виділено через DRA чи Device Plugin. Це полегшує розуміння причини несправного стану пристрою та відповідне реагування.&lt;/p&gt;
&lt;p&gt;Дивіться &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/09/17/kubernetes-v1-34-pods-report-dra-resource-health/&#34;&gt;Kubernetes v1.34: Звіт про стан ресурсів DRA в Podʼах&lt;/a&gt; для отримання додаткової інформації.&lt;/p&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;Що далі?&lt;/h2&gt;
&lt;p&gt;Хоча DRA отримав статус GA в цьому циклі, наполеглива робота над DRA не припиняється. Є кілька функцій в альфа та бета статусі, які ми плануємо довести до GA в наступних кількох релізах, і ми прагнемо продовжувати покращувати продуктивність, масштабованість та надійність DRA. Тож очікуйте такий же амбітний набір функцій в DRA для релізу 1.35.&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Як долучитися&lt;/h2&gt;
&lt;p&gt;Хорошою відправною точкою є приєднання до &lt;a href=&#34;https://kubernetes.slack.com/archives/C0409NGC1TK&#34;&gt;Slack-каналу&lt;/a&gt; WG Device Management та &lt;a href=&#34;https://docs.google.com/document/d/1qxI87VqGtgN7EAJlqVfxx86HGKEAc2A3SKru8nJHNkQ/edit?tab=t.0#heading=h.tgg8gganowxq&#34;&gt;зустрічей&lt;/a&gt;, які відбуваються у зручний для US/EU та EU/APAC час.&lt;/p&gt;
&lt;p&gt;Не всі ідеї щодо вдосконалень ще відстежуються як issues, тож приходьте поговорити з нами, якщо хочете допомогти або маєте власні ідеї! У нас є робота на всіх рівнях, від складних основних змін до покращень зручності використання в kubectl, які могли б бути підхоплені новачками.&lt;/p&gt;
&lt;h2 id=&#34;acknowledgements&#34;&gt;Подяки&lt;/h2&gt;
&lt;p&gt;Величезна подяка новим учасникам DRA цього циклу:&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: Більш точний контроль над перезапуском контейнерів</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/08/29/kubernetes-v1-34-per-container-restart-policy/</guid>
      <description>
        
        
        &lt;p&gt;З виходом Kubernetes 1.34, було представлено нову альфа-функцію, яка надає більш детальний контроль над перезапусками контейнерів у межах Pod. Ця функція, названа &lt;strong&gt;Container Restart Policy and Rules&lt;/strong&gt;, дозволяє вам вказати політику перезапуску для кожного контейнера окремо, перевизначаючи глобальну політику перезапуску Podʼа. Крім того, вона також дозволяє перезапускати окремі контейнери на основі їх кодів виходу. Ця функція доступна за альфа-функціональною можливістю &lt;code&gt;ContainerRestartRules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ця функція була давно очікуваною. Розглянемо, як вона працює і як ви можете її використовувати.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-with-a-single-restart-policy&#34;&gt;Проблема з єдиною політикою перезапуску&lt;/h2&gt;
&lt;p&gt;До цієї функції &lt;code&gt;restartPolicy&lt;/code&gt; встановлювалася на рівні Podʼа. Це означало, що всі контейнери в Podʼі ділили одну й ту ж політику перезапуску (&lt;code&gt;Always&lt;/code&gt;, &lt;code&gt;OnFailure&lt;/code&gt; або &lt;code&gt;Never&lt;/code&gt;). Хоча це підходить для багатьох випадків використання, в інших ситуаціях це може бути обмеженням.&lt;/p&gt;
&lt;p&gt;Наприклад, розглянемо Pod з основним контейнером застосунку та ініціалізаційним контейнером, який виконує деякі початкові налаштування. Ви можете захотіти, щоб основний контейнер завжди перезапускався у разі збою, але ініціалізаційний контейнер повинен виконуватися лише один раз і ніколи не перезапускатися. З єдиною політикою перезапуску на рівні Pod це було неможливо.&lt;/p&gt;
&lt;h2 id=&#34;introducing-per-container-restart-policies&#34;&gt;Введення політик перезапуску для кожного контейнера&lt;/h2&gt;
&lt;p&gt;З новою функцією &lt;code&gt;ContainerRestartRules&lt;/code&gt; ви тепер можете вказати &lt;code&gt;restartPolicy&lt;/code&gt; для кожного контейнера в специфікації вашого Podʼа. Ви також можете визначити &lt;code&gt;restartPolicyRules&lt;/code&gt;, щоб контролювати перезапуски на основі кодів виходу. Це дає вам детальний контроль, необхідний для обробки складних сценаріїв.&lt;/p&gt;
&lt;h2 id=&#34;use-cases&#34;&gt;Варіанти використання&lt;/h2&gt;
&lt;p&gt;Давайте розглянемо деякі реальні випадки використання, де політики перезапуску для кожного контейнера можуть бути корисними.&lt;/p&gt;
&lt;h3 id=&#34;in-place-restarts-for-training-jobs&#34;&gt;Перезапуски на місці для завдань навчання моделей&lt;/h3&gt;
&lt;p&gt;У дослідженнях машинного навчання часто потрібно організовувати велику кількість тривалих навчальних навантажень AI/ML. У цих сценаріях збої навантаження є неминучими. Коли навантаження зазнає збою з кодом виходу, що підлягає повторному виконанню, ви хочете, щоб контейнер швидко перезапускався без повторного планування всього Podʼа, що споживає значну кількість часу та ресурсів. Перезапуск невдалого контейнера &amp;quot;на місці&amp;quot; є критично важливим для кращого використання обчислювальних ресурсів. Контейнер повинен перезапускатися &amp;quot;на місці&amp;quot; лише у разі збою через помилку, що підлягає повторному виконанню; в іншому випадку контейнер і Pod повинні завершити роботу та, можливо, бути повторно запланованими.&lt;/p&gt;
&lt;p&gt;Це тепер можна досягти за допомогою правил &lt;code&gt;restartPolicyRules&lt;/code&gt; на рівні контейнера. Навантаження може завершитися з різними кодами, щоб представити помилки, що підлягають повторному виконанню, і непідлягають повторному виконанню. Завдяки &lt;code&gt;restartPolicyRules&lt;/code&gt; навантаження може бути швидко перезапущено на місці, але лише тоді, коли помилка підлягає повторному виконанню.&lt;/p&gt;
&lt;h3 id=&#34;try-once-init-containers&#34;&gt;Ініціалізаційні контейнери з одноразовим виконанням&lt;/h3&gt;
&lt;p&gt;Ініціалізаційні контейнери часто використовуються для виконання початкових налаштувань для основного контейнера, таких як налаштування середовищ і облікових даних. Іноді ви хочете, щоб основний контейнер завжди перезапускався, але не хочете повторювати ініціалізацію, якщо вона зазнає збою.&lt;/p&gt;
&lt;p&gt;З політикою перезапуску на рівні контейнера це тепер можливо. Ініціалізаційний контейнер може виконуватися лише один раз, і його збій буде вважатися збоєм Podʼа. Якщо ініціалізація проходить успішно, основний контейнер завжди може бути перезапущений.&lt;/p&gt;
&lt;h3 id=&#34;pods-with-multiple-containers&#34;&gt;Podʼи з кількома контейнерами&lt;/h3&gt;
&lt;p&gt;Для Podʼів, які виконують кілька контейнерів, ви можете мати різні вимоги до перезапуску для кожного контейнера. Деякі контейнери можуть мати чітке визначення успіху і повинні перезапускатися лише у разі збою. Інші можуть потребувати постійного перезапуску.&lt;/p&gt;
&lt;p&gt;Це тепер можливо з політикою перезапуску на рівні контейнера, що дозволяє окремим контейнерам мати різні політики перезапуску.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use&#34;&gt;Як це використовувати&lt;/h2&gt;
&lt;p&gt;Щоб використовувати цю нову функцію, вам потрібно увімкнути функціональну можливість &lt;code&gt;ContainerRestartRules&lt;/code&gt; в панелі управління вашого кластера Kubernetes та робочих вузлах, які працюють на Kubernetes 1.34+. Після увімкнення ви можете вказати поля &lt;code&gt;restartPolicy&lt;/code&gt; та &lt;code&gt;restartPolicyRules&lt;/code&gt; у визначеннях ваших контейнерів.&lt;/p&gt;
&lt;p&gt;Ось кілька прикладів:&lt;/p&gt;
&lt;h3 id=&#34;example-1-restarting-on-specific-exit-codes&#34;&gt;Приклад 1: Перезапуск на основі конкретних кодів виходу&lt;/h3&gt;
&lt;p&gt;У цьому прикладі контейнер повинен перезапуститися, якщо і тільки якщо він зазнає збою з помилкою, що підлягає повторному виконанню, що представляється кодом виходу 42.&lt;/p&gt;
&lt;p&gt;Щоб досягти цього, контейнер має &lt;code&gt;restartPolicy: Never&lt;/code&gt;, і правило політики перезапуску, яке вказує Kubernetes перезапустити контейнер на місці, якщо він завершується з кодом 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;# Політика перезапуску контейнера повинна бути вказана, якщо правила вказані&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;# Тільки перезапустити контейнер, якщо він завершується з кодом 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;Приклад 2: Ініціалізаційний контейнер з одною спробою запуску&lt;/h3&gt;
&lt;p&gt;У цьому прикладі Pod повинен завжди перезапускатися після успішної ініціалізації. Однак ініціалізація повинна бути спробована лише один раз.&lt;/p&gt;
&lt;p&gt;Щоб досягти цього, Pod має політику перезапуску &lt;code&gt;Always&lt;/code&gt;. Ініціалізаційний контейнер &lt;code&gt;init-once&lt;/code&gt; спробує запуститися лише один раз. Якщо він зазнає невдачі, Pod зазнає невдачі. Це дозволяє Pod зазнати невдачі, якщо ініціалізація не вдалася, але також продовжувати працювати, як тільки ініціалізація буде успішною.&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;# Цей контейнер ініціалізації спробує запуститись лише один раз. Якщо спроба не вдасться, 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:#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;# Цей контейнер завжди буде перезапущений, як тільки ініціалізація буде успішною.&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;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;Приклад 3: Контейнери з різними політиками перезапуску&lt;/h3&gt;
&lt;p&gt;У цьому прикладі є два контейнери з різними вимогами до перезапуску. Один повинен завжди перезапускатися, тоді як інший повинен перезапускатися лише у разі збою.&lt;/p&gt;
&lt;p&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;&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;Дізнайтеся більше&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ознайомтеся з документацією про &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/pod-lifecycle/#container-restart-rules&#34;&gt;політику перезапуску контейнерів&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Ознайомтеся з KEP для &lt;a href=&#34;https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/5307-container-restart-policy&#34;&gt;правил перезапуску контейнерів&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;roadmap&#34;&gt;Плани&lt;/h2&gt;
&lt;p&gt;Більше дій та сигналів для перезапуску Pod і контейнерів зʼявляться незабаром! Зокрема, планується додати підтримку перезапуску всього Podʼа. Планування та обговорення цих функцій тривають. Не соромтеся ділитися відгуками або запитами до спільноти SIG Node!&lt;/p&gt;
&lt;h2 id=&#34;your-feedback-is-welcome&#34;&gt;Ми будемо раді отримати ваші відгуки!&lt;/h2&gt;
&lt;p&gt;Це альфа-функція, і проєкт Kubernetes хотів би почути ваші відгуки. Будь ласка, спробуйте її. Ця функція керується &lt;a href=&#34;https://github.com/Kubernetes/community/blob/master/sig-node/README.md&#34;&gt;SIG Node&lt;/a&gt;. Якщо ви зацікавлені в допомозі в розробці цієї функції, обміні відгуками або участі в будь-яких інших поточних проєктах SIG Node, будь ласка, звʼяжіться зі спільнотою SIG Node!&lt;/p&gt;
&lt;p&gt;Ви можете звʼязатися з SIG Node кількома способами:&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: Налаштування користувача (kuberc) доступні для тестування в kubectl 1.34</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/08/28/kubernetes-v1-34-kubectl-kuberc-beta/</guid>
      <description>
        
        
        &lt;p&gt;Чи хотіли ви будь-коли, щоб ви могли мати стандартно увімкнене &lt;a href=&#34;https://kep.k8s.io/3895&#34;&gt;інтерактивне видалення&lt;/a&gt; у &lt;code&gt;kubectl&lt;/code&gt;? Або, можливо, ви хочете визначити власні псевдоніми, але не обовʼязково &lt;a href=&#34;https://github.com/ahmetb/kubectl-aliases&#34;&gt;генерувати сотні з них вручну&lt;/a&gt;? Шукайте далі. &lt;a href=&#34;https://git.k8s.io/community/sig-cli/&#34;&gt;SIG-CLI&lt;/a&gt; наполегливо працює над додаванням &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;налаштувань користувача до kubectl&lt;/a&gt;, і ми раді оголосити, що ця функціональність досягає бета-версії в рамках випуску Kubernetes v1.34.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;Як це працює&lt;/h2&gt;
&lt;p&gt;Повний опис цієї функціональності доступний &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/kubectl/kuberc/&#34;&gt;в нашій офіційній документації&lt;/a&gt;, але в цьому дописі ми відповімо на обидва питання з початку цієї статті.&lt;/p&gt;
&lt;p&gt;Перед тим, як зануритися в деталі, давайте швидко розглянемо, як виглядає файл налаштувань користувача та де його розмістити. Типово &lt;code&gt;kubectl&lt;/code&gt; буде шукати файл &lt;code&gt;kuberc&lt;/code&gt; у вашій стандартній теці &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/configuration/organize-cluster-access-kubeconfig/&#34;&gt;kubeconfig&lt;/a&gt;, яка знаходиться за адресою &lt;code&gt;$HOME/.kube&lt;/code&gt;. Альтернативно, ви можете вказати це місце за допомогою параметра &lt;code&gt;--kuberc&lt;/code&gt; або змінної середовища &lt;code&gt;KUBERC&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Як і кожен маніфест Kubernetes, файл &lt;code&gt;kuberc&lt;/code&gt; почнеться з &lt;code&gt;apiVersion&lt;/code&gt; та &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;# тут будуть відображатися налаштування користувача&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;Почнемо з налаштування стандартних значень для параметрів команд &lt;code&gt;kubectl&lt;/code&gt;. Наша мета — завжди використовувати інтерактивне видалення, що означає, що ми хочемо, щоб параметр &lt;code&gt;--interactive&lt;/code&gt; для &lt;code&gt;kubectl delete&lt;/code&gt; завжди був встановлений на &lt;code&gt;true&lt;/code&gt;. Це можна досягти, додавши наступний фрагмент до нашого файлу &lt;code&gt;kuberc&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;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;В цьому прикладі ми представляємо секцію &lt;code&gt;defaults&lt;/code&gt;, яка дозволяє користувачам визначати стандартні значення для параметрів &lt;code&gt;kubectl&lt;/code&gt;. У цьому випадку ми встановлюємо параметр інтерактивності для &lt;code&gt;kubectl delete&lt;/code&gt; на &lt;code&gt;true&lt;/code&gt;. Це значення можна перевизначити, якщо користувач явно надає інше значення, наприклад, &lt;code&gt;kubectl delete --interactive=false&lt;/code&gt;, в цьому випадку явний параметр має пріоритет.&lt;/p&gt;
&lt;p&gt;Ще одне дуже рекомендоване типове значення від SIG-CLI — це використання &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/using-api/server-side-apply/&#34;&gt;Server-Side Apply&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:#080;font-style:italic&#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;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;Можливість визначати аліаси дозволяє нам заощаджувати дорогоцінні секунди під час введення команд. Я впевнений, що ви, напевно, маєте один визначений для &lt;code&gt;kubectl&lt;/code&gt;, оскільки введення семи літер безумовно займає більше часу, ніж просто натискання &lt;code&gt;k&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;З цієї причини можливість визначати аліаси була обовʼязковою, коли ми вирішили реалізувати налаштування користувача, поряд з установкою стандартних значень. Щоб визначити аліас для будь-якої з вбудованих команд, розширте свій файл &lt;code&gt;kuberc&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;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;Там багато чого відбувається, тому давайте розберемо це по черзі. По-перше, ми вводимо новий розділ: &lt;code&gt;aliases&lt;/code&gt;. Тут ми визначаємо новий аліас &lt;code&gt;gns&lt;/code&gt;, який відображається на команду &lt;code&gt;get&lt;/code&gt;. Далі ми визначаємо аргументи (&lt;code&gt;namespace&lt;/code&gt; ресурс), які будуть вставлені відразу після назви команди. Крім того, ми встановлюємо опцію &lt;code&gt;--output=json&lt;/code&gt; для цього аліаса. Структура блоку &lt;code&gt;options&lt;/code&gt; ідентична тій, що в розділі &lt;code&gt;defaults&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ви, напевно, помітили, що ми представили механізм для попереднього додавання аргументів, і ви можете запитати, чи є відповідне налаштування для їх додавання в кінці (іншими словами, додавання в кінець команди, після аргументів, наданих користувачем). Це можна досягти за допомогою блоку &lt;code&gt;appendArgs&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:#080;font-style:italic&#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;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;Тут ми вводимо ще один аліас: &lt;code&gt;runx&lt;/code&gt;, який викликає команду &lt;code&gt;kubectl run&lt;/code&gt;, передаючи параметри &lt;code&gt;--image&lt;/code&gt; і &lt;code&gt;--namespace&lt;/code&gt; з попередньо визначеними значеннями, а також додаючи &lt;code&gt;--&lt;/code&gt; і &lt;code&gt;custom-arg&lt;/code&gt; в кінці виклику.&lt;/p&gt;
&lt;h2 id=&#34;debugging&#34;&gt;Відлагодження&lt;/h2&gt;
&lt;p&gt;Ми сподіваємося, що налаштування користувача &lt;code&gt;kubectl&lt;/code&gt; відкриє нові можливості для наших користувачів. Коли у вас виникають сумніви, не соромтеся запускати &lt;code&gt;kubectl&lt;/code&gt; з підвищеною докладністю виводу. При &lt;code&gt;-v=5&lt;/code&gt; ви повинні отримати всю можливу інформацію для відлагодження з цієї функції, що буде важливо при повідомленні про проблеми.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше, я закликаю вас ознайомитися з &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/kubectl/kuberc/&#34;&gt;нашою офіційною документацією&lt;/a&gt; та &lt;a href=&#34;https://git.k8s.io/enhancements/keps/sig-cli/3104-introduce-kuberc/README.md&#34;&gt;фактичною пропозицією&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Долучайтесь&lt;/h2&gt;
&lt;p&gt;Функція налаштувань користувача Kubectl досягла бета-версії, і ми дуже зацікавлені у ваших відгуках. Нам хотілося б почути, що вам подобається в ній і які проблеми ви хотіли б вирішити. Не соромтеся приєднуватися до &lt;a href=&#34;https://kubernetes.slack.com/archives/C2GL57FJ4&#34;&gt;каналу SIG-CLI slack&lt;/a&gt;, або відкривати тікети в &lt;a href=&#34;https://git.k8s.io/kubectl/&#34;&gt;репозиторії kubectl&lt;/a&gt;. Ви також можете приєднатися до наших &lt;a href=&#34;https://git.k8s.io/community/sig-cli/#meetings&#34;&gt;зустрічей спільноти&lt;/a&gt;, які відбуваються кожну другу середу, і поділитися своїми історіями з нами.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Of Wind &amp; Will (O&#39; WaW)</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/08/27/kubernetes-v1-34-release/</link>
      <pubDate>Wed, 27 Aug 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/08/27/kubernetes-v1-34-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Редактори:&lt;/strong&gt; Agustina Barbetta, Alejandro Josue Leon Bellido, Graziano Casto, Melony Qin, Dipesh Rawat&lt;/p&gt;
&lt;p&gt;Подібно до попередніх релізів, випуск Kubernetes v1.34 представляє нові стабільні, бета- та альфа-функції. Послідовне надання високоякісних релізів підкреслює силу нашого циклу розробки та активну підтримку нашої спільноти.&lt;/p&gt;
&lt;p&gt;Цей реліз складається з 58 покращень. З них 23 перейшли до стабільного стану, 22 входять до бета-версії, а 13 перейшли до альфа-версії.&lt;/p&gt;
&lt;p&gt;У цьому релізі також є &lt;a href=&#34;#deprecations-and-removals&#34;&gt;застарівання та видалення функцій&lt;/a&gt;; обовʼязково ознайомтеся з ними.&lt;/p&gt;
&lt;h2 id=&#34;release-theme-and-logo&#34;&gt;Тема та логотип релізу&lt;/h2&gt;


&lt;figure class=&#34;release-logo &#34;&gt;
    &lt;img src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/08/27/kubernetes-v1-34-release/k8s-v1.34.png&#34;
         alt=&#34;Логотип Kubernetes v1.34: Три ведмеді пливуть на дерев&amp;#39;яному кораблі з прапором, на якому зображені лапа і штурвал, а вітер дме над океаном.&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Випуск, що рухається силою вітру навколо нас — і силою нашої волі.&lt;/p&gt;
&lt;p&gt;Кожен цикл випуску ми успадковуємо вітри, які насправді не контролюємо — стан наших інструментів, документації та історичні особливості нашого проєкту. Іноді ці вітри наповнюють наші вітрила, іноді вони штовхають нас убік або стихають.&lt;/p&gt;
&lt;p&gt;Те, що тримає Kubernetes в русі, не ідеальні вітри, а воля наших моряків, які регулюють вітрила, тримають штурвал, прокладають курси і тримають корабель на плаву. Випуск відбувається не тому, що умови завжди ідеальні, а завдяки людям, які його створюють, людям, які його випускають, і ведмедям&lt;sup&gt;^&lt;/sup&gt;, котам, собакам, чарівникам і допитливим умам, які допомагають Kubernetes залишатися на плаву — незалежно від того, в якому напрямку дме вітер.&lt;/p&gt;
&lt;p&gt;Цей реліз, &lt;strong&gt;Of Wind &amp;amp; Will (O&#39; WaW)&lt;/strong&gt;, вшановує вітри, які сформували нас, і волю, яка штовхає нас вперед.&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;^ О, і ви здивовані, чому ведмеді? Продовжуйте дивуватися!&lt;/sub&gt;&lt;/p&gt;
&lt;h2 id=&#34;spotlight-on-key-updates&#34;&gt;Основні оновлення&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.34 насичений новими функціями та покращеннями. Ось кілька оновлень, які команда випуску хотіла б виділити!&lt;/p&gt;
&lt;h3 id=&#34;stable-the-core-of-dra-is-ga&#34;&gt;Stable: Ядро DRA тепер GA&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;Динамічне виділення ресурсів&lt;/a&gt; (DRA) дозволяє використовувати потужніші способи вибору, виділення, спільного використання та налаштування GPU, TPU, мережевих карт та інших пристроїв.&lt;/p&gt;
&lt;p&gt;Починаючи з релізу v1.30, DRA базується на заявках на пристрої за допомогою &lt;em&gt;структурованих параметрів&lt;/em&gt;, які є непрозорими для ядра Kubernetes. Це покращення було натхненне динамічним провізуванням для сховищ. DRA зі структурованими параметрами спирається на набір допоміжних API-видів: ResourceClaim, DeviceClass, ResourceClaimTemplate та ResourceSlice API-типів в рамках &lt;code&gt;resource.k8s.io&lt;/code&gt;, одночасно розширюючи &lt;code&gt;.spec&lt;/code&gt; для Podʼів новим полем &lt;code&gt;resourceClaims&lt;/code&gt;. API &lt;code&gt;resource.k8s.io/v1&lt;/code&gt; стали стабільними і тепер є стандартно доступними.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4381&#34;&gt;KEP #4381&lt;/a&gt;, очолюваної WG Device Management.&lt;/p&gt;
&lt;h3 id=&#34;beta-projected-serviceaccount-tokens-for-kubelet-image-credential-providers&#34;&gt;Beta: Захищені токени ServiceAccount для провайдерів облікових даних образів &lt;code&gt;kubelet&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Постачальники облікових даних &lt;code&gt;kubelet&lt;/code&gt;, які використовуються для отримання приватних контейнерних образів, традиційно покладалися на довгострокові Secrets, збережені на вузлі або в кластері. Такий підхід збільшував ризики безпеки та ускладнював управління, оскільки ці облікові дані не були привʼязані до конкретного робочого навантаження і не оновлювалися автоматично. Щоб вирішити цю проблему, &lt;code&gt;kubelet&lt;/code&gt; тепер може запитувати короткочасні, привʼязані до певної аудиторії токени ServiceAccount для автентифікації в контейнерних реєстрах. Це дозволяє авторизувати отримання образів на основі власної ідентичності Podʼа, а не облікових даних на рівні вузла. Основна перевага полягає в значному поліпшенні безпеки. Це усуває необхідність у довгострокових Secrets для отримання образів, зменшуючи поверхню атаки та спрощуючи управління обліковими даними як для адміністраторів, так і для розробників.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4412&#34;&gt;KEP #4412&lt;/a&gt;, очолюваної SIG Auth та SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;alpha-support-for-kyaml-a-kubernetes-dialect-of-yaml&#34;&gt;Alpha: Підтримка KYAML, діалекту YAML для Kubernetes&lt;/h3&gt;
&lt;p&gt;KYAML має бути більш безпечним і менш неоднозначною підмножиною YAML, і був спроектований спеціально для Kubernetes. Незалежно від версії Kubernetes, яку ви використовуєте, починаючи з Kubernetes v1.34 ви можете використовувати KYAML як новий формат виводу для kubectl.&lt;/p&gt;
&lt;p&gt;KYAML вирішує специфічні проблеми як з YAML, так і з JSON. Значний пробіл YAML вимагає уважної уваги до відступів та вкладеності, тоді як необовʼязкове взяття рядків в лапки може призвести до неочікуваного приведення типів (наприклад: &lt;a href=&#34;https://hitchdev.com/strictyaml/why/implicit-typing-removed/&#34;&gt;&amp;quot;The Norway Bug&amp;quot;&lt;/a&gt;). Тим часом, JSON не підтримує коментарі та має суворі вимоги до наявності ком та ключів в лапках.&lt;/p&gt;
&lt;p&gt;Ви можете писати KYAML та передавати його як вхідні дані будь-якій версії &lt;code&gt;kubectl&lt;/code&gt;, оскільки всі файли KYAML також є дійсними YAML. З &lt;code&gt;kubectl&lt;/code&gt; v1.34 ви також можете &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/kubectl/#syntax-1&#34;&gt;запитувати вивід у форматі KYAML&lt;/a&gt; (як у kubectl get -o kyaml …), встановивши змінну середовища &lt;code&gt;KUBECTL_KYAML=true&lt;/code&gt;. Якщо ви бажаєте, ви все ще можете запитувати вивід у форматі JSON або YAML.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5295&#34;&gt;KEP #5295&lt;/a&gt;, очолюваної SIG CLI.&lt;/p&gt;
&lt;h2 id=&#34;features-graduating-to-stable&#34;&gt;Функції, що переходять у стабільний стан&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Це вибір деяких покращень, які тепер є стабільними після випуску v1.34.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;delayed-creation-of-jobs-replacement-pods&#34;&gt;Відкладене створення замінних Podʼів для Job&lt;/h3&gt;
&lt;p&gt;Стандартно, контролери Job створюють замінні Podʼи негайно, коли Pod починає завершення своєї роботи, що призводить до одночасного виконання обох Podʼів. Це може спричинити конкуренцію за ресурси в обмежених кластерах, де замінний Pod може зіткнутися з труднощами при пошуку доступних вузлів, поки оригінальний Pod повністю не завершиться. Ситуація також може спровокувати небажане збільшення масштабу кластеру. Крім того, деякі фреймворки машинного навчання, такі як TensorFlow та &lt;a href=&#34;https://jax.readthedocs.io/en/latest/&#34;&gt;JAX&lt;/a&gt;, вимагають, щоб на індекс припадав лише один Pod, що робить одночасне виконання Podʼів проблематичним. Ця функція вводить &lt;code&gt;.spec.podReplacementPolicy&lt;/code&gt; у Jobs. Ви можете вибрати створення замінних Podʼів лише тоді, коли Pod повністю завершено (має &lt;code&gt;.status.phase: Failed&lt;/code&gt;). Для цього встановіть &lt;code&gt;.spec.podReplacementPolicy: Failed&lt;/code&gt;.
Представлена як альфа у v1.28, ця функція стала стабільною у v1.34.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3939&#34;&gt;KEP #3939&lt;/a&gt;, очолюваної SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;recovery-from-volume-expansion-failure&#34;&gt;Відновлення після збою розширення тому&lt;/h3&gt;
&lt;p&gt;Ця функція дозволяє користувачам скасовувати розширення тому, які не підтримуються підляглими постачальниками зберігання, і повторно спробувати розширити том з меншими значеннями, які можуть бути успішними. Представлена як альфа у v1.23, ця функція стала стабільною у v1.34.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/1790&#34;&gt;KEP #1790&lt;/a&gt;, очолюваної SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;volumeattributesclass-for-volume-modification&#34;&gt;VolumeAttributesClass для зміни томів&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/storage/volume-attributes-classes/&#34;&gt;VolumeAttributesClass&lt;/a&gt; став стабільним у v1.34. VolumeAttributesClass — це загальний, рідний для Kubernetes API для зміни параметрів тому, таких як виділений IO. Він дозволяє робочим навантаженням вертикально масштабувати свої томи онлайн для балансування вартості та продуктивності, якщо це підтримується їх провайдером. Як і всі нові функції томів в Kubernetes, цей API реалізується через &lt;a href=&#34;https://kubernetes-csi.github.io/docs/&#34;&gt;інтерфейс зберігання контейнерів (CSI)&lt;/a&gt;. Ваш специфічний для провайдерів CSI драйвер повинен підтримувати новий ModifyVolume API, який є CSI стороною цієї функції.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3751&#34;&gt;KEP #3751&lt;/a&gt;, очолюваної SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;structured-authentication-configuration&#34;&gt;Структурована конфігурація автентифікації&lt;/h3&gt;
&lt;p&gt;Kubernetes v1.29 представив формат файлу конфігурації для управління автентифікацією клієнта API сервера, відмовившись від попередньої залежності від великої кількості параметрів командного рядка. &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/access-authn-authz/authentication/#using-authentication-configuration&#34;&gt;AuthenticationConfiguration&lt;/a&gt; дозволяє адміністраторам підтримувати кілька автентифікаторів JWT, перевірку виразів CEL та динамічну перезагрузку. Ця зміна суттєво покращує керованість та можливість аудиту налаштувань автентифікації кластеру, і стала стабільною у v1.34.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3331&#34;&gt;KEP #3331&lt;/a&gt;, очолюваної SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;finer-grained-authorization-based-on-selectors&#34;&gt;Більш детальна авторизація на основі селекторів&lt;/h3&gt;
&lt;p&gt;Авторизатори Kubernetes, включаючи веб-хуки авторизації та вбудований авторизатор вузлів, тепер можуть приймати рішення про авторизацію на основі селекторів полів та міток у вхідних запитах. Коли ви надсилаєте запити &lt;strong&gt;list&lt;/strong&gt;, &lt;strong&gt;watch&lt;/strong&gt; або &lt;strong&gt;deletecollection&lt;/strong&gt; з селекторами, шар авторизації тепер може оцінювати доступ з урахуванням цього додаткового контексту.&lt;/p&gt;
&lt;p&gt;Наприклад, ви можете написати політику авторизації, яка дозволяє лише вивід переліку Podʼів, привʼязаних до конкретного &lt;code&gt;.spec.nodeName&lt;/code&gt;. Клієнт (можливо, kubelet на певному вузлі) повинен вказати селектор поля, який вимагає політика, в іншому випадку запит заборонено. Ця зміна робить можливим налаштування правил найменшого привілею, за умови, що клієнт знає, як відповідати встановленим вами обмеженням. Kubernetes v1.34 тепер підтримує більш детальний контроль у таких середовищах, як ізоляція на рівні вузлів або спеціальні багатокористувацькі налаштування.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4601&#34;&gt;KEP #4601&lt;/a&gt;, очолюваної SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;restrict-anonymous-requests-with-fine-grained-controls&#34;&gt;Обмеження анонімних запитів за допомогою детальних налаштувань контролю&lt;/h3&gt;
&lt;p&gt;Замість повного увімкнення або вимкнення анонімного доступу, ви тепер можете налаштувати суворий список точок доступу, де дозволені неавтентифіковані запити. Це забезпечує більш безпечну альтернативу для кластерів, які покладаються на анонімний доступ до точок доступу, таких як &lt;code&gt;/healthz&lt;/code&gt;, &lt;code&gt;/readyz&lt;/code&gt; або &lt;code&gt;/livez&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;З цією функцією можна уникнути випадкових неправильних налаштувань RBAC, які надають широкий доступ неавтентифікованим користувачам, не вимагаючи змін у зовнішніх пробах або інструментах завантаження.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4633&#34;&gt;KEP #4633&lt;/a&gt;, очолюваної SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;more-efficient-requeueing-through-plugin-specific-callbacks&#34;&gt;Більш ефективне повторне додавання в чергу за допомогою зворотних викликів, специфічних для відповідних втулків&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;kube-scheduler&lt;/code&gt; тепер може приймати більш точні рішення про те, коли повторно намагатися запланувати Podʼи, які раніше не вдалося запланувати. Кожен втулок планування тепер може реєструвати функції зворотного виклику, які повідомляють планувальнику, чи ймовірно, що вхідна подія кластера знову зробить Pod, що відхиляється, придатним для планування.&lt;/p&gt;
&lt;p&gt;Це зменшує непотрібні повторні спроби та покращує загальну пропускну здатність планування, особливо в кластерах, що використовують динамічне виділення ресурсів. Ця функція також дозволяє певним втулкам пропускати звичайну затримку повторної спроби, коли це безпечно, що прискорює планування в певних випадках.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4247&#34;&gt;KEP #4247&lt;/a&gt;, очолюваної SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;ordered-namespace-deletion&#34;&gt;Впорядковане видалення Namespace&lt;/h3&gt;
&lt;p&gt;Напіввипадковий порядок видалення ресурсів може створювати прогалини в безпеці або непередбачувану поведінку, таку як збереження Podʼів після видалення їх асоційованих NetworkPolicies. Це покращення впроваджує більш структурований процес видалення для &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/namespaces/&#34;&gt;просторів імен&lt;/a&gt; Kubernetes, щоб забезпечити безпечне та детерміноване видалення ресурсів. Дотримуючись структурованої послідовності видалення, яка враховує логічні та безпекові залежності, цей підхід забезпечує видалення Podʼів перед іншими ресурсами. Ця функція була представлена в Kubernetes v1.33 і стала стабільною в v1.34. Підвищення безпеки та надійності завдяки зменшенню ризиків від недетермінованих видалень, включаючи вразливість, описану в &lt;a href=&#34;https://github.com/advisories/GHSA-r56h-j38w-hrqq&#34;&gt;CVE-2024-7598&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5080&#34;&gt;KEP #5080&lt;/a&gt;, очолюваної SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;streaming-list-responses&#34;&gt;Потокове передавання &lt;strong&gt;list&lt;/strong&gt; відповідей&lt;/h3&gt;
&lt;p&gt;Обробка великих &lt;strong&gt;list&lt;/strong&gt; відповідей у Kubernetes раніше становила значну проблему масштабованості. Коли клієнти запитували великі списки ресурсів, такі як тисячі Podʼів або Custom Resources, API серверу потрібно було серіалізувати всю колекцію обʼєктів в один великий буфер памʼяті перед відправленням. Цей процес створював значний тиск на памʼять і міг призвести до погіршення продуктивності, впливаючи на загальну стабільність кластера. Щоб розвʼязати це обмеження, було впроваджено механізм кодування потоків для колекцій (відповідей списку). Цей механізм потокового передавання автоматично активний для форматів відповіді JSON та Kubernetes Protobuf, і відповідна функціональна можливість є стабільною. Основна перевага цього підходу полягає в уникненні великих алокацій памʼяті на API сервері, що призводить до набагато меншої та більш передбачуваної витрати памʼяті. Внаслідок цього кластер стає більш стійким і продуктивним, особливо в середовищах великого масштабу, де часті запити на великі списки ресурсів є звичайними.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5116&#34;&gt;KEP #5116&lt;/a&gt;, очолюваної SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;resilient-watch-cache-initialization&#34;&gt;Ініціалізація стійкого кешу спостереження&lt;/h3&gt;
&lt;p&gt;Watch cache — це шар кешування всередині &lt;code&gt;kube-apiserver&lt;/code&gt;, який підтримує врешті-решт узгоджений кеш стану кластера, збереженого в etcd. У минулому могли виникати проблеми, коли кеш спостереження ще не був ініціалізований під час запуску &lt;code&gt;kube-apiserver&lt;/code&gt; або коли він вимагав повторної ініціалізації.&lt;/p&gt;
&lt;p&gt;Щоб вирішити ці проблеми, процес ініціалізації кешу спостереження став більш стійким до збоїв, покращуючи надійність панелі управління та забезпечуючи надійне встановлення спостережень для контролерів і клієнтів. Це покращення було представлено як бета у v1.31 і тепер є стабільним.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4568&#34;&gt;KEP #4568&lt;/a&gt;, очолюваної SIG API Machinery та SIG Scalability.&lt;/p&gt;
&lt;h3 id=&#34;relaxing-dns-search-path-validation&#34;&gt;Послаблення перевірки шляху пошуку DNS&lt;/h3&gt;
&lt;p&gt;Раніше сувора перевірка шляху DNS &lt;code&gt;search&lt;/code&gt; у Kubernetes часто створювала проблеми інтеграції в складних або застарілих мережевих середовищах. Ця обмеженість могла блокувати конфігурації, які були необхідні для інфраструктури організації, змушуючи адміністраторів впроваджувати складні обхідні шляхи. Щоб вирішити цю проблему, була введена послаблена перевірка DNS як альфа у v1.32, і вона стала стабільною у v1.34. Загальний випадок використання включає Podʼи, які повинні спілкуватися як з внутрішніми службами Kubernetes, так і з зовнішніми доменами. Встановивши одну крапку (&lt;code&gt;.&lt;/code&gt;) як перший запис у списку &lt;code&gt;searches&lt;/code&gt; поля &lt;code&gt;.spec.dnsConfig&lt;/code&gt; Pod, адміністратори можуть запобігти додаванню внутрішніх доменів пошуку кластера до зовнішніх запитів. Це запобігає створенню непотрібних DNS-запитів до внутрішнього DNS-сервера для зовнішніх імен хостів, покращуючи ефективність та запобігаючи потенційним помилкам резолюції.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4427&#34;&gt;KEP #4427&lt;/a&gt;, очолюваної SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;support-for-direct-service-return-dsr-in-windows-kube-proxy&#34;&gt;Підтримкадля Direct Service Return (DSR) у Windows &lt;code&gt;kube-proxy&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;DSR забезпечує оптимізацію продуктивності, дозволяючи поверненню трафіку, що маршрутизується через балансувальники навантаження, обходити балансувальник і безпосередньо відповідати клієнту, зменшуючи навантаження на балансувальник і покращуючи загальну затримку. Для отримання інформації про DSR у Windows читайте &lt;a href=&#34;https://techcommunity.microsoft.com/blog/networkingblog/direct-server-return-dsr-in-a-nutshell/693710&#34;&gt;Direct Server Return (DSR) in a nutshell&lt;/a&gt;. Спочатку представлена у v1.14, ця функція стала стабільною у v1.34.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5100&#34;&gt;KEP #5100&lt;/a&gt;, очолюваної SIG Windows.&lt;/p&gt;
&lt;h3 id=&#34;sleep-action-for-container-lifecycle-hooks&#34;&gt;Дія Sleep для хуків життєвого циклу контейнерів&lt;/h3&gt;
&lt;p&gt;Дія Sleep для хуків життєвого циклу контейнерів PreStop і PostStart була введена, щоб забезпечити простий спосіб керування процесом відповідного завершення роботи та покращити загальне управління життєвим циклом контейнерів. Дія Sleep дозволяє контейнерам призупинятися на вказаний період після запуску або перед завершенням. Використання негативної або нульової тривалості сну призводить до негайного повернення, що призводить до відсутності операції. Дія Sleep була представлена в Kubernetes v1.29, з підтримкою нульового значення, доданою в v1.32. Обидві функції стали стабільними в v1.34.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3960&#34;&gt;KEP #3960&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/4818&#34;&gt;KEP #4818&lt;/a&gt;, очолюваної SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;linux-node-swap-support&#34;&gt;Підтримка свопу на вузлах Linux&lt;/h3&gt;
&lt;p&gt;Історично, відсутність підтримки свопу в Kubernetes могло призводити до нестабільності робочих навантажень, оскільки вузли під тиском памʼяті часто змушені були примусово завершувати процеси. Це особливо впливало на програми з великими, але рідко використовуваними обсягами памʼяті, і заважало більш мʼякому управлінню ресурсами.&lt;/p&gt;
&lt;p&gt;Щоб вирішити цю проблему, підтримка свопу з налаштуваннями на рівні вузлів була представлена у v1.22. Вона пройшла через альфа- та бета-етапи і стала стабільною у v1.34. Основний режим, &lt;code&gt;LimitedSwap&lt;/code&gt;, дозволяє Podʼам використовувати своп всередині їх наявних обмежень памʼяті, надаючи безпосереднє розвʼязання проблеми. Стандартно, &lt;code&gt;kubelet&lt;/code&gt; налаштований у режимі &lt;code&gt;NoSwap&lt;/code&gt;, що означає, що робочі навантаження Kubernetes не можуть використовувати своп.&lt;/p&gt;
&lt;p&gt;Ця функція покращує стабільність робочих навантажень і дозволяє більш ефективно використовувати ресурси. Вона дозволяє кластерам підтримувати ширший спектр програм, особливо в умовах обмежених ресурсів, хоча адміністраторам слід враховувати потенційний вплив на продуктивність від використання свопу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/2400&#34;&gt;KEP #2400&lt;/a&gt;, очолюваної SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;allow-special-characters-in-environment-variables&#34;&gt;Дозвіл на використання спеціальних символів в змінних середовища&lt;/h3&gt;
&lt;p&gt;Правила валідації змінних середовища в Kubernetes були послаблені, щоб дозволити майже всі друковані символи ASCII в іменах змінних, за винятком &lt;code&gt;=&lt;/code&gt;. Ця зміна підтримує сценарії, коли робочі навантаження вимагають нестандартних символів в іменах змінних, наприклад, фреймворки, такі як .NET Core, які використовують &lt;code&gt;:&lt;/code&gt; для представлення вкладених ключів конфігурації.&lt;/p&gt;
&lt;p&gt;Послаблена валідація застосовується до змінних середовища, визначених безпосередньо в специфікації Pod, а також до тих, що впроваджуються за допомогою посилань &lt;code&gt;envFrom&lt;/code&gt; на ConfigMaps і Secrets.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4369&#34;&gt;KEP #4369&lt;/a&gt;, очолюваної SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;taint-management-is-separated-from-node-lifecycle&#34;&gt;Керування позначками taint тепер відокремлено від життєвого циклу вузлів&lt;/h3&gt;
&lt;p&gt;Історично, логіка &lt;code&gt;TaintManager&lt;/code&gt; щодо застосування taints NoSchedule та NoExecute до вузлів на основі їх стану (NotReady, Unreachable тощо) була тісно повʼязана з контролером життєвого циклу вузлів. Це тісне зʼєднання ускладнювало обслуговування та тестування коду, а також обмежувало гнучкість механізму виселення на основі taint. Цей KEP переносить &lt;code&gt;TaintManager&lt;/code&gt; у свій власний окремий контролер у межах менеджера контролерів Kubernetes. Це внутрішнє архітектурне покращення, спрямоване на підвищення модульності та підтримуваності коду. Ця зміна дозволяє логіці виселення на основі taint тестуватися та розвиватися незалежно, але не має прямого впливу на користувацький інтерфейс щодо використання taints.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3902&#34;&gt;KEP #3902&lt;/a&gt;, очолюваної SIG Scheduling та SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-beta&#34;&gt;Нові Beta функції&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Це деякі покращення, які тепер є бета після випуску v1.34.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;pod-level-resource-requests-and-limits&#34;&gt;Запити та обмеження ресурсів на рівні Pod&lt;/h3&gt;
&lt;p&gt;Визначення потреб у ресурсах для Podʼів з кількома контейнерами було складним, оскільки запити та обмеження могли бути встановлені лише на рівні кожного контейнера. Це змушувало розробників або перевищувати виділені ресурси для кожного контейнера, або ретельно ділити загальні бажані ресурси, ускладнюючи конфігурацію та часто призводячи до неефективного виділення ресурсів. Щоб спростити це, була введена можливість вказувати запити та обмеження ресурсів на рівні Podʼів. Це дозволяє розробникам визначати загальний бюджет ресурсів для Podʼа, який потім ділиться між його контейнерами. Ця функція була представлена як альфа у v1.32 і стала бета у v1.34, при цьому HPA тепер підтримує специфікації ресурсів на рівні подів.&lt;/p&gt;
&lt;p&gt;Основна перевага полягає в більш інтуїтивному та простому способі управління ресурсами для Podʼів з кількома контейнерами. Це забезпечує те, щоб загальні ресурси, що використовуються всіма контейнерами, не перевищували визначені обмеження Podʼа, що призводить до кращого планування ресурсів, більш точного розподілу, та більш ефективного використання ресурсів кластера.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/2837&#34;&gt;KEP #2837&lt;/a&gt;, очолюваної SIG Scheduling та SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;kuberc-file-for-kubectl-user-preferences&#34;&gt;Файл &lt;code&gt;.kuberc&lt;/code&gt; для налаштувань користувача &lt;code&gt;kubectl&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Файл конфігурації &lt;code&gt;.kuberc&lt;/code&gt; дозволяє визначити уподобання для &lt;code&gt;kubectl&lt;/code&gt;, такі як стандартні параметри та псевдоніми команд. На відміну від файлу kubeconfig, файл конфігурації &lt;code&gt;.kuberc&lt;/code&gt; не містить інформації про кластер, імен користувачів або паролів. Ця функція була представлена як альфа у v1.33, під контролем змінної середовища &lt;code&gt;KUBECTL_KUBERC&lt;/code&gt;. Вона стала бета у v1.34 і є стандартно увімкненою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;KEP #3104&lt;/a&gt;, очолюваної SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;external-serviceaccount-token-signing&#34;&gt;Підписування токенів зовнішніх ServiceAccount&lt;/h3&gt;
&lt;p&gt;Традиційно, Kubernetes управляє токенами ServiceAccount, використовуючи статичні ключі підпису, які завантажуються з диска під час запуску &lt;code&gt;kube-apiserver&lt;/code&gt;. Ця функція впроваджує сервіс gRPC &lt;code&gt;ExternalJWTSigner&lt;/code&gt; для підпису поза процесом, що дозволяє дистрибутивам Kubernetes інтегруватися з зовнішніми рішеннями для управління ключами (наприклад, HSM, хмарні KMS) для підпису токенів ServiceAccount замість статичних ключів на диску.&lt;/p&gt;
&lt;p&gt;Представлена як альфа у v1.32, ця зовнішня можливість підпису JWT переходить у бета-версію та є стандартно увімкненою у v1.34.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/740&#34;&gt;KEP #740&lt;/a&gt;, очолюваної SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;dra-features-in-beta&#34;&gt;Функції DRA у бета-версії&lt;/h3&gt;
&lt;h4 id=&#34;admin-access-for-secure-resource-monitoring&#34;&gt;Адміністративний доступ для безпечного моніторингу ресурсів&lt;/h4&gt;
&lt;p&gt;DRA підтримує контрольований адміністративний доступ через поле &lt;code&gt;adminAccess&lt;/code&gt; у ResourceClaims або ResourceClaimTemplates, що дозволяє операторам кластерів отримувати доступ до пристроїв, які вже використовуються іншими, для моніторингу або діагностики. Цей привілейований режим обмежений користувачами, уповноваженими створювати такі обʼєкти в просторах імен, помічених як &lt;code&gt;resource.k8s.io/admin-access: &amp;quot;true&amp;quot;&lt;/code&gt;, що забезпечує, щоб звичайні робочі навантаження залишалися неушкодженими. Перехід до бета-версії у v1.34 надає цю функцію безпечних інструментів для спостереження, зберігаючи при цьому ізоляцію робочих навантажень через авторизаційні перевірки на основі просторів імен.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5018&#34;&gt;KEP #5018&lt;/a&gt;, очолюваної WG Device Management та SIG Auth.&lt;/p&gt;
&lt;h4 id=&#34;prioritized-alternatives-in-resourceclaims-and-resourceclaimtemplates&#34;&gt;Пріоритетні альтернативи в ResourceClaims та ResourceClaimTemplates&lt;/h4&gt;
&lt;p&gt;Хоча робоче навантаження може найкраще працювати на одному високопродуктивному GPU, воно також може працювати на двох слабших GPU. З перемикачем функцій &lt;code&gt;DRAPrioritizedList&lt;/code&gt; (тепер стандартно увімкнено) ResourceClaims та ResourceClaimTemplates отримують нове поле &lt;code&gt;firstAvailable&lt;/code&gt;. Це поле є впорядкованим списком, що дозволяє користувачам вказувати, що запит може бути задоволений різними способами, включаючи виділення нічого, якщо специфічне обладнання недоступне. Планувальник намагатиметься задовольнити альтернативи в списку за порядком, тому робоче навантаження отримає найкращий набір доступних пристроїв у кластері.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4816&#34;&gt;KEP #4816&lt;/a&gt;, очолюваної WG Device Management.&lt;/p&gt;
&lt;h4 id=&#34;the-kubelet-reports-allocated-dra-resources&#34;&gt;&lt;code&gt;kubelet&lt;/code&gt; сповіщає про виділені ресурси DRA&lt;/h4&gt;
&lt;p&gt;API &lt;code&gt;kubelet&lt;/code&gt; було оновлено для звіту про ресурси Pod, виділені через DRA. Це дозволяє агентам моніторингу вузлів виявляти виділені ресурси DRA для Podʼів на вузлі. Крім того, це дозволяє вузловим компонентам використовувати PodResourcesAPI та використовувати цю інформацію про DRA при розробці нових функцій та інтеграцій. Починаючи з Kubernetes v1.34, ця функція є стандартно увімкненою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3695&#34;&gt;KEP #3695&lt;/a&gt;, очолюваної WG Device Management.&lt;/p&gt;
&lt;h3 id=&#34;kube-scheduler-non-blocking-api-calls&#34;&gt;Неблокуючі виклики API &lt;code&gt;kube-scheduler&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;kube-scheduler&lt;/code&gt; виконує блокуючі API виклики під час циклів планування, створюючи вузькі місця в продуктивності. Ця функція впроваджує асинхронну обробку API через систему пріоритетних черг з дедуплікацією запитів, що дозволяє планувальнику продовжувати обробку Podʼів, поки операції API завершуються у фоновому режимі. Основні переваги включають зменшення затримки планування, запобігання голодування потоків планувальника під час затримок API та негайну можливість повторної спроби для незапланованих Podʼів. Реалізація зберігає зворотну сумісність і додає метрики для моніторингу очікуючих операцій API.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5229&#34;&gt;KEP #5229&lt;/a&gt;, очолюваної SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;mutating-admission-policies&#34;&gt;Змінювані політики допуску&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/access-authn-authz/mutating-admission-policy/&#34;&gt;MutatingAdmissionPolicies&lt;/a&gt; пропонують декларативну, внутрішню альтернативу змінюваним веб-хукам допуску. Ця функція використовує інсталяцію обʼєктів CEL та стратегії JSON Patch, в поєднанні з алгоритмами злиття Server Side Apply. Це суттєво спрощує контроль допуску, дозволяючи адміністраторам визначати правила мутації безпосередньо в API сервері. Представлені як альфа у v1.32, політики мутації допуску стали бета у v1.34.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3962&#34;&gt;KEP #3962&lt;/a&gt;, очолюваної SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;snapshottable-api-server-cache&#34;&gt;Кеш сервера API, доступний для знімків&lt;/h3&gt;
&lt;p&gt;Механізм кешування &lt;code&gt;kube-apiserver&lt;/code&gt; (кеш спостереження) ефективно обслуговує запити на останній спостережуваний стан. Однак, &lt;strong&gt;list&lt;/strong&gt; запити на попередні стани (наприклад, через пагінацію або вказуючи &lt;code&gt;resourceVersion&lt;/code&gt;) часто обходять цей кеш і обслуговуються безпосередньо з etcd. Це пряме звернення до etcd значно збільшує витрати на продуктивність і може призвести до проблем зі стабільністю, особливо з великими ресурсами, через тиск на памʼять від передачі великих обсягів даних. Зі стандартно увімкненою функцією &lt;code&gt;ListFromCacheSnapshot&lt;/code&gt; &lt;code&gt;kube-apiserver&lt;/code&gt; намагатиметься обслуговувати відповідь з моментальних знімків, якщо такий є з &lt;code&gt;resourceVersion&lt;/code&gt;, старішим за запитуваний. &lt;code&gt;kube-apiserver&lt;/code&gt; починає без знімків, створює новий знімок на кожну подію спостереження і зберігає їх, поки не виявить, що etcd стиснуто, або якщо кеш заповнений подіями старшими за 75 секунд. Якщо вказаний &lt;code&gt;resourceVersion&lt;/code&gt; недоступний, сервер повернеться до etcd.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4988&#34;&gt;KEP #4988&lt;/a&gt;, очолюваної SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;tooling-for-declarative-validation-of-kubernetes-native-types&#34;&gt;Інструменти для декларативної перевірки типів, властивих Kubernetes&lt;/h3&gt;
&lt;p&gt;Перед цим випуском правила валідації для вбудованих у Kubernetes API писалися повністю вручну, що ускладнює їх виявлення, розуміння, покращення або тестування для супроводжуючих. Не було єдиного способу знайти всі правила валідації, які можуть застосовуватися до API. &lt;em&gt;Декларативна валідація&lt;/em&gt; приносить користь супроводжувачам Kubernetes, спрощуючи розробку, обслуговування та перевірку API, одночасно дозволяючи програмну інспекцію для кращого інструментування та документації. Для людей, які використовують бібліотеки Kubernetes для написання свого коду (наприклад: контролера), новий підхід спрощує додавання нових полів через IDL теґи, а не складні функції валідації. Ця зміна допомагає прискорити створення API, автоматизуючи шаблони валідації, та надає більш релевантні повідомлення про помилки, виконуючи валідацію на версійованих типах.​​​​​​​​​​​​​​​​ Це вдосконалення (яке стало бета у v1.33 і продовжується як бета у v1.34) приносить правила валідації на основі CEL до рідних типів Kubernetes. Це дозволяє визначати більш детальну та декларативну валідацію безпосередньо в визначеннях типів, покращуючи узгодженість API та взаємодію з розробниками.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5073&#34;&gt;KEP #5073&lt;/a&gt;, очолюваної SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;streaming-informers-for-list-requests&#34;&gt;Потокові інформери для запитів &lt;strong&gt;list&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Функція потокових інформерів, яка була в бета-версії з v1.32, отримує подальші вдосконалення бета-версії в v1.34. Ця можливість дозволяє &lt;strong&gt;list&lt;/strong&gt; запитам повертати дані як безперервний потік обʼєктів з кешу спостереження API сервера, а не збиратися з пагінованих результатів безпосередньо з etcd. Повторюючи ті ж механізми, що використовуються для операцій &lt;strong&gt;watch&lt;/strong&gt;, API сервер може обслуговувати великі набори даних, зберігаючи при цьому стабільне використання памʼяті та уникаючи піків алокації, які можуть вплинути на стабільність.&lt;/p&gt;
&lt;p&gt;У цьому релізі &lt;code&gt;kube-apiserver&lt;/code&gt; та &lt;code&gt;kube-controller-manager&lt;/code&gt; обидва типово використовують новий механізм &lt;code&gt;WatchList&lt;/code&gt;. Для &lt;code&gt;kube-apiserver&lt;/code&gt; це означає, що запити списку тепер обслуговуються більш ефективно, тоді як &lt;code&gt;kube-controller-manager&lt;/code&gt; отримує більш ефективний з точки зору памʼяті та передбачуваний спосіб роботи з інформерами. Разом ці покращення зменшують тиск на памʼять під час великих операцій list та покращують надійність під час тривалого навантаження, роблячи потокову передачу списків більш передбачуваною та ефективною.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3157&#34;&gt;KEP #3157&lt;/a&gt;, очолюваної SIG API Machinery та SIG Scalability.&lt;/p&gt;
&lt;h3 id=&#34;graceful-node-shutdown-handling-for-windows-nodes&#34;&gt;Управління належним вимкненням для вузлів на Windows&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;kubelet&lt;/code&gt; на вузлах Windows тепер може виявляти події завершення системи та починати належне завершення роботи запущених Podʼів. Це відображає існуючу поведінку на Linux і допомагає забезпечити чистий вихід робочих навантажень під час запланованих вимкнень або перезавантажень. Коли система починає вимикатися, &lt;code&gt;kubelet&lt;/code&gt; реагує, використовуючи стандартну логіку завершення. Він поважає налаштовані хуки життєвого циклу та періоди належного вимкнення, надаючи Podʼам час на зупинку перед вимкненням вузла. Ця функція покладається на попереджувальні сповіщення Windows для координації цього процесу. Це вдосконалення покращує надійність робочих навантажень під час обслуговування, перезавантажень або оновлень системи. Тепер вона знаходиться в бета-версії та є стандартно увімкненою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4802&#34;&gt;KEP #4802&lt;/a&gt;, очолюваної SIG Windows.&lt;/p&gt;
&lt;h3 id=&#34;in-place-pod-resize-improvements&#34;&gt;Покращення в зміні розмірів Podʼа на місці&lt;/h3&gt;
&lt;p&gt;Підвищена до бета-версії та стандартно увімкнена у v1.33, функція зміни розміру Podʼа на місці отримує подальші вдосконалення в v1.34. До них відноситься підтримка зменшення використання памʼяті та інтеграція з ресурсами на рівні Podʼа.&lt;/p&gt;
&lt;p&gt;Ця функція залишається в бета-версії в v1.34. Для отримання детальних інструкцій щодо використання та прикладів зверніться до документації: &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tasks/configure-pod-container/resize-container-resources/&#34;&gt;Зміна ресурсів CPU та памʼяті, призначених контейнерам&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP #1287&lt;/a&gt;, очолюваної SIG Node та SIG Autoscaling.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-alpha&#34;&gt;Нові функції в Alpha&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Це деякі з покращень, які тепер є альфа після випуску v1.34.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;pod-certificates-for-mtls-authentication&#34;&gt;Сертифікати Pod для автентифікації mTLS&lt;/h3&gt;
&lt;p&gt;Автентифікація робочих навантажень всередині кластера, особливо для звʼязку з API сервером, в основному покладалася на токени ServiceAccount. Хоча це ефективно, ці токени не завжди є ідеальними для встановлення сильної, перевіряємої ідентичності для взаємного TLS (mTLS) і можуть створювати проблеми при інтеграції з зовнішніми системами, які очікують автентифікації на основі сертифікатів. Kubernetes v1.34 вводить вбудований механізм для Podʼів для отримання сертифікатів X.509 через &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/access-authn-authz/certificate-signing-requests/#pod-certificate-requests&#34;&gt;PodCertificateRequests&lt;/a&gt;. &lt;code&gt;kubelet&lt;/code&gt; може запитувати та керувати сертифікатами для Podʼів, які потім можуть використовуватися для автентифікації на сервері API Kubernetes та інших службах за допомогою mTLS. Основна перевага полягає в більш надійному та гнучкому механізмі ідентифікації для Podʼів. Це надає рідний спосіб реалізації надійної автентифікації mTLS без покладання виключно на маркерні токени, узгоджуючи Kubernetes зі стандартними практиками безпеки та спрощуючи інтеграцію з інструментами спостереження та безпеки, які використовують сертифікати.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4317&#34;&gt;KEP #4317&lt;/a&gt;, очолюваної SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;restricted-pod-security-standard-now-forbids-remote-probes&#34;&gt;Стандарт безпеки Pod &amp;quot;Restricted&amp;quot; тепер забороняє віддалені перевірки&lt;/h3&gt;
&lt;p&gt;Поле &lt;code&gt;host&lt;/code&gt; в рамках перевірок та обробників життєвого циклу дозволяє користувачам вказувати іншу сутність, ніж &lt;code&gt;podIP&lt;/code&gt;, для перевірки &lt;code&gt;kubelet&lt;/code&gt;. Однак, це відкриває шлях для зловживань та атак, які обходять засоби безпеки, оскільки поле &lt;code&gt;host&lt;/code&gt; може бути встановлено на &lt;strong&gt;будь-яке&lt;/strong&gt; значення, включаючи чутливі до безпеки зовнішні хости або localhost на вузлі. У Kubernetes v1.34, Podʼи відповідають стандарту безпеки &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/security/pod-security-standards/#restricted&#34;&gt;Restricted&lt;/a&gt; лише в тому випадку, якщо вони або залишають поле &lt;code&gt;host&lt;/code&gt; не налаштованим, або якщо вони навіть не використовують цей тип перевірки. Ви можете використовувати &lt;em&gt;автоматизацію безпеки Pod&lt;/em&gt;, або сторонніх рішень, щоб забезпечити відповідність Podʼів цьому стандарту. Оскільки це засоби безпеки, ознайомтеся з документацією, щоб зрозуміти обмеження та поведінку механізму примусового виконання, який ви обираєте.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4940&#34;&gt;KEP #4940&lt;/a&gt;, очолюваної SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;use-status-nominatednodename-to-express-pod-placement&#34;&gt;Використовуйте &lt;code&gt;.status.nominatedNodeName&lt;/code&gt; для показу розміщення Podʼа&lt;/h3&gt;
&lt;p&gt;Коли &lt;code&gt;kube-scheduler&lt;/code&gt; затримується з привʼязкою Podʼів до вузлів, кластерні автомасштабувальники можуть не розуміти, що Pod буде привʼязаний до певного вузла. Внаслідок цього вони можуть помилково вважати вузол недовикористаним і видалити його. Щоб вирішити цю проблему, &lt;code&gt;kube-scheduler&lt;/code&gt; може використовувати &lt;code&gt;.status.nominatedNodeName&lt;/code&gt; не лише для вказівки на триваюче примусове виконання, але й для показу намірів розміщення Pod. Увімкнувши функціональну можливість &lt;code&gt;NominatedNodeNameForExpectation&lt;/code&gt;, планувальник використовує це поле, щоб вказати, куди Pod буде призначений. Це відкриває внутрішні резервування, щоб допомогти зовнішнім компонентам приймати обґрунтовані рішення.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5278&#34;&gt;KEP #5278&lt;/a&gt;, очолюваної SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;dra-features-in-alpha&#34;&gt;Функції DRA в альфа-версії&lt;/h3&gt;
&lt;h4 id=&#34;resource-health-status-for-dra&#34;&gt;Стан ресурсів для DRA&lt;/h4&gt;
&lt;p&gt;Може бути важко дізнатися, коли Pod використовує пристрій, який вийшов з ладу або тимчасово не працює, що ускладнює усунення неполадок, повʼязаних з аварією Pod. Стан справності ресурсу для DRA покращує спостережуваність, відкриваючи стан справності пристроїв, виділених Podʼу, у статусі Podʼа. Це полегшує виявлення причин проблем Podʼа, повʼязаних з несправними пристроями, та відповідь на них. Щоб увімкнути цю функціональність, потрібно активувати функціональну можливість &lt;code&gt;ResourceHealthStatus&lt;/code&gt;, а драйвер DRA повинен реалізувати сервіс gRPC &lt;code&gt;DRAResourceHealth&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4680&#34;&gt;KEP #4680&lt;/a&gt;, очолюваної WG Device Management.&lt;/p&gt;
&lt;h4 id=&#34;extended-resource-mapping&#34;&gt;Зіставлення розширених ресурсів&lt;/h4&gt;
&lt;p&gt;Зіставлення розширених ресурсів надає простіший альтернативний DRA виразний та гнучкий підхід, пропонуючи простий спосіб опису ємності та споживання ресурсів. Ця функція дозволяє адміністраторам кластерів оголошувати ресурси, керовані DRA, як &lt;em&gt;розширені ресурси&lt;/em&gt;, що дозволяє розробникам хастосунків та операторам продовжувати використовувати знайомий синтаксис контейнера &lt;code&gt;.spec.resources&lt;/code&gt; для їх використання. Це дозволяє наявним робочим навантаженням приймати DRA без модифікацій, спрощуючи перехід на DRA як для розробників застосунків, так і для адміністраторів кластерів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5004&#34;&gt;KEP #5004&lt;/a&gt;, очолюваної WG Device Management.&lt;/p&gt;
&lt;h4 id=&#34;dra-consumable-capacity&#34;&gt;Споживча спроможність DRA&lt;/h4&gt;
&lt;p&gt;У Kubernetes v1.33 додано підтримку драйверів ресурсів для оголошення доступних частин пристрою, замість того, щоб виставляти весь пристрій як ресурс «все або нічого». Однак, цей підхід не міг впоратися зі сценаріями, де драйвери пристроїв керують тонкими, динамічними частинами ресурсу пристрою на основі попиту користувача або ділять ці ресурси незалежно від ResourceClaims, які обмежені їх специфікацією та простором іменем. Увімкнення функціональної можливості &lt;code&gt;DRAConsumableCapacity&lt;/code&gt; (представленої як альфа у v1.34) дозволяє драйверам ресурсів ділити один й той же пристрій, або навіть частину пристрою, між кількома ResourceClaims або між кількома DeviceRequests. Ця функція також розширює планувальник, щоб підтримувати виділення частин ресурсів пристрою, як визначено в полі &lt;code&gt;capacity&lt;/code&gt;. Ця функція DRA покращує спільне використання пристроїв між просторами імен та заявками, налаштовуючи його на потреби Pod. Вона дозволяє драйверам забезпечувати обмеження ємності, покращує планування та підтримує нові випадки використання, такі як обізнаний про пропускну здатність мережевий звʼязок та багатокористувацьке спільне використання.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5075&#34;&gt;KEP #5075&lt;/a&gt;, очолюваної WG Device Management.&lt;/p&gt;
&lt;h4 id=&#34;device-binding-conditions&#34;&gt;Умови привʼязки пристроїв&lt;/h4&gt;
&lt;p&gt;Планувальник Kubernetes стає надійнішим, затримуючи привʼязку Pod до вузла, поки його необхідні зовнішні ресурси, такі як приєднувані пристрої або FPGA, не будуть підтверджені як готові. Цей механізм затримки реалізовано в фазі &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/scheduling-framework/#pre-bind&#34;&gt;PreBind&lt;/a&gt; фреймворку планування. Під час цієї фази планувальник перевіряє, чи задоволені всі необхідні умови пристрою, перш ніж продовжити привʼязку. Це забезпечує координацію з зовнішніми контролерами пристроїв, забезпечуючи більш надійне та передбачуване планування.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5007&#34;&gt;KEP #5007&lt;/a&gt;, очолюваної WG Device Management.&lt;/p&gt;
&lt;h3 id=&#34;container-restart-rules&#34;&gt;Правила перезапуску контейнерів&lt;/h3&gt;
&lt;p&gt;В даний час всі контейнери в межах Podʼа будуть дотримуватися однієї й тієї ж політики перезапуску &lt;code&gt;.spec.restartPolicy&lt;/code&gt; під час виходу або аварії. Однак, Podʼи, які виконують кілька контейнерів, можуть мати різні вимоги до перезапуску для кожного контейнера. Наприклад, для ініціалізаційних контейнерів, які використовуються для виконання ініціалізації, ви, можливо, не захочете повторювати спроби ініціалізації, якщо вони зазнають невдачі. Аналогічно, в середовищах дослідження ML з тривалими навчальними навантаженнями, контейнери, які зазнають невдачі з кодами виходу, що підлягають повторному спробуванню, повинні швидко перезапускатися на місці, а не викликати відтворення Pod і втрату прогресу. Kubernetes v1.34 вводить перемикач функцій &lt;code&gt;ContainerRestartRules&lt;/code&gt;. Коли він увімкнений, політика перезапуску може бути вказана для кожного контейнера в межах Pod. Також можна визначити список &lt;code&gt;restartPolicyRules&lt;/code&gt;, щоб переважити &lt;code&gt;restartPolicy&lt;/code&gt; на основі останнього коду виходу. Це надає детальний контроль, необхідний для обробки складних сценаріїв та кращого використання обчислювальних ресурсів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5307&#34;&gt;KEP #5307&lt;/a&gt;, очолюваної SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;load-environment-variables-from-files-created-in-runtime&#34;&gt;Завантаження змінних середовища з файлів, створених під час виконання&lt;/h3&gt;
&lt;p&gt;Розробники застосунків давно просять про більшу гнучкість у оголошенні змінних середовища. Традиційно, змінні середовища оголошуються на стороні сервера API через статичні значення, ConfigMaps або Secrets.&lt;/p&gt;
&lt;p&gt;Під функціональністю &lt;code&gt;EnvFiles&lt;/code&gt; Kubernetes v1.34 впроваджує можливість оголошення змінних середовища під час виконання. Один контейнер (зазвичай ініціалізаційний контейнер) може згенерувати змінну та зберегти її у файлі, а наступний контейнер може запуститися зі змінною середовища, завантаженою з цього файлу. Цей підхід усуває необхідність &amp;quot;обгортати&amp;quot; точку входу цільового контейнера, що дозволяє більш гнучку оркестрацію контейнерів у Pod.&lt;/p&gt;
&lt;p&gt;Ця функція особливо корисна для навчальних навантажень AI/ML, де кожен Pod у навчальному завданні вимагає ініціалізації з значеннями, визначеними під час виконання.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3721&#34;&gt;KEP #5307&lt;/a&gt;, очолюваної SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-v1-34&#34;&gt;Зміна станів, застарівання та видалення в v1.34&lt;/h2&gt;
&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Перехід до стабільного стану&lt;/h3&gt;
&lt;p&gt;Це список усіх функцій, які стали стабільними (також відомими як &lt;em&gt;загально доступні&lt;/em&gt;). Для отримання повного списку оновлень, включаючи нові функції та переходи з альфа- до бета-версії, дивіться примітки до випуску.&lt;/p&gt;
&lt;p&gt;Цей реліз включає в себе в цілому 23 вдосконалення, які стали стабільними:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4369&#34;&gt;Дозволити майже всі друковані символи ASCII в змінних середовища&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3939&#34;&gt;Дозволити відтворення подів після повного завершення в контролері завдань&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4818&#34;&gt;Дозволити нульове значення для дії сну хуків PreStop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/647&#34;&gt;Трасування API сервера&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/24&#34;&gt;Підтримка AppArmor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4601&#34;&gt;Авторизація за допомогою селекторів полів та міток&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/2340&#34;&gt;Послідовні читання з кешу&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3902&#34;&gt;Відділення TaintManager від контролера життєвого циклу вузлів&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4033&#34;&gt;Виявлення драйвера cgroup з CRI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4381&#34;&gt;DRA: структуровані параметри&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3960&#34;&gt;Введення дії сну для хуків PreStop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/2831&#34;&gt;Трасування OpenTelemetry для Kubelet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3751&#34;&gt;Модифікація VolumeAttributesClass Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/2400&#34;&gt;Підтримка свопу на вузлах&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4633&#34;&gt;Дозволити анонімну авторизацію лише для налаштованих точок доступу&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5080&#34;&gt;Упорядковане видалення просторів імен&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4247&#34;&gt;Повторне чергування з точними зворотними викликами в kube-scheduler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4427&#34;&gt;Послаблена валідація рядка пошуку DNS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4568&#34;&gt;Стійка ініціалізація кешу спостереження&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5116&#34;&gt;Потокове кодування для відповідей LIST&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3331&#34;&gt;Структурована конфігурація автентифікації&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5100&#34;&gt;Підтримка Direct Service Return (DSR) та мережевих оверлеїв в Windows kube-proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/1790&#34;&gt;Відновлення після збою розширення тому&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;deprecations-and-removals&#34;&gt;Застарівання та вилучення&lt;/h3&gt;
&lt;p&gt;Оскільки Kubernetes розвивається та росте, функції можуть застарівати, видалятися або замінюватися кращими для покращення загального стану проєкту. Дивіться &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/reference/using-api/deprecation-policy/&#34;&gt;політику застарівання та видалення&lt;/a&gt; для отримання додаткової інформації про цей процес. Випуск Kubernetes v1.34 містить кілька застарівань.&lt;/p&gt;
&lt;h4 id=&#34;manual-cgroup-driver-configuration-is-deprecated&#34;&gt;Ручна конфігурація драйвера cgroup застаріла&lt;/h4&gt;
&lt;p&gt;Історично, налаштування правильного драйвера cgroup було болючою точкою для користувачів, які використовували кластери Kubernetes. Kubernetes v1.28 додав спосіб для &lt;code&gt;kubelet&lt;/code&gt; запитувати реалізацію CRI та дізнаватися, який драйвер cgroup використовувати. Це автоматичне виявлення тепер &lt;strong&gt;наполегливо рекомендується&lt;/strong&gt; і підтримка цього функціоналу стала стабільною у v1.34. Якщо ваш CRI рушій виконання контейнерів не підтримує можливість повідомляти про драйвер cgroup, який йому потрібен, вам слід оновити або змінити його. Налаштування &lt;code&gt;cgroupDriver&lt;/code&gt; у файлі конфігурації &lt;code&gt;kubelet&lt;/code&gt; тепер застаріло. Відповідна опція командного рядка &lt;code&gt;--cgroup-driver&lt;/code&gt; була раніше застаріла, оскільки Kubernetes рекомендує використовувати замість цього файл конфігурації. Як і налаштування конфігурації, так і опція командного рядка будуть видалені в майбутньому релізі, але це видалення не відбудеться раніше, ніж у мінорному релізі випуску v1.36.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4033&#34;&gt;KEP #4033&lt;/a&gt;, очолюваної SIG Node.&lt;/p&gt;
&lt;h4 id=&#34;kubernetes-to-end-containerd-1-x-support-in-v1-36&#34;&gt;Kubernetes припинить підтримку containerd 1.x у v1.36&lt;/h4&gt;
&lt;p&gt;Хоча Kubernetes v1.34 все ще підтримує containerd 1.7 та інші LTS релізи containerd, внаслідок автоматичного виявлення драйвера cgroup, спільнота Kubernetes SIG Node формально погодилася на остаточний графік підтримки для containerd v1.X. Останнім релізом Kubernetes, який запропонує цю підтримку, буде v1.35 (узгоджений з EOL containerd 1.7). Це раннє попередження про те, що якщо ви використовуєте containerd 1.X, розгляньте можливість переходу на 2.0+ найближчим часом. Ви можете моніторити метрику &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt;, щоб визначити, чи використовують якісь вузли у вашому кластері версію containerd, яка незабаром стане застарілою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4033&#34;&gt;KEP #4033&lt;/a&gt;, очолюваної SIG Node.&lt;/p&gt;
&lt;h4 id=&#34;preferclose-traffic-distribution-is-deprecated&#34;&gt;Розподіл трафіку &lt;code&gt;PreferClose&lt;/code&gt; є застарілим&lt;/h4&gt;
&lt;p&gt;Поле &lt;code&gt;spec.trafficDistribution&lt;/code&gt; в рамках Kubernetes &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/service/&#34;&gt;Service&lt;/a&gt; дозволяє користувачам висловлювати переваги щодо того, як трафік повинен маршрутизуватися до точок доступу сервісу.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://kep.k8s.io/3015&#34;&gt;KEP-3015&lt;/a&gt; визнає застарілим &lt;code&gt;PreferClose&lt;/code&gt; і вводить два додаткових значення: &lt;code&gt;PreferSameZone&lt;/code&gt; та &lt;code&gt;PreferSameNode&lt;/code&gt;. &lt;code&gt;PreferSameZone&lt;/code&gt; є псевдонімом для наявного &lt;code&gt;PreferClose&lt;/code&gt;, щоб прояснити його семантику. &lt;code&gt;PreferSameNode&lt;/code&gt; дозволяє зʼєднанням доставлятися до локальної точки доступу, коли це можливо, з переходом на віддалену точку доступу, коли це неможливо.&lt;/p&gt;
&lt;p&gt;Ця функція була представлена у v1.33 під перемикачем функцій &lt;code&gt;PreferSameTrafficDistribution&lt;/code&gt;. Вона стала бета у v1.34 і є стандартно увімкненою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3015&#34;&gt;KEP #3015&lt;/a&gt;, очолюваної SIG Network.&lt;/p&gt;
&lt;h2 id=&#34;release-notes&#34;&gt;Примітки до випуску&lt;/h2&gt;
&lt;p&gt;Перегляньте всі деталі випуску Kubernetes v1.34 у наших &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.34.md&#34;&gt;примітках до випуску&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;availability&#34;&gt;Доступність&lt;/h2&gt;
&lt;p&gt;Kubernetes v1.34 доступний для завантаження на &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.34.0&#34;&gt;GitHub&lt;/a&gt; або на сторінці &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/releases/download/&#34;&gt;Завантаження Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щоб почати роботу з Kubernetes, ознайомтеся з цими &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/tutorials/&#34;&gt;інтерактивними навчальними посібниками&lt;/a&gt; або запустіть локальні кластери Kubernetes за допомогою &lt;a href=&#34;https://minikube.sigs.k8s.io/&#34;&gt;minikube&lt;/a&gt;. Ви також можете легко встановити v1.34 за допомогою &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/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;Команда випуску&lt;/h2&gt;
&lt;p&gt;Kubernetes можливий лише завдяки підтримці, відданості та наполегливій праці його спільноти. Кожна команда випуску складається з відданих волонтерів спільноти, які працюють разом, щоб зібрати багато частин, які складають випуски Kubernetes, на які ви покладаєтеся. Це вимагає спеціалізованих навичок людей з усіх куточків нашої спільноти, від самого коду до його документації та управління проєктом.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/cncf/memorials/blob/main/rodolfo-martinez.md&#34;&gt;Ми вшановуємо памʼять Рудольфо &amp;quot;Родо&amp;quot; Мартінеса Веги&lt;/a&gt;, відданого учасника, чия пристрасть до технологій та побудови спільноти залишила слід у спільноті Kubernetes. Родо був учасником команди випуску Kubernetes протягом кількох релізів, включаючи v1.22-v1.23 та v1.25-v1.30, демонструючи непохитну відданість успіху та стабільності проєкту. Поза участтю в команді випуску, Родо активно сприяв розвитку спільноти Cloud Native LATAM, допомагаючи подолати мовні та культурні барʼєри в цій сфері. Його робота над іспанською версією документації Kubernetes та глосарію CNCF є прикладом його відданості справі зробити знання доступними для розробників, які говорять іспанською мовою, по всьому світу. Спадщина Родо живе через безліч членів спільноти, яких він наставляв, релізи, які він допоміг випустити, та яскраву спільноту Kubernetes LATAM, яку він допоміг виростити.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати всій &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.34/release-team.md&#34;&gt;Команді випуску&lt;/a&gt; за години наполегливої праці, витрачені на підготовку релізу Kubernetes v1.34 для нашої спільноти. Членство в команді випуску варіюється від новачків до досвідчених лідерів команд з досвідом, набутих протягом кількох циклів випуску. Особлива подяка нашому лідеру випуску, Вйому Ядаву, за те, що провів нас через успішний цикл випуску, за його практичний підхід до вирішення викликів та за енергію та турботу, які рухають нашу спільноту вперед.&lt;/p&gt;
&lt;h2 id=&#34;project-velocity&#34;&gt;Швидкість проєкту&lt;/h2&gt;
&lt;p&gt;Проєкт 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; агрегує кілька цікавих показників, повʼязаних з швидкістю розвитку Kubernetes та різних підпроєктів. Це включає все, починаючи від індивідуальних внесків до кількості компаній, які роблять свій внесок, і є ілюстрацією глибини та широти зусиль, які вкладаються в розвиток цієї екосистеми.&lt;/p&gt;
&lt;p&gt;Під час циклу випуску v1.34, який тривав 15 тижнів з 19 травня 2025 року по 27 серпня 2025 року, Kubernetes отримав внески від 106 різних компаній та 491 особи. У ширшій хмарній екосистемі ця цифра зростає до 370 компаній, враховуючи 2235 загальних учасників.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що &amp;quot;внесок&amp;quot; враховується, коли хтось робить коміт,  рецензію коду, коментар, створює тікет або PR, рецензує PR (включаючи блоги та документацію) або коментує тікети та PR. Якщо ви зацікавлені в участі, відвідайте розділ &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/#getting-started&#34;&gt;Початок роботи&lt;/a&gt; на нашому сайті для учасників.&lt;/p&gt;
&lt;p&gt;Джерело цих даних:&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=1747609200000&amp;to=1756335599000&amp;var-period=d28&amp;var-repogroup_name=Kubernetes&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Компанії, що роблять внесок в 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=1747609200000&amp;to=1756335599000&amp;var-period=d28&amp;var-repogroup_name=All&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Загальні внески екосистеми&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;event-update&#34;&gt;Майбутні події&lt;/h2&gt;
&lt;p&gt;Ознайомтесь з майбутніми подіями Kubernetes та Cloud Native, включаючи KubeCon + CloudNativeCon, KCD та інші помітні конференції по всьому світу. Залишайтеся в курсі та беріть участь у житті спільноти Kubernetes!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Серпень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-colombia-presents-kcd-colombia-2025/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Колумбія&lt;/strong&gt;&lt;/a&gt;: 28 серпня 2025 року | Богота, Колумбія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Вересень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-cloud-native-sydney-presents-cloudcon-sydney-sydney-international-convention-centre-910-september/&#34;&gt;&lt;strong&gt;CloudCon Sydney&lt;/strong&gt;&lt;/a&gt;: 9–10 вересня 2025 року | Сідней, Австралія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-sf-bay-area-presents-kcd-san-francisco-bay-area/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Сан-Франциско&lt;/strong&gt;&lt;/a&gt;: 9 вересня 2025 року | Сан-Франциско, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-washington-dc-presents-kcd-washington-dc-2025/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Вашингтон&lt;/strong&gt;&lt;/a&gt;: 16 вересня 2025 року | Вашингтон, округ Колумбія, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-sofia-presents-kubernetes-community-days-sofia/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Софія&lt;/strong&gt;&lt;/a&gt;: 18 вересня 2025 року | Софія, Болгарія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-el-salvador-presents-kcd-el-salvador/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Ель-Сальвадор&lt;/strong&gt;&lt;/a&gt;: 20 вересня 2025 року | Сан-Сальвадор, Ель-Сальвадор&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Жовтень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-warsaw-presents-kcd-warsaw-2025/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Варшава&lt;/strong&gt;&lt;/a&gt;: 9 жовтня 2025 року | Варшава, Польща&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-uk-presents-kubernetes-community-days-uk-edinburgh-2025/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Единбург&lt;/strong&gt;&lt;/a&gt;: 21 жовтня 2025 року | Единбург, Сполучене Королівство&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-sri-lanka-presents-kcd-sri-lanka-2025/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Шрі-Ланка&lt;/strong&gt;&lt;/a&gt;: 26 жовтня 2025 року | Коломбо, Шрі-Ланка&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Листопад 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-porto-presents-kcd-porto-2025/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Порту&lt;/strong&gt;&lt;/a&gt;: 3 листопада 2025 року | Порту, Португалія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Північна Америка 2025&lt;/strong&gt;&lt;/a&gt;: 10-13 листопада 2025 року | Атланта, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sessionize.com/kcd-hangzhou-and-oicd-2025/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Ханчжоу&lt;/strong&gt;&lt;/a&gt;: 15 листопада 2025 року | Ханчжоу, Китай&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Грудень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-suisse-romande-presents-kcd-suisse-romande/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes: Швейцарська Романдія&lt;/strong&gt;&lt;/a&gt;: 4 грудня 2025 року | Женева, Швейцарія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ви можете знайти останні деталі подій &lt;a href=&#34;https://community.cncf.io/events/#/list&#34;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;upcoming-release-webinar&#34;&gt;Вебінар про майбутній реліз&lt;/h2&gt;
&lt;p&gt;Приєднуйтесь до членів команди випуску Kubernetes v1.34 у  &lt;strong&gt;середу, 24 вересня 2025 року о 16:00 (UTC)&lt;/strong&gt;, щоб дізнатися про основні моменти цього випуску. Для отримання додаткової інформації та реєстрації відвідайте &lt;a href=&#34;https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cloud-native-live-kubernetes-v134-release/&#34;&gt;сторінку події&lt;/a&gt; на сайті CNCF Online Programs.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Долучайтесь&lt;/h2&gt;
&lt;p&gt;Найпростіший спосіб долучитися до Kubernetes — це приєднатися до однієї з багатьох &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-list.md&#34;&gt;Груп за інтересами&lt;/a&gt; (SIG, Special Interest Groups), які відповідають вашим інтересам. Маєте щось, що хочете донести до спільноти Kubernetes? Поділіться своїм голосом на нашій щотижневій &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зустрічі спільноти&lt;/a&gt;, а також через наведені нижче канали. Дякуємо за ваш постійний зворотний звʼязок та підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами в Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@Kubernetesio&lt;/a&gt; для отримання останніх оновлень&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до обговорення спільноти на &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до спільноти в &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Публікуйте запитання (або відповідайте на запитання) на &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Діліться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Читайте більше про те, що відбувається з Kubernetes в &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;Команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Налаштування Linux Swap для Kubernetes: детальний огляд</title>
      <link>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/08/19/tuning-linux-swap-for-kubernetes-a-deep-dive/</link>
      <pubDate>Tue, 19 Aug 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/blog/2025/08/19/tuning-linux-swap-for-kubernetes-a-deep-dive/</guid>
      <description>
        
        
        &lt;p&gt;Функція Kubernetes &lt;a href=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/cluster-administration/swap-memory-management/&#34;&gt;NodeSwap&lt;/a&gt;, яка, ймовірно, отримає статус &lt;em&gt;stable&lt;/em&gt; у майбутньому релізі Kubernetes v1.34, дозволяє використання swap: це значна зміна порівняно з традиційною практикою вимкнення swap для передбачуваної продуктивності. Ця стаття зосереджена виключно на налаштуванні swap на вузлах Linux, де ця функція доступна. Дозволяючи вузлам Linux використовувати вторинне сховище для додаткової віртуальної памʼяті, коли фізична RAM вичерпана, підтримка swap на вузлах спрямована на покращення використання ресурсів та зменшення кількості припинень процесів через нестачу памʼяті (OOM kills).&lt;/p&gt;
&lt;p&gt;Однак, увімкнення swap не є рішенням &amp;quot;під ключ&amp;quot;. Продуктивність та стабільність ваших вузлів під тиском на памʼять критично залежать від набору параметрів ядра Linux. Неправильна конфігурація може призвести до погіршення продуктивності та втручання в логіку виселення Kubelet.&lt;/p&gt;
&lt;p&gt;У цьому дописі ми розглянемо критичні параметри ядра Linux, які керують поведінкою swap. Ми дослідимо, як ці параметри впливають на продуктивність робочих навантажень Kubernetes, використання swap та критичні механізми виселення. Також представимо різні результати тестів, що демонструють вплив різних конфігурацій, та поділимось своїми висновками щодо досягнення оптимальних налаштувань для стабільних та високопродуктивних кластерів Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;introduction-to-linux-swap&#34;&gt;Вступ до Linux swap&lt;/h2&gt;
&lt;p&gt;На високому рівні, ядро Linux керує памʼяттю через сторінки, зазвичай розміром 4КіБ. Коли фізична памʼять стає обмеженою, алгоритм заміни сторінок ядра вирішує, які сторінки перемістити у swap-простір. Хоча точна логіка є складною оптимізацією, на цей процес прийняття рішень впливають певні ключові фактори:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Шаблони доступу до сторінок (як часто сторінки використовуються)&lt;/li&gt;
&lt;li&gt;&amp;quot;Забрудненість&amp;quot; сторінок (чи були сторінки модифіковані)&lt;/li&gt;
&lt;li&gt;Тиск на памʼять (наскільки терміново системі потрібна вільна памʼять)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;anonymous-vs-file-backed-memory&#34;&gt;Анонімна памʼять проти памʼяті, що підтримується файлами&lt;/h3&gt;
&lt;p&gt;Важливо розуміти, що не всі сторінки памʼяті однакові. Ядро розрізняє анонімну памʼять та памʼять з файловою підтримкою.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Анонімна памʼять&lt;/strong&gt;: Це памʼять, яка не підтримується конкретним файлом на диску, така як купа та стек програми. З точки зору програми це приватна памʼять, і коли ядру потрібно звільнити ці сторінки, воно повинно записати їх на спеціально відведений пристрій swap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Памʼять з файловою підтримкою&lt;/strong&gt;: Ця памʼять підтримується файлом у файловій системі. Сюди входять виконуваний код програми, спільні бібліотеки та кеші файлової системи. Коли ядру потрібно звільнити ці сторінки, воно може просто відкинути їх, якщо вони не були модифіковані (&amp;quot;чисті&amp;quot;). Якщо сторінка була модифікована (&amp;quot;брудна&amp;quot;), ядро спочатку повинно записати зміни назад у файл, перш ніж її можна буде відкинути.&lt;/p&gt;
&lt;p&gt;Хоча система без swap все ще може звільняти памʼять з чистими файлами під тиском, скидаючи їх, у неї немає способу скинути анонімну памʼять. Увімкнення swap надає цю можливість, дозволяючи ядру переміщати менш часто використовувані сторінки памʼяті на диск, щоб зберегти памʼять і уникнути використання механізму OOM-очищення системи.&lt;/p&gt;
&lt;h3 id=&#34;key-kernel-parameters-for-swap-tuning&#34;&gt;Ключові параметри ядра для налаштування swap&lt;/h3&gt;
&lt;p&gt;Щоб ефективно налаштувати поведінку swap, Linux надає кілька параметрів ядра, якими можна керувати за допомогою &lt;code&gt;sysctl&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vm.swappiness&lt;/code&gt;: Це найвідоміший параметр. Це значення від 0 до 200 (100 у старіших ядрах), яке контролює перевагу ядра для обміну анонімними сторінками памʼяті проти відновлення сторінок памʼяті з файловою підтримкою (кеш сторінок).
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Високе значення (наприклад, 90+)&lt;/strong&gt;: Ядро буде агресивно переміщувати в своп менш використовувану анонімну памʼять, щоб звільнити місце для кешу файлів.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Низьке значення (наприклад, &amp;lt; 10)&lt;/strong&gt;: Ядро буде намагатися в першу чергу скинути сторінки кешу файлів, а не робити своп анонімній памʼяті.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vm.min_free_kbytes&lt;/code&gt;: Цей параметр вказує ядру зберігати мінімальну кількість памʼяті вільною як буфер. Коли кількість вільної памʼяті падає нижче цього буфера безпеки, ядро починає більш агресивно відновлювати сторінки (робити їх своп, а врешті-решт виконувати OOM-очищення).
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Функція:&lt;/strong&gt; Це діє як запобіжник, щоб забезпечити ядру достатньо памʼяті для критичних запитів на виділення, які не можуть бути відкладені.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Вплив на swap&lt;/strong&gt;: Встановлення більшого &lt;code&gt;min_free_kbytes&lt;/code&gt; ефективно підвищує мінімальне значення для вільної памʼяті, змушуючи ядро раніше ініціювати своп під час тиску на памʼять.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vm.watermark_scale_factor&lt;/code&gt;: Ця настройка контролює проміжок між різними водяними знаками: &lt;code&gt;min&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt; та &lt;code&gt;high&lt;/code&gt;, які обчислюються на основі &lt;code&gt;min_free_kbytes&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Пояснення водяних знаків&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;low&lt;/code&gt;: Коли вільна памʼять нижча за цю позначку, процес ядра &lt;code&gt;kswapd&lt;/code&gt; прокидається, щоб відновити сторінки у фоновому режимі. Саме тоді починається цикл свопу.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min&lt;/code&gt;: Коли вільна памʼять досягає цього мінімального рівня, агресивне відновлення сторінок блокує виділення процесів. Нездатність відновити сторінки призведе до OOM-очищень.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;high&lt;/code&gt;: Відновлення памʼяті зупиняється, як тільки вільна памʼять досягає цього рівня.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Вплив&lt;/strong&gt;: Більший &lt;code&gt;watermark_scale_factor&lt;/code&gt; створює більший буфер між водяними знаками &lt;code&gt;low&lt;/code&gt; та &lt;code&gt;min&lt;/code&gt;. Це дає &lt;code&gt;kswapd&lt;/code&gt; більше часу для поступового відновлення памʼяті, перш ніж система потрапить у критичний стан.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;У типовому серверному робочому навантаженні у вас може бути довготривалий процес з деякою памʼяттю, яка стає &amp;quot;холодною&amp;quot;. Вищий показник &lt;code&gt;swappiness&lt;/code&gt; може звільнити RAM, обмінюючи холодну памʼять, для інших активних процесів, які можуть виграти від збереження свого кешу файлів.&lt;/p&gt;
&lt;p&gt;Налаштування параметрів &lt;code&gt;min_free_kbytes&lt;/code&gt; та &lt;code&gt;watermark_scale_factor&lt;/code&gt; для раннього переміщення вікна обміну надасть більше місця для &lt;code&gt;kswapd&lt;/code&gt;, щоб скинути памʼять на диск і запобігти OOM-очищенням під час раптових сплесків потреби в памʼяті.&lt;/p&gt;
&lt;h2 id=&#34;swap-tests-and-results&#34;&gt;Тести та результати свопу&lt;/h2&gt;
&lt;p&gt;Щоб зрозуміти реальний вплив цих параметрів, ми провели серію стрес-тестів.&lt;/p&gt;
&lt;h3 id=&#34;test-setup&#34;&gt;Налаштування тесту&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Середовище&lt;/strong&gt;: GKE на Google Cloud&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Версія Kubernetes&lt;/strong&gt;: 1.33.2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конфігурація вузла&lt;/strong&gt;: &lt;code&gt;n2-standard-2&lt;/code&gt; (8GiB RAM, 50GB swap на диску &lt;code&gt;pd-balanced&lt;/code&gt;, без шифрування), Ubuntu 22.04&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Робоче навантаження&lt;/strong&gt;: Спеціально розроблена програма на Go, призначена для виділення памʼяті з налаштовуваною швидкістю, створення тиску на кеш файлів та імітації різних шаблонів доступу до памʼяті (випадковий проти послідовного).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Моніторинг&lt;/strong&gt;: Контейнер-сайдкар, що захоплює системні метрики щосекунди.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Захист&lt;/strong&gt;: Критичним системним компонентам (kubelet, середовище запуску контейнерів, sshd) було заборонено використовувати swap, встановивши &lt;code&gt;memory.swap.max=0&lt;/code&gt; у їхніх відповідних cgroups.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;test-methodology&#34;&gt;Методологія тестування&lt;/h3&gt;
&lt;p&gt;Був запущений под зі стрес-тестом на вузлах з різними налаштуваннями swappiness (0, 60 та 90) з варіюванням параметрів &lt;code&gt;min_free_kbytes&lt;/code&gt; та &lt;code&gt;watermark_scale_factor&lt;/code&gt;, щоб спостерігати за результатами під час сильного виділення памʼяті та тиску введення/виведення.&lt;/p&gt;
&lt;h4 id=&#34;visualizing-swap-in-action&#34;&gt;Візуалізація роботи свопу&lt;/h4&gt;
&lt;p&gt;Графік нижче, з тесту на стрес з швидкістю 100MBps, показує роботу swap. Коли вільна памʼять (на графіку &amp;quot;Використання памʼяті&amp;quot;) зменшується, використання swap (&lt;code&gt;Використано swap (GiB)&lt;/code&gt;) та активність swap-виводу (&lt;code&gt;Swap Out (MiB/s)&lt;/code&gt;) зростають. Критично, оскільки система більше покладається на swap, також зростає I/O активність та відповідний час очікування (&lt;code&gt;IO Wait %&lt;/code&gt; на графіку &amp;quot;Використання CPU&amp;quot;), що вказує на навантаження на CPU.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Графік, що показує використання CPU, памʼяті, swap та I/O активності на вузлі Kubernetes&#34; src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/08/19/tuning-linux-swap-for-kubernetes-a-deep-dive/swap_visualization.png&#34; title=&#34;swap visualization&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;findings&#34;&gt;Висновки&lt;/h3&gt;
&lt;p&gt;Мої початкові тести з типовими параметрами ядра (&lt;code&gt;swappiness=60&lt;/code&gt;, &lt;code&gt;min_free_kbytes=68MB&lt;/code&gt;, &lt;code&gt;watermark_scale_factor=10&lt;/code&gt;) швидко призвели до OOM-очищень і навіть несподіваних перезавантажень вузлів під час високого навантаження на памʼять. З вибором відповідних параметрів ядра можна досягти хорошого балансу між стабільністю вузла та продуктивністю.&lt;/p&gt;
&lt;h4 id=&#34;the-impact-of-swappiness&#34;&gt;Вплив &lt;code&gt;swappiness&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Параметр swappiness безпосередньо впливає на вибір ядра між відновленням анонімної памʼяті (свопом) та скиданням кешу сторінок. Щоб це спостерігати, я провів тест, у якому один под створював та утримував тиск на кеш файлів, після чого другий под виділяв анонімну памʼять зі швидкістю 100MB/s, щоб спостерігати за налаштуваннями ядра у відновленні:&lt;/p&gt;
&lt;p&gt;Мої висновки виявили чіткий компроміс:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;swappiness=90&lt;/code&gt;: Ядро проактивно робило своп неактивної анонімної памʼяті, щоб зберегти кеш файлів. Це призвело до високого та стабільного використання swap та значної I/O активності (&amp;quot;Blocks Out&amp;quot;), що, в свою чергу, викликало сплески очікування I/O на CPU.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swappiness=0&lt;/code&gt;: Ядро надавало перевагу скиданню сторінок кешу файлів, затримуючи споживання swap. Однак важливо розуміти, що це &lt;strong&gt;не вимикає своп&lt;/strong&gt;. Коли тиск на памʼять був високим, ядро все ще робило своп анонімної памʼяті на диск.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вибір залежить від робочого навантаження. Для робочих навантажень, чутливих до затримок введення/виведення, бажано нижче значення swappiness. Для робочих навантажень, які покладаються на великий та часто використовуваний кеш файлів, може бути корисним вищий показник swappiness, за умови, що диск достатньо швидкий, щоб впоратися з навантаженням.&lt;/p&gt;
&lt;h4 id=&#34;tuning-watermarks-to-prevent-eviction-and-oom-kills&#34;&gt;Налаштування водяних знаків для запобігання виселенню та OOM kills&lt;/h4&gt;
&lt;p&gt;Найбільшою проблемою, з якою я зіткнувся, було взаємодія між швидким виділенням памʼяті та механізмом виселення Kubelet. Коли мій тестовий под, який навмисно був налаштований на перевищення памʼяті, виділяв її високими темпами (наприклад, 300-500 MBps), система швидко залишалася без вільної памʼяті.&lt;/p&gt;
&lt;p&gt;Стандартно буфер для відновлення був занадто малим. Перш ніж &lt;code&gt;kswapd&lt;/code&gt; встигав звільнити достатньо памʼяті шляхом свопу, вузол потрапляв у критичний стан, що призводило до двох можливих наслідків:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Виселення Kubelet&lt;/strong&gt; Якщо менеджер виселення kubelet виявляв, що &lt;code&gt;memory.available&lt;/code&gt; нижче його порогу, він виселяв под.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OOM-очищення&lt;/strong&gt; У деяких сценаріях з високою швидкістю OOM-очищення активувалось би раніше, ніж виселення встигало завершитися, іноді вбиваючи поди вищого пріоритету, які не були джерелом тиску.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Щоб помʼякшити це, я налаштував водяні знаки:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Збільшено &lt;code&gt;min_free_kbytes&lt;/code&gt; до 512MiB: Це змушує ядро почати відновлення памʼяті набагато раніше, забезпечуючи більший буфер безпеки.&lt;/li&gt;
&lt;li&gt;Збільшено &lt;code&gt;watermark_scale_factor&lt;/code&gt; до 2000: Це розширило проміжок між водяними знаками &lt;code&gt;low&lt;/code&gt; та &lt;code&gt;high&lt;/code&gt; (з ≈337MB до ≈591MB у моєму тестовому вузлі в &lt;code&gt;/proc/zoneinfo&lt;/code&gt;), ефективно збільшуючи вікно обміну.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ця комбінація надала &lt;code&gt;kswapd&lt;/code&gt; більшу операційну зону та більше часу для обміну сторінок на диск під час сплесків памʼяті, успішно запобігаючи як передчасним виселенням, так і OOM-очищенням у моїх тестових запусках.&lt;/p&gt;
&lt;p&gt;Таблиця порівнює рівні водяних знаків з &lt;code&gt;/proc/zoneinfo&lt;/code&gt; (недоступний NUMA-узел):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;min_free_kbytes=67584KiB&lt;/code&gt; та &lt;code&gt;watermark_scale_factor=10&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;min_free_kbytes=524288KiB&lt;/code&gt; та &lt;code&gt;watermark_scale_factor=2000&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Вузол 0, зона Нормальна &lt;br&gt;   вільні сторінки 583273 &lt;br&gt;   підвищення 0 &lt;br&gt;   мін 10504 &lt;br&gt;   низький 13130 &lt;br&gt;   високий 15756 &lt;br&gt;   охоплено 1310720 &lt;br&gt;   присутній 1310720 &lt;br&gt;   керується 1265603&lt;/td&gt;
&lt;td&gt;Вузол 0, зона Нормальна &lt;br&gt;   вільні сторінки 470539 &lt;br&gt;   мін 82109 &lt;br&gt;   низький 337017 &lt;br&gt;   високий 591925&lt;br&gt;   охоплено 1310720&lt;br&gt;   присутній 1310720 &lt;br&gt;   керується 1274542&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Графік нижче показує, що розмір буфера ядра та коефіцієнт масштабування відіграють вирішальну роль у визначенні того, як система реагує на навантаження на памʼять. З правильним поєднанням цих параметрів система може ефективно використовувати простір swap, щоб уникнути виселення та підтримувати стабільність.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Порівняння різних налаштувань min_free_kbytes, що показує різницю у впливі на Swap, Використання памʼяті та Виселення&#34; src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/08/19/tuning-linux-swap-for-kubernetes-a-deep-dive/memory-and-swap-growth.png&#34; title=&#34;Memory and Swap Utilization with min_free_kbytes&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;risks-and-recommendations&#34;&gt;Ризики та рекомендації&lt;/h3&gt;
&lt;p&gt;Увімкнення swap у Kubernetes є потужним інструментом, але воно повʼязане з ризиками, якими потрібно управляти за допомогою ретельного налаштування.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ризик погіршення продуктивності&lt;/strong&gt; Своп значно повільніший, ніж доступ до RAM. Якщо активний робочий набір програми буде переміщено до свопу, її продуктивність різко постраждає через високі часи очікування введення/виведення (thrashing). Своп бажано забезпечити сховищем на базі SSD для покращення продуктивності.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ризик маскування витоків пам&#39;яті&lt;/strong&gt; Своп може приховати витоки памʼяті в програмах, які інакше призвели б до швидкого OOM-очищення. З свопом програма з протіканням памʼяті може повільно погіршувати продуктивність вузла з часом, ускладнюючи діагностику першопричини.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ризик відключення виселень&lt;/strong&gt; Kubelet активно моніторить вузол на предмет тиску на памʼять та завершує поди, щоб відновити ресурси. Неправильне налаштування може призвести до OOM-очищень до того, як kubelet матиме можливість виселити поди відповідним чином. Правильно налаштований &lt;code&gt;min_free_kbytes&lt;/code&gt; є критично важливим для забезпечення ефективності механізму виселення kubelet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;kubernetes-context&#34;&gt;Kubernetes context&lt;/h3&gt;
&lt;p&gt;Разом, водяні знаки ядра та поріг виселення kubelet створюють серію зон тиску памʼяті на вузлі. Параметри порогу виселення потрібно відрегулювати, щоб налаштувати керовані Kubernetes виселення, які відбуваються до OOM-очищення.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Бажані пороги для ефективного використання swap&#34; src=&#34;https://deploy-preview-48551--kubernetes-io-main-staging.netlify.app/blog/2025/08/19/tuning-linux-swap-for-kubernetes-a-deep-dive/swap-thresholds.png&#34; title=&#34;Recommended Thresholds&#34;&gt;&lt;/p&gt;
&lt;p&gt;Як показано на діаграмі, ідеальна конфігурація полягає в тому, щоб створити достатньо велике &amp;quot;вікно обміну&amp;quot; (між водяними знаками &lt;code&gt;high&lt;/code&gt; та &lt;code&gt;min&lt;/code&gt;), щоб ядро могло обробляти тиск памʼяті шляхом свопу, перш ніж доступна памʼять впаде в зону виселення/прямого відновлення.&lt;/p&gt;
&lt;h3 id=&#34;recommended-starting-point&#34;&gt;Рекомендована точка відліку&lt;/h3&gt;
&lt;p&gt;На основі цих висновків, я рекомендую наступне як відправну точку для вузлів Linux з увімкненим swap. Вам слід провести тестування продуктивності з вашими власними робочими навантаженнями.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vm.swappiness=60&lt;/code&gt;: Linux стандартно є хорошою відправною точкою для загальних робочих навантажень. Однак, ідеальне значення залежить від робочого навантаження, і застосунки, чутливі до swap, можуть потребувати більш ретельного налаштування.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vm.min_free_kbytes=500000&lt;/code&gt; (500MB): Встановіть це на досить високе значення (наприклад, 2-3% від загальної памʼяті вузла), щоб забезпечити розумний буфер безпеки.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vm.watermark_scale_factor=2000&lt;/code&gt;: Створіть більше вікно для роботи &lt;code&gt;kswapd&lt;/code&gt;, запобігаючи OOM kills під час раптових сплесків виділення памʼяті.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Я рекомендую проводити тести продуктивності з вашими власними робочими навантаженнями в тестових середовищах при першому налаштуванні swap у вашому кластері Kubernetes. Продуктивність swap може бути чутливою до різних особливостей середовища, таких як навантаження на CPU, тип диска (SSD проти HDD) та шаблони введення/виведення.&lt;/p&gt;

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