<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes Blog</title>
    <link>https://deploy-preview-59083--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-59083--kubernetes-io-main-staging.netlify.app/uk/</link>
    </image>
    
    <atom:link href="https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/feed.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Чому мій Kubernetes Job досі в черзі? Відстеження допуску Kueue в Headlamp</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/14/tracing-kueue-admission-with-headlamp/</link>
      <pubDate>Wed, 14 Oct 2026 10:35:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/14/tracing-kueue-admission-with-headlamp/</guid>
      <description>
        
        
        &lt;p&gt;Ви подаєте &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/job/&#34;&gt;Kubernetes Job&lt;/a&gt; і чекаєте, поки зʼявляться його Podʼи. Хвилина минає. Потім ще одна. Job досі призупинено, журналів застосунку немає, а Podʼа для перевірки може й не бути.&lt;/p&gt;
&lt;p&gt;У кластері, керованому &lt;a href=&#34;https://kueue.sigs.k8s.io/&#34;&gt;Kueue&lt;/a&gt;, це цілком може бути нормою. Kueue досі може вирішувати, чи може Job використати запитані ресурси. Корисне питання полягає не лише в тому, «чому Pod у стані очікування?». Насамперед варто запитати: «Чи здійснив Kueue допуск (admission) цього Workload?».&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/kueue&#34;&gt;Втулок Kueue для Headlamp&lt;/a&gt; переносить це розслідування в інтерфейс Headlamp. Замість того, щоб відтворювати шлях допуску за допомогою кількох команд і обʼємних YAML-обʼєктів, ви можете почати з Workload, прочитати повідомлення його стану (condition) і перейти за посиланнями до LocalQueue, ClusterQueue, ResourceFlavor і Cohort.&lt;/p&gt;
&lt;p&gt;Ця стаття присвячена саме цьому підходу: спершу Headlamp, а командний рядок зʼявляється лише в короткому необовʼязковому розділі для відтворення прикладу.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Підготовка&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#before-you-begin&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Вам потрібен кластер Kubernetes зі &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/installation/&#34;&gt;встановленим Kueue&lt;/a&gt;, &lt;a href=&#34;https://headlamp.dev/docs/latest/installation/&#34;&gt;встановлений Headlamp&lt;/a&gt; та &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/kueue/0.1.0-alpha&#34;&gt;втулок Kueue &lt;code&gt;0.1.0-alpha&lt;/code&gt;&lt;/a&gt;. Ваш обліковий запис Kubernetes повинен мати права на читання ресурсів Kueue, що використовуються в цій статті.&lt;/p&gt;
&lt;p&gt;Альфа-версія надає режими перегляду лише для читання ресурсів Kueue &lt;code&gt;v1beta2&lt;/code&gt;: Cohorts, ClusterQueues, LocalQueues, ResourceFlavors та Workloads. Вона не додає власних робочих процесів створення, редагування, зупинки, відновлення чи видалення. Headlamp як і раніше надає стандартні дії з YAML і ресурсами, якщо ваші дозволи це допускають.&lt;/p&gt;
&lt;h2 id=&#34;first-separate-admission-from-pod-scheduling&#34;&gt;Спершу відокремте допуск від планування Podʼів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#first-separate-admission-from-pod-scheduling&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kueue та планувальник Kubernetes відповідають на різні питання.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Допуск Kueue (admission): чи слід запускати цей Workload зараз, з урахуванням політики черги (queue), квоти, ResourceFlavorʼів, перевірок допуску (admission checks) та інших Workloadʼів в очікуванні?&lt;/li&gt;
&lt;li&gt;Планування Podʼів: після того як Kueue здійснює допуск Workload і Job поновлюється, на яких вузлах можна виконати його Podʼи?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Межа між цими двома змінює саме розслідування. Якщо Workload не допущено, залишайтеся в розділі Kueue в Headlamp. Якщо допущено, але Podʼи досі в стані &lt;code&gt;Pending&lt;/code&gt;, переходьте до звичайних режимів перегляду Job і Pod у Headlamp і перевіряйте події планувальника.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/10/14/tracing-kueue-admission-with-headlamp/kueue-admission-architecture.png&#34;
         alt=&#34;Kubernetes Job стає Workload Kueue. Kueue оцінює його LocalQueue, ClusterQueue, ResourceFlavor і необовʼязковий Cohort, перш ніж поновити Job. Headlamp зчитує ці ресурси через API Kubernetes.&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Архітектура допуску Kueue&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;the-headlamp-first-troubleshooting-path&#34;&gt;Шлях усунення несправностей із Headlamp на першому місці&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-headlamp-first-troubleshooting-path&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Найшвидше розслідування починається з Workload, а не з командного рядка.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/10/14/tracing-kueue-admission-with-headlamp/headlamp-kueue-troubleshooting-flow.png&#34;
         alt=&#34;Схема усунення несправностей у Headlamp, що починається з Workload Kueue, перевіряє стани допуску, переходить за посиланнями до LocalQueue і ClusterQueue, якщо допуск заблоковано, і перемикається до режимів перегляду Job і Pod після допуску.&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Відстеження Job в очікуванні за допомогою Headlamp&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;step-1-open-the-workloads-view&#34;&gt;Крок 1. Відкрийте режим перегляду Workloads&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#step-1-open-the-workloads-view&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У Headlamp відкрийте &lt;strong&gt;Kueue → Workloads&lt;/strong&gt;. Виберіть простір імен (namespace), що містить Job, а потім знайдіть Workload, створений для нього.&lt;/p&gt;
&lt;p&gt;Kueue створює &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/workload/&#34;&gt;Workload&lt;/a&gt;, що представляє запит ресурсів і стан допуску Job. В альфа-версії втулка посилання на власника показані як текст у форматі &lt;code&gt;Kind/name&lt;/code&gt;, але поки не є посиланнями. Назва Workload зазвичай містить назву Job, тож фільтр за простором імен і пошук у таблиці — найпростіший спосіб його знайти.&lt;/p&gt;
&lt;p&gt;Ще до відкриття сторінки подробиць список уже дає корисний перший огляд:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LocalQueue&lt;/li&gt;
&lt;li&gt;пріоритет і клас пріоритету&lt;/li&gt;
&lt;li&gt;активний стан&lt;/li&gt;
&lt;li&gt;стан допуску (admitted)&lt;/li&gt;
&lt;li&gt;стан завершення&lt;/li&gt;
&lt;li&gt;зрозумілий поточний статус, як-от &lt;code&gt;Admitted&lt;/code&gt;, &lt;code&gt;Finished&lt;/code&gt; або &lt;code&gt;Inadmissible&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;вік&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Якщо відповідного Workload немає, перевірте три речі, перш ніж іти далі: вибраний простір імен, чи було Job подано до LocalQueue, і чи може ваш обліковий запис Kubernetes перелічувати Workloads. Втулок виконує перевірки дозволів і показує повідомлення про доступ, коли поточний обліковий запис не може прочитати ресурс.&lt;/p&gt;
&lt;h2 id=&#34;step-2-read-status-conditions-and-events&#34;&gt;Крок 2. Прочитайте статус, стани та події&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#step-2-read-status-conditions-and-events&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Відкрийте Workload. Почніть з його поточного статусу та &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/tasks/troubleshooting/troubleshooting_jobs/#is-my-job-admitted&#34;&gt;станів (conditions)&lt;/a&gt;, а не з повного YAML.&lt;/p&gt;
&lt;p&gt;Для усунення несправностей допуску найважливіші типи станів — це &lt;code&gt;QuotaReserved&lt;/code&gt; і &lt;code&gt;Admitted&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Admitted=True&lt;/code&gt; означає, що Kueue здійснив допуск Workload. Job може поновитися, тож усі Podʼи, що лишилися в стані &lt;code&gt;Pending&lt;/code&gt;, належать гілці розслідування, повʼязаній із плануванням.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QuotaReserved=False&lt;/code&gt; з причиною, як-от &lt;code&gt;Pending&lt;/code&gt;, означає, що Kueue не зарезервував квоту. Повідомлення стану пояснює, що завадило резервуванню.&lt;/li&gt;
&lt;li&gt;Статус &lt;code&gt;Inadmissible&lt;/code&gt; означає, що Workload поки не вміщується в доступну конфігурацію черги. До цього можуть призвести відсутність ресурсу в наборі квот, непридатний ResourceFlavor, зупинена черга чи перевірка допуску (admission check).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Наприклад, повідомлення стану може сповіщати, що Kueue не зміг призначити ResourceFlavor, оскільки ClusterQueue має недостатню квоту CPU. Таке повідомлення — перша справжня відповідь на запитання «Чому мій Job досі в черзі?». Решта шляху в Headlamp пояснює конфігурацію, що стоїть за цим.&lt;/p&gt;
&lt;p&gt;Також перевірте розділ &lt;strong&gt;Events&lt;/strong&gt;. Стани описують поточний стан; події допомагають побачити, що змінилося нещодавно або що Kueue намагався зробити.&lt;/p&gt;
&lt;h2 id=&#34;step-3-compare-the-workload-s-request-with-its-assignment&#34;&gt;Крок 3. Порівняйте запит Workload із його призначенням&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#step-3-compare-the-workload-s-request-with-its-assignment&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Залишайтеся на сторінці подробиць Workload і перевірте PodSets та запити ресурсів. Втулок показує кількість Podʼів, CPU, памʼять та інші ресурси, які Kueue оцінює разом.&lt;/p&gt;
&lt;p&gt;Це важливо, бо Job із &lt;code&gt;parallelism: 3&lt;/code&gt; та запитом один CPU на Pod просить у Kueue загалом три CPU. Погляд лише на шаблон одного Podʼа недооцінить Workload.&lt;/p&gt;
&lt;p&gt;Якщо квоту вже зарезервовано, та сама сторінка також показує призначений ClusterQueue, ResourceFlavorʼи та використання допущених ресурсів. Якщо цих призначень допуску немає, Workload ще не дійшов до цього етапу.&lt;/p&gt;
&lt;p&gt;У нашому прикладі Workload запитує:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;три Podʼи&lt;/li&gt;
&lt;li&gt;загалом три CPU&lt;/li&gt;
&lt;li&gt;загалом 600 MiB памʼяті&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Наступне питання — куди цей запит потрапив у Kueue.&lt;/p&gt;
&lt;h2 id=&#34;step-4-follow-the-linked-localqueue&#34;&gt;Крок 4. Перейдіть за посиланням на LocalQueue&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#step-4-follow-the-linked-localqueue&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Скористайтеся посиланням &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/local_queue/&#34;&gt;LocalQueue&lt;/a&gt; на сторінці подробиць Workload. LocalQueue — це точка входу на рівні простору імен, яку використовує Job. Вона зʼєднує Workloads у межах простору імен із ClusterQueue, що охоплює весь кластер.&lt;/p&gt;
&lt;p&gt;Сторінка LocalQueue показує:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;її простір імен і підключений ClusterQueue&lt;/li&gt;
&lt;li&gt;політику зупинки (stop policy) та поточний статус&lt;/li&gt;
&lt;li&gt;кількість Workload в очікуванні, з резервуванням і допущених&lt;/li&gt;
&lt;li&gt;стани Kueue та події Kubernetes&lt;/li&gt;
&lt;li&gt;повʼязані Workloads у тому самому просторі імен&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ця сторінка відповідає на два практичні питання: чи потрапив Job до черги, яку ви очікували, і чи є він єдиним Workload в очікуванні там.&lt;/p&gt;
&lt;p&gt;Якщо LocalQueue неактивний або зупинений, це може вже пояснювати очікування. Якщо він активний, перейдіть за посиланням на ClusterQueue, щоб перевірити ємність, що стоїть за ним.&lt;/p&gt;
&lt;h2 id=&#34;step-5-inspect-clusterqueue-capacity-and-usage&#34;&gt;Крок 5. Перевірте ємність і використання ClusterQueue&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#step-5-inspect-clusterqueue-capacity-and-usage&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/cluster_queue/&#34;&gt;ClusterQueue&lt;/a&gt; представляє квоту та політику допуску на рівні кластера, доступні для одного чи кількох LocalQueue.&lt;/p&gt;
&lt;p&gt;На його сторінці подробиць у Headlamp порівняйте запит Workload із такими параметрами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ресурси в межах квоти (covered resources)&lt;/li&gt;
&lt;li&gt;номінальна квота для кожного ResourceFlavor&lt;/li&gt;
&lt;li&gt;поточні резервування та використання&lt;/li&gt;
&lt;li&gt;обмеження запозичення та надання квоти&lt;/li&gt;
&lt;li&gt;кількість Workload в очікуванні, з резервуванням і допущених&lt;/li&gt;
&lt;li&gt;стратегія постановки в чергу (queueing strategy) та політика зупинки&lt;/li&gt;
&lt;li&gt;налаштування витіснення (preemption), чесного поділу (fair sharing), взаємозамінності flavor (flavor fungibility) та перевірок допуску&lt;/li&gt;
&lt;li&gt;стани Kueue та події Kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для прикладу в цій статті ClusterQueue надає номінальну квоту в два CPU та два слоти Pod. Workload просить по три з кожного. Повідомлення стану та сторінка ClusterQueue тепер розповідають ту саму історію: Workload не вміщується, тож Kueue залишає Job призупиненим.&lt;/p&gt;
&lt;p&gt;Це проблема ємності для допуску, а не доказ того, що kube-scheduler не зміг знайти вузол.&lt;/p&gt;
&lt;h2 id=&#34;step-6-check-resourceflavor-and-cohort-when-needed&#34;&gt;Крок 6. За потреби перевірте ResourceFlavor і Cohort&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#step-6-check-resourceflavor-and-cohort-when-needed&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Квота не завжди є єдиним пулом. &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/resource_flavor/&#34;&gt;ResourceFlavor&lt;/a&gt; може представляти клас обчислень за допомогою міток вузлів, taints, tolerations або налаштувань топології. Скористайтеся посиланням на ResourceFlavor із ClusterQueue, коли стан згадує призначення flavor або коли Workload потребує певного класу обладнання, як-от вузли з GPU.&lt;/p&gt;
&lt;p&gt;Якщо ClusterQueue належить &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/concepts/cohort/&#34;&gt;Cohort&lt;/a&gt;, перейдіть і за цим посиланням. Cohort дає змогу ClusterQueue ділитися невикористаною квотою. Сторінка в Headlamp показує батьківські та дочірні Cohort, ClusterQueue-учасники, задіяні ResourceFlavorʼи, групи ресурсів, обмеження запозичення та надання квоти, а також відомості про чесний поділ.&lt;/p&gt;
&lt;p&gt;Ці сторінки допомагають відповісти на більш тонке питання: чи заблоковано Workload тому, що черга не має власної квоти, тому, що вона не може позичити достатньо, чи тому, що не можна призначити придатний flavor?&lt;/p&gt;
&lt;h2 id=&#34;what-we-learned-without-leaving-headlamp&#34;&gt;Чого ми навчилися, не залишаючи Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-we-learned-without-leaving-headlamp&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Для прикладу Job в очікуванні інтерфейс дає нам повне пояснення:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Workload не допущено.&lt;/li&gt;
&lt;li&gt;Його стан &lt;code&gt;QuotaReserved&lt;/code&gt; має значення false, а повідомлення вказує на недостатню квоту.&lt;/li&gt;
&lt;li&gt;Workload запитує три CPU та три слоти Pod.&lt;/li&gt;
&lt;li&gt;Його LocalQueue активний і вказує на очікуваний ClusterQueue.&lt;/li&gt;
&lt;li&gt;ClusterQueue надає лише два CPU та два слоти Pod.&lt;/li&gt;
&lt;li&gt;Тому Kueue тримає Job призупиненим, доки квота не стане доступною або конфігурацію черги не змінять.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Важлива не та обставина, що Headlamp вигадує новий статус. Він зчитує ті самі обʼєкти API Kubernetes, що й інші клієнти, а потім збирає повʼязані ресурси та зрозумілі значення в одному цілісному розслідуванні.&lt;/p&gt;
&lt;h2 id=&#34;if-the-workload-is-admitted-switch-views&#34;&gt;Якщо Workload допущено — перемикайтеся на інші режими&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#if-the-workload-is-admitted-switch-views&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Уявімо, що сторінка подробиць Workload показує &lt;code&gt;Admitted=True&lt;/code&gt;, але застосунок досі не працює. Kueue завершив свою частину рішення. Продовжуйте в стандартних режимах перегляду Kubernetes у Headlamp:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Відкрийте &lt;strong&gt;Workloads → Jobs&lt;/strong&gt; і перевірте стан та події Job.&lt;/li&gt;
&lt;li&gt;Відкрийте &lt;strong&gt;Workloads → Pods&lt;/strong&gt; і фільтруйте за назвою Job або простором імен.&lt;/li&gt;
&lt;li&gt;Виберіть Pod у стані &lt;code&gt;Pending&lt;/code&gt; і прочитайте його розділ &lt;strong&gt;Events&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;На цьому етапі шукайте ознаки проблем планувальника, як-от недостатня ємність вузла, &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/assign-pod-node/&#34;&gt;спорідненість вузлів (node affinity)&lt;/a&gt;, &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/taint-and-toleration/&#34;&gt;taints і tolerations&lt;/a&gt;, обмеження топології, привʼязування постійних томів чи помилки завантаження образів.&lt;/p&gt;
&lt;p&gt;Це перемикання — найкорисніше правило усунення несправностей у статті:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Не допущено: розслідуйте ресурси Kueue в Headlamp.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Admitted&lt;/code&gt;, але Podʼи в стані &lt;code&gt;Pending&lt;/code&gt;: розслідуйте відомості про Job, Podʼи, вузли та планувальник у Headlamp.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;a-repeatable-headlamp-checklist&#34;&gt;Повторюваний чекліст Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#a-repeatable-headlamp-checklist&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Коли наступний Job не запускається, скористайтеся цим коротким шляхом:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Відкрийте &lt;strong&gt;Kueue → Workloads&lt;/strong&gt; і виберіть правильний простір імен.&lt;/li&gt;
&lt;li&gt;Знайдіть Workload, повʼязаний із Job.&lt;/li&gt;
&lt;li&gt;Перевірте зрозумілий поточний статус, а також стани &lt;code&gt;Admitted&lt;/code&gt; і &lt;code&gt;QuotaReserved&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Прочитайте повідомлення стану та нещодавні події.&lt;/li&gt;
&lt;li&gt;Порівняйте запити ресурсів PodSet із призначеннями допуску.&lt;/li&gt;
&lt;li&gt;Перейдіть за посиланням LocalQueue та підтвердьте його статус і ClusterQueue.&lt;/li&gt;
&lt;li&gt;Перейдіть за посиланням ClusterQueue і порівняйте квоту, резервування, використання та політику.&lt;/li&gt;
&lt;li&gt;Перевірте подробиці ResourceFlavor або Cohort, коли повідомлення вказує на вибір flavor або спільну квоту.&lt;/li&gt;
&lt;li&gt;Якщо допущено, перейдіть до режимів перегляду Job і Pod у Headlamp.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;what-headlamp-replaces-during-this-investigation&#34;&gt;Що Headlamp замінює під час цього розслідування&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-headlamp-replaces-during-this-investigation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Втулок не замінює &lt;code&gt;kubectl&lt;/code&gt; чи &lt;a href=&#34;https://kueue.sigs.k8s.io/docs/reference/kubectl-kueue/&#34;&gt;&lt;code&gt;kueuectl&lt;/code&gt;&lt;/a&gt; для скриптів, точного виведення обʼєктів чи змін. Він замінює монотонну навігацію без інтерфейсу, потрібну під час інтерактивного розслідування.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Питання&lt;/th&gt;
          &lt;th&gt;Шлях у Headlamp&lt;/th&gt;
          &lt;th&gt;Еквівалент у командному рядку&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Чи допущено Workload?&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Kueue → Workloads → статус і стани&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;kubectl describe workload &amp;lt;workload-name&amp;gt; -n &amp;lt;namespace&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;До якого LocalQueue він потрапив?&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Workload → повʼязаний LocalQueue&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;kubectl get localqueue &amp;lt;localqueue-name&amp;gt; -n &amp;lt;namespace&amp;gt; -o yaml&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Який ClusterQueue надає квоту?&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;LocalQueue → повʼязаний ClusterQueue&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;kubectl get clusterqueue &amp;lt;clusterqueue-name&amp;gt; -o yaml&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Який flavor чи спільна квота мають значення?&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;ClusterQueue → ResourceFlavor або Cohort&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;kubectl get resourceflavor &amp;lt;flavor-name&amp;gt; -o yaml&lt;/code&gt; або &lt;code&gt;kubectl get cohort &amp;lt;cohort-name&amp;gt; -o yaml&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Що сталося після допуску?&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Workloads → Jobs і Pods → події&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;kubectl describe job &amp;lt;job-name&amp;gt; -n &amp;lt;namespace&amp;gt;&lt;/code&gt; або &lt;code&gt;kubectl describe pod &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Для скриптів і робочих процесів GitOps командний рядок залишається правильним інструментом. Для людини, яка запитує «чому це очікує?», зазвичай швидше прочитати звʼязний шлях у Headlamp.&lt;/p&gt;
&lt;h2 id=&#34;optional-reproduce-the-pending-scenario&#34;&gt;Необовʼязково: відтворіть сценарій очікування&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#optional-reproduce-the-pending-scenario&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Репозиторій втулка містить &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/kueue/test-files/deploy&#34;&gt;приклади маніфестів Cohort, ClusterQueue, LocalQueue, ResourceFlavor і Job&lt;/a&gt; для локального тестування. Застосуйте ці приклади до кластера зі встановленим Kueue, а потім відкрийте розділ Kueue в Headlamp.&lt;/p&gt;
&lt;p&gt;Щоб відтворити конкретну невідповідність квоти, використану в цій статті, налаштуйте ClusterQueue з двома CPU та двома слотами Pod, а потім подайте Job із трьома Podʼами, що запитує один CPU на Pod. Job потрапляє до свого LocalQueue, Kueue створює Workload, і Workload залишається в очікуванні, бо сукупний запит більший за доступну квоту.&lt;/p&gt;
&lt;p&gt;Цей сценарій навмисно винесено за межі основного огляду: щойно ресурси створено, саме розслідування слід вести в Headlamp.&lt;/p&gt;
&lt;h2 id=&#34;current-alpha-limitations&#34;&gt;Поточні обмеження альфа-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#current-alpha-limitations&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Випуск &lt;code&gt;0.1.0-alpha&lt;/code&gt; — це початковий режим перегляду шляху допуску Kueue лише для читання.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Втулок не додає власних процесів створення, редагування, призупинення, відновлення чи видалення.&lt;/li&gt;
&lt;li&gt;Посилання на власника Workload показуються як текст і поки не є посиланнями.&lt;/li&gt;
&lt;li&gt;Інтерфейс залежить від дозволів Kubernetes облікового запису, який використовує Headlamp.&lt;/li&gt;
&lt;li&gt;Метрики та візуальна мапа взаємозвʼязків — можливі напрями подальшої роботи, а не можливості цього випуску.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ці обмеження корисно висловити чітко: поточна мета втулка — зробити стан допуску та взаємозвʼязки ресурсів простішими для перевірки.&lt;/p&gt;
&lt;h2 id=&#34;developed-during-lfx-mentorship&#34;&gt;Розроблено в межах наставництва LFX&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#developed-during-lfx-mentorship&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Втулок розроблено в межах &lt;a href=&#34;https://mentorship.lfx.linuxfoundation.org/&#34;&gt;наставництва CNCF LFX&lt;/a&gt; 2026 Term 2 з використанням TypeScript, React, API Kubernetes та системи втулків Headlamp.&lt;/p&gt;
&lt;p&gt;Utkarsh Raj реалізував втулок за наставництва та рецензування René Dudfield (&lt;a href=&#34;https://github.com/illume&#34;&gt;@illume&lt;/a&gt;) і Kevin Hannon (&lt;a href=&#34;https://github.com/kannon92&#34;&gt;@kannon92&lt;/a&gt;). Відгуки спільнот Headlamp і Kueue сформували режими перегляду ресурсів, подання статусу, навігацію, документацію, тести та перший альфа-випуск.&lt;/p&gt;
&lt;h2 id=&#34;try-it-and-share-feedback&#34;&gt;Спробуйте та поділіться відгуками&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#try-it-and-share-feedback&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Перегляньте &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/kueue&#34;&gt;сирці втулка та README&lt;/a&gt;, прочитайте &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/kueue/0.1.0-alpha&#34;&gt;документацію до випуску &lt;code&gt;0.1.0-alpha&lt;/code&gt;&lt;/a&gt; або поділіться відгуками в &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/issues/1251&#34;&gt;тікеті випуску&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Якщо Workload в очікуванні досі важко пояснити після проходження шляху в Headlamp, саме такий відгук допоможе покращити втулок.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.37: Представляємо стани життєвого циклу вузла</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/09/kubernetes-v1-37-node-lifecycle-conditions/</link>
      <pubDate>Wed, 09 Sep 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/09/kubernetes-v1-37-node-lifecycle-conditions/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes має багато способів описати те, що відбувається на вузлі. Готовність (readiness), taints, стан Podʼів, мітки, анотації та API конкретних провайдерів — кожен розкриває частину картини. Бракувало спільного способу, що належить Kubernetes, повідомити, що для вузла виконується &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/safely-drain-node/&#34;&gt;drain&lt;/a&gt;, що він перебуває на обслуговуванні або що на ньому триває &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/cluster-administration/node-shutdown/&#34;&gt;коректне вимкнення вузла&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.37 вводить пʼять загальновідомих &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/node/node-status/#condition&#34;&gt;станів вузла (Node conditions)&lt;/a&gt;, що надають цей опис:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DrainInProgress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Drained&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MaintenancePlanned&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MaintenanceInProgress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GracefulNodeShutdownInProgress&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-new-node-lifecycle-conditions&#34;&gt;Нові стани життєвого циклу вузла&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-new-node-lifecycle-conditions&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Стан&lt;/th&gt;
          &lt;th&gt;Що він повідомляє&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DrainInProgress&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Для вузла активно виконується drain відповідно до обраних адміністратором критеріїв drain.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Drained&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Вузол досяг обраних адміністратором критеріїв drain.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;MaintenancePlanned&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Очікується, що вузол пройде через зміну в майбутньому.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;MaintenanceInProgress&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Вузол перебуває в стані обслуговування.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GracefulNodeShutdownInProgress&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Визначено, що на вузлі триває коректне вимкнення вузла.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Обслуговування може включати оновлення апаратного або програмного забезпечення, виправлення, виведення з експлуатації або налагодження. Чи потребує обслуговування drain, залежить від його впливу. Оновлення Kubernetes зазвичай слід виконувати після drain, тоді як live patch ядра може не потребувати його.&lt;/p&gt;
&lt;p&gt;Як і інші стани вузла, кожен стан життєвого циклу використовує &lt;code&gt;status&lt;/code&gt; для повідомлення про те, чи активне спостереження:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;True&lt;/code&gt;: стан життєвого циклу зараз спостерігається.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;False&lt;/code&gt;: стан життєвого циклу зараз не спостерігається.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Unknown&lt;/code&gt;: Kubernetes не може визначити, чи активний стан життєвого циклу.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;reason&lt;/code&gt; надає стабільну, машиночитану причину для поточного статусу, а &lt;code&gt;message&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Node .status excerpt&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;conditions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;MaintenancePlanned&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;reason&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;MaintenanceWindow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lastTransitionTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2026-12-09T12:00:00Z&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hardware maintenance is scheduled for this Node&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;what-changes-in-kubernetes-v1-37&#34;&gt;Що змінюється в Kubernetes v1.37&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-changes-in-kubernetes-v1-37&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У версії v1.37 ці імена зарезервовано як загальновідомі константи &lt;code&gt;NodeConditionType&lt;/code&gt;, а також запроваджено функціональну можливість Alpha-рівня &lt;code&gt;NodeLifecycleConditions&lt;/code&gt;, яка типово вимкнена. У версії 1.37 ця функціональна можливість фактично нічого не робить: вона не обмежує коло користувачів, які можуть встановлювати ці стани, і жоден основний компонент їх не зчитує. Вона існує для того, щоб у майбутніх версіях можна було увімкнути заплановану вбудовану поведінку — контролери, які використовують ці стани. Вам не потрібно вмикати цю функціональну можливість, щоб почати публікувати стани вже сьогодні.&lt;/p&gt;
&lt;p&gt;У цьому випуску за встановлення та скидання станів життєвого циклу відповідає адміністратор або авторизований адміністратором контролер.&lt;/p&gt;
&lt;p&gt;У цьому першому випуску жоден основний контролер робочих навантажень не змінює свою поведінку на основі цих станів, але адміністратор може публікувати їх щоб повідомляти користувачам кластера про обслуговування та drain.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-lifecycle-conditions-today&#34;&gt;Як використовувати стани життєвого циклу сьогодні&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-use-lifecycle-conditions-today&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Безпосередньою перевагою є чіткість операційних процесів. Адміністратори та системи автоматизації життєвого циклу можуть використовувати ці стани як загальний канал статусу для роботи з життєвим циклом вузлів, яка вже здійснюється сьогодні.&lt;/p&gt;
&lt;p&gt;Наприклад, автоматизація обслуговування може встановити &lt;code&gt;MaintenancePlanned&lt;/code&gt;, коли заплановане майбутнє вікно обслуговування, потім встановити &lt;code&gt;MaintenanceInProgress&lt;/code&gt;, коли робота починається. Автоматизація drain може встановити &lt;code&gt;DrainInProgress&lt;/code&gt;, коли починає виселяти Podʼи, і &lt;code&gt;Drained&lt;/code&gt;, коли обрані адміністратором критерії drain виконано. Стан &lt;code&gt;GracefulNodeShutdownInProgress&lt;/code&gt; може повідомляти, що на вузлі триває коректне вимкнення вузла.&lt;/p&gt;
&lt;p&gt;Рекомендований шаблон — використовувати стани життєвого циклу для повідомлення статусу, тоді як операції життєвого циклу керуються через інші механізми. Продовжуйте використовувати наявні механізми Kubernetes, такі як &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/generated/kubectl_cordon/&#34;&gt;&lt;code&gt;kubectl cordon&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/safely-drain-node/&#34;&gt;&lt;code&gt;kubectl drain&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/taint-and-toleration/&#34;&gt;taints&lt;/a&gt; та специфічні для робочих навантажень механізми для зміни поведінки планування або виселення. Використовуйте стани життєвого циклу, щоб зробити статус цієї роботи видимим для людей, дашбордів, алертів та автоматизації, яка може використовувати цей сигнал.&lt;/p&gt;
&lt;p&gt;Встановлюючи стан, використовуйте &lt;code&gt;True&lt;/code&gt;, поки стан життєвого циклу активний. Встановіть стан у &lt;code&gt;False&lt;/code&gt; або видаліть його, коли стан більше не активний. Використовуйте стабільне значення &lt;code&gt;reason&lt;/code&gt; та зрозуміле &lt;code&gt;message&lt;/code&gt;, щоб і люди, і автоматизація могли зрозуміти, чому стан змінився. Адміністратори кластера також повинні вирішити, який компонент володіє кожним станом життєвого циклу, щоб уникнути конфліктних записів.&lt;/p&gt;
&lt;h2 id=&#34;why-a-shared-signal-matters&#34;&gt;Чому спільний сигнал важливий&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-a-shared-signal-matters&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Життєвий цикл вузла впливає на компоненти по всьому кластеру. &lt;code&gt;kubelet&lt;/code&gt;, контролер життєвого циклу вузла, контролери робочих навантажень, планувальник, засоби автоматичного масштабування, оператори сховища, та зовнішні системи обслуговування — всі потребують певного розуміння того, що відбувається з вузлом.&lt;/p&gt;
&lt;p&gt;Сьогодні кожен компонент має реконструювати це розуміння з непрямих сигналів. Один контролер може дивитися на готовність вузла, інший — на taints, третій — на Podʼи, що завершуються або відсутні. Провайдери інфраструктури та оператори часто додають власні мітки або анотації.&lt;/p&gt;
&lt;p&gt;Ці сигнали залишаються корисними для своїх передбачених цілей, але вони не дають відповіді на те саме питання. Наприклад, taint може впливати на планування або виселення, але не свідчить про те, що триває drain або що критерії drain адміністратора виконано. Статус вузла &lt;code&gt;NotReady&lt;/code&gt; не пояснює, чи причиною є несподівана несправність, коректне вимкнення чи планове технічне обслуговування.&lt;/p&gt;
&lt;p&gt;Без спільного контексту життєвого циклу компоненти, які окремо є коректними, можуть приймати суперечливі рішення. Контролер DaemonSet може замінити Pod, який &lt;code&gt;kubelet&lt;/code&gt; навмисно завершив під час коректного вимкнення. Контролер Job може безкінечно чекати на кінцеву фазу Podʼа на вузлі, який адміністратор видаляє. Оператор системи зберігання даних може дізнатися про технічне обслуговування лише після того, як drain уже розпочався.&lt;/p&gt;
&lt;p&gt;Нові стани надають стабільне місце на вузлі для цього відсутнього контексту як частину &lt;a href=&#34;https://kep.k8s.io/5683&#34;&gt;більших зусиль щодо покращення керування життєвим циклом вузла&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-foundation-for-lifecycle-aware-kubernetes&#34;&gt;Фундамент для Kubernetes, що враховує життєвий цикл&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-foundation-for-lifecycle-aware-kubernetes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цінність спільного сигналу полягає в тому, хто може його використовувати — основні контролери, адміністратори або екосистема проєктів життєвого циклу. Подальші вдосконалення можуть ґрунтуватися на цих станах, без необхідності для кожного компонента розробляти власний спосіб визначення стану життєвого циклу вузла.&lt;/p&gt;
&lt;p&gt;Розгляньмо давній граничний випадок під час rollout DaemonSet. Вузол, який зламаний або перебуває на обслуговуванні, може залишатися недоступним з причин, не повʼязаних з новою ревізією DaemonSet. Цей вузол все ще споживає бюджет доступності rollout, що може сповільнити контролер або завадити йому просувати rollout на справних вузлах.&lt;/p&gt;
&lt;p&gt;Контролер DaemonSet знає, що Pod недоступний, але він не може сказати, чи нова ревізія провалилася чи адміністратор навмисно вивів вузол з експлуатації. Готовність, taints та стан Podʼів показують частини ситуації, але жоден не надає авторитетного контексту обслуговування.&lt;/p&gt;
&lt;p&gt;Стан &lt;code&gt;MaintenanceInProgress&lt;/code&gt; створює власне Kubernetes місце для публікації цього контексту. Майбутня робота може визначити, як контролер DaemonSet використовує його для порядку розгортання, обліку доступності та повідомлення статусу. Ці поведінки все ще вимагають ретельного дизайну, але мета — щоб адміністраторам більше не потрібно було вручну коригувати розгортання.&lt;/p&gt;
&lt;h2 id=&#34;future-expansions-and-getting-involved&#34;&gt;Майбутні розширення та як долучитись&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#future-expansions-and-getting-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Життєвий цикл вузла — це перехресна проблема. Її розвʼязання починається з того, що компоненти обмінюються достатнім контекстом для прийняття сумісних рішень. Наступний етап — спиратися на Node Lifecycle Conditions для покращення таких сценаріїв, як Graceful Node Shutdown, drain та обслуговування. Довгострокова координація життєвого циклу може вимагати явної власності, блокування та потенційно спеціалізованого API.&lt;/p&gt;
&lt;p&gt;Екосистема Kubernetes вже включає багато рішень для обслуговування вузлів, виправлення, drain, автоматичного масштабування та керування парком вузлів. Досвід цих проєктів необхідний для побудови фундаменту, що працює в різних середовищах та операційних моделях. Node Lifecycle Working Group, SIG Node та SIG Apps запрошують супровідників та користувачів поділитися своїми випадками використання та ідеями для формування майбутньої роботи.&lt;/p&gt;
&lt;p&gt;Слідкуйте за роботою через &lt;a href=&#34;https://kep.k8s.io/5683&#34;&gt;KEP-5683: Node Lifecycle Conditions&lt;/a&gt;. Для участі в наших обговореннях, приєднуйтесь до однієї з наших груп:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/wg/node-lifecycle/&#34;&gt;Node Lifecycle Working Group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/apps/&#34;&gt;SIG Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.37: Storage Version Migration типово увімкнена</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/08/31/kubernetes-v1-37-storage-version-migration-ga/</link>
      <pubDate>Mon, 31 Aug 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/08/31/kubernetes-v1-37-storage-version-migration-ga/</guid>
      <description>
        
        
        &lt;p&gt;Я радий, що &lt;em&gt;міграція версії зберігання&lt;/em&gt; (SVM) досягла загальної доступності (GA) у Kubernetes v1.37!&lt;/p&gt;
&lt;p&gt;Після кількох випусків роботи та тестування вбудований API StorageVersionMigration (&lt;code&gt;storagemigration.k8s.io/v1&lt;/code&gt;)
та контролер панелі управління тепер повністю стабільні та типово увімкнені у всіх кластерах Kubernetes v1.37.&lt;/p&gt;
&lt;h2 id=&#34;the-problem-with-stale-storage-versions&#34;&gt;Проблема застарілих версій зберігання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-problem-with-stale-storage-versions&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У Kubernetes збережені API-ресурси записуються з використанням певної &lt;em&gt;версії зберігання&lt;/em&gt; (представлення схеми). Те, як Kubernetes взаємодіє з обʼєктним сховищем, принципово вимагає зміни ресурсу, щоб гарантувати використання останньої версії зберігання для всіх ресурсів. Це створює проблеми, коли ви хочете змінити версію зберігання ресурсу.&lt;/p&gt;
&lt;p&gt;Один із прикладів сценарію, коли ви можете захотіти змінити версію зберігання ресурсу, — це коли ви просуваєте CRD, щоб відмовитися від старішої версії API (наприклад, &lt;code&gt;v1alpha1&lt;/code&gt;) на користь новішої (залишивши лише &lt;code&gt;v1beta1&lt;/code&gt; та &lt;code&gt;v1&lt;/code&gt;). Відмова від старішої версії API є проблемою, поки в сховищі все ще залишаються ресурси, збережені зі старою альфа-версією.&lt;/p&gt;
&lt;p&gt;Щоб уникнути проблем, ви призначаєте &lt;code&gt;v1&lt;/code&gt; як нову версію зберігання; але само по собі цього недостатньо. Поки нові записи зберігаються як &lt;code&gt;v1&lt;/code&gt;, будь-який наявний ресурс може залишатися збереженим як &lt;code&gt;v1alpha1&lt;/code&gt; або &lt;code&gt;v1beta1&lt;/code&gt; у сховищі. Ви не можете безпечно видалити &lt;code&gt;v1alpha1&lt;/code&gt; з &lt;code&gt;.status.storedVersions&lt;/code&gt; CRD або припинити підтримку обслуговування, доки кожен окремий ресурс у сховищі не буде переписаний так, щоб не серіалізуватися та не зберігатися з альфа-версією.&lt;/p&gt;
&lt;p&gt;Іншим доречним прикладом є &lt;em&gt;шифрування у стані спокою&lt;/em&gt; та, повʼязана з ним, &lt;em&gt;ротація ключів&lt;/em&gt;. Коли ви налаштовуєте шифрування у стані спокою або виконуєте ротацію ключів шифрування, наявні ресурси у сховищі залишаються &lt;strong&gt;незашифрованими&lt;/strong&gt; (або зашифрованими старими ключами), доки вони не будуть активно
переписані через API-сервер Kubernetes.&lt;/p&gt;
&lt;p&gt;Історично адміністратори кластерів та автори CRD мали покладатися на ручні скрипти &lt;code&gt;kubectl get&lt;/code&gt; / &lt;code&gt;kubectl replace&lt;/code&gt; або розгортати зовнішній компонент &lt;code&gt;kube-storage-version-migrator&lt;/code&gt;, щоб примусово виконувати перезапис. Ці підходи часто були марудними, схильними до помилок та важкими для моніторингу.&lt;/p&gt;
&lt;h2 id=&#34;how-storage-version-migration-works&#34;&gt;Як працює міграція версії зберігання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-storage-version-migration-works&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Запустити міграцію версії зберігання так само просто, як створити декларативний обʼєкт StorageVersionMigration. Вбудований контролер StorageVersionMigrator у панелі управління Kubernetes відстежує ці обʼєкти та автоматично переносить наявні ресурси до типової версії зберігання для цього API.&lt;/p&gt;
&lt;h3 id=&#34;example-custom-resources&#34;&gt;Приклад: міграція API власного ресурсу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-custom-resources&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Припустимо, ви оновили CustomResourceDefinition (&lt;code&gt;crontabs.example.com&lt;/code&gt;), щоб використовувати &lt;code&gt;v1&lt;/code&gt; як версію зберігання. Щоб мігрувати всі наявні збережені ресурси зі старіших версій, створіть StorageVersionMigration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;storagemigration.k8s.io/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;StorageVersionMigration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;crontabs-migration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;example.com&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;crontabs&lt;/span&gt;&lt;span class=&#34;w&#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;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl apply -f crontabs-migration.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;monitoring-and-verifying-migrations&#34;&gt;Моніторинг та перевірка міграцій&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#monitoring-and-verifying-migrations&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Контролер StorageVersionMigrator оновлює &lt;code&gt;status&lt;/code&gt; обʼєкта StorageVersionMigration у міру виконання міграції. Ви можете переглянути стан міграції за допомогою &lt;code&gt;kubectl&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get storageversionmigration.storagemigration.k8s.io/crontabs-migration -o yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Успішна міграція повідомить про умову &lt;code&gt;Succeeded&lt;/code&gt; зі значенням True:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;conditions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Running&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lastUpdateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2026-08-02T10:05:00Z&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;reason&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;StorageVersionMigrationInProgress&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Succeeded&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lastUpdateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2026-08-02T10:05:00Z&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;reason&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;StorageVersionMigrationSucceeded&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Після успішної міграції ви можете бути впевнені, що всі екземпляри ресурсу у сховищі збережені у поточній версії зберігання. Для CRD версія зберігання має бути оновлена в &lt;code&gt;.status.storedVersions&lt;/code&gt; CRD так, щоб містити лише бажану версію. Якщо &lt;code&gt;.status.storedVersions&lt;/code&gt; не оновлено після успішної міграції, це означає, що CRD було оновлено під час міграції. У цьому випадку міграцію слід повторити, щоб безпечно визнати старішу версію зберігання застарілою.&lt;/p&gt;
&lt;h2 id=&#34;including-migrations-in-your-crd-manifests&#34;&gt;Включення міграцій у ваші маніфести CRD&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#including-migrations-in-your-crd-manifests&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Оскільки StorageVersionMigration — це стандартний декларативний API Kubernetes, автори CRD можуть постачати або запускати міграції безпосередньо разом з оновленнями CRD. Наприклад, ви можете включити міграцію в той самий маніфест, що й оновлений CustomResourceDefinition:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;apiextensions.k8s.io/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;CustomResourceDefinition&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;crontabs.example.com&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;example.com&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Оновлений список версій, де v1 має storage: true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;storagemigration.k8s.io/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;StorageVersionMigration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;crontabs-migration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;example.com&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resource&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;crontabs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;what-s-next&#34;&gt;Що далі?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-s-next&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Дізнайтеся більше про концепції, що стоять за &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/storage-version/&#34;&gt;версіями зберігання&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Прочитайте покроковий посібник: &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/manage-kubernetes-objects/storage-version-migration/&#34;&gt;міграція обʼєктів Kubernetes з використанням міграції версії зберігання&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SIG API Machinery буде рада почути ваш відгук, коли ви впроваджуватимете вбудовану міграцію версії зберігання у своїх кластерах. Звертайтеся до нас на каналі &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-api-machinery&#34;&gt;#sig-api-machinery&lt;/a&gt; у Slack або беріть участь у наших обговореннях у спільноті!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.37: Garhwal</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/08/26/kubernetes-v1-37-release/</link>
      <pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/08/26/kubernetes-v1-37-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Редактори:&lt;/strong&gt; Arsh Sharma, Christopher Tineo, Kirti Goyal, Sophia Ugochukwu, Swathi Rao, Troy Connor&lt;/p&gt;
&lt;p&gt;Подібно до попередніх випусків, реліз Kubernetes v1.37 представляє нові стабільні, бета- та альфа-функції. Постійний випуск високоякісних версій підкреслює силу нашого циклу розробки та активну підтримку з боку нашої спільноти.&lt;/p&gt;
&lt;p&gt;Цей випуск складається з 67 вдосконалень. З них 16 стали стабільними, 23 переходять у бета-версію, 27 стали альфа-функціями, а 1 функція визнана застарілою.&lt;/p&gt;
&lt;h2 id=&#34;release-theme-and-logo&#34;&gt;Тема та логотип релізу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#release-theme-and-logo&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;figure class=&#34;release-logo &#34;&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/08/26/kubernetes-v1-37-release/k8s-v1.37.svg&#34;
         alt=&#34;Логотип версії Kubernetes v1.37 «Garhwal»: плетена рамка, виконана у стилі «рингаал», оточує засніжені вершини Гімалаїв, терасові поля, дерева деодар, звивисту річку, гірський будинок із позначкою 1.37, барвисті прапори, гімалайського монала та червоні квіти буранш із символами шолома Kubernetes у їхньому центрі&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Темою для Kubernetes v1.37 є &lt;strong&gt;Гарвал&lt;/strong&gt; (गढ़वाल, вимовляється як &lt;em&gt;gaṛhvāl&lt;/em&gt;) — гімалайський регіон штату Уттаракханд, Індія. Засніжені вершини Гімалаїв у Гарвалі, ліси деодара, терасові поля, річки та струмки, а також гірські стежки формують як сам регіон, так і логотип. Усі ці елементи разом відображають спільноту, в якій кожен шар, кожен шлях і кожен внесок пов’язані між собою.&lt;/p&gt;
&lt;p&gt;Логотип уявляється як вікно в пейзаж Гарвалу.&lt;sup&gt;1&lt;/sup&gt; Всередині терасові поля піднімаються до засніжених вершин, кожен рівень підтримується тим, що нижче, так само як кожен випуск Kubernetes залежить від роботи, виконаної раніше. Річка звивається долиною і збирає гірські потоки, відображаючи внески багатьох SIG та спільнот, що об’єднуються в один проєкт.&lt;/p&gt;
&lt;p&gt;Деодаровий ліс — це ширша екосистема Kubernetes, де різні проєкти ділять спільну основу та ростуть пліч-о-пліч. Камʼяна кладка та деревʼяні конструкції формують стежку та гірський будинок, ставлячи людей у центр і викликаючи спільні основи, підтримувані для тих, хто йде слідом. Над річкою барвисті прапори ловлять вітер і оживляють сцену.&lt;/p&gt;
&lt;p&gt;Сцену оточує фігурний каркас, натхненний кошикарством із &lt;em&gt;рингаала&lt;/em&gt; — гнучкого карликового гімалайського бамбука. Окремі смужки набувають міцності, коли їх переплітають, так само як код, ревізії, тести, документація та координація об’єднуються для створення релізу.&lt;/p&gt;
&lt;p&gt;У рамці зображений &lt;a href=&#34;https://en.wikipedia.org/wiki/Himalayan_monal&#34;&gt;гімалайський монал&lt;/a&gt; — державний птах штату Уттаракханд, який мешкає на великих висотах у Гімалаях. Його райдужне пірʼя має безліч кольорів одночасно, подібно до того, як спільнота Kubernetes об’єднує різноманітні навички та погляди в одному проєкті. Квіти червоного буранша (Rhododendron arboreum), державного дерева штату Уттаракханд, мають у центрі символи Kubernetes, поєднуючи знайомий цвіт Гархвала із символом, який поділяє спільнота. На будинку зображено数字 १.३७ (1,37 у цифрах деванагарі), що вкорінює цей реліз у місцевий ландшафт.&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;1. Продовжуйте дивитися у вікно (логотип). Спостерігайте, як тече річка і як прапори майоріють на вітрі. За 37 секунд пейзаж відкриє свою магію.. 😉&lt;/sub&gt;&lt;/p&gt;
&lt;h2 id=&#34;spotlight-on-key-updates&#34;&gt;Основні оновлення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#spotlight-on-key-updates&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes v1.37 насичений новими функціями та покращеннями. Ось кілька оновлень, які &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.37/release-team.md&#34;&gt;Команда випуску&lt;/a&gt; хотіла б виділити!&lt;/p&gt;
&lt;h3 id=&#34;stable-resilient-watchcache-initialization&#34;&gt;Stable: Стійка ініціалізація watchcache&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#stable-resilient-watchcache-initialization&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.37 завершує роботу над &lt;em&gt;стійкою ініціалізацією watchcache&lt;/em&gt;: функціональна можливість &lt;code&gt;ResilientWatchCacheInitialization&lt;/code&gt; досягла стану Stable ще в v1.34, а в v1.37 інша функціональна можливість &lt;code&gt;WatchCacheInitializationPostStartHook&lt;/code&gt; переходить у Stable і заблокована. З v1.36 вона стандартно увімкнена, що посилює API-сервер при старті та під час відновлення. Ініціалізація та повторна ініціалізація watchcache більше не створюють стрибка трафіку запитів до &lt;code&gt;etcd&lt;/code&gt;, а запити обробляються коректно замість накопичення під час прогрівання кешу.&lt;/p&gt;
&lt;p&gt;Щоб уникнути надмірного навантаження &lt;code&gt;etcd&lt;/code&gt; або вичерпання можливостей механізмів API Priority та Fairness через дорогі запити типу «list» та «watch», &lt;code&gt;kube-apiserver&lt;/code&gt; тепер безпечно делегує запити з обмеженим обсягом, а інші відхиляє, повертаючи відповіді HTTP 429. Це знижує ризик відмови панелі управління у великих кластерах. Клієнти (включно з власними контролерами та операторами) мають коректно обробляти відповіді HTTP &lt;code&gt;429 Too Many Requests&lt;/code&gt;, дотримуючись заголовків &lt;code&gt;Retry-After&lt;/code&gt; та використовуючи експоненційну затримку.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4568/&#34;&gt;KEP #4568&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/api-machinery/&#34;&gt;SIG API Machinery&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;beta-horizontalpodautoscaler-scale-to-zero&#34;&gt;Beta: Масштабування HorizontalPodAutoscaler до нуля&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#beta-horizontalpodautoscaler-scale-to-zero&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.37 підтримка &lt;em&gt;масштабування до нуля&lt;/em&gt; для HorizontalPodAutoscaler переходить у Beta. Вперше представлена в Kubernetes v1.16, вона тепер &lt;strong&gt;стандартно увімкнена&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Для робочих навантажень, що використовують метрики обʼєктів або зовнішні метрики, ця функція дозволяє HorizontalPodAutoscaler масштабуватися до нуля Podʼів у стані простою, а потім відновлювати їх, коли попит повертається. Це може знизити витрати для обробників черг, пакетних завдань та навантажень з GPU.&lt;/p&gt;
&lt;p&gt;Масштабування до нуля на основі метрик CPU та памʼяті &lt;strong&gt;не підтримується&lt;/strong&gt;, оскільки ці метрики залежать від активних Podʼів. Натомість ця функція призначена для сценаріїв, коли кількість реплік залишається нульовою, доки не зʼявиться робота в черзі для обробки.&lt;/p&gt;
&lt;p&gt;Поки HorizontalPodAutoscaler утримує робоче навантаження з нульовою кількістю реплік, він фіксує стан &lt;code&gt;ScaledToZero&lt;/code&gt; зі значенням &lt;code&gt;True&lt;/code&gt; у статусі HorizontalPodAutoscaler. Контролер HorizontalPodAutoscaler потім використовує цей стан, щоб відрізнити робоче навантаження, яке він масштабував до нуля (і яке масштабується назад, коли показник повертається), від робочого навантаження, яке було вручну деактивоване встановленням кількості реплік у 0. Коли робоче навантаження масштабується назад, стан встановлюється у &lt;code&gt;False&lt;/code&gt; з причиною &lt;code&gt;NotScaledToZero&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/2021/&#34;&gt;KEP #2021&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/autoscaling/&#34;&gt;SIG Autoscaling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;beta-manifest-based-admission-control-configuration&#34;&gt;Beta: Конфігурація контролю допусків на основі маніфестів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#beta-manifest-based-admission-control-configuration&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.37 переводить конфігурацію &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/manifest-admission-control/&#34;&gt;контролю допусків на основі маніфестів&lt;/a&gt; у Beta. Admission webhooks та політики на основі CEL тепер можуть завантажуватися з маніфестів на диску через поле &lt;code&gt;staticManifestsDir&lt;/code&gt; у &lt;code&gt;AdmissionConfiguration&lt;/code&gt;, замість того, щоб існувати лише в Kubernetes API. Політики, завантажені таким чином, застосовуються з моменту запуску сервера API, продовжують діяти навіть під час недоступності &lt;code&gt;etcd&lt;/code&gt; і можуть захищати самі ресурси допуску на основі API від модифікації.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5793/&#34;&gt;KEP #5793&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/api-machinery/&#34;&gt;SIG API Machinery&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;alpha-pod-level-checkpoint-and-restore&#34;&gt;Alpha: Контрольна точка та відновлення на рівні Podʼів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alpha-pod-level-checkpoint-and-restore&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.37 представляє підтримку Alpha для &lt;strong&gt;контрольних точок та відновлення на рівні Podʼів&lt;/strong&gt;, розширюючи CRI за допомогою RPC &lt;code&gt;CheckpointPod&lt;/code&gt; та &lt;code&gt;RestorePod&lt;/code&gt;, які дозволяють kubelet та сумісним рушіям виконання контейнерів створювати контрольну точку Podʼа та відновлювати Podʼа з неї. Щоб використати цю функцію, середовище виконання контейнерів також має реалізувати ці нові RPC.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5823/&#34;&gt;KEP #5823&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;features-graduating-to-stable&#34;&gt;Функції, що переходять у стабільний стан&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#features-graduating-to-stable&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей розділ перераховує всі функції, що перейшли в Stable (також відомий як стан &lt;em&gt;загальної доступності (GA, General Availability)&lt;/em&gt;). Для повного списку оновлень, включаючи нові функції та переходи з Alpha в Beta, дивіться примітки до випуску.&lt;/p&gt;
&lt;p&gt;Цей випуск включає загалом 16 вдосконалень, переведених у Stable:&lt;/p&gt;
&lt;h3 id=&#34;kyaml&#34;&gt;KYAML&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#kyaml&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;KYAML&lt;/em&gt; — це безпечніша та менш неоднозначна підмножина YAML, розроблена спеціально для Kubernetes, &lt;strong&gt;а не заміна для нього&lt;/strong&gt;. Кожен файл KYAML є валідним YAML, тож KYAML є валідним вхідним форматом для будь-якої версії &lt;code&gt;kubectl&lt;/code&gt;, а файли специфікацій не потрібно писати саме в KYAML, щоб їх можна було обробити. Ваші наявні маніфести, інструменти та конвеєри не потребують змін. KYAML вперше представлений як альфа-функція у v1.34 і перейшов у бета-версію в v1.35. KYAML переходить у стабільний стан у v1.37 після завершення тестування на відповідність, і команда &lt;code&gt;kubectl get -o kyaml&lt;/code&gt; тепер також є стабільною.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше про KYAML, перегляньте допис &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/08/11/how-to-pretty-print-kubernetes-yaml-as-kyaml/&#34;&gt;«Як форматувати ваш Kubernetes YAML у форматі KYAML і навіщо це потрібно»&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5295/&#34;&gt;KEP #5295&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/cli/&#34;&gt;SIG CLI&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;the-metrics-k8s-io-api&#34;&gt;API metrics.k8s.io&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-metrics-k8s-io-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;API &lt;em&gt;metrics.k8s.io&lt;/em&gt; переходить у Stable в Kubernetes v1.37 після майже девʼяти років у Beta. API надає стандартний спосіб отримання відомостей про використання CPU та памʼяті для podʼів та вузлів, живлячи широко використовувані функції Kubernetes такі як HorizontalPodAutoscaler (HPA) та команди на кшталт &lt;code&gt;kubectl top&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Перехід відповідає цілі проєкту Kubernetes уникати постійних API у Beta. Тепер, коли &lt;code&gt;v1&lt;/code&gt; існує, майбутні випуски Kubernetes перейдуть на нього; &lt;code&gt;v1beta1&lt;/code&gt; залишається придатним для використання протягом переходу, відповідно до політики застарівання API, тому ви можете прийняти Stable API, не ламаючи існуючі робочі процеси.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5207/&#34;&gt;KEP #5207&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/instrumentation/&#34;&gt;SIG Instrumentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;selinuxmount-and-selinuxchangepolicy&#34;&gt;&lt;code&gt;SELinuxMount&lt;/code&gt; та &lt;code&gt;SELinuxChangePolicy&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#selinuxmount-and-selinuxchangepolicy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.37 прапорці &lt;code&gt;SELinuxMount&lt;/code&gt; та &lt;code&gt;SELinuxChangePolicy&lt;/code&gt; переходять у Stable і стандартно ввімкнені: це означає, що томи монтуються з &lt;code&gt;-o context=&amp;lt;label&amp;gt;&lt;/code&gt; (типово MountOption) замість рекурсивного перейменування, але лише коли CSI драйвер тому обирає через &lt;code&gt;.spec.seLinuxMount: true&lt;/code&gt; для обʼєкта CSIDriver.&lt;/p&gt;
&lt;p&gt;Монтування може нести лише один контекст SELinux, тому &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/1710/#story-3-cluster-upgrade&#34;&gt;Podʼи з різними мітками SELinux, що разом використовують том на одному вузлі, які раніше співіснували під час рекурсивного перейменування, тепер можуть не запуститися&lt;/a&gt;. Щоб зберегти стару поведінку для роботи, рекомендується встановити &lt;code&gt;.spec.seLinuxChangePolicy&lt;/code&gt; у &lt;code&gt;Recursive&lt;/code&gt; для Pod.&lt;/p&gt;
&lt;p&gt;Ця поведінка сама по собі не заблокована до v1.38, тому відключення її на рівні кластера залишається варіантом на ще один випуск. Кластери без увімкненого SELinux не відчувають жодного ефекту. Щоб дізнатися більше, перегляньте &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/04/22/breaking-changes-in-selinux-volume-labeling/&#34;&gt;Зміни міток томів SELinux переходять у GA (і ймовірні наслідки в v1.37)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/1710/&#34;&gt;KEP #1710&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/storage/&#34;&gt;SIG Storage&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;dra-features-graduating-to-stable&#34;&gt;Функції DRA, що переходять у стабільний стан&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-features-graduating-to-stable&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;dra-resourceclaim-status-with-possible-standardized-network-interface-data&#34;&gt;DRA: Статус ResourceClaim з можливими стандартизованими даними мережевого інтерфейсу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-resourceclaim-status-with-possible-standardized-network-interface-data&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Статус &lt;code&gt;.status.devices&lt;/code&gt; ResourceClaim переходить у Stable в Kubernetes v1.37, що дозволяє драйверам повідомляти специфічні для пристрою дані статусу для кожного виділеного пристрою в заявці на ресурс. Це полегшує розуміння того, як налаштовано пристрій, усунення несправностей та використання пристрою разом з іншими сервісами.&lt;/p&gt;
&lt;p&gt;Це особливо корисно для мережевих пристроїв; до додавання цього поля, якщо Pod запитував мережевий пристрій через DRA, жоден інший компонент системи не мав можливості дізнатися IP-адресу, присвоєну цьому мережевому пристрою. Нове поле стану забезпечує стандартизований спосіб, за допомогою якого драйвер DRA може передавати цю інформацію компонентам, які її потребують, що робить DRA повністю придатним для підключення додаткових мережевих інтерфейсів до Podів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4817/&#34;&gt;KEP #4817&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt; та &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/network/&#34;&gt;SIG Network&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;dra-handle-extended-resource-requests-via-dra-driver&#34;&gt;DRA: обробка запитів розширених ресурсів через драйвер DRA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-handle-extended-resource-requests-via-dra-driver&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Підтримка розширених ресурсів DRA переходить у Stable в Kubernetes v1.37. Ця функція дозволяє драйверам DRA задовольняти запити, зроблені через традиційний механізм &lt;em&gt;розширених ресурсів&lt;/em&gt;, наприклад &lt;code&gt;abc.example/gpu: 3&lt;/code&gt; у специфікації Podʼа, без необхідності окремого &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/&#34;&gt;втулка пристрою&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;За допомогою цього механізму імʼя розширеного ресурсу може бути призначене безпосередньо DeviceClass. Podʼи, що запитують цей ресурс, можуть мати пристрій, виділений через DRA, без необхідності визначати ResourceClaim у робочому навантаженні.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5004/&#34;&gt;KEP #5004&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;dra-device-taints-and-tolerations&#34;&gt;DRA: позначки taint та toleration пристроїв&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-device-taints-and-tolerations&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Підтримка &lt;em&gt;taints&lt;/em&gt; та &lt;em&gt;tolerations&lt;/em&gt; для фізичних пристроїв, керованих через DRA, тепер є Stable в Kubernetes v1.37. Стандартно будь-який доступний пристрій може розглядатися для планування. Це вдосконалення надає більший контроль над плануванням пристроїв, дозволяючи драйверам DRA позначати конкретні пристрої позначкою taint, запобігаючи їхньому вибору для робочих навантажень. Крім того, адміністратори кластера можуть створити DeviceTaintRule для позначення пристроїв як taint на основі конкретних критеріїв відбору, наприклад, усіх пристроїв, керованих певним драйвером.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5055/&#34;&gt;KEP #5055&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;dra-standard-numanode-device-attribute&#34;&gt;DRA: стандартний атрибут пристрою numaNode&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-standard-numanode-device-attribute&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Kubernetes v1.37 визначає новий стандартний &lt;em&gt;атрибут пристрою NUMA-вузла&lt;/em&gt;. Він стандартизує &lt;code&gt;resource.kubernetes.io/numaNode&lt;/code&gt; як спільне імʼя атрибуту для інформації про NUMA-вузол пристрою, дозволяючи пристроям, керованим різними драйверами DRA, порівнюватися на основі одного й того ж NUMA-вузла. Це дозволяє уникати ситуації, коли кожен драйвер визначає власну назву атрибуту, і надає послідовний спосіб ідентифікації NUMA-розміщення між пристроями. Це вдосконалення одразу переходить у стабільний стан, оскільки це KEP щодо іменування та реєстрації без функціональної можливості чи змін поведінки в кодовій базі.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6072/&#34;&gt;KEP #6072&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;node-declared-features&#34;&gt;Функції, оголошені вузлом&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#node-declared-features&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Функції, оголошені вузлом&lt;/em&gt; переходять у Stable в Kubernetes v1.37, надаючи фреймворк для оголошення доступності конкретних, керованих функціональними можливостями функцій Kubernetes для вузлів. Ці функції потім використовуються компонентами панелі управління (такими як &lt;code&gt;kube-scheduler&lt;/code&gt;, контролери допуску або сам API-сервер) для керування розбіжністю версій (version skew).&lt;/p&gt;
&lt;p&gt;Функція вводить нове поле &lt;code&gt;.status.declaredFeatures&lt;/code&gt; для вузлів, яке використовується для оголошення функції, що проходить через етапи Alpha → Beta → Stable. Панель управління може використовувати це поле для забезпечення правильної роботи навіть у кластері, де одночасно працюють вузли з різними версіями.&lt;/p&gt;
&lt;p&gt;Коли функції переходять у Stable і панель управління може припустити, що всі вузли підтримують їх у межах вікна розбіжності версій, вузли припиняють повідомляти про них.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;kubelet&lt;/code&gt; визначає свої оголошені функції при запуску, базуючись лише на функціональних можливостях та статичній конфігурації вузла (отже, будь-які зміни вимагають перезапуску &lt;code&gt;kubelet&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5328/&#34;&gt;KEP #5328&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;storage-version-migrator&#34;&gt;Мігратор версій сховища&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#storage-version-migrator&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.37 переводить API &lt;em&gt;StorageVersionMigration&lt;/em&gt; (&lt;code&gt;storagemigration.k8s.io/v1&lt;/code&gt;) у Stable і стандартно його вмикає. Він допомагає виконувати мігрувацію наявних ресурсів, як вбудованих, так і власних ресурсів користувача, зі старішої версії сховища на нову після оновлення API, наприклад, коли бажана версія сховища змінюється з &lt;code&gt;v1beta1&lt;/code&gt; на &lt;code&gt;v1&lt;/code&gt;. Його також можна використати для перезапису наявних даних після зміни шифрування у стані спокою, щоб застарілі дані зберігалися з новими налаштуваннями шифрування.&lt;/p&gt;
&lt;p&gt;Історично адміністраторам кластерів та авторам CustomResourceDefinition доводилося використовувати ручні скрипти &lt;code&gt;kubectl get&lt;/code&gt; або &lt;code&gt;kubectl replace&lt;/code&gt;, або розгортати out-of-tree компонент &lt;code&gt;kube-storage-version-migrator&lt;/code&gt; для переписування наявних ресурсів. Ці підходи часто були важкими, схильними до помилок і важкими для моніторингу.&lt;/p&gt;
&lt;p&gt;Щоб розпочати міграцію версії сховища, користувачам потрібно створити декларативний обʼєкт StorageVersionMigration. Вбудований контролер &lt;code&gt;StorageVersionMigrator&lt;/code&gt; у панелі управління Kubernetes слідкує за цими обʼєктами і виконує автоматичну міграцію наявних ресурсів до базової версії сховищення для цього API. Оскільки StorageVersionMigration є стандартним Kubernetes API, автори CRD можуть запускати міграції як частину оновлення CRD замість окремого керування міграцією.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4192/&#34;&gt;KEP #4192&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/api-machinery/&#34;&gt;SIG API Machinery&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;pod-certificates-and-clustertrustbundles&#34;&gt;Stable: Сертифікати Podʼів та Cluster Trust Bundles&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pod-certificates-and-clustertrustbundles&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/certificate-signing-requests/#pod-certificate-requests&#34;&gt;Сертифікати Podʼів&lt;/a&gt; та тісно повʼязані &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/certificate-signing-requests/#cluster-trust-bundles&#34;&gt;ClusterTrustBundles&lt;/a&gt; обидва переходять у Stable в Kubernetes v1.37, надаючи першокласну підтримку для розповсюдження приватних ключів, X.509 сертифікатів та пакунків довіри до Podʼів.&lt;/p&gt;
&lt;p&gt;Щоб це використати, розробник або адміністратор обирає імʼя підписувача і розгортає &lt;em&gt;контролер підписувача&lt;/em&gt;, який спостерігає за обʼєктами PodCertificateRequest, видає та оновлює сертифікати для придатних Podʼів і підтримує відповідні обʼєкти ClusterTrustBundles, що містять довірчі точки (trust anchors), необхідні для перевірки цих сертифікатів. Робоче навантаження потім підключається до цієї ідентичності, визначаючи проєкційний том &lt;code&gt;podCertificate&lt;/code&gt; з обраним імʼям підписувача. Робочі навантаження також можуть монтувати проєкційний том ClusterTrustBundle для завантаження інформації про довірчі точки.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина двох KEP — &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4317/&#34;&gt;KEP #4317&lt;/a&gt; та &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/3257/&#34;&gt;KEP #3257&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/auth/&#34;&gt;SIG Auth&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;features-graduating-to-beta&#34;&gt;Функції, що перейшли в Beta&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#features-graduating-to-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;gang-scheduling-support-in-kubernetes&#34;&gt;Підтримка групового планування (Gang scheduling) в Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#gang-scheduling-support-in-kubernetes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Оскільки Kubernetes стає де-факто стандартом для керування AI/ML навантаженнями в масштабі, планування таких робіт, як тренування AI/ML моделей та HPC-симуляції, стає важливішим ніж будь-коли. Однак планування стає викликом, оскільки стандартний планувальник Kubernetes планує Podʼи індивідуально, що може призвести до того, що деякі Podʼи плануються, тоді як інші залишаються у стані очікування через нестачу ресурсів. Таке часткове планування може призвести до взаємних блокувань (deadlock) та неефективного використання ресурсів кластера.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Групове планування (Gang scheduling)&lt;/em&gt; переходить у Beta в Kubernetes v1.37, вдосконалюючи нативну підтримку групового планування через Workload API та концепцію PodGroup. Ця функція реалізує стратегію планування «все або нічого», забезпечуючи, що визначена група Podʼів планується лише тоді, коли кластер має достатньо ресурсів для розміщення всієї групи. Перехід у Beta також вводить планування з урахуванням навантаження (workload-aware preemption), щоб уникнути передчасних витіснень, які не допомагають навантаженню просуватись в роботі, а також чергування PodGroup для кращої координації конкуруючих навантажень.&lt;/p&gt;
&lt;p&gt;Важливо, що це вирішує сценарії активного очікування (livelock), які можуть виникати, коли кілька навантажень плануються одночасно &lt;code&gt;kube-scheduler&lt;/code&gt;ʼом, запобігаючи їхньому взаємному блокуванню без прогресу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4671/&#34;&gt;KEP #4671&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;native-histogram-support-for-kubernetes-metrics&#34;&gt;Нативна підтримка гістограм для метрик Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#native-histogram-support-for-kubernetes-metrics&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes експонує сотні метрик-гістограм у &lt;a href=&#34;https://prometheus.io/docs/instrumenting/exposition_formats/&#34;&gt;форматі Prometheus&lt;/a&gt; у компонентах панелі управління, які є необхідними для моніторингу стану кластера та відстеження проблем продуктивності. Однак класичні гістограми Prometheus покладалися на статичні, заздалегідь визначені кошики (buckets), що змушувало йти на компроміс між точністю даних та використанням памʼяті. Для помʼякшення цього Prometheus представив &lt;em&gt;нативні гістограми&lt;/em&gt;, які використовують динамічні експоненційні межі кошиків замість фіксованих, забезпечуючи значну ефективність зберігання, покращену продуктивність запитів та детальнішу видимість розподілів, зберігаючи при цьому повну зворотну сумісність з наявною інфраструктурою моніторингу.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.37 переводить нативну підтримку гістограм для метрик Kubernetes у бета-версію. Базуючись на реалізації Alpha, яка ввела функціональну можливість &lt;code&gt;NativeHistograms&lt;/code&gt;, фаза Beta покращує реалізацію та досвід розгортання. Коли увімкнено, компоненти Kubernetes експонують гістограми як у класичному, так і в нативному форматах, коли запитуваний протокол скрейпінгу підтримує Нативні Гістограми (зокрема &lt;code&gt;PrometheusProto&lt;/code&gt;), дозволяючи наявним дашбордам та сповіщенням продовжувати працювати, поки користувачі виконують міграцію у власному темпі. Реалізація також переробила гістограми, створені в функціях &lt;code&gt;init()&lt;/code&gt;, для використання лінивої ініціалізації, гарантуючи, що опції нативних гістограм правильно застосовуються після обробки функціональних можливостей. Ці зміни надають більш надійну реалізацію, зберігаючи при цьому безпечні розгортання та відкат через функціональну можливість або конфігурацію на стороні Prometheus для користувачів Prometheus 3.x.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5808/&#34;&gt;KEP #5808&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/instrumentation/&#34;&gt;SIG Instrumentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;was-features-graduating-to-beta&#34;&gt;WAS: Функції, що переходять у Beta&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#was-features-graduating-to-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;workload-aware-preemption&#34;&gt;Витіснення з урахуванням навантаження &lt;a class=&#34;td-heading-self-link&#34; href=&#34;#workload-aware-preemption&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Традиційно Kubernetes виконує витіснення на рівні Podʼів, що може бути неефективним для навантажень, що складаються з кількох тісно повʼязаних Podʼів. У Kubernetes v1.37 витіснення з урахуванням навантаження (workload-aware preemption, WAP) переходить у Beta, дозволяючи планувальнику враховувати PodGroup при прийнятті рішень про витіснення. Це допомагає планувальнику розглядати навантаження як єдину сутність при витісненні навантажень нижчого пріоритету, зменшуючи випадки, коли індивідуальні Podʼи витісняються без забезпечення достатньої потужності для роботи корисного навантаження.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5710/&#34;&gt;KEP #5710&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;dra-resourceclaim-support-for-workloads&#34;&gt;DRA: Підтримка ResourceClaim для навантажень&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-resourceclaim-support-for-workloads&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Dynamic Resource Allocation (DRA) дозволяє Podʼам запитувати спеціалізовані ресурси через ResourceClaims. У Kubernetes v1.37 підтримка DRA ResourceClaims для навантажень переходить у Beta, дозволяючи Workload та PodGroup API асоціювати ResourceClaims та ResourceClaimTemplates з групами Podʼів. Це дозволяє ResourceClaims бути спільними для всього навантаження замість індивідуального резервування для кожного Podʼа, тоді як ResourceClaimTemplates можуть автоматично створювати claims для PodGroup.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5729/&#34;&gt;KEP #5729&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;cadvisor-less-cri-full-stats&#34;&gt;Статистика контейнерів та Podʼів без cAdvisor, повністю через CRI&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cadvisor-less-cri-full-stats&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;kubelet&lt;/code&gt; історично отримував статистику контейнерів та Podʼів з &lt;code&gt;cAdvisor&lt;/code&gt;, тоді як Container Runtime Interface (CRI) експонував власну статистику. Наявність двох джерел для однакових метрик ускладнює розуміння, звідки взялося конкретне значення.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.37 покращення «статистика контейнерів та Podʼів без cAdvisor, повністю через CRI» переходить у Beta. Це покращення розширює CRI для надання статистики контейнерів та Podʼів, необхідної Kubernetes, дозволяючи &lt;code&gt;kubelet&lt;/code&gt; отримувати ці метрики безпосередньо від рушія виконання контейнерів замість залежності від &lt;code&gt;cAdvisor&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Це переміщує метрики контейнерів та Podʼів до єдиного джерела правди, одночасно зменшуючи дублювання збору метрик та спрощуючи те, як &lt;code&gt;kubelet&lt;/code&gt; збирає та виставляє ці статистики.&lt;/p&gt;
&lt;p&gt;Ця функція є Beta у v1.37, але &lt;strong&gt;стандартно вимкнена&lt;/strong&gt;; увімкніть функціональну можливість &lt;code&gt;PodAndContainerStatsFromCRI&lt;/code&gt;, щоб спробувати її.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/2371/&#34;&gt;KEP #2371&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;support-memory-qos-with-cgroups-v2&#34;&gt;Підтримка memory QoS з cgroups v2&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-memory-qos-with-cgroups-v2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes покращує свої механізми якості обслуговування (QoS) для покриття захисту та ізоляції памʼяті для навантажень Kubernetes. Для вузлів, що працюють на Linux, функція &lt;em&gt;memory QoS&lt;/em&gt; використовує запити та ліміти памʼяті для налаштування cgroup-контролів, які можуть захистити запитану памʼять від відновлення (reclamation) та обмежити (throttle) використання памʼяті до досягнення жорстких лімітів навантаженням. Це може допомогти зменшити вплив тиску памʼяті на чутливі до памʼяті навантаження та покращити стабільність вузла.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.37 підтримка memory QoS переходить у Beta. Функція використовує cgroups v2 контролі памʼяті, такі як &lt;code&gt;memory.min&lt;/code&gt;, &lt;code&gt;memory.low&lt;/code&gt; та &lt;code&gt;memory.high&lt;/code&gt;, для надання різних рівнів захисту памʼяті та обмеження. Наприклад, запити памʼяті можуть використовуватися для захисту памʼяті від відновлення, тоді як &lt;code&gt;memory.high&lt;/code&gt; може використовуватися для обмеження навантажень, що перевищують свої налаштовані пороги.&lt;/p&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;MemoryQoS&lt;/code&gt; стандартно увімкнена у v1.37. Оператори кластерів можуть контролювати захист памʼяті через налаштування &lt;code&gt;memoryReservationPolicy&lt;/code&gt; у &lt;code&gt;kubelet&lt;/code&gt; та налаштовувати обмеження памʼяті за допомогою &lt;code&gt;memoryThrottlingFactor&lt;/code&gt;. Типово вони розроблені так, щоб уникнути несподіваного обмеження памʼяті для існуючих навантажень при оновленні до v1.37, одночасно дозволяючи операторам підключитися до додаткових можливостей захисту памʼяті.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/2570/&#34;&gt;KEP #2570&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;pod-level-resource-managers&#34;&gt;Менеджери ресурсів на рівні Podʼів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pod-level-resource-managers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.37 &lt;em&gt;менеджери ресурсів на рівні Podʼів&lt;/em&gt; переходять у Beta з функціональною можливістю &lt;code&gt;PodLevelResourceManagers&lt;/code&gt;, яка &lt;strong&gt;залишається стандартно вимкненою&lt;/strong&gt;. Її увімкнення дозволяє менеджерам топології, CPU та памʼяті використовувати ресурси, визначені для всього Podʼа, при прийнятті рішень про виділення та NUMA-вирівнювання. Це робить можливим керування Podʼом як єдиною одиницею ресурсів, одночасно підтримуючи різні вимоги до ресурсів між контейнерами всередині нього.&lt;/p&gt;
&lt;p&gt;З управлінням ресурсів на рівні Podʼа, Pod може резервувати NUMA-вирівняний пул CPU та памʼяті на основі свого загального ресурсного бюджету. Контейнери, що вимагають виділених ресурсів, можуть отримати ексклюзивні частини цього пулу, тоді як інші контейнери, такі як sidecar або підтримуючі навантаження, можуть спільно використовувати залишкові ресурси. Це особливо корисно для промислових чутливих навантажень, таких як AI/ML та HPC, де зберігання ресурсів близько один до одного на одному NUMA-вузлі може покращити продуктивність без вимоги, щоб кожен контейнер у Podʼі мав виділені ресурси.&lt;/p&gt;
&lt;p&gt;Ця функція також підтримує область дії контейнера, в якій контейнери можуть і надалі отримувати незалежні виділення ресурсів, вирівняні за NUMA. Це забезпечує більшу гнучкість для робочих навантажень, що поєднують контейнер, чутливий до продуктивності, з іншими контейнерами, які мають інші вимоги до ресурсів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5526/&#34;&gt;KEP #5526&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;watch-based-route-controller-reconciliation&#34;&gt;Узгоддження контролера маршрутів на основі watch (Watch-based route controller reconciliation)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#watch-based-route-controller-reconciliation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Контролер маршрутів у бібліотеці cloud-controller-manager раніше виконував узгодження маршрутів за фіксованим інтервалом, типово кожні 10 секунд. Це могло призводити до непотрібних запитів до провайдерів інфраструктури, навіть коли нічого не змінювалося, а також затримувати оновлення маршрутів при додаванні нового вузла.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Узгодження контролера маршрутів на основі watch&lt;/em&gt; перейшло в Beta в Kubernetes v1.37. Цей випуск також додає спостережуваність для цієї роботи: Alpha-метрика контролера маршрутів &lt;code&gt;route_sync_total&lt;/code&gt; отримує дві мітки — &lt;code&gt;trigger&lt;/code&gt; (&lt;code&gt;periodic&lt;/code&gt; або &lt;code&gt;node_change&lt;/code&gt;) та &lt;code&gt;outcome&lt;/code&gt; (&lt;code&gt;changed&lt;/code&gt;, &lt;code&gt;noop&lt;/code&gt; або &lt;code&gt;error&lt;/code&gt;), щоб оператори могли бачити, чи періодична реконсиляція дійсно виправляє дрифт маршрутів або просто працює як no-op, і відстежувати невдалі узгодження.&lt;/p&gt;
&lt;p&gt;З узгодженням на основі watch, контролер маршрутів може узгоджувати маршрути з подій watch замість очікування наступного фіксованого інтервалу: узгодження може розпочатися негайно, коли відбуваються відповідні зміни вузла, такі як додавання або видалення вузла, або коли змінюються його адреси або призначені Pod CIDR. Менш часте періодичне узгодження все ще виконується для виявлення застарілих маршрутів та підтримки узгодженості стану. Ця поведінка знаходиться за функціональною можливістю &lt;code&gt;CloudControllerManagerWatchBasedRoutesReconciliation&lt;/code&gt; і стандартно вимкнена, отже, перехід не змінив типову поведінку.&lt;/p&gt;
&lt;p&gt;Це зменшує непотрібні запити до провайдерів інфраструктури, дозволяючи одночасно швидше узгоджувати маршрути для щойно доданих вузлів. Зміна не змінює логіку узгодження маршрутів саму по собі; вона змінює те, &lt;em&gt;коли&lt;/em&gt; запускається узгодження.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5237/&#34;&gt;KEP #5237&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/cloud-provider/&#34;&gt;SIG Cloud Provider&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;storage-capacity-scoring-of-nodes&#34;&gt;Оцінка ємності сховища вузлів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#storage-capacity-scoring-of-nodes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Втулок планувальника &lt;code&gt;VolumeBinding&lt;/code&gt; завжди міг робити оцінку (scoring) вузлів для статично привʼязаних PV на основі вільної ємності, але ця оцінка ніколи не поширювалася на динамічне провизионування.&lt;/p&gt;
&lt;p&gt;Коли CSI-драйвер провизионує новий том за запитом, планувальник не мав способу віддати перевагу вузлу з більшою або меншою вільною областю.&lt;/p&gt;
&lt;p&gt;Це було прогалиною для локального сховища, оскільки адміністратор міг хотіти, щоб Podʼи потрапляли на вузол з найбільшою вільною ємністю, щоб залишити місце для пізнішого розширення тома, або на вузол з найменшою (але все ще достатньою) вільною ємністю, щоб упакувати навантаження щільніше (bin-pack) і зменшити кількість вузлів, необхідних для роботи хмарного кластера.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.37 переводить оцінювання ємності сховища для динамічного провізіонування у бета-версію за допомогою функціональної можливості &lt;code&gt;StorageCapacityScoring&lt;/code&gt;. Її вперше представили в альфа-версії в v1.33, а ця функція обʼєднує й оголошує застарілою старішу функціональну можливість &lt;code&gt;VolumeCapacityPriority&lt;/code&gt; з &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/1845/&#34;&gt;KEP #1845&lt;/a&gt;. Коли її увімкнено, точка розширення &lt;code&gt;Score&lt;/code&gt; втулка &lt;code&gt;VolumeBinding&lt;/code&gt; зчитує обʼєкти &lt;code&gt;CSIStorageCapacity&lt;/code&gt;, опубліковані зовнішнім sidecar-контейнером провізіонера драйвера, й оцінює вузли для динамічного провізіонування так само, як уже робить для статичних привʼязок. Адміністратори обирають стратегію через параметр &lt;code&gt;Shape&lt;/code&gt; у &lt;code&gt;VolumeBindingArgs&lt;/code&gt; — типово це «надавати перевагу вузлу з максимальною доступною ємністю», щоб залишити простір для подальшого розширення.&lt;/p&gt;
&lt;p&gt;Функція залежить виключно від функціональної можливості &lt;code&gt;StorageCapacityScoring&lt;/code&gt;: оцінка для статично привʼязаних PV запускається одразу при увімкненні, незалежно від будь-якого CSI-драйвера. Драйверу потрібно лише &lt;code&gt;StorageCapacity: true&lt;/code&gt; на своєму обʼєкті &lt;code&gt;CSIDriver&lt;/code&gt;, щоб його динамічно надані томи також отримували оцінку з урахуванням ємності. Функція повністю зворотня, і вимкнення функціональної можливості зупиняє всю оцінку ємності VolumeBinding, як статичну, так і динамічну, без впливу на вже заплановані Podʼи.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4049/&#34;&gt;KEP #4049&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/storage/&#34;&gt;SIG Storage&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;integrate-csi-volume-attach-limits-with-cluster-autoscaler&#34;&gt;Інтеграція CSI лімітів підключення томів з Cluster Autoscaler&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#integrate-csi-volume-attach-limits-with-cluster-autoscaler&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.37 покращено інтеграцію Cluster Autoscaler з обмеженнями підключення томів CSI, завдяки чому під час створення нових вузлів для Podʼів, що очікують на обробку, Cluster Autoscaler може точніше визначити, скільки нових вузлів потрібно для підключення всіх Podʼів, що очікують на обробку та використовують томи CSI. Cluster Autoscaler вже мав доступ до інформації про обмеження підключення томів CSI для наявних вузлів, але не для вузлів, які він збирався створити, що означало: він міг недостатньо масштабувати систему і залишати Podʼи, що використовують томи, у стані очікування навіть після додавання ємності. Проблема ускладнюється з боку планування: втулок &lt;code&gt;NodeVolumeLimits&lt;/code&gt; розглядає вузол без опублікованої інформації про драйвер CSI як такий, що не має жодних обмежень, тому щойно створений вузол, який ще не повідомив про свій об’єкт &lt;code&gt;CSINode&lt;/code&gt;, може бути переповнений більшою кількістю Podʼів, підкріплених томами, ніж він фактично може підключити, що є конкурентною ситуацією, яку дотепер адміністратори кластерів не мали можливості усунути.&lt;/p&gt;
&lt;p&gt;У версії Kubernetes v1.37 функція автоматичного масштабування з підтримкою CSI переходить у стадію бета-тестування з функціональною можливістю &lt;code&gt;VolumeLimitScaling&lt;/code&gt;, яка вперше була представлена у версії v1.35 у стадії альфа-тестування. Cluster autoscaler тепер запускає симуляції масштабування вгору для шаблонних обʼєктів &lt;code&gt;CSINode&lt;/code&gt;, щоб правильно враховувати ліміти підключення, чи то він масштабує наявну групу вузлів, чи створює її з нуля. З боку планувальника, адміністратори можуть підключитися на рівні &lt;code&gt;CSIDriver&lt;/code&gt;, через нове поле &lt;code&gt;PreventPodSchedulingIfMissing&lt;/code&gt;, щоб заблокувати розміщення Podʼів на вузлах, що ще не повідомили свій драйвер, з виділеними помилками &lt;code&gt;CSIDriverMissingOnNode&lt;/code&gt; та &lt;code&gt;CSINodeMissing&lt;/code&gt;, що роблять ці помилки планування легшими для відстеження. Фаза Beta додає наскрізне покриття для поведінки масштабування вниз та сценаріїв CSI opt-in, та оновлює метрики &lt;code&gt;failed_scale_ups_total&lt;/code&gt; та &lt;code&gt;scaled_up_nodes_total&lt;/code&gt;, щоб включати інформацію про CSI-драйвери. Зміни як в автомасштабувачі, так і в планувальнику залишаються суто опціональними: вимкнення функціональної можливості відновлює поточне стандартне значення — необмежене розміщення подів на вузлах без даних &lt;code&gt;CSINode&lt;/code&gt;, тому дистрибутиви та адміністратори, які використовують автомасштабувачі, що ще не підтримують CSI (наприклад, Karpenter), не змушені переходити на нову модель роботи.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5030/&#34;&gt;KEP #5030&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/autoscaling/&#34;&gt;SIG Autoscaling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;report-last-used-time-on-a-pvc&#34;&gt;Звіт про час останнього використання PVC&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#report-last-used-time-on-a-pvc&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;PersistentVolumeClaims&lt;/code&gt; зазвичай живуть довше за навантаження, що їх створили. Коли застосунок видаляється або мігрує, його PVC залишається, споживаючи сховище та збільшуючи витрати. Сьогодні Kubernetes не дає адміністраторам кластерів жодного способу дізнатися, як довго PVC просидів бездіяльно; &lt;code&gt;kubelet&lt;/code&gt; є єдиним компонентом, який дійсно знає, коли том був змонтований останній раз, але немає чогось що не виводить цю інформацію на рівні API, тому адміністратори залишаються вгадувати, які PVC насправді безпечні для очищення.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.37 переводить відстеження «останнього використання» PVC у Beta з функціональною можливістю &lt;code&gt;PersistentVolumeClaimUnusedSinceTime&lt;/code&gt;, яка у Alpha (v1.36) була стандартно вимкнена, а тепер стандартно увімкнена. Функція додає новий стан &lt;code&gt;Unused&lt;/code&gt; до &lt;code&gt;PersistentVolumeClaimStatus&lt;/code&gt;, якою керує наявний контролер захисту PVC: &lt;code&gt;Status=True (Reason=NoPodsUsingPVC)&lt;/code&gt; коли останній нетермінальний Pod, що посилається на PVC, зникає, і назад до &lt;code&gt;Status=False (Reason=PodUsingPVC)&lt;/code&gt; якомога швидше, як тільки Pod починає посилатися на нього знову. &lt;code&gt;lastTransitionTime&lt;/code&gt; цього стану використовується як позначка часу «невикористано з», тому адміністратори можуть запитати, та як довго PVC дійсно просидів бездіяльно, без того, щоб Kubernetes відстежував, який саме Pod використав його останнім, чи приймав будь-які рішення про видалення — це залишається повністю на розсуд адміністратора. Варто зазначити, що позначка часу відображає момент, коли контролер спостерігав відсутність Podʼів, що використовують PVC, а не точний момент розмонтування тома на рівні інфраструктури, тому повідомлений час бездіяльності може бути дещо меншим за справжній, але ніколи не перевищить його.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5541/&#34;&gt;KEP #5541&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/storage/&#34;&gt;SIG Storage&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;etcd-rangestream-support&#34;&gt;Підтримка etcd RangeStream&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#etcd-rangestream-support&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Унарний RPC-виклик &lt;code&gt;Range&lt;/code&gt; в &lt;code&gt;etcd&lt;/code&gt; формує повну відповідь у пам’яті перед її відправкою, що стає проблемою при масштабуванні. У випадку великого списку, наприклад, під час розігріву кешу спостереження kube-apiserver у великому кластері, необроблений фрагмент «ключ-значення», його серіалізована форма protobuf та буфер відправки gRPC мають одночасно співіснувати в пам’яті, а внаслідок цього спалахи навантаження поширюються й на kube-apiserver. Разбиття на сторінки також не вирішує проблему базових витрат, оскільки кожна сторінка все одно проходить весь індекс B-дерева для обчислення загальної кількості результатів, перетворюючи операцію, яка мала б бути &lt;code&gt;O(limit)&lt;/code&gt;, на операцію &lt;code&gt;O(total_keys)&lt;/code&gt; для кожної окремої сторінки.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.37 підтримка &lt;code&gt;etcd&lt;/code&gt; &lt;code&gt;RangeStream&lt;/code&gt; надається безпосередньо у версії Beta, з функціональною можливістю &lt;code&gt;EtcdRangeStream&lt;/code&gt; (лише для &lt;code&gt;kube-apiserver&lt;/code&gt;, стандартно &lt;strong&gt;увімкнено&lt;/strong&gt;). У цьому випуску додано новий RPC-інтерфейс &lt;code&gt;RangeStream&lt;/code&gt; для потокової передачі на сервері, який використовує наявний &lt;code&gt;RangeRequest&lt;/code&gt; але повертає фрагменти замість одного буферованого блоку: сервер внутрішньо розбиває дані на сторінки з адаптивним розміром фрагментів (цільовий розмір кожного фрагмента коригується на основі &lt;code&gt;MaxRequestBytes&lt;/code&gt; та розмірів значень, зафіксованих на даний момент), фіксує одну ревізію MVCC, щоб об’єднаний потік залишався узгодженим зі знімком, та обчислює загальну кількість ключів на основі поточного підрахунку, який формується під час потокової передачі, а не шляхом окремого обходу індексу. Ініціалізація кешу спостереження &lt;code&gt;kube-apiserver&lt;/code&gt; є основним споживачем, і тепер вона декодує кожен фрагмент у синтетичні події &lt;em&gt;created&lt;/em&gt; безпосередньо під час їх надходження, замість того, щоб спочатку збирати повний список у пам’яті; така сама обробка застосовується до прямих викликів &lt;code&gt;GetList&lt;/code&gt;, коли &lt;code&gt;WatchList&lt;/code&gt; вимкнено.&lt;/p&gt;
&lt;p&gt;Ця функція вимагає &lt;code&gt;etcd&lt;/code&gt; версії 3.7 або вище; у разі використання старішої версії &lt;code&gt;etcd&lt;/code&gt;, &lt;code&gt;kube-apiserver&lt;/code&gt; виявляє відповідь Unimplemented і автоматично переходить на унарний &lt;code&gt;Range&lt;/code&gt;, без жодних змін у поведінці. Якщо закріплена ревізія ущільнюється в процесі роботи, &lt;code&gt;kube-apiserver&lt;/code&gt; трактує це так само, як і будь-яку іншу помилку ініціалізації кешу спостереження, і робить повторну спробу, що не гірше, ніж гонитви за ущільнення, з якими вже сьогодні може зіткнутися виклик &lt;code&gt;List&lt;/code&gt; з розбиттям на сторінки. Критерії виходу з бета-версії включають тест на масштабованість, що вимірює затримку при роботі з великими списками на кластері з 5000 вузлів, а команда &lt;code&gt;etcdctl get --stream&lt;/code&gt; поставляється разом із нею для тих, хто хоче безпосередньо протестувати новий RPC.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5966/&#34;&gt;KEP #5966&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/etcd/&#34;&gt;SIG etcd&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;concurrent-watch-object-decode&#34;&gt;Конкурентне декодування обʼєктів watch&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#concurrent-watch-object-decode&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;kube-apiserver&lt;/code&gt; декодує та перетворює кожну подію спостереження з &lt;code&gt;etcd&lt;/code&gt; по черзі в одній goroutine, тому одне повільне перетворення на подію, зокрема виклик вебхука для конвертації CRD, блокує всі події, що стоять у черзі за ним. Це здебільшого створює незручності для вбудованих ресурсів, але для CRD, версія якого в сервісі відрізняється від збереженої, послідовне перетворення «холодного» кешу може займати кілька хвилин. Якщо це перевищує стандартний 5-хвилинний інтервал ущільнення &lt;code&gt;etcd&lt;/code&gt;, ревізія, з якої кеш почав читати, ущільнюється до завершення ініціалізації, спостереження не може поновитися, а ініціалізація просто перезапускається і ніколи не завершується для достатньо великого ресурсу, при цьому кожен клієнт, який намагається перелічити або спостерігати за ним, отримує помилки.&lt;/p&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;ConcurrentWatchObjectDecode&lt;/code&gt; фактично була у Beta, стандартно вимкнена, з v1.31, і Kubernetes v1.37 стандартно увімкнув її. Це увімкнення переміщує крок декодування/трансформації на обмежений пул робітничих goroutines (10 типово, налаштовано з перебору, що показав, що вигоди отримуються навколо 8–12) замість однієї, з колектором, що збирає події назад у їхній оригінальний порядок перед доставкою, тому порядок подій зберігається точно. У бенчмарках на 150k+ podʼах, лише паралельне декодування скорочує ініціалізацію кешу приблизно на 40%, а приблизно на 55% в поєднанні з новою функцією &lt;code&gt;EtcdRangeStream&lt;/code&gt;, що також виходить в цьому випуску (див. KEP 5966). Головний компроміс, за яким варто слідкувати — навантаження на conversion webhook. З увімкненою функцією, до 10 конвертацій тепер можуть одночасно виконуватися для webhookʼа під час ініціалізації кешу замість однієї за раз. Загальний обсяг викликів не змінюється, лише кількість, що виконуються одночасно, отже це переважно стосується webhookʼів, які обмежують власну конкурентність нижче 10.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6178/&#34;&gt;KEP #6178&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/api-machinery/&#34;&gt;SIG API Machinery&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;stale-controller-mitigation&#34;&gt;Заходи щодо усунення наслідків використання застарілого контролера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#stale-controller-mitigation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Кожен контролер у &lt;code&gt;kube-controller-manager&lt;/code&gt; працює з локального кешу, побудованого шляхом спостереження за &lt;code&gt;kube-apiserver&lt;/code&gt;, а цей watch-потік є лише зрештою консистентним. Зміна може зʼявитися за мілісекунди, або це може зайняти секунди чи навіть хвилини під навантаженням. Наразі оператори не мають уявлення про це відставання і не можуть відрізнити нормальну затримку від ситуації, коли контролер небезпечно втратив синхронізацію, тому контролер може продовжувати узгоджувати свої дані з уявленням про стан системи, яке вже є застарілим.&lt;/p&gt;
&lt;p&gt;Заходи щодо мінімізації ризиків, пов’язаних із застарілими контролерами, перебувають у стадії бета-тестування з версії v1.36 і є стандартними для кожного контролера за функціональною можливісьтю &lt;code&gt;StaleControllerConsistency&amp;lt;Controller&amp;gt;&lt;/code&gt;; у Kubernetes v1.37 ці заходи поширено на контролер HorizontalPodAutoscaler та додано варіант із механізмом відключення (circuit-breaking) і додаткові метрики, описані нижче. Основний механізм — це гарантія &lt;em&gt;read your writes&lt;/em&gt;: &lt;code&gt;ResourceEventHandlerFuncs&lt;/code&gt; у client-go отримує новий callback &lt;code&gt;BookmarkFunc&lt;/code&gt;, щоб контролер міг надійно відстежувати версію ресурсу обʼєктів, які йому цікаві, навіть через крайні випадки, які наявні callbackʼи add/update/delete пропускають. Контролер записує версію ресурсу власних записів і, при наступному узгодженні, пропускає та повторно ставить у чергу, доки його інформер-кеш дійсно не наздогнав цей запис. Контролер DaemonSet — хороший приклад цього. Він відстежує версії ресурсів DaemonSet → Pod, щоб не переузгоджувати проти власного застарілого pod-кешу. Другий, circuit-breaking варіант націлений на контролери, чутливі до затримок, на кшталт node-lifecycle, які інакше могли б прочитати застарілий node lease з кешу і помилково вирішити, що він закінчився; замість цього він робить живий GET на руйнівному рішенні і позначає свій кеш як «not ready», доки він не догонить його, замість того щоб діяти на основі застарілого читання. &lt;code&gt;StaleControllerConsistency&lt;/code&gt; контролює саму процедуру пом’якшення наслідків (спочатку застосовується до контролерів, які KCM позначив як великомасштабні), &lt;code&gt;MonitorInformerStaleness&lt;/code&gt; — це окремий контрольний механізм, призначений лише для спостереження, який кожні 5 секунд безпосередньо опитує apiserver виключно для того, щоб виявити, наскільки насправді відстає кеш інформера, а &lt;code&gt;AtomicFIFO&lt;/code&gt; / &lt;code&gt;UnlockWhileProcessingFIFO&lt;/code&gt; — це базові механізми черги завдань client-go, від яких залежить робота механізму помʼякшення наслідків. Ніщо з цього не змінює стандартну поведінку узгоджувача; контролер, який було призупинено та знову поставлено в чергу, може здаватися застряглим, хоча насправді він просто чекає на свій кеш, і він коректно відкочується, оскільки жодна його дія не є незворотною.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5647/&#34;&gt;KEP #5647&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/api-machinery/&#34;&gt;SIG API Machinery&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;manifest-based-admission-control-config&#34;&gt;Конфігурація контролю допуску на основі маніфесту&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#manifest-based-admission-control-config&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes контроль допуску відповідає за забезпечення дотримання політик щодо ресурсів до того, як вони будуть прийняті сервером API. Однак вебхуки та політики допуску, налаштовані через API Kubernetes, під час запуску кластера залежать від сервера API та etcd і не можуть захистити самі ресурси конфігурації допуску. Це створює вразливість під час початкового запуску кластера та дозволяє користувачам із достатніми привілеями змінювати або видаляти критично важливі політики допуску.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.37 конфігурація &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/manifest-admission-control/&#34;&gt;контролю доступу на основі маніфестів&lt;/a&gt; перейшла у стадію бета-тестування, що дозволяє завантажувати вебхуки доступу та політики на основі CEL із файлів маніфестів на диску та застосовувати їх із моменту запуску сервера API. Оскільки ця конфігурація управляється незалежно від API Kubernetes, вона також може захищати ресурси контролю доступу на основі API від модифікацій. Файли маніфестів відстежуються на наявність змін, і дійсні оновлення перезавантажуються автоматично, тоді як недійсні оновлення залишають попередньо завантажену конфігурацію без змін.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5793/&#34;&gt;KEP #5793&lt;/a&gt; під керівництвом  &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/api-machinery/&#34;&gt;SIG API Machinery&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;improved-handling-for-undecryptable-resources&#34;&gt;Покращена обробка нерозшифровуваних ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#improved-handling-for-undecryptable-resources&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes зберігає ресурси в etcd, де шифрування в стані спокою може бути використане для захисту чутливих даних. Однак, коли зашифровані ресурси більше не можуть бути розшифровані, наприклад, тому що ключ шифрування недоступний, API-сервер не може читати або керувати цими ресурсами нормально. Це може залишити ресурси в кластері, до яких неможливо отримати доступ через Kubernetes API, вимагаючи від адміністраторів вручну модифікувати базові дані etcd для відновлення.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.37 включає Beta підтримку для адміністраторів кластерів для ідентифікації та видалення ресурсів, які не можуть бути розшифровані API-сервером.&lt;/p&gt;
&lt;p&gt;Раніше Alpha, і введена в Kubernetes v1.32, ця підтримка дозволяє видаляти проблемні API-ресурси через Kubernetes API замість безпосереднього маніпулювання файлом etcd. Ця функція також надає засоби безпеки для адміністраторів для перевірки задіяних ресурсів перед видаленням.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/3926/&#34;&gt;KEP #3926&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/auth/&#34;&gt;SIG Auth&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-alpha&#34;&gt;Нові функції в Alpha&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#new-features-in-alpha&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;new-recreate-strategy-for-statefulset-rollouts&#34;&gt;Нова стратегія &lt;code&gt;Recreate&lt;/code&gt; для розгортання StatefulSet&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#new-recreate-strategy-for-statefulset-rollouts&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.37 вводить стратегію &lt;code&gt;Recreate&lt;/code&gt; для розгортання StatefulSet. StatefulSet API раніше пропонував лише дві стратегії оновлення: OnDelete (ручна) та RollingUpdate (автоматична, типово). Схоже на Deployments, стратегія оновлення &lt;code&gt;Recreate&lt;/code&gt; видаляє всі Podʼи StatefulSet перед створенням нових Podʼів, що відображають модифікації, зроблені до &lt;code&gt;.spec.template&lt;/code&gt; StatefulSet. Використання цієї стратегії вимагає увімкнення функціональної можливості &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/feature-gates/#StatefulSetRecreateStrategy&#34;&gt;&lt;code&gt;StatefulSetRecreateStrategy&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/3541/&#34;&gt;KEP #3541&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/apps/&#34;&gt;SIG Apps&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;dra-alpha-features-to-look-out-for&#34;&gt;DRA: Alpha функції, на які варто звернути увагу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-alpha-features-to-look-out-for&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;dra-node-allocatable-resource-request&#34;&gt;DRA: Запит на ресурси, що розподіляються вузлом&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-node-allocatable-resource-request&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Kubernetes v1.37 покращує Alpha підтримку керування ресурсами вузла, такими як CPU, памʼять та huge pages, через DRA. Це обʼєднує стандартний та DRA облік ресурсів, допомагаючи запобігти подвійному рахуванню однієї й тієї ж можливості вузла.&lt;/p&gt;
&lt;p&gt;Це оновлення вводить окремі API-поля для &lt;code&gt;mapping&lt;/code&gt; (для пристроїв, що безпосередньо моделюють основні ресурси, на кшталт CPU/памʼяті DRA драйверів) та &lt;code&gt;overhead&lt;/code&gt; (як допоміжна хост-памʼять для пристроїв прискорення). Kubelet тепер примушує ці виділення між pod та container cgroups, інтегрує їх з Memory QoS, розрахунками OOM score та in-place зміною розміру podʼа.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5517/&#34;&gt;KEP #5517&lt;/a&gt;, під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt; з участю &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;dra-derived-attributes&#34;&gt;DRA: Похідні атрибути&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-derived-attributes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Kubernetes v1.37 вводить Alpha підтримку &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/concepts/resource-management/dynamic-resource-allocation/dra-api/#derived-attributes&#34;&gt;похідних атрибутів у DRA&lt;/a&gt;. Навантаження можуть використовувати CEL-вирази для створення віртуальних атрибутів з інформації про пристрої та використання їх при виборі повʼязаних пристроїв.&lt;/p&gt;
&lt;p&gt;Це полегшує ко-локацію пристроїв, таких як GPU та мережеві інтерфейси, навіть коли їх драйвери використовують різні імена атрибутів або формати. Наприклад, навантаження може вивести спільний NUMA ідентифікатор і використати його для вибору пристроїв з відповідною топологією.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6080/&#34;&gt;KEP #6080&lt;/a&gt;, під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt; з участю &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/network/&#34;&gt;SIG Network&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;dra-device-compatibility-groups&#34;&gt;DRA: Групи сумісності пристроїв&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-device-compatibility-groups&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;DRA можна використовувати для управління пристроями, що підтримують різні схеми розділення або віртуалізації. Однак деякі з цих конфігурацій не можна використовувати одночасно на одному фізичному пристрої, наприклад MIG і vGPU на графічному процесорі. Раніше ці несумісності можна було виявити лише під час підготовки пристрою, після того як планувальник уже прийняв своє рішення.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.37 DRA додає групи сумісності пристроїв, дозволяючи драйверам ресурсів описувати, які пристрої можуть бути виділені разом. Планувальник може використовувати цю інформацію при прийнятті рішень про виділення, запобігаючи призначенню некомплектних пристроїв разом і уникаючи помилок запуску Podʼів, спричинених некомплектними конфігураціями пристроїв.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5963/&#34;&gt;KEP #5963&lt;/a&gt;, під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;scheduler-preemption-in-place-pod-resize&#34;&gt;Витіснення планувальником для in-place зміни розміру Podʼа&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#scheduler-preemption-in-place-pod-resize&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.37 вводить &lt;em&gt;витіснення планувальником для in-place зміни розміру podʼа&lt;/em&gt;, за (opt-in, Alpha) функціональною можливістю &lt;code&gt;InPlacePodVerticalScalingSchedulerPreemption&lt;/code&gt;. Ця зміна вирішує важливу прогалину функціоналу, що залишилася після того, як основна функція &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/pod-lifecycle/#pod-resize-inplace&#34;&gt;вертикального масштабування Podʼа на місці&lt;/a&gt; перейшла в Stable: якщо запущений pod запитував додаткові ресурси, що перевищували доступну ємність вузла, &lt;code&gt;kubelet&lt;/code&gt; позначав запит як &lt;code&gt;Deferred&lt;/code&gt;, залишаючи pod очікувати, поки достатньо ресурсів не стане доступними на вузлі. Завдяки цьому вдосконаленню панель управління Kubernetes може активно звільняти ємність на повністю завантаженому вузлі та витісняти навантаження з нижчим пріоритетом, дозволяючи відкладеним in-place запитам на зміну розміру критичних застосунків з вищим пріоритетом успішно завершитися.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5836/&#34;&gt;KEP #5836&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;dynamic-resize-of-memory-backed-volumes&#34;&gt;Динамічна зміна розміру memory-backed томів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dynamic-resize-of-memory-backed-volumes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Також спираючись на вертикальне масштабування Podʼів «на місці», функція Alpha &lt;em&gt;масштабування на місці для томів, що підтримуються памʼяттю&lt;/em&gt; розширює субресурс pod &lt;code&gt;/resize&lt;/code&gt;, який раніше дозволяв лише динамічне регулювання CPU та памʼяті без перезапуску контейнерів, щоб підтримати оновлення параметра &lt;code&gt;sizeLimit&lt;/code&gt; томів &lt;code&gt;emptyDir&lt;/code&gt;, що підтримуються памʼяттю (medium: Memory), у запущених Podʼах. Коли параметр &lt;code&gt;sizeLimit&lt;/code&gt; тома явно регулюється за допомогою субресурсу /resize, Kubelet динамічно оновлює базове монтування tmpfs без переривання роботи контейнера, одночасно надійно запобігаючи помилкам нестачі памʼяті або помилковим спрацьовуванням механізмів витіснення. Це особливо корисно для робочих навантажень із збереженням стану та з інтенсивним використанням памʼяті, які покладаються на тимчасове зберігання даних у памʼяті, що дозволяє їм динамічно масштабувати межі зберігання разом із об’ємом пам’яті контейнера без перезапуску подів або простоїв застосунків.&lt;/p&gt;
&lt;p&gt;Це альфа-функція, яка вмикається за бажанням користувача і зазвичай вимкнена. Щоб спробувати її, увімкніть функціональну можливість &lt;code&gt;InPlacePodVerticalScalingMemoryBackedVolumes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6030/&#34;&gt;KEP #6030&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt; та &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/storage/&#34;&gt;SIG Storage&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;specialized-lifecycle-management-for-nodes&#34;&gt;Спеціалізоване управління життєвим циклом вузлів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#specialized-lifecycle-management-for-nodes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Декілька компонентів Kubernetes потребують інформації про стан життєвого циклу вузла, і на сьогодні кожен із них визначає його на основі різного поєднання готовності вузла, позначок taint, стану Pod, міток, анотацій та API-інтерфейсів провайдерів. Це вдосконалення запроваджує загальновизнані умови життєвого циклу для вузлів, надаючи адміністраторам єдине місце в Kubernetes для публікації стану життєвого циклу, яке можуть використовувати основні контролери та інструменти екосистеми. Ці нові умови вузлів (Node Conditions) такі: &lt;code&gt;DrainInProgress&lt;/code&gt;, &lt;code&gt;Drained&lt;/code&gt;, &lt;code&gt;MaintenancePlanned&lt;/code&gt;, &lt;code&gt;MaintenanceInProgress&lt;/code&gt; та &lt;code&gt;GracefulNodeShutdownInProgress&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5683/&#34;&gt;KEP #5683&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/node/&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;was-alpha-features-to-look-out-for&#34;&gt;WAS: Alpha функції, на які варто звернути увагу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#was-alpha-features-to-look-out-for&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&#34;compositepodgroup-api&#34;&gt;CompositePodGroup API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#compositepodgroup-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Попередні випуски вводили підтримку групового планування навантажень з плоскою структурою, сучасні AI/ML навантаження є складними і мають більш витончені вимоги до планування. У Kubernetes v1.37 новий Alpha &lt;code&gt;CompositePodGroup&lt;/code&gt; API дозволяє Kubernetes описувати складні навантаження як ієрархію груп замість плаского набору Podʼів. Це дозволяє багаторівневе групове планування, workload-aware preemption та topology-aware планування.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6012/&#34;&gt;KEP #6012&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;workload-aware-scheduling-controller-apis&#34;&gt;API контролера планування з урахуванням навантаження&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#workload-aware-scheduling-controller-apis&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Як Alpha функція, в Kubernetes v1.37 надається спільний фреймворк для інтеграції контролерів навантажень (таких як JobSet, TrainJob, LWS, та RayJob, поряд з основними навантаженнями, такими як &lt;code&gt;Job&lt;/code&gt;) з &lt;em&gt;Workload-aware Scheduling&lt;/em&gt; (WAS). Які функція альфа-версії, Kubernetes v1.37 надає загальну платформу для інтеграції контролерів робочих навантажень (таких як JobSet, TrainJob, LWS та RayJob, а також основних робочих навантажень, таких як &lt;code&gt;Job&lt;/code&gt;) із &lt;em&gt;плануванням з урахуванням робочих навантажень&lt;/em&gt; (WAS).&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6089/&#34;&gt;KEP #6089&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;workload-apis-job-controller&#34;&gt;Інтеграція Workload API з Job контролером&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#workload-apis-job-controller&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Спочатку введена в Kubernetes v1.36 з обмеженим функціоналом, ця функція будує на &lt;a href=&#34;#workload-aware-scheduling-controller-apis&#34;&gt;Workload Aware Scheduling Controller APIs&lt;/a&gt;, додаючи нове поле &lt;code&gt;spec.scheduling&lt;/code&gt; для користувача до &lt;code&gt;batch/v1&lt;/code&gt; Job у Kubernetes v1.37, дозволяючи користувачам явно конфігурувати політики планування, обмеження топології, режими розладів (disruption modes) та resource claims. Якщо &lt;code&gt;spec.scheduling&lt;/code&gt; виключено, Job типово використовує Basic планування, зберігаючи наявну поведінку, при цьому створюючи Basic Workload/PodGroup для workload-aware планування, без використання minCount gate. Користувачі можуть явно використовувати (opt in) Gang планування, де &lt;code&gt;minCount&lt;/code&gt; типово дорівнює паралелізму Jobʼа, а контролер використовує спільну бібліотеку &lt;code&gt;workloadbuilder&lt;/code&gt; для перекладу конфігурації планування у відповідні обʼєкти Workload та PodGroup замість реалізації власної логіки перекладу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5547/&#34;&gt;KEP #5547&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/scheduling/&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;localhost-nodeport-userspace-proxy-for-nftables&#34;&gt;Проксі користувацького простору (userspace) для &lt;code&gt;localhost&lt;/code&gt; NodePort для &lt;code&gt;nftables&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#localhost-nodeport-userspace-proxy-for-nftables&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.37 додає opt-in userspace проксі до &lt;code&gt;nftables&lt;/code&gt; бекенду &lt;code&gt;kube-proxy&lt;/code&gt;, дозволяючи NodePort сервісам бути доступними через &lt;code&gt;localhost&lt;/code&gt; поверх IPv4 та IPv6. Це закриває прогалину між &lt;code&gt;nftables&lt;/code&gt; та &lt;code&gt;iptables&lt;/code&gt; бекендами, оскільки &lt;code&gt;nftables&lt;/code&gt; раніше не міг обслуговувати localhost NodePortʼи.&lt;/p&gt;
&lt;p&gt;Проксі увімкнено, коли &lt;code&gt;localhost&lt;/code&gt; або loopback-адреса включена в конфігурацію &lt;code&gt;--nodeport-addresses&lt;/code&gt; &lt;code&gt;kube-proxy&lt;/code&gt;. Це може бути корисним для навантажень, таких як локальні контейнерні реєстрі, що покладаються на зʼєднання &lt;code&gt;localhost:&amp;lt;NodePort&amp;gt;&lt;/code&gt;. Наявна поведінка &lt;code&gt;iptables&lt;/code&gt; та &lt;code&gt;ipvs&lt;/code&gt; бекендів незмінна.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана як частина &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6032/&#34;&gt;KEP #6032&lt;/a&gt; під керівництвом &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/network/&#34;&gt;SIG Network&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;other-notable-changes&#34;&gt;Інші значущі зміни&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#other-notable-changes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;maxunavailable-for-statefulsets-back-on-by-default&#34;&gt;&lt;code&gt;maxUnavailable&lt;/code&gt; для StatefulSets знову стандартно увімкнено&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#maxunavailable-for-statefulsets-back-on-by-default&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Поле &lt;code&gt;maxUnavailable&lt;/code&gt; для StatefulSets було знову стандартно увімкнено у Kubernetes v1.37 (після того, як баг був виявлений у v1.36).&lt;/p&gt;
&lt;p&gt;Баг виникав, коли несправна початкова ревізія StatefulSet створювала Pod, який ніколи не ставав ready, і з увімкненим &lt;code&gt;MaxUnavailableStatefulSet&lt;/code&gt;, контролер StatefulSet не міг оновити той Pod до новій, виправленій ревізії. Коли баг спрацьовував, зазначений Pod міг застрягти в стані CrashLoopBackOff безкінечно (див. &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/137409&#34;&gt;kubernetes#137409&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&#34;improved-nftables-performance&#34;&gt;Покращена продуктивність &lt;code&gt;nftables&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#improved-nftables-performance&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;kube-proxy тепер використовує kernel netlink інтерфейс для операцій з правилами nftables, обходячи утиліту командного рядка &lt;code&gt;nft&lt;/code&gt;. Це робить kube-proxy ефективнішим при перевірці та управлінні правилами nftables, покращуючи продуктивність управління правилами.&lt;/p&gt;
&lt;h3 id=&#34;context-handling-and-contextual-logging-in-client-go&#34;&gt;Обробка контексту та контекстне логування в client-go&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#context-handling-and-contextual-logging-in-client-go&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Підтримка розповсюдження контексту та контекстного логування в client-go завершена, за винятком невеликої кількості викликів логування втулків автентифікації, які все ще покладаються на глобальний klog логер, бо базові API не підтримують передачу контексту.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-v1-37&#34;&gt;Зміна статусу, застарілі та видалені функції у v1.37&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#graduations-deprecations-and-removals-in-v1-37&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Переходи в Stable&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#graduations-to-stable&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Цей розділ перераховує всі функції, що перейшли в Stable (також відомі як загальна доступність). Для повного списку оновлень, включаючи нові функції та переходи з Alpha в Beta, дивіться примітки до випуску.&lt;/p&gt;
&lt;p&gt;Цей випуск включає загалом 16 вдосконалень, переведених у Stable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/1710/&#34;&gt;Прискорення рекурсивної зміни міток SELinux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/3257/&#34;&gt;ClusterTrustBundles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4317/&#34;&gt;Сертифікати Podʼів&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4762/&#34;&gt;Дозволити встановлення довільного FQDN як hostname podʼа&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4817/&#34;&gt;DRA: Статус Resource Claim з можливими стандартизованими даними мережевого інтерфейсу&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4951/&#34;&gt;Налаштована толерантність для HorizontalPodAutoscalers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5311/&#34;&gt;Спрощена валідація для імен Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4680/&#34;&gt;Додавання Resource Health Status до Pod Status для Device Plugin та DRA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5055/&#34;&gt;DRA: taint та toleration пристроїв&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5004/&#34;&gt;DRA: Обробка запитів розширених ресурсів через DRA Driver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5328/&#34;&gt;Функції, оголошені вузлом&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/3085/&#34;&gt;Додавання станів для створення sandboxʼу&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4192/&#34;&gt;Переміщення Storage Version Migrator in-tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4568/&#34;&gt;Стійка ініціалізація Watchcache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/6072/&#34;&gt;DRA: Стандартний атрибут пристрою numaNode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5207/&#34;&gt;Визначення API metrics.k8s.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5295/&#34;&gt;KYAML&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;deprecations-removals-and-community-updates&#34;&gt;Застарілі функції, видалення та оновлення від спільноти&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecations-removals-and-community-updates&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У міру розвитку та вдосконалення Kubernetes окремі функції можуть бути визнані застарілими, видалені або замінені кращими з метою забезпечення загального стабільного функціонування проєкту. Деталі цього процесу дивіться в &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політиці застарівання та видалення Kubernetes&lt;/a&gt;. Багато з цих застарівань та видалень були оголошені в &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/07/31/kubernetes-v1-37-sneak-peek/&#34;&gt;блозі про застарівання та видалення&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;deprecation-of-kube-dns&#34;&gt;Застарівання &lt;code&gt;kube-dns&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecation-of-kube-dns&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;CoreDNS є стандартною надбудовою для кластерного DNS, починаючи з версії Kubernetes v1.113, і з того часу &lt;code&gt;kube-dns&lt;/code&gt; не встигає за ним; такі функції, як EndpointSlices та сервіси з подвійним стеком, у ньому недоступні.&lt;/p&gt;
&lt;p&gt;Kubernetes вже вивів kube-dns субпроєкт і виділив node-local-dns в окремий &lt;a href=&#34;https://github.com/kubernetes-sigs/node-local-dns&#34;&gt;репозиторій&lt;/a&gt;, де він продовжує підтримуватися і працює з CoreDNS. Очікується, що нові пакети для kube-dns не будуть збиратися після v1.40.&lt;/p&gt;
&lt;p&gt;Якщо ви все ще використовуєте &lt;code&gt;kube-dns&lt;/code&gt;, &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/coredns/&#34;&gt;почніть планувати міграцію ваших кластерів на CoreDNS&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;deprecating-kube-proxy-s-support-for-ipvs-mode&#34;&gt;Припинення підтримки режиму &lt;code&gt;ipvs&lt;/code&gt; у &lt;code&gt;kube-proxy&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecating-kube-proxy-s-support-for-ipvs-mode&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Підтримка режиму &lt;code&gt;ipvs&lt;/code&gt; в &lt;code&gt;kube-proxy&lt;/code&gt; була введена в v1.8 для вирішення вузьких місць продуктивності &lt;code&gt;iptables&lt;/code&gt;. Однак, оскільки kernel &lt;code&gt;ipvs&lt;/code&gt; API самостійно не може повністю реалізувати Kubernetes Services, режим &lt;code&gt;ipvs&lt;/code&gt; продовжує використовувати &lt;code&gt;iptables&lt;/code&gt; під капотом (&lt;a href=&#34;https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/3866-nftables-proxy/README.md#the-ipvs-mode-of-kube-proxy-will-not-save-us&#34;&gt;KEP-3866, &amp;quot;The ipvs mode of kube-proxy will not save us&amp;quot;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Кластери, що запускають &lt;code&gt;kube-proxy&lt;/code&gt; в режимі &lt;code&gt;ipvs&lt;/code&gt; (або mode: &lt;code&gt;ipvs&lt;/code&gt; в KubeProxyConfiguration), тепер логують попередження про застарівання при запуску. Графік застарівання виглядає так:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;До v1.40, режим &lt;code&gt;ipvs&lt;/code&gt; для &lt;code&gt;kube-proxy&lt;/code&gt; очікується стандартно вимкненим (його все ще можна вибірково включати через функціональну можливість)&lt;/li&gt;
&lt;li&gt;До v1.43, підтримка режиму &lt;code&gt;ipvs&lt;/code&gt; буде видалена повністю &lt;a href=&#34;https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/5495-deprecate-ipvs-mode-in-kube-proxy/README.md#graduation-criteria&#34;&gt;KEP #5495, Graduation Criteria&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl -n kube-system get configmap kube-proxy -o &lt;span class=&#34;nv&#34;&gt;jsonpath&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ʼ&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;.data.config&lt;span class=&#34;se&#34;&gt;\.&lt;/span&gt;conf&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;ʼ &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep ʼmode:ʼ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Щоб зрозуміти обґрунтування цього застарівання, дивіться &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5495/&#34;&gt;KEP #5495&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kubectl-kubectl-run-filename-f-to-be-deprecated&#34;&gt;&lt;code&gt;kubectl&lt;/code&gt;: прапорець &lt;code&gt;kubectl run --filename/-f&lt;/code&gt; застаріває&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#kubectl-kubectl-run-filename-f-to-be-deprecated&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Прапорець &lt;code&gt;--filename&lt;/code&gt; (або &lt;code&gt;-f&lt;/code&gt;) для &lt;code&gt;kubectl run&lt;/code&gt; оголошується застарілим, оскільки генерований pod завжди будується виключно з CLI аргументів на кшталт &lt;code&gt;NAME&lt;/code&gt; та &lt;code&gt;--image&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Дивіться &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/138671&#34;&gt;kubernetes/kubernetes#138671&lt;/a&gt; для оригінального issue та обговорення.&lt;/p&gt;
&lt;h3 id=&#34;kubelet-static-pods-can-no-longer-reference-secrets-or-configmaps&#34;&gt;&lt;code&gt;kubelet&lt;/code&gt;: статичні Podʼи більше не можуть посилатися на Secrets або ConfigMaps&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#kubelet-static-pods-can-no-longer-reference-secrets-or-configmaps&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Статичні Podʼи ніколи не призначалися для читання API-ресурсів безпосередньо, оскільки вони не створюються через API-сервер — але баг дозволяв їм посилатися на Secrets або ConfigMaps через поля на кшталт &lt;code&gt;configMapRef&lt;/code&gt; або &lt;code&gt;secretRef&lt;/code&gt;. Цей баг тепер виправлений: починаючи з v1.37 ці посилання суворо заборонені, а функціональна можливість &lt;code&gt;PreventStaticPodAPIReferences&lt;/code&gt;, що раніше дозволяв відмовитися від обмеження, був видалений.&lt;/p&gt;
&lt;p&gt;Дивіться &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/140226&#34;&gt;kubernetes/kubernetes#140226&lt;/a&gt; для оригінального issue та обговорення.&lt;/p&gt;
&lt;h3 id=&#34;ongoing-major-change-future-removal-of-cgroup-v1-support&#34;&gt;Поточна велика зміна: майбутнє видалення підтримки cgroup v1&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ongoing-major-change-future-removal-of-cgroup-v1-support&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Оскільки сучасні Linux дистрибутиви та рушії виконання контейнерів стандартно використовують &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/cgroups/&#34;&gt;cgroup v2&lt;/a&gt;, підтримка застарілих cgroup v1 офіційно виводиться з експлуатації. З випуску v1.35 налаштування &lt;code&gt;failCgroupV1&lt;/code&gt; типово дорівнює true. Отже, &lt;code&gt;kubelet&lt;/code&gt; не зможе ініціалізуватися на будь-яких вузлах, що все ще покладаються на cgroup v1, якщо не застосовано явний перевизначення конфігурації.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kubelet.config.k8s.io/v1beta1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;KubeletConfiguration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;failCgroupV1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# тимчасове перевизначення&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Використання цього перевизначення слід розглядати як короткострокове виправлення. Розширені можливості керування ресурсами, такі як memory QoS та in-place масштабування для memory-backed томів, працюють лише на cgroups v2. Хоча перевизначення залишається доступним у Kubernetes v1.37, користувачів заохочують мігрувати на cgroups v2, оскільки підтримка cgroups v1 планується бути видаленою у майбутньому випуску.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше про це застарівання, зверніться до &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5573/&#34;&gt;KEP #5573&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;release-notes&#34;&gt;Примітки до випуску&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#release-notes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Перегляньте повні деталі релізу Kubernetes v1.37 в наших &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.37.md&#34;&gt;примітках до випуску&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;availability&#34;&gt;Доступність&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#availability&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/releases/1.37/&#34;&gt;Kubernetes v1.37&lt;/a&gt; доступний для завантаження з &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/releases/download/&#34;&gt;сторінки завантаження Kubernetes&lt;/a&gt; або безпосередньо з &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.37.0&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щоб розпочати роботу з Kubernetes, перегляньте &lt;a href=&#34;https://deploy-preview-59083--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.37 за допомогою &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/setup/independent/create-cluster-kubeadm/&#34;&gt;kubeadm&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;release-team&#34;&gt;Команда випуску&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#release-team&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes можливий лише завдяки підтримці, відданості та важкій роботі своєї спільноти. Кожна команда випуску складається з відданих волонтерів спільноти, які працюють разом, щоб створити багато частин, що складають Kubernetes релізи, на які ви покладаєтеся.&lt;/p&gt;
&lt;p&gt;Це вимагає спеціалізованих навичок людей з усіх куточків нашої спільноти, від самого коду до його документації та управління проєктом.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати всій &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.37/release-team.md&#34;&gt;команді, що працювала над випуском&lt;/a&gt; за години наполегливої праці, завдяки яким випуск Kubernetes v1.37 став доступним для нашої спільноти.&lt;/p&gt;
&lt;p&gt;До складу команди з випуску входять як новачки, які вперше беруть участь у проєкті, так і досвідчені керівники команд, які вже брали участь у кількох циклах випуску.&lt;/p&gt;
&lt;p&gt;Особлива подяка нашому керівнику випуску, &lt;a href=&#34;https://github.com/dipesh-rawat&#34;&gt;Діпешу Равату&lt;/a&gt;, за підтримку
протягом успішного циклу випуску, за те, що він відстоював наші інтереси, дбав про те, щоб ми всі могли зробити свій внесок якнайкраще, та
спонукав нас вдосконалювати процес випуску.&lt;/p&gt;
&lt;h3 id=&#34;project-velocity&#34;&gt;Швидкість проєкту&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#project-velocity&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&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;Це включає все від індивідуальних внесків до кількості компаній, що роблять внесок, і є ілюстрацією глибини та широти зусиль, що йдуть на еволюцію цієї екосистеми.&lt;/p&gt;
&lt;p&gt;У циклі релізу v1.37, що тривав 15 тижнів з 18 травня 2026 року по 26 серпня 2026 року, внески в Kubernetes досягли максимуму у 212 різних компаній та 1,754 окремих осіб.&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=1779058800000&amp;to=1787781600000&amp;var-period=d28&amp;var-repogroup_name=All&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=1779055200000&amp;to=1787781600000%20&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;p&gt;Під внеском ми маємо на увазі, коли хтось виконує коміт, проводить рецензію коду, залишає коментар, створює тікет або PR, рецензує PR (включно з блогами та документацією) або коментує тікети та PR.&lt;/p&gt;
&lt;p&gt;Якщо ви бажаєте долучитися до проєкту, перегляньте нашу сторінку &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/#getting-started&#34;&gt;«Як розпочати»&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;event-updates&#34;&gt;Події&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#event-updates&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Дізнайтесь про майбутні KubeCon по всьому світу:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.lfopensource.cn/kubecon-cloudnativecon-openinfra-summit-pytorch-conference-china/&#34;&gt;KubeCon + CloudNativeCon China&lt;/a&gt;: 7–9 вересня 2026, Шанхай, Китай&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/&#34;&gt;KubeCon + CloudNativeCon North America&lt;/a&gt;: 9–12 листопада 2026, Солт-Лейк-Сіті, США&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Дізнайтесь про майбутні Kubernetes Community Days (KCDs), які відбуватимуться до кінця 2026 року:&lt;/p&gt;
&lt;h4 id=&#34;september-2026&#34;&gt;Вересень 2026&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#september-2026&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-south-korea-presents-kcd-x-ceph-x-openinfra-day-korea-2026/&#34;&gt;KCD x Ceph x OpenInfra Day Korea&lt;/a&gt;: 1 вересня 2026, Сеул, Південна Корея&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-sf-bay-area-presents-kcd-san-francisco-bay-area-2026/&#34;&gt;KCD San Francisco Bay Area&lt;/a&gt;: 1 вересня 2026, Маунтн-Вʼю, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-washington-dc-presents-kcd-washington-dc-2026/&#34;&gt;KCD Washington DC&lt;/a&gt;: 15 вересня 2026, Вашингтон, округ Колумбія, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-gujarat-presents-kcd-gujarat-2026/&#34;&gt;KCD Gujarat&lt;/a&gt;: 19 вересня 2026, Ахмедабад, Індія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-brasil-presents-kcd-sao-paulo-2026/&#34;&gt;KCD São Paulo&lt;/a&gt;: 26 вересня 2026, Сан-Паулу, Бразилія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-sofia-presents-kubernetes-community-days-sofia-2026/&#34;&gt;KCD Sofia&lt;/a&gt;: 29 вересня 2026, Софія, Болгарія&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;october-2026&#34;&gt;Жовтень 2026&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#october-2026&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-uk-presents-kubernetes-community-days-uk-edinburgh-2026/&#34;&gt;KCD UK – Edinburgh&lt;/a&gt;: 19–20 жовтня 2026, Единбург, Велика Британія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-nigeria-presents-kcd-nigeria-2026-telling-the-african-cloud-native-story/&#34;&gt;KCD Nigeria&lt;/a&gt;: 24 жовтня 2026, Лагос, Нігерія&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;november-2026&#34;&gt;Листопад 2026&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#november-2026&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-porto-presents-kcd-porto-2026-collab-with-devops-days-portugal/&#34;&gt;KCD Porto&lt;/a&gt;: 19–20 листопада 2026, Порто, Португалія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://sessionize.com/kcd-hangzhou-2026/&#34;&gt;KCD Hangzhou&lt;/a&gt;: 28 листопада 2026, Ханчжоу, Китай&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;december-2026&#34;&gt;Грудень 2026&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#december-2026&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-suisse-romande-presents-kcd-suisse-romande-2026/&#34;&gt;KCD Suisse Romande&lt;/a&gt;: 9–10 грудня 2026, Мейрін, Швейцарія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-provence-presents-kcd-provence-2026/&#34;&gt;KCD Provence&lt;/a&gt;: 10 грудня 2026, Екс-ан-Прованс, Франція&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-florida-presents-kcd-florida-2026-miami/&#34;&gt;KCD Florida – Miami&lt;/a&gt;: 11 грудня 2026, Маями, США&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Актуальну інформацію про заходи можна знайти на &lt;a href=&#34;https://community2.cncf.io/events/#/list&#34;&gt;сторінці заходів CNCF&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;upcoming-release-webinar&#34;&gt;Вебінар присвячений релізу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#upcoming-release-webinar&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Приєднуйтесь до членів команди випуску Kubernetes v1.37 у середу, 23 вересня 2026 о 16:00 (UTC), щоб дізнатися про головні моменти цього релізу. Для отримання інформації та реєстрації відвідайте &lt;a href=&#34;https://community2.cncf.io/events/details/cncf-cncf-online-programs-presents-cloud-native-live-kubernetes-v137-webinar/&#34;&gt;сторінку події на сайті CNCF Online Programs&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Приєднуйтесь&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#get-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Найпростіший спосіб залучитися до Kubernetes — приєднатися до однієї з багатьох &lt;a href=&#34;https://kubernetes.dev/community/community-groups/sigs/&#34;&gt;Special Interest Groups&lt;/a&gt; (SIGs), що відповідають вашим інтересам.&lt;/p&gt;
&lt;p&gt;Якщо ви не знаєте, з чого почати, приєднуйтесь до наших щомісячних навчальних семінарів для нових учасників &lt;a href=&#34;https://www.kubernetes.dev/docs/orientation/&#34;&gt;New Contributor Orientations&lt;/a&gt;, де ми розповідаємо учасникам спільноти про структуру проєкту та допоможемо вам зробити свій перший внесок у проєкт.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Прочитайте більше про те, як стати &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/&#34;&gt;Kubernetes Contributor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Прочитайте більше про те, що відбувається з Kubernetes у нашому &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/&#34;&gt;блозі&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://bsky.app/profile/kubernetes.io&#34;&gt;Bluesky&lt;/a&gt; для останніх оновлень&lt;/li&gt;
&lt;li&gt;Слідкуйте за нами в &lt;a href=&#34;https://www.linkedin.com/company/kubernetes/&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Слідкуйте за нами в &lt;a href=&#34;https://x.com/kubernetesio&#34;&gt;X&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://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться вашою &lt;a href=&#34;https://www.cncf.io/case-studies/&#34;&gt;Kubernetes End User Story&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 Release Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Створення власного експортера метрик для Kubernetes</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/07/14/custom-metrics-exporter-kubernetes/</link>
      <pubDate>Tue, 14 Jul 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/07/14/custom-metrics-exporter-kubernetes/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes має вбудовану підтримку моніторингу CPU та памʼяті, але більшість рішень щодо масштабування в реальних сценаріях залежать від сигналів, які знаходяться повністю поза цими вузькими межами: скільки повідомлень чекають у черзі, скільки часу тривало останнє пакетне завдання, скільки активних WebSocket-зʼєднань утримує Pod. Коли вбудованих метрик недостатньо, &lt;em&gt;експортер метрик&lt;/em&gt; заповнює цю прогалину.&lt;/p&gt;
&lt;p&gt;У цій статті ми розглянемо створення такого експортера з нуля, пакування його в контейнер та підключення до кластера, щоб Prometheus, і зрештою &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/&#34;&gt;HorizontalPodAutoscaler&lt;/a&gt;, могли його використовувати.&lt;/p&gt;
&lt;h2 id=&#34;what-a-metrics-exporter-actually-does&#34;&gt;Що насправді робить експортер метрик&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-a-metrics-exporter-actually-does&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Експортер — це невеликий HTTP-сервер з єдиним завданням: повідомляти стан застосунку у вигляді тексту в точці доступу &lt;code&gt;/metrics&lt;/code&gt;. Prometheus &lt;em&gt;збирає&lt;/em&gt; дані з цієї точки доступу з певним інтервалом, зберігає часові ряди та робить їх доступними для запитів, сповіщень і правил автомасштабування.&lt;/p&gt;
&lt;p&gt;У деяких випадках ви можете інструментувати застосунок безпосередньо — вбудувати клієнтську бібліотеку Prometheus та відкрити &lt;code&gt;/metrics&lt;/code&gt; всередині того ж процесу, замість запуску окремого експортера. Окремий експортер має більше сенсу, коли джерело даних знаходиться зовні вашого застосунку або коли ви не контролюєте код застосунку.&lt;/p&gt;
&lt;p&gt;Формат, який очікує Prometheus — це звичайний текст: одна метрика на рядок, з назвою, опціональними мітками та числовим значенням. Клієнтські бібліотеки беруть на себе серіалізацію, тому на практиці вам потрібно лише вирішити, що вимірювати, та викликати відповідну функцію, коли значення змінюється.&lt;/p&gt;
&lt;h2 id=&#34;choosing-what-to-measure&#34;&gt;Вибір того, що вимірювати&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#choosing-what-to-measure&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Перед написанням коду варто визначитися, з яким типом сигналу ви маєте справу. Модель даних Prometheus має три основні типи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Лічильники&lt;/em&gt; (&lt;em&gt;Counters&lt;/em&gt;) лише збільшуються. Вони підходять для підсумкових значень: кількість оброблених запитів, виконаних завдань, виниклих помилок. Ніколи не використовуйте лічильник для значення, яке може зменшуватися.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Вимірювачі&lt;/em&gt; (&lt;em&gt;Gauges&lt;/em&gt;) представляють поточний знімок значення, яке може вільно зростати та спадати. Глибина черги, активні зʼєднання та розмір кешу — все це вимірювачі.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Гістограми&lt;/em&gt; (&lt;em&gt;Histograms&lt;/em&gt;) записують розподіл спостережуваних значень, наприклад, затримку запитів. Вони дозволяють обчислювати перцентилі (p99, p50), а не лише середні значення.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Коли ви знаєте, який тип підходить для вашого сигналу, оберіть назву відповідно до конвенції &lt;code&gt;&amp;lt;namespace&amp;gt;_&amp;lt;name&amp;gt;_&amp;lt;unit&amp;gt;&lt;/code&gt; у форматі &lt;code&gt;snake_case&lt;/code&gt;. Обробник завдань може надавати &lt;code&gt;worker_jobs_processed_total&lt;/code&gt; (лічильник), &lt;code&gt;worker_queue_depth&lt;/code&gt; (вимірювач) та &lt;code&gt;worker_job_duration_seconds&lt;/code&gt; (гістограма). Зрозумілі назви заощаджують час усім під час налагодження.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-the-project&#34;&gt;Налаштування проєкту&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#setting-up-the-project&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Клієнт Prometheus для Go є найпоширенішим вибором для експортерів в екосистемі Kubernetes, значною мірою тому, що ця ж бібліотека використовується в більшості офіційних компонентів Kubernetes. Почніть зі створення модуля та додавання залежності:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir my-exporter &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; my-exporter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go mod init example.com/my-exporter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go get github.com/prometheus/client_golang/prometheus
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go get github.com/prometheus/client_golang/prometheus/promhttp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;registering-metrics&#34;&gt;Реєстрація метрик&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#registering-metrics&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Створіть &lt;code&gt;main.go&lt;/code&gt;. Перше, що потрібно зробити — оголосити метрики та зареєструвати їх у типовому реєстрі Prometheus. Реєстрація повідомляє бібліотеці, що ці метрики існують, тому вони зʼявляться у виводі навіть до того, як буде записано перше спостереження:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;github.com/prometheus/client_golang/prometheus&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;github.com/prometheus/client_golang/prometheus/promhttp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;jobsProcessed&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewCounterVec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CounterOpts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nx&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;worker_jobs_processed_total&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nx&#34;&gt;Help&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Total number of jobs processed, partitioned by status.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;queueDepth&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewGauge&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GaugeOpts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;worker_queue_depth&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;Help&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Current number of jobs waiting in the queue.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;jobDuration&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewHistogram&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;HistogramOpts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;Name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;worker_job_duration_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;Help&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;Time spent processing a single job.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;Buckets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;DefBuckets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;prometheus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;MustRegister&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;jobsProcessed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;queueDepth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;jobDuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#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;prometheus.MustRegister&lt;/code&gt; викликає паніку у разі дублювання реєстрації, що дозволяє виявити помилки в налаштуваннях одразу під час запуску, а не непомітно під час роботи. Якщо ви вбудовуєте цей експортер у бібліотеку, яку будуть інструментувати інші пакети, використовуйте &lt;code&gt;prometheus.Register&lt;/code&gt; та обробляйте помилку самостійно.&lt;/p&gt;
&lt;h2 id=&#34;collecting-real-values&#34;&gt;Збір реальних значень&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#collecting-real-values&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Після реєстрації метрик наступний крок — підтримувати їх в актуальному стані. Ви можете або постійно оновлювати дані в міру їх зміни, або запустити власний внутрішній цикл оновлення. У прикладі нижче показано цикл опитування — goroutine, що періодично читає дані з вашого джерела даних та оновлює зареєстровані метрики. Замініть імітовані значення реальними викликами до вашої бази даних, внутрішнього API або брокера повідомлень:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;math/rand&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;collectMetrics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// Замініть це на реальні дані з вашого застосунку.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;depth&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float64&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Intn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;queueDepth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;depth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Duration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Intn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Millisecond&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;jobDuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Observe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Since&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;jobsProcessed&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WithLabelValues&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Inc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Sleep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Інтервал опитування (тут пʼять секунд) має бути коротшим за інтервал збору Prometheus, щоб кожен збір бачив свіже значення. Типовий інтервал збору в більшості розгортань кластера становить пʼятнадцять секунд, що дає комфортний запас.&lt;/p&gt;
&lt;h2 id=&#34;exposing-the-endpoint&#34;&gt;Експонування точки доступу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#exposing-the-endpoint&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Обʼєднайте цикл збору та HTTP-обробник у &lt;code&gt;main&lt;/code&gt;. Шлях &lt;code&gt;/healthz&lt;/code&gt; разом із &lt;code&gt;/metrics&lt;/code&gt; надає Kubernetes ціль для проб життєздатності (liveness probe), не експонуючи дані метрик на цьому шляху:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;collectMetrics&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Handle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/metrics&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;promhttp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Handler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;HandleFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/healthz&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteHeader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;StatusOK&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Listening on :8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ListenAndServe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatalf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;server error: %v&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go run .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl http://localhost:8080/metrics &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep worker_
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ви маєте побачити три блоки &lt;code&gt;# HELP&lt;/code&gt; та &lt;code&gt;# TYPE&lt;/code&gt;, за якими слідують поточні значення метрик. Якщо ці рядки зʼявилися, експортер працює правильно та готовий до контейнеризації.&lt;/p&gt;
&lt;h2 id=&#34;build-a-container-image&#34;&gt;Створення образу контейнера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#build-a-container-image&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Багатоетапна збірка зберігає кінцевий образ невеликим та дозволяє не постачати інструменти Go у промислове середовище. Перший етап компілює статично зібраний бінарний файл; другий етап копіює лише цей бінарний файл у мінімальний базовий образ. Приклад нижче використовує Docker, але той самий підхід працює з будь-яким OCI-сумісним інструментом, як-от Buildah або Podman:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; golang:1.21-alpine AS builder&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WORKDIR&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; /src&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; go.mod go.sum ./&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; go mod download&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; . .&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;CGO_ENABLED&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; go build -o /exporter .&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; gcr.io/distroless/static:nonroot&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; --from&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;builder /exporter /exporter&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;EXPOSE&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; 8080&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ENTRYPOINT&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/exporter&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#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;distroless/static:nonroot&lt;/code&gt; не містить оболонки, менеджера пакунків і типово працює від імені непривілейованого користувача, що відповідає більшості політик безпеки кластера без додаткового налаштування.&lt;/p&gt;
&lt;p&gt;Зберіть та відправте образ, замінивши &lt;code&gt;&amp;lt;registry&amp;gt;&lt;/code&gt; на адресу вашого реєстру:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker build -t &amp;lt;registry&amp;gt;/my-exporter:v1.0.0 .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker push &amp;lt;registry&amp;gt;/my-exporter:v1.0.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Примітка: використання конвеєра CI/CD для автоматизації цього процесу зазвичай є кращим підходом, ніж ручне виконання цих команд.)&lt;/p&gt;
&lt;h2 id=&#34;deploying-to-the-cluster&#34;&gt;Розгортання в кластері&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deploying-to-the-cluster&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Двох маніфестів достатньо для запуску експортера: Deployment, який керує життєвим циклом Podʼів, та Service, який надає Prometheus стабільну адресу для збору даних. (Ви можете налаштувати Prometheus на збір даних з кожного Podʼа; якщо це має сенс для вашого випадку використання, то це також допустимо).&lt;/p&gt;
&lt;p&gt;Приклади нижче використовують простір імен &lt;code&gt;monitoring&lt;/code&gt;, що є поширеною практикою при запуску Prometheus та повʼязаних компонентів разом. Відкоригуйте простір імен відповідно до налаштувань вашого кластера.&lt;/p&gt;
&lt;p&gt;Deployment встановлює консервативні обмеження ресурсів, прийнятні для легковагового процесу в стилі sidecar, та використовує шлях &lt;code&gt;/healthz&lt;/code&gt; для своєї проби життєздатності (liveness probe):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;apps/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Deployment&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;monitoring&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;replicas&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;selector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;matchLabels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;&amp;lt;registry&amp;gt;/my-exporter:v1.0.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;metrics&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containerPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;livenessProbe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;httpGet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/healthz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;initialDelaySeconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;periodSeconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resources&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cpu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;50m&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;32Mi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cpu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;100m&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;memory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;64Mi&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Service називає порт &lt;code&gt;metrics&lt;/code&gt;, на який посилатиметься ServiceMonitor у наступному розділі:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;monitoring&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;selector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;metrics&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8080&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;targetPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;metrics&lt;/span&gt;&lt;span class=&#34;w&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl apply -f deployment.yaml -f service.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;telling-prometheus-where-to-look&#34;&gt;Налаштування Prometheus для пошуку експортера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#telling-prometheus-where-to-look&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Спосіб налаштування збору даних залежить від того, як встановлено Prometheus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Варіант 1: Prometheus Operator (ServiceMonitor)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Якщо ви встановили Prometheus за допомогою &lt;a href=&#34;https://github.com/prometheus-operator/prometheus-operator&#34;&gt;Prometheus Operator&lt;/a&gt; або Helm-чарту &lt;code&gt;kube-prometheus-stack&lt;/code&gt;, оператор має бути запущений у вашому кластері перед створенням ServiceMonitor. Мітка &lt;code&gt;release&lt;/code&gt; має збігатися з селектором міток, налаштованим у вашому ресурсі Prometheus — &lt;code&gt;kube-prometheus-stack&lt;/code&gt; є типовим значенням для стандартного встановлення Helm:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;monitoring.coreos.com/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ServiceMonitor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;monitoring&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;release&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kube-prometheus-stack&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;selector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;matchLabels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-exporter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;endpoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;metrics&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;15s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/metrics&lt;/span&gt;&lt;span class=&#34;w&#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;Варіант 2: Виявлення на основі анотацій&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Якщо ваш Prometheus використовує виявлення Podʼів на основі анотацій, вам знадобиться відповідне правило &lt;code&gt;scrape_config&lt;/code&gt; у конфігурації Prometheus — перевірте з тим, хто керує вашим примірником Prometheus, щоб підтвердити наявність такого правила.&lt;/p&gt;
&lt;p&gt;Ви можете додати наступні три анотації до шаблону Podʼа незалежно від методу збору. Вони ігноруються Prometheus Operator, але автоматично підхоплюються системами на основі анотацій:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;annotations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prometheus.io/scrape&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prometheus.io/port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;8080&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# опустіть, якщо не використовуєте виявлення на основі анотацій&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;prometheus.io/path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/metrics&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# опустіть, якщо не використовуєте виявлення на основі анотацій&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо ви не впевнені, яке налаштування використовує ваш кластер,
підхід із ServiceMonitor є більш явним і простішим у налагодженні.&lt;/p&gt;
&lt;h2 id=&#34;verifying-the-scrape&#34;&gt;Перевірка збору даних&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#verifying-the-scrape&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Виконайте перенаправлення порту до сервісу Prometheus та відкрийте сторінку targets, щоб підтвердити, що експортер знайдено:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl port-forward svc/prometheus-operated &lt;span class=&#34;m&#34;&gt;9090&lt;/span&gt; -n monitoring
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Перейдіть на &lt;code&gt;http://localhost:9090/targets&lt;/code&gt;. Ціль &lt;code&gt;my-exporter&lt;/code&gt; має відображатися зі статусом &lt;strong&gt;UP&lt;/strong&gt;. Якщо відображається &lt;strong&gt;DOWN&lt;/strong&gt;, перевірте, чи збігається мітка &lt;code&gt;release&lt;/code&gt; у ServiceMonitor та чи працює Pod:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods -n monitoring -l app.kubernetes.io/name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;my-exporter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl describe servicemonitor my-exporter -n monitoring
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Коли ціль стане працездатною, виконайте швидкий запит у браузері виразів (expression browser), щоб підтвердити надходження даних:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rate(worker_jobs_processed_total{status=&amp;#34;success&amp;#34;}[2m])
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ненульовий результат означає, що весь конвеєр працює: ваш застосунок генерує дані, Prometheus їх збирає, а часові ряди зберігаються та доступні для запитів.&lt;/p&gt;
&lt;h2 id=&#34;what-comes-next&#34;&gt;Що далі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-comes-next&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Робочий експортер — це фундамент, а не кінцева мета. Наступним логічним кроком є передача цих метрик до &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/&#34;&gt;HorizontalPodAutoscaler&lt;/a&gt;, щоб ваше навантаження масштабувалося на основі сигналів, які дійсно визначають навантаження, а не лише CPU. Для цього потрібен адаптер метрик (найпоширеніший варіант — Prometheus Adapter), який реєструє ваші власні метрики в Kubernetes Custom Metrics API. Після реєстрації будь-який HorizontalPodAutoscaler у кластері може посилатися на &lt;code&gt;worker_queue_depth&lt;/code&gt; або &lt;code&gt;worker_jobs_processed_total&lt;/code&gt; безпосередньо у своєму блоці &lt;code&gt;metrics&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Інструкцію з налаштування дивіться в &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#autoscaling-on-multiple-metrics-and-custom-metrics&#34;&gt;Автомасштабування на основі кількох метрик і власних метрик&lt;/a&gt;. Каталог готових експортерів для баз даних, брокерів повідомлень і хмарних сервісів доступний на сторінці &lt;a href=&#34;https://prometheus.io/docs/instrumenting/exporters/&#34;&gt;Prometheus exporters and integrations&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Керування AI/ML навантаженнями в Kubernetes: втулок Headlamp для Kubeflow</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/07/13/introducing-headlamp-plugin-for-kubeflow/</link>
      <pubDate>Mon, 13 Jul 2026 12:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/07/13/introducing-headlamp-plugin-for-kubeflow/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes непомітно став стандартною платформою для AI та машинного навчання. Незалежно від того, чи ви запускаєте сервери notebook для дослідників даних, плануєте розподілені тренувальні завдання, налаштовуєте гіперпараметри чи керуєте багатоступеневими ML-пайплайнами, ці навантаження дедалі частіше потрапляють в кластер Kubernetes. &lt;a href=&#34;https://www.kubeflow.org/&#34;&gt;Kubeflow&lt;/a&gt; — одна з найпопулярніших платформ для складання такого стеку, і вона робить це природним для Kubernetes способом: кожна можливість надається як Custom Resource Definition (CRD).&lt;/p&gt;
&lt;p&gt;Такий дизайн є подарунком для операторів кластерів, оскільки це означає, що за ML-навантаженнями можна спостерігати та керувати ними тими ж примітивами, що й усіма іншими в кластері. Але на практиці спеціалізовані ML-інфопанелі, що постачаються з цими платформами, приховують Kubernetes-рівень під собою. Коли notebook застрягає або тренувальний запуск завершується невдало, оператор часто змушений повернутися до &lt;code&gt;kubectl&lt;/code&gt;, щоб дізнатися, що насправді сталося на рівні Podʼа.&lt;/p&gt;
&lt;p&gt;Тут представлено &lt;strong&gt;втулок Headlamp для Kubeflow&lt;/strong&gt;, який усуває цю прогалину, показуючи власні ресурси Kubeflow безпосередньо в універсальному інтерфейсі Kubernetes. Це наочний приклад підходу, якого може дотримуватися будь-яка платформа, що активно використовує CRD: взаємодіяти з операторами там, де вони вже працюють, і надавати їм достовірну інформацію на рівні кластера.&lt;/p&gt;
&lt;p&gt;Сам Headlamp — це розширюваний веб-інтерфейс Kubernetes, що підтримується &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp&#34;&gt;Kubernetes SIG UI&lt;/a&gt; та ліцензований за ліцензією Apache 2.0. Він працює як десктоп-застосунок або в кластері, а його система втулків дозволяє будь-кому додавати першокласні представлення для власних ресурсів.&lt;/p&gt;
&lt;h2 id=&#34;why-operators-need-a-different-view&#34;&gt;Чому операторам потрібне інше представлення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-operators-need-a-different-view&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Спеціалізовані ML-інфопанелі допомагають дослідникам даних подавати експерименти, пайплайни та notebookʼи. Оператори кластерів та інженери надійності сайтів (SRE) шукають несправності в Kubernetes-ресурсах, що лежать в їх основі, і вони задають інші запитання:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Чому notebook застряг? Чи це &lt;code&gt;ImagePullBackOff&lt;/code&gt;, &lt;code&gt;OOMKilled&lt;/code&gt; чи Pod, що очікує PersistentVolumeClaim?&lt;/li&gt;
&lt;li&gt;Які ресурси Run нещодавно завершилися невдало в різних просторах імен?&lt;/li&gt;
&lt;li&gt;Який набір параметрів Katib Experiment визнає оптимальним?&lt;/li&gt;
&lt;li&gt;Чи посилаються ресурси TrainJob на очікувані ресурси TrainingRuntime?&lt;/li&gt;
&lt;li&gt;Які пакетні навантаження виконуються та який стан показує Kubernetes?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Втулок Headlamp Kubeflow допомагає відповісти на ці запитання, зчитуючи дані безпосередньо з API-сервера Kubernetes. Він показує умови Podʼів, причини збоїв в Kubernetes та ресурси в різних просторах імен без необхідності посередницького ML-сервісу чи бази даних.&lt;/p&gt;
&lt;h2 id=&#34;what-the-plugin-covers&#34;&gt;Що охоплює цей втулок&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-the-plugin-covers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubeflow є модульним, і команди часто встановлюють лише ті компоненти, які їм потрібні. Втулок виявляє API-групи Kubeflow у кластері та показує лише відповідні розділи.&lt;/p&gt;
&lt;p&gt;Втулок підтримує такі родини компонентів та API-ресурси:&lt;/p&gt;


 





&lt;table&gt;&lt;caption style=&#34;display: none;&#34;&gt;Компоненти Kubeflow та API-ресурси, підтримувані втулком Headlamp&lt;/caption&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Компонент&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Призначення&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;API-ресурси&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Notebooks&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Надає середовища розробки, такі як Jupyter, VS Code та RStudio&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Notebook, Profile, PodDefault&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Pipelines&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Визначає та відстежує пайплайни, версії, експерименти, запуски та розклади&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Pipeline, PipelineVersion, Run, RecurringRun, Experiment&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Katib&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Автоматизує налаштування гіперпараметрів та пошук нейронних архітектур&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Experiment, Trial, Suggestion&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Training&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Виконує розподілені тренувальні навантаження, такі як завдання PyTorch та TensorFlow&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;TrainJob, TrainingRuntime, ClusterTrainingRuntime&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;Spark&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Виконує масштабну обробку даних за допомогою Apache Spark&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;SparkApplication, ScheduledSparkApplication&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&#34;what-you-can-see&#34;&gt;Що ви можете побачити&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-you-can-see&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;inspect-notebook-pods&#34;&gt;Інспектуйте Podʼи notebook&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#inspect-notebook-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Детальний вигляд Notebook показує умови Podʼів та їхні поля &lt;code&gt;reason&lt;/code&gt; та &lt;code&gt;message&lt;/code&gt;. Він також показує запити та обмеження CPU, памʼяті та GPU; монтування томів та їхні типи, такі як PersistentVolumeClaim, ConfigMap, Secret чи &lt;code&gt;emptyDir&lt;/code&gt;; змінні середовища, що посилаються на Secret чи ConfigMap обʼєкти; sidecar-контейнери; та toleration вузлів. Цей вигляд консолідує інформацію, яка в іншому випадку вимагала б кількох команд &lt;code&gt;kubectl describe&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;inspect-hyperparameter-tuning&#34;&gt;Інспектуйте налаштування гіперпараметрів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#inspect-hyperparameter-tuning&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Представлення Katib показують алгоритм налаштування, простір пошуку, кожен Trial з його поточним статусом та поточний найкращий Trial з його метричними значеннями та призначеннями параметрів. Вони також показують конфігурацію раннього зупинення та кількість ресурсів Trial, що зупинилися рано, щоб ви могли слідкувати за пошуком, не виходячи з UI кластера.&lt;/p&gt;
&lt;h3 id=&#34;inspect-pipeline-state-without-the-backend-database&#34;&gt;Інспектуйте стан пайплайну без бази даних бекенду&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#inspect-pipeline-state-without-the-backend-database&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Представлення Pipelines зчитують Kubernetes-ресурси API безпосередньо та не запитують Kubeflow Pipelines API-сервіс чи базу даних бекенду. Ви можете інспектувати збережений стан пайплайну навіть коли цей сервіс недоступний. Детальний вигляд Pipeline надає порівняння останньої та попередньої версій PipelineVersion у вигляді паралельного порівняння у форматі YAML. Представлення Run показують стан та тривалість, представлення RecurringRun показують зрозумілі розклади, а представлення artifacts агрегує значення &lt;code&gt;pipelineRoot&lt;/code&gt; з останніх ресурсів Run.&lt;/p&gt;
&lt;h3 id=&#34;map-ml-resources&#34;&gt;Мапа ML-ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#map-ml-resources&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Втулок реєструє &lt;a href=&#34;https://headlamp.dev/docs/latest/development/plugins/functionality/extending-the-map/&#34;&gt;Headlamp map source&lt;/a&gt;, що показує ресурси Notebook, Profile, PodDefault, Experiment, Pipeline, SparkApplication та TrainJob як вузли графа. Він малює ребра між підтримуваними ресурсами на основі &lt;code&gt;.metadata.ownerReferences&lt;/code&gt;. Headlamp також показує вбудовані зведення для цих типів ресурсів, коли ви наводите на них курсор.&lt;/p&gt;
&lt;h2 id=&#34;try-it&#34;&gt;Спробуйте&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#try-it&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/headlamp-k8s/plugins/blob/main/kubeflow/README.md&#34;&gt;README втулка Kubeflow&lt;/a&gt; пояснює встановлення та налаштування локального кластера, включаючи полегшений варіант лише з CRD для ознайомлення. Оскільки втулок виявляє встановлені API-групи, ви можете використовувати його з наявною модульною інсталяцією Kubeflow чи створити кластер для ознайомлення лише з CRD та зразковими ресурсами.&lt;/p&gt;
&lt;h2 id=&#34;apply-the-pattern-to-other-platforms&#34;&gt;Застосуйте шаблон до інших платформ&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#apply-the-pattern-to-other-platforms&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubeflow ілюструє ширший шаблон. Платформи часто моделюють предметно-орієнтовані робочі процеси за допомогою власних ресурсів. Їхні інфопанелі зосереджені на цих робочих процесах, тоді як Kubernetes-оператори також потребують стану базових API-ресурсів та Podʼів. Втулок, що працює на основі CRD, у загальному Kubernetes UI може показувати цей стан, не змушуючи операторів перемикатися між незвʼязаними інструментами.&lt;/p&gt;
&lt;p&gt;Втулок використовує ліцензію Apache 2.0 та розробляється під егідою Kubernetes SIG UI. Щоб повідомити про проблему чи зробити покращення, скористайтеся &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/issues&#34;&gt;issue tracker&lt;/a&gt; чи &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/pulls&#34;&gt;pull requests&lt;/a&gt; репозиторію втулків Headlamp.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Представляємо втулок Cluster API для Headlamp</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/06/25/headlamp-cluster-api-plugin/</link>
      <pubDate>Thu, 25 Jun 2026 14:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2026/06/25/headlamp-cluster-api-plugin/</guid>
      <description>
        
        
        &lt;p&gt;&lt;a href=&#34;https://headlamp.dev/&#34;&gt;Headlamp&lt;/a&gt; — це відкритий, розширюваний проєкт Kubernetes SIG UI, призначений для огляду, керування та налагодження ресурсів кластера безпосередньо з вебоглядача.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://cluster-api.sigs.k8s.io&#34;&gt;Cluster API (CAPI)&lt;/a&gt; є субпроєктом Kubernetes, який надає декларативні API у стилі Kubernetes для керування життєвим циклом кластерів. Він дозволяє командам платформи створювати, оновлювати та керувати життєвим циклом кластерів Kubernetes за допомогою стандартних обʼєктів Kubernetes, збережених і узгоджених у кластері керування.&lt;/p&gt;
&lt;p&gt;Керування ресурсами Cluster API історично вимагало використання команд &lt;code&gt;kubectl&lt;/code&gt; та глибокого розуміння ієрархій власності. Втулок Headlamp Cluster API забезпечує візуальну ясність, швидше налагодження та спрощені операції для команд платформи безпосередньо всередині Headlamp.&lt;/p&gt;
&lt;h2 id=&#34;what-this-plugin-provides&#34;&gt;Що надає цей втулок&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-this-plugin-provides&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Втулок Cluster API додає спеціальний розділ Cluster API до Headlamp і забезпечує повну видимість основних ресурсів CAPI через узгоджені списки та детальні перегляди.&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;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Огляд кластерів&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Перегляд кластерів з актуальним станом панелі управління та реплік робочих вузлів.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Видимість машин&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Перевірка MachineDeployments, MachineSets, Machines та MachinePools зі станом та умовами.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Інфопанель Cluster API&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Отримання централізованого огляду стану ресурсів Cluster API, активних проблем зі станами, інформації про провайдера та рекомендацій щодо усунення несправностей.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Моніторинг панелі управління&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Відстеження реплік KubeadmControlPlane, версій та повʼязаних Machines.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Масштабування з інтерфейсу&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Масштабування MachineDeployments та MachineSets безпосередньо з Headlamp.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Ієрархія підлеглих ресурсів&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Відстеження взаємозвʼязків між кластерами, розгортаннями, наборами та машинами.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Перегляд KubeadmConfig&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Перегляд конфігурацій завантаження, файлів, аргументів kubelet та налаштувань приєднання/ініціалізації.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Врахування топології&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Автоматичне виявлення ресурсів, керованих ClusterClass, і призначення їм міток.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Мапа&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Візуалізація взаємозвʼязків між Cluster, Control Plane та Worker.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Динамічне версіонування API&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Підтримка обох версій Cluster API: v1beta1 та v1beta2.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Метрики Prometheus&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Перегляд метрик наживо з &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/prometheus&#34;&gt;втулка Headlamp Prometheus&lt;/a&gt; безпосередньо на сторінках деталей ресурсів Cluster API.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;a-tour-of-the-plugin&#34;&gt;Огляд втулка&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#a-tour-of-the-plugin&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Втулок Headlamp Cluster API надає основні ресурси Cluster API в узгодженому візуальному інтерфейсі всередині Headlamp. Ось деякі з ключових переглядів, включених у перший випуск.&lt;/p&gt;
&lt;h3 id=&#34;cluster-api-dashboard&#34;&gt;Інфопанель Cluster API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cluster-api-dashboard&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Інфопанель надає централізований огляд ресурсів Cluster API та їх стану в кластері керування.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/cluster-api-dashboard.png&#34; alt=&#34;Інфопанель Cluster API, що показує загальний стан ресурсів&#34;&gt;&lt;/p&gt;
&lt;p&gt;Огляд підсумовує стан кластерів, Machines, MachineDeployments, MachinePools, MachineSets та панелей управління. Він також виділяє поточні проблеми станів, інформацію про провайдера та кількість шаблонів конфігурацій, щоб допомогти операторам швидко виявляти деградовані або несправні ресурси.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/cluster-health-cards.png&#34; alt=&#34;Деталі кластера та рекомендації щодо усунення несправностей&#34;&gt;&lt;/p&gt;
&lt;p&gt;Після вибору кластера відкривається детальний огляд стану, що показує стан панелі управління та робочих вузлів, інформацію про машини, деталі інфраструктури та стани ресурсів. Коли виявляються проблеми, панель надає рекомендації щодо усунення несправностей та діагностичні команди для допомоги у вирішенні проблем.&lt;/p&gt;
&lt;h3 id=&#34;bring-full-cluster-api-visibility-into-headlamp&#34;&gt;Забезпечте повну видимість Cluster API в Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#bring-full-cluster-api-visibility-into-headlamp&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Перегляд списку кластерів показує всі ресурси Cluster у кластері керування, включаючи стан реплік панелі управління та робочих вузлів. Це дає змогу швидко оцінити загальний стан кластера.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/cluster-list-view.png&#34; alt=&#34;Список кластерів показує стан реплік панелі управління та робочих вузлів&#34;&gt;&lt;/p&gt;
&lt;p&gt;Перегляд деталей кластера надає інформацію про статус ресурсів, стани, посилання на інфраструктуру, посилання на панель керування та повʼязані Machines на одній сторінці.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/cluster-detail-overview.png&#34; alt=&#34;Перегляд деталей кластера показує статус ресурсів та стани&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/cluster-detail-machines.png&#34; alt=&#34;Перегляд деталей кластера показує повʼязані машини&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;explore-cluster-api-resources-in-a-visual-interface&#34;&gt;Досліджуйте ресурси Cluster API у візуальному інтерфейсі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#explore-cluster-api-resources-in-a-visual-interface&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для MachineDeployments, MachineSets, Machines та MachinePools доступні окремі перегляди. Ці сторінки відображають кількість реплік, відносини власності, ідентифікатори провайдерів, версії та стани для підтримки щоденних операцій та налагодження.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/machine-resources-view.png&#34; alt=&#34;MachineDeployment list view showing replica counts, ownership, and conditions&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;scale-workloads-directly-from-headlamp&#34;&gt;Масштабування робочих навантажень безпосередньо з Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#scale-workloads-directly-from-headlamp&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;MachineDeployments та MachineSets включають вбудовану дію масштабування, що дозволяє регулювати кількість реплік безпосередньо з Headlamp без використання команд терміналу.&lt;/p&gt;
&lt;p&gt;Для кластерів із топологічним керуванням втулок також вказує, коли масштабування слід виконувати на рівні кластера.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/scale-machine-deployments.png&#34; alt=&#34;Діалог масштабування для MachineDeployment&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/scale-machine-sets.png&#34; alt=&#34;Кластер з топологічним керуванням, що показує рекомендації щодо масштабування на рівні кластера&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;inspect-bootstrap-configuration-without-raw-yaml&#34;&gt;Перегляд конфігурації bootstrap без сирого YAML&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#inspect-bootstrap-configuration-without-raw-yaml&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Конфігурації bootstrap можна переглядати у структурованому форматі, включаючи вбудовані файли, аргументи kubelet, додаткові томи та налаштування join або init. Це усуває необхідність вручну переглядати сирий YAML або Secret.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/bootstrap-config-view.png&#34; alt=&#34;Докладний перегляд KubeadmConfig, що показує конфігурацію bootstrap у структурованому форматі&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;visualize-cluster-relationships-with-map-view&#34;&gt;Візуалізація взаємозвʼязків кластера за допомогою мапи&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#visualize-cluster-relationships-with-map-view&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Візуальна мапа показує взаємозвʼязки між Cluster, панеллю управління та робочими ресурсами. Це забезпечує швидший спосіб розуміння ієрархії власності та загальної структури кластера.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/topology-map-view.png&#34; alt=&#34;Мапа, що показує взаємозвʼязки між Cluster, панеллю управління та робочими ресурсами&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;prometheus-metrics-integration&#34;&gt;Інтеграція метрик Prometheus&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#prometheus-metrics-integration&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Втулок Cluster API інтегрується з &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/tree/main/prometheus&#34;&gt;втулком Headlamp Prometheus&lt;/a&gt;, щоб показувати метрики безпосередньо на сторінках деталей ресурсів Cluster API.&lt;/p&gt;
&lt;p&gt;Коли втулок Prometheus встановлено та налаштовано, метрики вбудовуються безпосередньо на сторінках деталей для Cluster, MachineDeployments, MachineSets та Machines. Ви можете переглядати стан ресурсів та дані про продуктивність разом із станами та відносинами власності, не переходячи на окрему панель.&lt;/p&gt;
&lt;p&gt;Це спрощує зіставлення стану інфраструктури з поточними показниками під час налагодження або повсякденної експлуатації кластера — і все це безпосередньо в Headlamp.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2026/06/25/headlamp-cluster-api-plugin/prometheus-metrics-view.png&#34; alt=&#34;Метрики Prometheus вбудовані безпосередньо на сторінці деталей кластера&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-to-use&#34;&gt;Як використовувати&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-use&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Дивіться &lt;a href=&#34;https://github.com/headlamp-k8s/plugins/blob/main/cluster-api/README.md&#34;&gt;&lt;code&gt;plugins/cluster-api/README.md&lt;/code&gt;&lt;/a&gt; для інструкцій з встановлення та використання.&lt;/p&gt;
&lt;h2 id=&#34;developed-during-lfx-mentorship&#34;&gt;Розроблено під час програми LFX Mentorship&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#developed-during-lfx-mentorship&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей втулок був розроблений в рамках програми CNCF LFX Mentorship в проєкті Headlamp. Програма наставництва надала можливість тісно співпрацювати зі спільнотою Headlamp під час створення можливостей для покращення керування Cluster API.&lt;/p&gt;
&lt;p&gt;Основна увага приділялася не лише впровадженню можливостей, але й розумінню реальних проблем зручності використання під час операцій з Cluster API. Обговорення з наставниками та членами спільноти допомогли визначити напрямок розвитку втулка, покращити досвід використання та пріоритизувати можливості, найкорисніші для команд платформи.&lt;/p&gt;
&lt;p&gt;Програма наставництва також надала цінний досвід участі у великих проєктах з відкритим кодом: співпраця із супровідниками, участь у дискусіях щодо дизайну, обробка відгуків про випуски та ітеративне вдосконалення можливостей на основі відгуків спільноти.&lt;/p&gt;
&lt;p&gt;Робота над втулком триває, з додатковими покращеннями та можливостями, запланованими після початкового випуску Alpha.&lt;/p&gt;
&lt;h2 id=&#34;feedback-and-questions&#34;&gt;Питання та відгуки&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#feedback-and-questions&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Це випуск Alpha, і відгуки спільноти безпосередньо впливають на подальший розвиток.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Повідомлення про помилки:&lt;/strong&gt; &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/issues&#34;&gt;Створити issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Запити на нові можливості:&lt;/strong&gt; &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/discussions&#34;&gt;Почати обговорення&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Внесок:&lt;/strong&gt; &lt;a href=&#34;https://github.com/kubernetes-sigs/headlamp/pulls&#34;&gt;PR вітаються&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Slack:&lt;/strong&gt; &lt;a href=&#34;https://slack.k8s.io/&#34;&gt;Приєднатися до каналу #headlamp&lt;/a&gt; для питань та обговорень&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Представляємо контролер готовності вузлів</title>
      <link>https://deploy-preview-59083--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-59083--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 або спеціальні перевірки працездатності, щоб бути повністю готовими до роботи, перш ніж вони зможуть надійно обслуговувати Podʼи.&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 вузлів, розширюючи захисні барʼєри готовності під час завантаження вузлів за межі стандартних станів. Динамічно керуючи taints на основі власних сигналів працездатності, контролер гарантує, що робочі навантаження розміщуються тільки на вузлах, які відповідають усім вимогам інфраструктури.&lt;/p&gt;
&lt;h2 id=&#34;why-the-node-readiness-controller&#34;&gt;Навіщо потрібен контролер готовності вузлів?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-the-node-readiness-controller&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Основний статус «Ready» вузлів Kubernetes часто є недостатнім для кластерів із складними вимогами до ініціалізації. Оператори часто стикаються з труднощами, намагаючись переконатися, що певні DaemonSets або локальні сервіси працюють належним чином, перш ніж вузол потрапить до пулу планування.&lt;/p&gt;
&lt;p&gt;Контролер готовності вузлів заповнює цю прогалину, дозволяючи операторам визначати власні scheduling gates, адаптовані до конкретних груп вузлів. Це дозволяє застосовувати різні вимоги до готовності в гетерогенних кластерах, гарантуючи, наприклад, що вузли, оснащені GPU, приймають Podʼи тільки після перевірки спеціалізованих драйверів, тоді як вузли загального призначення дотримуються стандартного шляху.&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;Автоматичне керування taints&lt;/strong&gt;: контролер автоматично застосовує або видаляє taints вузлів залежно від статусу станів, запобігаючи потраплянню Podʼів на непідготовлену інфраструктуру.&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;a class=&#34;td-heading-self-link&#34; href=&#34;#core-concepts-and-features&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Контролер базується на API NodeReadinessRule (NRR), який дозволяє визначати декларативні &lt;em&gt;gates&lt;/em&gt; для ваших вузлів.&lt;/p&gt;
&lt;h3 id=&#34;flexible-enforcement-modes&#34;&gt;Гнучкі режими виконання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#flexible-enforcement-modes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Контролер підтримує два різних режими роботи:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Безперервне виконання&lt;/dt&gt;
&lt;dd&gt;Активно підтримує гарантію готовності протягом усього життєвого циклу вузла. Якщо критична залежність (наприклад, драйвер пристрою) пізніше дає збій, на вузол негайно додається taint, щоб запобігти новому плануванню.&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;a class=&#34;td-heading-self-link&#34; href=&#34;#condition-reporting&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Контролер реагує на стани вузлів (Node Conditions), а не виконує перевірки працездатності самостійно. Така роздільна конструкція дозволяє йому безперешкодно інтегруватися з іншими інструментами, що існують в екосистемі, а також із власними рішеннями:&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;a class=&#34;td-heading-self-link&#34; href=&#34;#operational-safety-with-dry-run&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Впровадження нових правил готовності у всьому парку вузлів несе в собі певний ризик. Щоб його зменшити, режим &lt;em&gt;тестового запуску&lt;/em&gt; (&lt;em&gt;dry run&lt;/em&gt;) дозволяє операторам спочатку змоделювати вплив на кластер. У цьому режимі контролер записує в логи заплановані дії та оновлює статус правила, щоб показати вузли, на які це вплине, без фактичного застосування taints, що дозволяє безпечно перевірити правило перед застосуванням.&lt;/p&gt;
&lt;h2 id=&#34;example-cni-bootstrapping&#34;&gt;Приклад: ініціалізація CNI&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-cni-bootstrapping&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Наведене нижче правило NodeReadinessRule гарантує, що вузол залишатиметься таким, що не підлягає плануванню, доки його агент CNI не почне функціонувати. Контролер відстежує власний стан &lt;code&gt;cniplugin.example.net/NetworkReady&lt;/code&gt; і видаляє taint &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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;readiness.node.x-k8s.io/v1alpha1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;NodeReadinessRule&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;network-readiness-rule&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;conditions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cniplugin.example.net/NetworkReady&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;requiredStatus&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;True&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;taint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;readiness.k8s.io/acme.com/network-unavailable&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pending&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;enforcementMode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;bootstrap-only&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeSelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;matchLabels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;node-role.kubernetes.io/worker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;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;a class=&#34;td-heading-self-link&#34; href=&#34;#getting-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Node Readiness Controller тільки починає свою роботу, і ми випустили &lt;a href=&#34;https://github.com/kubernetes-sigs/node-readiness-controller/releases/tag/v0.1.1&#34;&gt;перші версії&lt;/a&gt;. Зараз ми чекаємо на відгуки від спільноти, щоб вдосконалити план розвитку. Після плідних дискусій на 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>Експерименти з Gateway API за допомогою kind</title>
      <link>https://deploy-preview-59083--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-59083--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;a class=&#34;td-heading-self-link&#34; href=&#34;#overview&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#prerequisites&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;create-a-kind-cluster&#34;&gt;Створення кластера kind&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#create-a-kind-cluster&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Створіть новий кластер kind, запустивши:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#install-cloud-provider-kind&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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, який призначає адреси Service типу 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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;VERSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;basename &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;curl -s -L -o /dev/null -w &lt;span class=&#34;s1&#34;&gt;&amp;#39;%{url_effective}&amp;#39;&lt;/span&gt; https://github.com/kubernetes-sigs/cloud-provider-kind/releases/latest&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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 class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;VERSION&lt;/span&gt;&lt;span class=&#34;si&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps --filter &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#experimenting-with-gateway-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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;deploy-a-gateway&#34;&gt;Розгортання Gateway&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deploy-a-gateway&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gateway-infra&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Gateway&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gateway&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gateway-infra&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;gatewayClassName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;cloud-provider-kind&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;listeners&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hostname&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*.exampledomain.example&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;protocol&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;HTTP&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;allowedRoutes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespaces&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;All&lt;/span&gt;&lt;span class=&#34;w&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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&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;deploy-a-demo-application&#34;&gt;Розгортання демо-застосунку&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deploy-a-demo-application&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;demo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Service&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;demo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;protocol&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;TCP&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;targetPort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;selector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ClusterIP&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;apps/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Deployment&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;demo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;selector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;matchLabels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;labels&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;POD_NAME&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;valueFrom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fieldRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fieldPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;metadata.name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;valueFrom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fieldRef&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;              &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fieldPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;metadata.namespace&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;registry.k8s.io/gateway-api/echo-basic:v20251204-v1.4.1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo-basic&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;create-an-httproute&#34;&gt;Створення HTTPRoute&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#create-an-httproute&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gateway.networking.k8s.io/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;HTTPRoute&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;demo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;parentRefs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gateway&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gateway-infra&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;hostnames&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;some.exampledomain.example&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;rules&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;matches&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;PathPrefix&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;backendRefs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3000&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#test-your-route&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GW_ADDR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;kubectl get gateway -n gateway-infra gateway -o &lt;span class=&#34;nv&#34;&gt;jsonpath&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{.status.addresses[0].value}&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl --resolve some.exampledomain.example:80:&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;GW_ADDR&lt;/span&gt;&lt;span class=&#34;si&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;host&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;some.exampledomain.example&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;method&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;proto&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP/1.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;s2&#34;&gt;&amp;#34;*/*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;s2&#34;&gt;&amp;#34;curl/8.15.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;namespace&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;demo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;ingress&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;service&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;#34;pod&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;echo-dc48d7cf8-vs2df&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#troubleshooting&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Якщо щось працює не так, як очікується, ви можете усунути несправності, перевіривши стан ваших ресурсів.&lt;/p&gt;
&lt;h3 id=&#34;check-the-gateway-status&#34;&gt;Перевірка стану Gateway&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#check-the-gateway-status&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Спочатку перевірте ресурс Gateway:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#check-the-httproute-status&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Далі перевірте ваш HTTPRoute:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get httproute -n demo &lt;span class=&#34;nb&#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;; це означає, що Service бекенду не існує або має неправильне імʼя&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;parents&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;conditions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;lastTransitionTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2026-01-19T17:13:35Z&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;backend not found&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;observedGeneration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;reason&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;BackendNotFound&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;False&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ResolvedRefs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;controllerName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kind.sigs.k8s.io/gateway-controller&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#check-controller-logs&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#cleanup&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Коли ви закінчите з експериментами, ви можете очистити ресурси:&lt;/p&gt;
&lt;h3 id=&#34;remove-kubernetes-resources&#34;&gt;Видалення ресурсів Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#remove-kubernetes-resources&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Видаліть простори імен (це видалить усі ресурси в них):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl delete namespace gateway-infra
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#stop-cloud-provider-kind&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#delete-the-kind-cluster&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Нарешті, видаліть кластер kind:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#next-steps&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#a-final-word-of-caution&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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-59083--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-59083--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;Подібно до того, як ви можете використовувати StatefulSet або Deployment в Kubernetes для керування групою Podʼів, в 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;a class=&#34;td-heading-self-link&#34; href=&#34;#emphasis-on-simplicity-and-usability&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;З версією v1.12.0 проєкт Cluster API ще раз демонструє, що ця спільнота здатна запроваджувати велику кількість інновацій, одночасно мінімізуючи вплив на користувачів Cluster API.&lt;/p&gt;
&lt;p&gt;Що це означає на практиці?&lt;/p&gt;
&lt;p&gt;Користувачам просто потрібно змінити специфікацію &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts#cluster&#34;&gt;Cluster&lt;/a&gt; або &lt;a href=&#34;https://cluster-api.sigs.k8s.io/user/concepts#machine&#34;&gt;Machine&lt;/a&gt; (так само, як і в попередніх версіях Cluster API), і Cluster API автоматично запустить оновлення на місці або ланцюгові оновлення, коли це можливо і доцільно.&lt;/p&gt;
&lt;h2 id=&#34;in-place-updates&#34;&gt;Оновлення на місці&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#in-place-updates&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Як і Kubernetes для Podʼів у Deployment, коли змінюється специфікація &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;В результаті розгортання машин значно зменшують кількість змінних, які потрібно враховувати під час керування життєвим циклом хост-сервера, на якому розміщено вузли.&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;додавання taint 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-59083--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, оновлення на місці найбільш корисні для внесення змін, які не вимагають drain вузла або перезапуску Podʼів; наприклад: зміна облікових даних користувача для машини. З іншого боку, коли робоче навантаження все одно буде порушено, просто виконайте розгортання.&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;a class=&#34;td-heading-self-link&#34; href=&#34;#chained-upgrades&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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-59083--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;runtime-розширення плану оновлення&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;a class=&#34;td-heading-self-link&#34; href=&#34;#release-team&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#what-s-next&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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>Kubernetes v1.35: allowList для exec-втулків у kuberc обмежує виконувані файли, які запускає kubeconfig</title>
      <link>https://deploy-preview-59083--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-59083--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;a class=&#34;td-heading-self-link&#34; href=&#34;#how-it-works&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Повний опис цієї функціональності доступний в нашій &lt;a href=&#34;https://deploy-preview-59083--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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kubectl.config.k8s.io/v1beta1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Preference&lt;/span&gt;&lt;span class=&#34;w&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kubectl.config.k8s.io/v1beta1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Preference&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;credentialPluginPolicy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;AllowAll&lt;/span&gt;&lt;span class=&#34;w&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kubectl.config.k8s.io/v1beta1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Preference&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;credentialPluginPolicy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;DenyAll&lt;/span&gt;&lt;span class=&#34;w&#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;Unable to connect to the server: getting credentials: plugin &amp;quot;cloudco-login&amp;quot; not allowed: policy set to &amp;quot;DenyAll&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Якщо вам не вистачає інформації для усунення проблеми, збільште детальність логування під час виконання наступної команди.  Наприклад:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# збільшити або зменшити детальність, якщо проблема все ще залишається незрозумілою&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods --verbosity &lt;span class=&#34;m&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#selectively-allowing-plugins&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;kubectl.config.k8s.io/v1beta1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Preference&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;credentialPluginPolicy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Allowlist&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;credentialPluginAllowlist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/usr/local/bin/cloudco-login&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;get-identity&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#future-enhancements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#get-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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: Кращий спосіб передачі токенів ServiceAccount до драйверів CSI</title>
      <link>https://deploy-preview-59083--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-59083--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, який використовує токени ServiceAccount, Kubernetes v1.35 приносить удосконалення, про яке вам варто знати. З моменту введення можливості &lt;a href=&#34;https://kubernetes-csi.github.io/docs/token-requests.html&#34;&gt;TokenRequests&lt;/a&gt;, токени ServiceAccount, запитувані драйверами CSI, передавалися їм через поле &lt;code&gt;volume_context&lt;/code&gt;. Хоча це працювало, це не ідеальне місце для конфіденційної інформації, і ми бачили випадки, коли токени випадково потрапляли в логи драйверів CSI.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 вводить рішення бета-версії для вирішення цієї проблеми:
&lt;em&gt;Добровільне ввімкнення драйвером CSI отримання токенів ServiceAccount через поле Secrets&lt;/em&gt;.
Це дозволяє драйверам CSI отримувати токени ServiceAccount
через поле &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;a class=&#34;td-heading-self-link&#34; href=&#34;#understanding-the-existing-approach&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;, вони можуть запитувати токени ServiceAccount для ідентичності робочого навантаження, налаштовуючи поле &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, не розглядає контекст тому як конфіденційний, тому токени ServiceAccount можуть потрапити в логи, коли 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;a class=&#34;td-heading-self-link&#34; href=&#34;#how-the-opt-in-mechanism-works&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes v1.35 вводить механізм увімкнення, який дозволяє драйверам CSI вибирати, як вони отримують токени ServiceAccount. Таким чином, поточні драйвери продовжують працювати як і раніше, а драйвери можуть перейти до більш відповідного поля 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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# УВАГА: це приклад конфігурації.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#          Не використовуйте це для власного кластера!&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;storage.k8s.io/v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;CSIDriver&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;example-csi-driver&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# ... наявні поля ...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tokenRequests&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;audience&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;example.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;expirationSeconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Нове поле для ввімкнення доставки через secrets&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;serviceAccountTokenInSecrets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# типово false&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#about-the-beta-release&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#guide-for-csi-driver-authors&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Якщо ви підтримуєте драйвер CSI, який використовує токени ServiceAccount, ось як запровадити цю можливість.&lt;/p&gt;
&lt;h3 id=&#34;adding-fallback-logic&#34;&gt;Додавання резервної логіки&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#adding-fallback-logic&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Спочатку оновіть код вашого драйвера, щоб перевіряти обидва місця на наявність токенів. Це робить ваш драйвер сумісним з обома підходами, старим і новим:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;serviceAccountTokenKey&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;csi.storage.k8s.io/serviceAccount.tokens&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;getServiceAccountTokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;csi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;NodePublishVolumeRequest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Перевірити поле secrets спочатку (нова поведінка, коли драйвер увімкнув її)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Secrets&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;serviceAccountTokenKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// Повернення до контексту тому (поточна поведінка)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;req&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;VolumeContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;serviceAccountTokenKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tokens&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Errorf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;service account tokens not found&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#rollout-sequence&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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. Ми заохочуємо вас додати цю логіку раніше, випускати релізи та навіть переносити її (backport) до гілок обслуговування, де це можливо.&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;a class=&#34;td-heading-self-link&#34; href=&#34;#important-constraints&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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 перед тим, як завершиться розгортання всіх Podʼів драйвера. Якщо ви це зробите, монтування томів зазнають невдачі на вузлах, які все ще працюють зі старою версією драйвера, оскільки ті Podʼи перевіряють лише контекст тому.&lt;/p&gt;
&lt;h2 id=&#34;why-this-matters&#34;&gt;Чому це важливо&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-this-matters&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Впровадження цієї можливості допомагає в кількох аспектах:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Це усуває ризик випадкового потрапляння токенів ServiceAccount у логи як частини контексту тому в 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;a class=&#34;td-heading-self-link&#34; href=&#34;#call-to-action&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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: Розширені оператори tolerations для підтримки числових порівнянь (Alpha)</title>
      <link>https://deploy-preview-59083--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-59083--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;Сьогодні taints і tolerations у Kubernetes можуть перевіряти збіг точних значень або наявність ключа, але не можуть порівнювати числові пороги. Вам довелося б створювати дискретні категорії taint, використовувати зовнішні контролери допуску або погоджуватися на неоптимальні рішення щодо розміщення.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 ми представляємо &lt;strong&gt;розширені оператори tolerations&lt;/strong&gt; (Extended Toleration Operators) як альфа-можливість. Це вдосконалення додає оператори &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;Розвиток tolerations&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-evolution-of-tolerations&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Історично Kubernetes підтримував два основні оператори tolerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Equal&lt;/code&gt;&lt;/strong&gt;: toleration відповідає taint, якщо ключ і значення точно збігаються&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Exists&lt;/code&gt;&lt;/strong&gt;: toleration відповідає taint, якщо ключ існує, незалежно від значення&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Хоча ці оператори добре працювали для категорійних сценаріїв, для числових порівнянь їх було недостатньо. Починаючи з v1.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;Навіщо розширювати tolerations замість використання NodeAffinity?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-extend-tolerations-instead-of-using-nodeaffinity&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Ви можете запитати: NodeAffinity вже підтримує числові оператори порівняння, тож навіщо розширювати tolerations? Хоча NodeAffinity добре підходить для вираження вподобань Podʼів, taints і tolerations дають важливі операційні переваги:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Орієнтованість на політику&lt;/strong&gt;: NodeAffinity задається для кожного Podʼа окремо, тож кожне робоче навантаження має явно відмовлятися від ризикованих вузлів. Taints інвертують контроль — вузли оголошують свій рівень ризику, і лише Podʼи з відповідними tolerations можуть на них потрапити. Це дає безпечнішу типову поведінку: більшість Podʼів тримаються подалі від 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;, що дозволяє операторам виконувати drain і виселяти Podʼи, коли SLA вузла погіршується або спотові екземпляри отримують повідомлення про завершення роботи.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ергономіка експлуатації&lt;/strong&gt;: централізована політика на боці вузла узгоджується з іншими захисними taints, як-от disk-pressure і memory-pressure, що робить керування кластером інтуїтивнішим.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це вдосконалення зберігає добре зрозумілу модель безпеки taints і tolerations, водночас уможливлюючи розміщення на основі порогових значень для планування з урахуванням SLA.&lt;/p&gt;
&lt;h2 id=&#34;introducing-gt-and-lt-operators&#34;&gt;Представляємо оператори Gt та Lt&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#introducing-gt-and-lt-operators&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes v1.35 представляє два нові оператори для tolerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Gt&lt;/code&gt; (більше ніж)&lt;/strong&gt;: toleration спрацьовує, якщо числове значення taint більше за значення toleration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Lt&lt;/code&gt; (менше ніж)&lt;/strong&gt;: toleration спрацьовує, якщо числове значення taint менше за значення toleration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Коли Pod толерує taint з &lt;code&gt;Lt&lt;/code&gt;, це означає: «Я можу толерувати вузли, де цей показник &lt;em&gt;менший&lt;/em&gt; за мій поріг». Оскільки tolerations дозволяють планування, Pod може працювати на вузлах, де значення taint більше за значення toleration. Думайте про це так: «Я толерую вузли, які перевищують мої мінімальні вимоги».&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;a class=&#34;td-heading-self-link&#34; href=&#34;#use-cases-and-examples&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Розгляньмо, як розширені оператори tolerations розвʼязують реальні завдання планування.&lt;/p&gt;
&lt;h3 id=&#34;example-1-spot-instance-protection-with-sla-thresholds&#34;&gt;Приклад 1: Захист спотових екземплярів за допомогою порогових значень SLA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-1-spot-instance-protection-with-sla-thresholds&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Багато кластерів поєднують вузли на вимогу та спотові вузли або вузли з можливістю витіснення для оптимізації витрат. Спотові вузли дають значну економію, але мають вищий рівень відмов. Ви хочете, щоб більшість робочих навантажень типово уникала спотових вузлів, і водночас дозволити окремим робочим навантаженням явно погоджуватися на них із чіткими межами SLA.&lt;/p&gt;
&lt;p&gt;Спочатку додайте до спотових вузлів taint з їхньою ймовірністю відмови (наприклад, 15% відмов на рік):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;spot-node-1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;taints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;15&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ondemand-node-1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;taints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;payment-processor&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tolerations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tolerationSeconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;30&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;payment-app:v1&lt;/span&gt;&lt;span class=&#34;w&#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;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), Pod отримує 30 секунд для коректного завершення роботи перед примусовим виселенням.&lt;/p&gt;
&lt;p&gt;Тим часом відмовостійке пакетне завдання може явно погодитися на спотові екземпляри:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;batch-job&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tolerations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;20&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoExecute&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;worker&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;batch-worker:v1&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#example-2-ai-workload-placement-with-gpu-tiers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Робочі навантаження ШІ та машинного навчання часто мають специфічні вимоги до обладнання. За допомогою розширених операторів tolerations ви можете створювати рівні GPU-вузлів і гарантувати, що робочі навантаження потраплять на обладнання відповідної потужності.&lt;/p&gt;
&lt;p&gt;Додайте до вузлів GPU taint з їхнім показником обчислювальної потужності:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gpu-node-a100&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;taints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1000&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Node&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gpu-node-t4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;taints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;500&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Важке навчальне навантаження може вимагати високопродуктивних GPU:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;model-training&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tolerations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Gt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;800&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;trainer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ml-trainer:v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resources&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nvidia.com/gpu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Це гарантує, що Pod для навчання плануватиметься лише на вузлах з показником обчислювальної потужності понад 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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;model-inference&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tolerations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;gpu-compute-score&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Gt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;400&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;inference&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ml-inference:v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;resources&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nvidia.com/gpu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#example-3-cost-optimized-workload-placement&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для пакетної обробки або некритичних робочих навантажень ви можете мінімізувати витрати, запускаючи їх на дешевших вузлах, навіть якщо вони мають нижчі характеристики продуктивності.&lt;/p&gt;
&lt;p&gt;До вузлів можна додати taint з їхнім рейтингом вартості:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;taints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cost-per-hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;tolerations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cost-per-hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;100&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#example-4-performance-based-placement&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Застосунки з інтенсивним використанням сховища часто потребують гарантій мінімальної продуктивності диска. За допомогою розширених операторів tolerations ви можете забезпечити дотримання цих вимог на рівні планування.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;tolerations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;disk-iops&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Gt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;3000&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ця toleration гарантує, що Pod планується тільки на вузли, де &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;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-use-this-feature&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Розширені оператори tolerations є &lt;strong&gt;альфа-можливістю&lt;/strong&gt; в Kubernetes v1.35. Щоб спробувати її:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Увімкніть функціональну можливість&lt;/strong&gt; на API-сервері та планувальнику:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--feature-gates&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TaintTolerationComparisonOperators&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#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;Додайте до вузлів taints&lt;/strong&gt; з числовими значеннями метрик, важливих для ваших потреб планування:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  kubectl taint nodes node-1 failure-probability&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;5:NoSchedule
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  kubectl taint nodes node-2 disk-iops&lt;span class=&#34;o&#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; у специфікаціях ваших Podʼів:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tolerations&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;failure-probability&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Lt&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;effect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;NoSchedule&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#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;Оскільки це альфа-можливість, розширені оператори tolerations можуть змінитися в майбутніх випусках, тож у промислових середовищах їх слід використовувати обережно. Завжди спершу ретельно тестуйте їх у непромислових кластерах.&lt;/div&gt;

&lt;h2 id=&#34;what-s-next&#34;&gt;Що далі?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-s-next&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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; у tolerations і спорідненості вузлів (node affinity) для ще гнучкішої логіки планування, зокрема порівняння семантичних версій&lt;/li&gt;
&lt;li&gt;Поліпшити інтеграцію з автоматичним масштабуванням кластерів для планування потужностей з урахуванням порогових значень&lt;/li&gt;
&lt;li&gt;Перевести можливість у бета-версію, а згодом і в GA зі стабільністю, придатною для промислового використання&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Нам особливо цікаво дізнатися про ваші випадки використання! Чи є у вас сценарії, в яких планування на основі порогових значень вирішило б проблеми? Чи є додаткові оператори або можливості, які ви хотіли б бачити?&lt;/p&gt;
&lt;h2 id=&#34;getting-involved&#34;&gt;Як долучитися&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#getting-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;З питаннями щодо розширених операторів tolerations звертайтеся до спільноти SIG Scheduling. Чекаємо на ваші відгуки!&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-learn-more&#34;&gt;Як дізнатися більше?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-can-i-learn-more&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/taint-and-toleration/&#34;&gt;Taints та Tolerations&lt;/a&gt; — основи&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59083--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-59083--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-59083--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, дозволяючи розробникам застосунків зосередитися на основній логіці тренування, перекладаючи складні механізми обробки збоїв і відновлення на sidecar-контейнери та декларативну конфігурацію 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-59083--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;Проблема: коли перезапуску одного контейнера недостатньо, а відтворення Podʼів занадто дороге&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-problem-when-a-single-container-restart-isn-t-enough-and-recreating-pods-is-too-costly&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes вже давно підтримує політики перезапуску на рівні Podʼів (&lt;code&gt;restartPolicy&lt;/code&gt;) і, з недавнього часу, на &lt;a href=&#34;https://deploy-preview-59083--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;a class=&#34;td-heading-self-link&#34; href=&#34;#introducing-the-restartallcontainers-action&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#use-cases&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;1-efficient-restarts-for-ml-batch-jobs&#34;&gt;1. Ефективний перезапуск завдань ML/Batch&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-efficient-restarts-for-ml-batch-jobs&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для завдань навчання ML &lt;a href=&#34;https://deploy-preview-59083--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 вузлів накладні витрати на перепланування можуть призвести до втрати &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;За допомогою дій &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ʼа, що дозволяє йому перезапуститися з останньої контрольної точки без залучення контролера Job. Ця можливість тепер нативно підтримується 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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;apiVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;kind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;metadata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;ml-worker-pod&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restartPolicy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Never&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;initContainers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Цей init-контейнер буде перезапускатися при кожному перезапуску на місці.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;setup-environment&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-repo/setup-worker:1.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;watcher-sidecar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-repo/watcher:1.0&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restartPolicy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Always&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restartPolicyRules&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;RestartAllContainers&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;exitCodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;In&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# Конкретний код виходу від watcher запускає повний перезапуск Podʼа.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;88&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;containers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;main-application&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-repo/training-app:1.0&lt;/span&gt;&lt;span class=&#34;w&#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;a class=&#34;td-heading-self-link&#34; href=&#34;#2-re-running-init-containers-for-a-clean-state&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Уявіть ситуацію, коли init-контейнер відповідає за отримання облікових даних або налаштування спільного тому. Якщо основний застосунок виходить з ладу, що призводить до пошкодження цього спільного стану, вам потрібно &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3676&#34;&gt;перезапустити init-контейнер&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Налаштувавши основний застосунок так, щоб він завершувався з певним кодом після виявлення такого пошкодження, ви можете запустити дію &lt;code&gt;RestartAllContainers&lt;/code&gt;, гарантуючи, що init-контейнер забезпечить чисте налаштування перед перезапуском застосунку.&lt;/p&gt;
&lt;h3 id=&#34;3-handling-high-rate-of-similar-tasks-execution&#34;&gt;3. Обробка великої кількості подібних завдань&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#3-handling-high-rate-of-similar-tasks-execution&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Іноді завдання найкраще виконувати у вигляді Podʼів. Кожне завдання вимагає чистого виконання. Завданням може бути бекенд ігрової сесії або обробка елементів черги. Якщо швидкість виконання завдань висока, запуск повного циклу створення, планування та ініціалізації Podʼів є надто дорогим, особливо якщо завдання можуть бути короткими. Можливість перезапустити всі контейнери з нуля дозволяє Kubernetes обробляти такі сценарії без використання спеціальних рішень або фреймворків.&lt;/p&gt;
&lt;h2 id=&#34;how-to-use-it&#34;&gt;Як користуватися&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-use-it&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#observing-the-restart&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#learn-more&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Прочитайте офіційну документацію про &lt;a href=&#34;https://deploy-preview-59083--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;a class=&#34;td-heading-self-link&#34; href=&#34;#we-want-your-feedback&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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>7 типових помилок Kubernetes (і як я навчився їх уникати)</title>
      <link>https://deploy-preview-59083--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-59083--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;a class=&#34;td-heading-self-link&#34; href=&#34;#1-skipping-resource-requests-and-limits&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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 та памʼяті для кожного Podʼа, гарантуючи, що він має необхідні ресурси для роботи. Обмеження ресурсів обмежують кількість CPU та памʼяті, яку може використовувати Pod, запобігаючи тому, щоб жоден окремий Pod не споживав надмірні ресурси та потенційно не позбавляв ресурсів інші Podʼи. Коли запити та обмеження ресурсів не встановлені:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Нестача ресурсів: Podʼи можуть отримувати недостатньо ресурсів, що призводить до зниження продуктивності або збоїв. Це відбувається тому, що Kubernetes планує Podʼи на основі цих запитів. Без них планувальник може розмістити занадто багато Podʼів на одному вузлі, що призводить до конкуренції за ресурси та вузьких місць у продуктивності.&lt;/li&gt;
&lt;li&gt;Привласнення ресурсів: З іншого боку, без обмежень Pod може споживати більше, ніж йому належить, впливаючи на продуктивність і стабільність інших Podʼів на тому ж вузлі. Це може призвести до таких проблем, як виселення або знищення інших Podʼів за допомогою Out-Of-Memory (OOM) killer через брак доступної памʼяті.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;how-to-avoid-it&#34;&gt;Як уникнути цього:&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-avoid-it&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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-59083--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;: На початку я ніколи не думав про обмеження памʼяті. Здавалося, що все гаразд на моєму локальному кластері. Потім, у більшому середовищі, Podʼи раз у раз отримували &lt;em&gt;OOMKilled&lt;/em&gt;. Урок засвоєно. Для отримання детальних інструкцій щодо налаштування запитів і обмежень ресурсів для ваших контейнерів, будь ласка, зверніться до &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/assign-memory-resource/&#34;&gt;Призначення ресурсів памʼяті для контейнерів і Podʼів&lt;/a&gt; (частина офіційної документації Kubernetes).&lt;/p&gt;
&lt;h2 id=&#34;2-underestimating-liveness-and-readiness-probes&#34;&gt;2. Недооцінка проб життєздатності та готовності&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-underestimating-liveness-and-readiness-probes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-avoid-it-1&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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-59083--kubernetes-io-main-staging.netlify.app/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;a class=&#34;td-heading-self-link&#34; href=&#34;#3-we-ll-just-look-at-container-logs-famous-last-words&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-avoid-it-2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;a class=&#34;td-heading-self-link&#34; href=&#34;#4-treating-dev-and-prod-exactly-the-same&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-avoid-it-3&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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;Витягніть специфічну для середовища конфігурацію в ConfigMap і / або Secret. Ви можете використовувати спеціалізований інструмент, такий як &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;a class=&#34;td-heading-self-link&#34; href=&#34;#5-leaving-old-stuff-floating-around&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: У кластері залишаються невикористані або застарілі ресурси, такі як Deployment, Service, ConfigMap або PersistentVolumeClaim. Це часто відбувається тому, що Kubernetes не видаляє ресурси автоматично, якщо не вказано явно, і немає вбудованого механізму для відстеження приналежності або терміну придатності. З часом ці забуті обʼєкти можуть накопичуватися, споживаючи ресурси кластера, збільшуючи витрати на хостинг у хмарі та створюючи операційну плутанину, особливо коли застарілі Service або LoadBalancer продовжують маршрутизувати трафік.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-4&#34;&gt;Як уникнути цього:&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-avoid-it-4&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&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-59083--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;a class=&#34;td-heading-self-link&#34; href=&#34;#6-diving-too-deep-into-networking-too-soon&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Пастка&lt;/strong&gt;: Впровадження розширених мережевих рішень, таких як service mesh, власні втулки CNI або міжкластерна комунікація, до повного розуміння нативних мережевих примітивів Kubernetes. Це часто трапляється, коли команди реалізують такі можливості, як маршрутизація трафіку, спостережуваність або mTLS, використовуючи зовнішні інструменти, не освоївши спочатку, як працює основна мережа Kubernetes: включаючи комунікацію Pod-to-Pod, Service типу ClusterIP, DNS-резолюцію та базову обробку вхідного трафіку. В результаті проблеми, повʼязані з мережею, стають важчими для усунення, особливо коли оверлеї вводять додаткові абстракції та точки відмови.&lt;/p&gt;
&lt;h3 id=&#34;how-to-avoid-it-5&#34;&gt;Як уникнути цього:&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-avoid-it-5&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Почніть з малого: Deployment, Service та базовий контролер Ingress, наприклад, на основі NGINX (наприклад, Ingress-NGINX).&lt;/li&gt;
&lt;li&gt;Переконайтеся, що ви розумієте, як трафік проходить у кластері, як працює виявлення сервісів і як налаштована DNS.&lt;/li&gt;
&lt;li&gt;Переходьте до повноцінного service mesh або розширених можливостей 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;a class=&#34;td-heading-self-link&#34; href=&#34;#7-going-too-light-on-security-and-rbac&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&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;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-avoid-it-6&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Використовуйте &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/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-59083--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;a class=&#34;td-heading-self-link&#34; href=&#34;#final-thoughts&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes дивовижний, але він не є провидцем, він не зробить магічно правильні речі, якщо ви не скажете йому, що вам потрібно. Памʼятаючи про ці пастки, ви уникнете головного болю та марної трати часу. Помилки трапляються (повірте, я зробив свою частку), але кожна з них — це можливість дізнатися більше про те, як Kubernetes насправді працює під капотом. Якщо ви хочете заглибитися, &lt;a href=&#34;https://deploy-preview-59083--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>Попередній огляд Kubernetes v1.34</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2025/07/28/kubernetes-v1-34-sneak-peek/</link>
      <pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2025/07/28/kubernetes-v1-34-sneak-peek/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes v1.34 очікукється наприкінці серпня 2025 року. Хоча він не міститиме видалень чи застарівань, у ньому буде велика кількість покращень. Ось деякі з функцій, які нас найбільше зацікавили в цьому циклі!&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що ця інформація відображає поточний стан розробки v1.34 і може змінитися до випуску нової версії.&lt;/p&gt;
&lt;h2 id=&#34;featured-enhancements-of-kubernetes-v1-34&#34;&gt;Основні покращення Kubernetes v1.34&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#featured-enhancements-of-kubernetes-v1-34&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Нижче наведено деякі з помітних покращень, які, ймовірно, будуть включені до випуску v1.34, але це не вичерпний перелік усіх запланованих змін, і вміст релізу може змінюватися.&lt;/p&gt;
&lt;h3 id=&#34;the-core-of-dra-targets-stable&#34;&gt;Ядро DRA переходить у стабільний стан&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-core-of-dra-targets-stable&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;Динамічний розподіл ресурсів&lt;/a&gt; (DRA) забезпечує гнучкий спосіб категоризації, подання заявок та використання пристроїв, таких як GPU або спеціалізоване обладнання, у вашому кластері Kubernetes.&lt;/p&gt;
&lt;p&gt;З моменту випуску v1.30 DRA базується на заявках на пристрої із &lt;em&gt;структурованими параметрами&lt;/em&gt;, які є непрозорими для ядра Kubernetes. Відповідна пропозиція (&lt;a href=&#34;https://kep.k8s.io/4381&#34;&gt;KEP-4381&lt;/a&gt;) щодо покращення, була створена під впливом концепцій динамічного виділення сховищ. DRA зі структурованими параметрами використовує набір допоміжних API-типів: ResourceClaim, DeviceClass, ResourceClaimTemplate та ResourceSlice у групі &lt;code&gt;resource.k8s.io&lt;/code&gt;, а також розширює &lt;code&gt;.spec&lt;/code&gt; для Pod новим полем &lt;code&gt;resourceClaims&lt;/code&gt;. Ядро DRA планує перейти у стабільний стан у Kubernetes v1.34.&lt;/p&gt;
&lt;p&gt;З DRA драйвери пристроїв та адміністратори кластерів визначають класи пристроїв, доступні для використання. Робочі навантаження можуть подавати заявки на пристрої із зазначенням класу пристроїв у запитах. Kubernetes виділяє відповідні пристрої для конкретних заявок і розміщує відповідні Podʼи на вузлах, які мають доступ до виділених пристроїв. Ця система забезпечує гнучку фільтрацію пристроїв за допомогою CEL, централізовану категоризацію пристроїв та спрощені запити Podʼів.&lt;/p&gt;
&lt;p&gt;Після переходу цієї функції у стабільний стан API &lt;code&gt;resource.k8s.io/v1&lt;/code&gt; буде стандартно доступний.&lt;/p&gt;
&lt;h3 id=&#34;serviceaccount-tokens-image-pull-authentication&#34;&gt;Токени ServiceAccount для автентифікації для завантаження образів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#serviceaccount-tokens-image-pull-authentication&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Інтеграція токенів &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/security/service-accounts/&#34;&gt;ServiceAccount&lt;/a&gt; для провайдерів облікових даних &lt;code&gt;kubelet&lt;/code&gt; ймовірно досягне бета-стадії та буде стандартно увімкнена у Kubernetes v1.34. Це дозволяє &lt;code&gt;kubelet&lt;/code&gt; використовувати ці токени для завантаження контейнерних образів з реєстрів, які потребують автентифікації.&lt;/p&gt;
&lt;p&gt;Підтримка вже існує як alpha і відстежується у &lt;a href=&#34;https://kep.k8s.io/4412&#34;&gt;KEP-4412&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alpha-інтеграція дозволяє &lt;code&gt;kubelet&lt;/code&gt; використовувати короткострокові, токени ServiceAccount (з OIDC-сумісною семантикою) з автоматичною ротацією для автентифікації у реєстрі контейнерних образів. Кожен токен прив’язаний до відповідного Podʼа; механізм замінює потребу у довгострокових секретах для завантаження образів.&lt;/p&gt;
&lt;p&gt;Впровадження цього підходу знижує ризики безпеки, підтримує ідентичність на рівні робочого навантаження та зменшує операційні витрати. Це наближає автентифікацію при завантаженні образів до сучасних практик.&lt;/p&gt;
&lt;h3 id=&#34;pod-replacement-policy-for-deployment&#34;&gt;Політика заміни Pod в Deployment&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pod-replacement-policy-for-deployment&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Після змін в &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/controllers/deployment/&#34;&gt;Deployment&lt;/a&gt; завершення Podʼів може тривати певний час і споживати додаткові ресурси. У рамках &lt;a href=&#34;https://kep.k8s.io/3973&#34;&gt;KEP-3973&lt;/a&gt; буде додано поле &lt;code&gt;.spec.podReplacementPolicy&lt;/code&gt; (як alpha) для Deployment.&lt;/p&gt;
&lt;p&gt;Якщо функція увімкнена у вашому кластері, ви зможете обрати одну з двох політик:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;TerminationStarted&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Створює нові Podʼи, як тільки старі починають процес завершення роботи, що прискорює оновлення, але може збільшити споживання ресурсів.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;TerminationComplete&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Чекає повного завершення роботи старих Podʼів перед створенням нових, що забезпечує контрольоване споживання ресурсів.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Ця функція робить поведінку Deployment більш передбачуваною, дозволяючи обирати, коли створювати нові Podʼи, під час оновлення чи масштабування. Це корисно для кластерів із обмеженими ресурсами або для навантажень із тривалим часом завершенням.&lt;/p&gt;
&lt;p&gt;Очікується, що функція буде доступна як alpha і може бути увімкнена через функціональні можливості &lt;code&gt;DeploymentPodReplacementPolicy&lt;/code&gt; та &lt;code&gt;DeploymentReplicaSetTerminatingReplicas&lt;/code&gt; в API-сервері та kube-controller-manager.&lt;/p&gt;
&lt;h3 id=&#34;production-ready-tracing-for-kubelet-and-api-server&#34;&gt;Готовий до промислового використання трейсинг для &lt;code&gt;kubelet&lt;/code&gt; та API Server&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#production-ready-tracing-for-kubelet-and-api-server&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для вирішення проблеми налагодження на рівні вузла шляхом зіставлення розрізнених логів, &lt;a href=&#34;https://kep.k8s.io/2831&#34;&gt;KEP-2831&lt;/a&gt; забезпечує глибоке, контекстне розуміння роботи &lt;code&gt;kubelet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Функція інструментує критичні операції &lt;code&gt;kubelet&lt;/code&gt;, особливо gRPC-виклики до Container Runtime Interface (CRI), використовуючи стандарт OpenTelemetry. Це дозволяє операторам візуалізувати весь життєвий цикл подій (наприклад, запуск Podʼів) для визначення джерел затримок та помилок. Найпотужніша частина — передача trace ID у запитах до контейнерного рушія, що дозволяє їм зв’язувати свої власні відрізки.&lt;/p&gt;
&lt;p&gt;Це доповнюється паралельним покращенням, &lt;a href=&#34;https://kep.k8s.io/647&#34;&gt;KEP-647&lt;/a&gt;, яке приносить такі ж можливості трейсингу до API-сервера Kubernetes. Разом ці покращення забезпечують більш цілісний, наскрізний огляд подій, спрощуючи пошук затримок та помилок від панелі управління до вузла. Обидві функції пройшли офіційний процес релізу Kubernetes. &lt;a href=&#34;https://kep.k8s.io/2831&#34;&gt;KEP-2831&lt;/a&gt; був представлений як alpha у v1.25, а &lt;a href=&#34;https://kep.k8s.io/647&#34;&gt;KEP-647&lt;/a&gt; — як alpha у v1.22. Обидва були підвищені до beta у v1.27. У v1.34 планується, що вони перейдуть у стабільний стан.&lt;/p&gt;
&lt;h3 id=&#34;prefersamezone-and-prefersamenode-traffic-distribution-for-service&#34;&gt;&lt;code&gt;PreferSameZone&lt;/code&gt; та &lt;code&gt;PreferSameNode&lt;/code&gt; для розподілу трафіку у Service&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#prefersamezone-and-prefersamenode-traffic-distribution-for-service&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Поле &lt;code&gt;spec.trafficDistribution&lt;/code&gt; у &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/service/&#34;&gt;Service&lt;/a&gt; дозволяє вказати переваги щодо маршрутизації трафіку до точок доступу Service.&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 вона планує перейти у beta зі стандартним її увімкненням.&lt;/p&gt;
&lt;h3 id=&#34;support-for-kyaml-a-kubernetes-dialect-of-yaml&#34;&gt;Підтримка KYAML: діалекту YAML для Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-for-kyaml-a-kubernetes-dialect-of-yaml&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;KYAML — це безпечніша та менш неоднозначна підмножина YAML, спеціально розроблена для Kubernetes. Незалежно від версії Kubernetes, ви зможете використовувати KYAML для написання маніфестів чи Helm-чартів. Ви можете писати KYAML і передавати його як вхідні дані у &lt;strong&gt;будь-яку&lt;/strong&gt; версію &lt;code&gt;kubectl&lt;/code&gt;, оскільки всі KYAML-файли також є валідними YAML. З kubectl v1.34 очікується можливість запитувати вивід у форматі KYAML (&lt;code&gt;kubectl get -o kyaml …&lt;/code&gt;). За бажанням, ви можете й надалі отримувати вихід у форматі JSON або YAML.&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;&lt;a href=&#34;https://kep.k8s.io/5295&#34;&gt;KEP-5295&lt;/a&gt; представляє KYAML, який вирішує основні проблеми:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Обовʼязкове використання подвійних лапок для рядкових (string) значень&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Не вказувати ключі в лапках, якщо вони не є потенційно неоднозначними&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Завжди використовує &lt;code&gt;{}&lt;/code&gt; для відображень (асоціативних масивів)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Завжди використовує &lt;code&gt;[]&lt;/code&gt; для списків&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це схоже на JSON, але на відміну від JSON, KYAML підтримує коментарі, дозволяє коми у кінці та не вимагає лапок для ключів.&lt;/p&gt;
&lt;p&gt;Очікуємо, що KYAML буде представлений як новий формат виводу для &lt;code&gt;kubectl&lt;/code&gt; v1.34. Як і для всіх цих функцій, жодна з них не гарантована; слідкуйте за оновленнями!&lt;/p&gt;
&lt;p&gt;KYAML є і залишатиметься &lt;strong&gt;строгою підмножиною YAML&lt;/strong&gt;, що гарантує можливість парсингу KYAML-документів будь-яким YAML-парсером. Kubernetes не вимагає спеціального формату KYAML для вхідних даних, і змінювати це не планується.&lt;/p&gt;
&lt;h3 id=&#34;fine-grained-autoscaling-control-with-hpa-configurable-tolerance&#34;&gt;Точне регулювання автоматичного масштабування з налаштовуваною толерантністю HPA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#fine-grained-autoscaling-control-with-hpa-configurable-tolerance&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://kep.k8s.io/4951&#34;&gt;KEP-4951&lt;/a&gt; додає можливість налаштовувати толерантність автомасштабування для кожного HPA окремо, замість стандартного кластерного значення 10%, яке часто є занадто грубим для різних навантажень. Покращення додає необов’язкове поле &lt;code&gt;tolerance&lt;/code&gt; до секцій &lt;code&gt;spec.behavior.scaleUp&lt;/code&gt; та &lt;code&gt;spec.behavior.scaleDown&lt;/code&gt; HPA, дозволяючи різні значення толерантності для масштабування вгору та вниз, що особливо корисно, оскільки чутливість до масштабування вгору зазвичай важливіша для обробки піків трафіку.&lt;/p&gt;
&lt;p&gt;Функція була випущена як alpha у Kubernetes v1.33 з функціональною можливістю &lt;code&gt;HPAConfigurableTolerance&lt;/code&gt;, а у v1.34 планує перейти у beta. Це покращення допомагає вирішити проблеми масштабування для великих розгортань, де толерантність для масштабування вниз на 10% може означати те, що в роботі залишаться сотні зайвих Podʼів. Новий підхід дозволяє оптимізувати поведінку для кожного навантаження окремо.&lt;/p&gt;
&lt;h2 id=&#34;want-to-learn-more&#34;&gt;Хочете дізнатися більше?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#want-to-learn-more&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Нові функції та застарівання також оголошуються у нотатках до релізу Kubernetes. Офіційний анонс новинок у &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.34.md&#34;&gt;Kubernetes v1.34&lt;/a&gt; буде частиною CHANGELOG для цього випуску.&lt;/p&gt;
&lt;p&gt;Випуск Kubernetes v1.34 заплановано на &lt;strong&gt;середу, 27 серпня 2025 року&lt;/strong&gt;. Слідкуйте за оновленнями!&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Долучайтеся&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#get-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Найпростіший спосіб долучитися до Kubernetes — приєднатися до однієї з багатьох &lt;a href=&#34;https://github.com/kubernetes/community/blob/master/sig-list.md&#34;&gt;Special Interest Groups&lt;/a&gt; (SIG), які відповідають вашим інтересам. Маєте щось, чим хочете поділитися з Kubernetes-спільнотою? Висловіть свою думку на щотижневій &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;community meeting&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;Поділіться своєю Kubernetes &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt;&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 Release Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Оголошення про випуск etcd v3.6.0</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2025/05/15/announcing-etcd-3.6/</link>
      <pubDate>Thu, 15 May 2025 16:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2025/05/15/announcing-etcd-3.6/</guid>
      <description>
        
        
        &lt;p&gt;&lt;em&gt;Це оголошення спочатку було &lt;a href=&#34;https://etcd.io/blog/2025/announcing-etcd-3.6/&#34;&gt;опубліковане&lt;/a&gt; в блозі etcd.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Сьогодні ми випускаємо &lt;a href=&#34;https://github.com/etcd-io/etcd/releases/tag/v3.6.0&#34;&gt;etcd v3.6.0&lt;/a&gt;, перший мінорний реліз з моменту випуску etcd v3.5.0 15 червня 2021 року. Цей реліз вводить кілька нових можливостей, робить значний прогрес у тривалих зусиллях, таких як підтримка зниження версії та міграція на v3store, і вирішує численні критичні та основні проблеми. Він також включає великі оптимізації в використанні памʼяті, покращуючи ефективність і продуктивність.&lt;/p&gt;
&lt;p&gt;На додачу до можливостей v3.6.0, etcd приєднався до Kubernetes як SIG (sig-etcd), що дозволяє нам покращити стійкість проєкту. Ми впровадили систематичне тестування на надійність, щоб забезпечити правильність і надійність. За допомоги робочої групи etcd-operator ми плануємо також покращити зручність використання.&lt;/p&gt;
&lt;p&gt;Далі наведені найзначніші зміни в etcd v3.6.0, а також обговорення планів майбутнього розвитку. Для детального списку змін, будь ласка, зверніться до &lt;a href=&#34;https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.6.md&#34;&gt;CHANGELOG-3.6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щира подяка всім учасникам, які зробили цей реліз можливим!&lt;/p&gt;
&lt;h2 id=&#34;security&#34;&gt;Безпека&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#security&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;etcd ставиться до безпеки серйозно. Щоб підвищити безпеку програмного забезпечення в v3.6.0, ми покращили наші перевірки робочого процесу, інтегрувавши &lt;code&gt;govulncheck&lt;/code&gt; для сканування вихідного коду та &lt;code&gt;trivy&lt;/code&gt; для сканування контейнерних образів. Ці покращення також були перенесені на підтримувані стабільні релізи.&lt;/p&gt;
&lt;p&gt;etcd продовжує дотримуватися &lt;a href=&#34;https://github.com/etcd-io/etcd/blob/main/security/security-release-process.md&#34;&gt;процесу безпеки випуску&lt;/a&gt; для забезпечення належного керування та вирішення вразливостей.&lt;/p&gt;
&lt;h2 id=&#34;features&#34;&gt;Можливості&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#features&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;migration-to-v3store&#34;&gt;Міграція на v3store&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#migration-to-v3store&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;v2store був визнаний застарілим з моменту випуску etcd v3.4, але його все ще можна було активувати за допомогою &lt;code&gt;--enable-v2&lt;/code&gt;. Він залишався джерелом істини для даних про членство. У etcd v3.6.0 v2store більше не може бути активований, оскільки прапорець &lt;code&gt;--enable-v2&lt;/code&gt; був видалений, а v3store став єдиним джерелом істини для даних про членство.&lt;/p&gt;
&lt;p&gt;Хоча v2store все ще існує в v3.6.0, etcd не зможе запуститися, якщо він міститиме будь-які дані, крім інформації про членство. Щоб допомогти з міграцією, etcd v3.5.18+ надає команду &lt;code&gt;etcdutl check v2store&lt;/code&gt;, яка перевіряє, чи містить v2store лише дані про членство (див. &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/19113&#34;&gt;PR 19113&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;У порівнянні з v2store, v3store пропонує кращу продуктивність і транзакційну підтримку. Крім того, саме цей рушій зберігання активно підтримуватиметься надалі.&lt;/p&gt;
&lt;p&gt;Видалення v2store все ще триває і відстежується в &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/12913&#34;&gt;issues/12913&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;downgrade&#34;&gt;Зниження версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#downgrade&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;etcd v3.6.0 — це перша версія, яка повністю підтримує зниження версії. Зусилля для цього завдання зниження версії охоплюють обидві версії 3.5 і 3.6, а вся повʼязана робота відстежується в &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/11716&#34;&gt;issues/11716&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На високому рівні процес охоплює міграцію схеми даних до цільової версії (наприклад, v3.5), а потім — поетапне зниження версії.&lt;/p&gt;
&lt;p&gt;Переконайтеся, що кластер справний, і зробіть резервну копію знімка. Перевірте, чи можливе зниження версії:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ etcdctl downgrade validate 3.5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Downgrade validate success, cluster version 3.6
&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; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ etcdctl downgrade &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; 3.5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Downgrade &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; success, cluster version 3.6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;etcd перенесе схему даних у фоновому режимі. Після завершення перейдіть до поетапного зниження версії.&lt;/p&gt;
&lt;p&gt;За деталями звертайтесь до керівництва &lt;a href=&#34;https://etcd.io/docs/v3.6/downgrades/downgrade_3_6/&#34;&gt;Downgrade-3.6&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;feature-gates&#34;&gt;Функціональні можливості&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#feature-gates&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У etcd v3.6.0 ми впровадили функціональні можливості (feature gates) в стилі Kubernetes для керування новими можливостями. Раніше ми позначали нестабільні можливості префіксом &lt;code&gt;--experimental&lt;/code&gt; у назвах прапорців. Префікс видалявся, щойно можливість ставала стабільною, що спричиняло несумісну зміну. Тепер можливості починаються з Alpha, переходять до Beta, потім до GA або стають застарілими. Це забезпечує значно плавніше оновлення та зниження версії для користувачів.&lt;/p&gt;
&lt;p&gt;Дивіться &lt;a href=&#34;https://etcd.io/docs/v3.6/feature-gates/&#34;&gt;feature-gates&lt;/a&gt; для деталей.&lt;/p&gt;
&lt;h3 id=&#34;livezreadyz-checks&#34;&gt;Перевірки livez / readyz&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#livezreadyz-checks&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;etcd тепер підтримує точки доступу &lt;code&gt;/livez&lt;/code&gt; і &lt;code&gt;/readyz&lt;/code&gt;, що відповідає пробам життєздатності та готовності в Kubernetes. &lt;code&gt;/livez&lt;/code&gt; вказує, чи є екземпляр etcd життєздатним, тоді як &lt;code&gt;/readyz&lt;/code&gt; вказує, коли він готовий обслуговувати запити. Ця можливість також була перенесена на release-3.5 (починаючи з v3.5.11) і release-3.4 (починаючи з v3.4.29). Дивіться &lt;a href=&#34;https://etcd.io/docs/v3.6/op-guide/monitoring/&#34;&gt;livez/readyz&lt;/a&gt; для деталей.&lt;/p&gt;
&lt;p&gt;Наявна точка доступу &lt;code&gt;/health&lt;/code&gt; залишається функціональною. &lt;code&gt;/livez&lt;/code&gt; подібна до &lt;code&gt;/health?serializable=true&lt;/code&gt;, тоді як &lt;code&gt;/readyz&lt;/code&gt; подібна до &lt;code&gt;/health&lt;/code&gt; або &lt;code&gt;/health?serializable=false&lt;/code&gt;. Очевидно, що точки доступу &lt;code&gt;/livez&lt;/code&gt; і &lt;code&gt;/readyz&lt;/code&gt; надають чіткішу семантику і легші для розуміння.&lt;/p&gt;
&lt;h3 id=&#34;v3discovery&#34;&gt;v3discovery&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#v3discovery&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;В etcd v3.6.0 був представлений новий протокол виявлення &lt;a href=&#34;https://etcd.io/docs/v3.6/dev-internal/discovery_protocol/&#34;&gt;v3discovery&lt;/a&gt;, заснований на clientv3. Він полегшує виявлення всіх членів кластера під час фази початкового завантаження.&lt;/p&gt;
&lt;p&gt;Попередній протокол &lt;a href=&#34;https://etcd.io/docs/v3.5/dev-internal/discovery_protocol/&#34;&gt;v2discovery&lt;/a&gt;, заснований на clientv2, був визнаний застарілим. Крім того, публічний сервіс виявлення за адресою &lt;a href=&#34;https://discovery.etcd.io/&#34;&gt;https://discovery.etcd.io/&lt;/a&gt;, який покладався на v2discovery, більше не підтримується.&lt;/p&gt;
&lt;h2 id=&#34;performance&#34;&gt;Продуктивність&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#performance&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;memory&#34;&gt;Памʼять&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#memory&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У цьому випуску ми зменшили середнє споживання памʼяті щонайменше на 50% (див. Зображення 1). Це покращення в основному зумовлено двома змінами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Типове значення для &lt;code&gt;--snapshot-count&lt;/code&gt; було зменшено з 100 000 у v3.5 до 10 000 у v3.6. В результаті etcd v3.6 тепер зберігає лише близько 10% історичних записів у порівнянні з v3.5.&lt;/li&gt;
&lt;li&gt;Історія Raft стискається частіше, про що йдеться в &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/18825&#34;&gt;PR/18825&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2025/05/15/announcing-etcd-3.6/figure-1.png&#34;
         alt=&#34;Схема використання памʼяті&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Зображення 1:&lt;/strong&gt; Порівняння використання памʼяті між etcd v3.5.20 і v3.6.0-rc.2 за різними співвідношеннями читання/запису. Кожен графік показує використання памʼяті з часом з певним співвідношенням читання/запису. Червона лінія представляє etcd v3.5.20, тоді як бірюзова лінія представляє v3.6.0-rc.2. У всіх протестованих співвідношеннях v3.6.0-rc.2 демонструє нижче і більш стабільне використання памʼяті.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;throughput&#34;&gt;Пропускна здатність&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#throughput&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У порівнянні з v3.5, etcd v3.6 забезпечує середнє поліпшення продуктивності приблизно на 10% як у читанні, так і в запису (див. Зображення 2, 3, 4 і 5). Це поліпшення не повʼязане з жодною окремою великою зміною, а є кумулятивним ефектом кількох незначних вдосконалень. Одним з таких прикладів є оптимізація запитів до вільних сторінок, введена в &lt;a href=&#34;https://github.com/etcd-io/bbolt/pull/419&#34;&gt;PR/419&lt;/a&gt;.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2025/05/15/announcing-etcd-3.6/figure-2.png&#34;
         alt=&#34;Продуктивність транзакцій читання etcd з високим коефіцієнтом запису&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Зображення 2:&lt;/strong&gt; Порівняння пропускної здатності читання між etcd v3.5.20 і v3.6.0-rc.2 за високого коефіцієнта запису. Коефіцієнт читання/запису становить 0.0078, що означає 1 читання на 128 записів. Права смуга показує відсоткове поліпшення пропускної здатності читання v3.6.0-rc.2 в порівнянні з v3.5.20, яке коливається від 3.21% до 25.59%.&lt;/em&gt;&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2025/05/15/announcing-etcd-3.6/figure-3.png&#34;
         alt=&#34;Продуктивність транзакцій etcd читання з високим коефіцієнтом читання&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Зображення 3:&lt;/strong&gt; Порівняння пропускної здатності читання між etcd v3.5.20 і v3.6.0-rc.2 за високого коефіцієнта читання. Коефіцієнт читання/запису становить 8, що означає 8 читань на 1 запис. Права смуга показує відсоткове поліпшення пропускної здатності читання v3.6.0-rc.2 в порівнянні з v3.5.20, яке коливається від 4.38% до 27.20%.&lt;/em&gt;&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2025/05/15/announcing-etcd-3.6/figure-4.png&#34;
         alt=&#34;Продуктивність транзакцій запису etcd з високим коефіцієнтом запису&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Зображення 4:&lt;/strong&gt; Порівняння пропускної здатності запису між etcd v3.5.20 і v3.6.0-rc.2 за високого коефіцієнта запису. Коефіцієнт читання/запису становить 0.0078, що означає 1 читання на 128 записів. Права смуга показує відсоткове поліпшення пропускної здатності запису v3.6.0-rc.2 в порівнянні з v3.5.20, яке коливається від 2.95% до 24.24%.&lt;/em&gt;&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2025/05/15/announcing-etcd-3.6/figure-5.png&#34;
         alt=&#34;Продуктивність транзакцій запису etcd з високим коефіцієнтом читання&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Зображення 5:&lt;/strong&gt; Порівняння пропускної здатності запису між etcd v3.5.20 і v3.6.0-rc.2 за високого коефіцієнта читання. Коефіцієнт читання/запису становить 8, що означає 8 читань на 1 запис. Права смуга показує відсоткове поліпшення пропускної здатності запису v3.6.0-rc.2 в порівнянні з v3.5.20, яке коливається від 3.86% до 28.37%.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;breaking-changes&#34;&gt;Кардинальні зміни&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#breaking-changes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У цьому розділі висвітлено кілька помітних несумісних змін. Повний список можна знайти в &lt;a href=&#34;https://etcd.io/docs/v3.6/upgrades/upgrade_3_6/&#34;&gt;Оновлення etcd з v3.5 до v3.6&lt;/a&gt; та &lt;a href=&#34;https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.6.md&#34;&gt;CHANGELOG-3.6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Старі бінарні файли несумісні з новими версіями схем&lt;/p&gt;
&lt;p&gt;Старі бінарні файли etcd несумісні з новими версіями схем даних. Наприклад, etcd 3.5 не може бути запущений з даними, створеними etcd 3.6, а etcd 3.4 не може бути запущений з даними, створеними як 3.5, так і 3.6.&lt;/p&gt;
&lt;p&gt;При зниженні версії etcd важливо дотримуватися задокументованої процедури зниження версії. Проста заміна бінарного файлу або образу призведе до проблеми несумісності.&lt;/p&gt;
&lt;h3 id=&#34;peer-endpoints-no-longer-serve-client-requests&#34;&gt;Точки доступу учасників більше не обслуговують запити клієнтів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#peer-endpoints-no-longer-serve-client-requests&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Точки доступу клієнтів (&lt;code&gt;--advertise-client-urls&lt;/code&gt;) призначені лише для обслуговування запитів клієнтів, тоді як точки доступу учасників (&lt;code&gt;--initial-advertise-peer-urls&lt;/code&gt;) призначені виключно для звʼязку між учасниками. Однак через недогляд у реалізації точки доступу учасників також могли обробляти запити клієнтів в etcd 3.4 і 3.5. Ця поведінка була оманливою і сприяла неправильним шаблонам використання. У etcd 3.6 ця оманлива поведінка була виправлена за допомогою &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/13565&#34;&gt;PR/13565&lt;/a&gt;; точки доступу учасників більше не обслуговують запити клієнтів.&lt;/p&gt;
&lt;h3 id=&#34;clear-boundary-between-etcdctl-and-etcdutl&#34;&gt;Чітка межа між etcdctl і etcdutl&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#clear-boundary-between-etcdctl-and-etcdutl&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Обидва &lt;code&gt;etcdctl&lt;/code&gt; і &lt;code&gt;etcdutl&lt;/code&gt; є інструментами командного рядка. &lt;code&gt;etcdutl&lt;/code&gt; є офлайн-утилітою, призначеною для роботи безпосередньо з файлами даних etcd, тоді як &lt;code&gt;etcdctl&lt;/code&gt; є онлайн-інструментом, який взаємодіє з etcd через мережу. Раніше між ними існували деякі перекриття функціональності, але ці перекриття були усунені в 3.6.0.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Вилучено &lt;code&gt;etcdctl defrag --data-dir&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Команда &lt;code&gt;etcdctl defrag&lt;/code&gt; підтримує лише онлайн-дефрагментацію і більше не підтримує офлайн-дефрагментацію. Щоб виконати офлайн-дефрагментацію, використовуйте команду &lt;code&gt;etcdutl defrag --data-dir&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Вилучено &lt;code&gt;etcdctl snapshot status&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;etcdctl&lt;/code&gt; більше не підтримує отримання статусу знімка. Використовуйте команду &lt;code&gt;etcdutl snapshot status&lt;/code&gt; замість цього.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Вилучено &lt;code&gt;etcdctl snapshot restore&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;etcdctl&lt;/code&gt; більше не підтримує відновлення з знімка. Використовуйте команду &lt;code&gt;etcdutl snapshot restore&lt;/code&gt; замість цього.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;critical-bug-fixes&#34;&gt;Виправлення критичних помилок&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#critical-bug-fixes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Коректність завжди була основним пріоритетом для проєкту etcd. У процесі розробки 3.6.0 ми знайшли та виправили кілька помітних помилок, які могли призвести до неузгодженості даних у певних випадках. Ці виправлення були перенесені до попередніх версій, але ми вважаємо, що вони заслуговують на окрему згадку тут.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Неузгодженість даних при аварійному завершенні під навантаженням&lt;/p&gt;
&lt;p&gt;Раніше, коли etcd застосовував дані, він спочатку оновлював consistent-index, а потім фіксував дані. Однак ці операції не були атомарними. Якщо etcd зазнавав аварії між цими операціями, це могло призвести до неузгодженості даних (див. &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/13766&#34;&gt;issue/13766&lt;/a&gt;). Проблема зʼявилася в v3.5.0, її виправлено в v3.5.3 за допомогою &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/13854&#34;&gt;PR/13854&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Порушення гарантії Durability API в кластері з одного вузла&lt;/p&gt;
&lt;p&gt;Коли клієнт записує дані та отримує успішну відповідь, очікується, що дані будуть збережені. Однак дані можуть бути втрачені, якщо etcd зазнає аварії одразу після надсилання успішної відповіді клієнту. Це була стара проблема (див. &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/14370&#34;&gt;issue/14370&lt;/a&gt;), яка впливала на всі попередні випуски. Вона була вирішена в v3.4.21 і v3.5.5 за допомогою &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/14400&#34;&gt;PR/14400&lt;/a&gt;, і виправлена на стороні raft в основній гілці (тепер release-3.6) з &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/14413&#34;&gt;PR/14413&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Неузгодженість ревізій при аварійному завершенні під час дефрагментації&lt;/p&gt;
&lt;p&gt;Якщо etcd зазнавав аварії під час операції дефрагментації, після перезапуску він міг повторно застосувати деякі записи, які вже були застосовані, що призводило до проблеми з неузгодженістю ревізій (див. обговорення в &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/14685&#34;&gt;PR/14685&lt;/a&gt;). Ця проблема зʼявилась в v3.5.0 і її було виправлено в v3.5.6 за допомогою &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/14730&#34;&gt;PR/14730&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade-issue&#34;&gt;Проблема з оновленням&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#upgrade-issue&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей розділ висвітлює поширену проблему &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/19557&#34;&gt;issues/19557&lt;/a&gt; в оновленні etcd з v3.5 до v3.6, яка може призвести до збою процесу оновлення. Для отримання докладних інструкцій з оновлення зверніться до &lt;a href=&#34;https://etcd.io/docs/v3.6/upgrades/upgrade_3_6/&#34;&gt;Оновлення etcd з v3.5 до v3.6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця проблема зʼявилась в etcd v3.5.1 і її було вирішено в v3.5.20.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Головне&lt;/strong&gt;: користувачі повинні спочатку оновитися до etcd v3.5.20 (або новішої патч-версії) перед оновленням до etcd v3.6.0; інакше оновлення може зазнати невдачі.&lt;/p&gt;
&lt;p&gt;Для отримання додаткової інформації та технічного контексту див. &lt;a href=&#34;https://etcd.io/blog/2025/upgrade_from_3.5_to_3.6_issue/&#34;&gt;upgrade_from_3.5_to_3.6_issue&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;testing&#34;&gt;Тестування&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#testing&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Ми впровадили &lt;a href=&#34;https://github.com/etcd-io/etcd/tree/main/tests/robustness&#34;&gt;тестування надійності&lt;/a&gt;, щоб перевірити коректність, яка завжди була нашим основним пріоритетом. Тест відтворює трафік різних типів і обсягів на кластері etcd, одночасно впроваджуючи випадкову точку відмови, записує всі операції (включаючи запити та відповіді) і, нарешті, виконує перевірку лінійної узгодженості. Він також перевіряє, що гарантії &lt;a href=&#34;https://etcd.io/docs/v3.5/learning/api_guarantees/#watch-apis&#34;&gt;Watch APIs&lt;/a&gt; не були порушені. Тестування надійності підвищує нашу впевненість у забезпеченні якості кожного випуску etcd.&lt;/p&gt;
&lt;p&gt;Ми мігрували більшість тестів робочого процесу etcd до інфраструктури тестування Prow Kubernetes, щоб використати її переваги, такі як зручні інформаційні панелі для перегляду результатів тестування та можливість для учасників повторно запускати невдалі тести самостійно.&lt;/p&gt;
&lt;h2 id=&#34;platforms&#34;&gt;Платформи&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#platforms&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Зберігаючи всі наявні підтримувані платформи, ми підвищили Linux/ARM64 до рівня підтримки Tier 1. Для отримання додаткової інформації зверніться до &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/15951&#34;&gt;issues/15951&lt;/a&gt;. Для отримання повного списку підтримуваних платформ, див. &lt;a href=&#34;https://etcd.io/docs/v3.6/op-guide/supported-platform/&#34;&gt;supported-platform&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;dependencies&#34;&gt;Залежності&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dependencies&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;dependency-bumping-guide&#34;&gt;Посібник з оновлення залежностей&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dependency-bumping-guide&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ми опублікували офіційний посібник з оновлення залежностей для основної гілки та стабільних випусків etcd. У ньому також описано, як оновити версію Go. Для отримання більш детальної інформації, будь ласка, зверніться до &lt;a href=&#34;https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/dependency_management.md&#34;&gt;dependency_management&lt;/a&gt;. Тепер, коли цей посібник доступний, будь-хто з учасників може допомогти з оновленням залежностей.&lt;/p&gt;
&lt;h3 id=&#34;core-dependency-updates&#34;&gt;Оновлення основних залежностей&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#core-dependency-updates&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/etcd-io/bbolt&#34;&gt;bbolt&lt;/a&gt; та &lt;a href=&#34;https://github.com/etcd-io/raft&#34;&gt;raft&lt;/a&gt; є двома основними залежностями etcd.&lt;/p&gt;
&lt;p&gt;Обидва etcd v3.4 і v3.5 залежать від bbolt v1.3, тоді як etcd v3.6 залежить від bbolt v1.4.&lt;/p&gt;
&lt;p&gt;Для гілок release-3.4 і release-3.5 raft включено безпосередньо в репозиторій etcd, тому etcd v3.4 і v3.5 не залежать від зовнішнього модуля raft. Починаючи з etcd v3.6, raft було переміщено до окремого репозиторію (&lt;a href=&#34;https://github.com/etcd-io/raft&#34;&gt;raft&lt;/a&gt;), а перший самостійний реліз raft — це v3.6.0. Як наслідок, etcd v3.6.0 залежить від raft v3.6.0.&lt;/p&gt;
&lt;p&gt;Будь ласка, дивіться таблицю нижче:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;версії etcd&lt;/th&gt;
          &lt;th&gt;версії bbolt&lt;/th&gt;
          &lt;th&gt;версії raft&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;3.4.x&lt;/td&gt;
          &lt;td&gt;v1.3.x&lt;/td&gt;
          &lt;td&gt;N/A&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3.5.x&lt;/td&gt;
          &lt;td&gt;v1.3.x&lt;/td&gt;
          &lt;td&gt;N/A&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3.6.x&lt;/td&gt;
          &lt;td&gt;v1.4.x&lt;/td&gt;
          &lt;td&gt;v3.6.x&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;grpc-gateway-v2&#34;&gt;grpc-gateway@v2&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#grpc-gateway-v2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ми оновили &lt;a href=&#34;https://github.com/grpc-ecosystem/grpc-gateway&#34;&gt;grpc-gateway&lt;/a&gt; з v1 до v2 через &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/16595&#34;&gt;PR/16595&lt;/a&gt; в etcd v3.6.0. Це є важливим кроком до міграції на &lt;a href=&#34;https://github.com/protocolbuffers/protobuf-go&#34;&gt;protobuf-go&lt;/a&gt;, другу основну версію реалізації API protocol buffers для Go.&lt;/p&gt;
&lt;p&gt;grpc-gateway@v2 призначений для роботи з &lt;a href=&#34;https://github.com/protocolbuffers/protobuf-go&#34;&gt;protobuf-go&lt;/a&gt;. Однак etcd v3.6 все ще залежить від застарілого &lt;a href=&#34;https://github.com/gogo/protobuf&#34;&gt;gogo/protobuf&lt;/a&gt;, який насправді є реалізацією protocol buffers v1. Щоб вирішити цю несумісність, ми застосували &lt;a href=&#34;https://github.com/etcd-io/etcd/blob/158b9e0d468d310c3edf4cf13f2458c51b0406fa/scripts/genproto.sh#L151-L184&#34;&gt;патч&lt;/a&gt; до згенерованих *.pb.gw.go файлів, щоб перетворити повідомлення v1 на повідомлення v2.&lt;/p&gt;
&lt;h3 id=&#34;grpc-ecosystem-go-grpc-middleware-providers-prometheus&#34;&gt;grpc-ecosystem/go-grpc-middleware/providers/prometheus&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#grpc-ecosystem-go-grpc-middleware-providers-prometheus&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ми перейшли з застарілого (і архівованого) &lt;a href=&#34;https://github.com/grpc-ecosystem/go-grpc-prometheus&#34;&gt;grpc-ecosystem/go-grpc-prometheus&lt;/a&gt; на &lt;a href=&#34;https://github.com/grpc-ecosystem/go-grpc-middleware/tree/main/providers/prometheus&#34;&gt;grpc-ecosystem/go-grpc-middleware/providers/prometheus&lt;/a&gt; у &lt;a href=&#34;https://github.com/etcd-io/etcd/pull/19195&#34;&gt;PR/19195&lt;/a&gt;. Ця зміна забезпечує подальшу підтримку та доступ до останніх можливостей і вдосконалень в інтеграції gRPC Prometheus.&lt;/p&gt;
&lt;h2 id=&#34;community&#34;&gt;Спільнота&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#community&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;В спільноті etcd відбуваються захопливі події, які відображають нашу постійну прихильність до зміцнення співпраці, покращення підтримки та розвитку врядування проєктом.&lt;/p&gt;
&lt;h3 id=&#34;etcd-becomes-a-kubernetes-sig&#34;&gt;etcd стає Kubernetes SIG&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#etcd-becomes-a-kubernetes-sig&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;etcd офіційно став Kubernetes Special Interest Group: SIG-etcd. Ця зміна відображає критичну роль etcd як основного сховища даних для Kubernetes і встановлює більш структуровану та прозору основу для довгострокового керування та співпраці між проєктами. Нова SIG допоможе спростити процес прийняття рішень, узгодити плани з потребами Kubernetes, і залучити більше учасників.&lt;/p&gt;
&lt;h3 id=&#34;new-contributors-maintainers-and-reviewers&#34;&gt;Нові учасники, супровідники та рецензенти&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#new-contributors-maintainers-and-reviewers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ми спостерігали активність, що постійно зростає, з боку учасників, що призвело до додавання трьох нових супровідників:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/fuweid&#34;&gt;fuweid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/jmhbnz&#34;&gt;jmhbnz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/wenjiaswe&#34;&gt;wenjiaswe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Їхній постійний внесок був вирішальним для просування проєкту вперед.&lt;/p&gt;
&lt;p&gt;Ми також вітаємо двох нових рецензентів у проєкті:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ivanvc&#34;&gt;ivanvc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/siyuanfoundation&#34;&gt;siyuanfoundation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ми цінуємо їхню відданість якості коду та готовність взяти на себе ширші обовʼязки з рецензування в межах спільноти.&lt;/p&gt;
&lt;p&gt;Нова команда випуску&lt;/p&gt;
&lt;p&gt;Ми сформували нову команду випуску, очолювану &lt;a href=&#34;https://github.com/ivanvc&#34;&gt;ivanvc&lt;/a&gt; та &lt;a href=&#34;https://github.com/jmhbnz&#34;&gt;jmhbnz&lt;/a&gt;, спростивши процес випуску шляхом автоматизації багатьох раніше ручних етапів. Надихнувшись Kubernetes SIG Release, ми прийняли кілька найкращих практик, включаючи чітко визначені ролі команди випуску та впровадження «тіней випуску» (release shadows) для підтримки обміну знаннями та стійкості команди. Ці зміни зробили наші випуски більш плавними та надійними, дозволяючи нам підходити до кожного випуску з більшою впевненістю та послідовністю.&lt;/p&gt;
&lt;h3 id=&#34;introducing-the-etcd-operator-working-group&#34;&gt;Представляємо etcd Operator Working Group&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#introducing-the-etcd-operator-working-group&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб ще більше покращити операційну досконалість etcd, ми сформували нову робочу групу: &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-etcd-operator&#34;&gt;WG-etcd-operator&lt;/a&gt;. Робоча група присвячена питанням забезпечення автоматичної та ефективної роботи кластерів etcd, які працюють у середовищі Kubernetes за допомогою etcd-operator.&lt;/p&gt;
&lt;h2 id=&#34;future-development&#34;&gt;Майбутній розвиток&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#future-development&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;v2store був визнаний застарілим з моменту виходу etcd v3.4, а прапорець &lt;code&gt;--enable-v2&lt;/code&gt; був повністю видалений у v3.6. Це означає, що починаючи з v3.6, більше немає способу увімкнути або використовувати v2store. Однак всередині etcd все ще ініціалізується зі спадкових знімків v2. Щоб усунути цю неузгодженість, ми плануємо змінити etcd так, щоб він ініціалізувався з v3store і відтворити записи WAL на основі &lt;code&gt;consistent-index&lt;/code&gt;. Ця робота відстежується в &lt;a href=&#34;https://github.com/etcd-io/etcd/issues/12913&#34;&gt;issues/12913&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Однією з найпостійніших проблем залишаються великі запити діапазону з kube-apiserver, які можуть призвести до аварійних зупинок процесів через їх непередбачувану природу. Можливість потокового діапазону, спочатку описана в &lt;a href=&#34;https://etcd.io/blog/2021/announcing-etcd-3.5/#future-roadmaps&#34;&gt;v3.5 release blog/Future roadmaps&lt;/a&gt;, залишається ідеєю, яку варто переглянути, щоб розвʼязати проблеми з великими запитами діапазону.&lt;/p&gt;
&lt;p&gt;Для отримання додаткової інформації та майбутніх планів, будь ласка, зверніться до &lt;a href=&#34;https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/roadmap.md&#34;&gt;планів розвитку etcd&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Огляд Kubernetes v1.30</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2024/03/12/kubernetes-1-30-upcoming-changes/</link>
      <pubDate>Tue, 12 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2024/03/12/kubernetes-1-30-upcoming-changes/</guid>
      <description>
        
        
        &lt;h2 id=&#34;a-quick-look-exciting-changes-in-kubernetes-v1.30&#34;&gt;Швидкий огляд: зміни у Kubernetes v1.30&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#a-quick-look-exciting-changes-in-kubernetes-v1.30&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Новий рік, новий реліз Kubernetes. Ми на половині релізного циклу і маємо чимало цікавих та чудових поліпшень у версії v1.30. Від абсолютно нових можливостей у режимі альфа до вже сталих функцій, які переходять у стабільний режим, а також довгоочікуваних поліпшень — цей випуск має щось для усіх, на що варто звернути увагу!&lt;/p&gt;
&lt;p&gt;Щоб підготувати вас до офіційного випуску, ось короткий огляд удосконалень, про які ми найбільше хочемо розповісти!&lt;/p&gt;
&lt;h2 id=&#34;major-changes-for-kubernetes-v1.30&#34;&gt;Основні зміни для Kubernetes v1.30&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#major-changes-for-kubernetes-v1.30&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;structured-parameters-for-dynamic-resource-allocation-kep-4381-https-kep-k8s-io-4381&#34;&gt;Структуровані параметри для динамічного розподілу ресурсів (&lt;a href=&#34;https://kep.k8s.io/4381&#34;&gt;KEP-4381&lt;/a&gt;)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#structured-parameters-for-dynamic-resource-allocation-kep-4381-https-kep-k8s-io-4381&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;Динамічний розподіл ресурсів&lt;/a&gt; було додано до Kubernetes у версії v1.26 у режимі альфа. Він визначає альтернативу традиційному API пристроїв для запиту доступу до ресурсів сторонніх постачальників. За концепцією, динамічний розподіл ресурсів використовує параметри для ресурсів, що є абсолютно непрозорими для ядра Kubernetes. Цей підхід створює проблему для Cluster Autoscaler (CA) чи будь-якого контролера вищого рівня, який повинен приймати рішення для групи Podʼів (наприклад, планувальник завдань). Він не може симулювати ефект виділення чи звільнення заявок з плином часу. Інформацію для цього можуть надавати лише драйвери DRA сторонніх постачальників.&lt;/p&gt;
&lt;p&gt;Структуровані параметри для динамічного розподілу ресурсів — це розширення оригінальної реалізації, яке розвʼязує цю проблему, створюючи фреймворк для підтримки параметрів заявок, що є більш прозорими. Замість обробки семантики всіх параметрів заявок самостійно, драйвери можуть керувати ресурсами та описувати їх, використовуючи конкретну &amp;quot;структуровану модель&amp;quot;, заздалегідь визначену Kubernetes. Це дозволить компонентам, які обізнані з цією &amp;quot;структурованою моделлю&amp;quot;, приймати рішення щодо цих ресурсів без залучення зовнішнього контролера. Наприклад, планувальник може швидко обробляти заявки без зайвої комунікації з драйверами динамічного розподілу ресурсів. Робота, виконана для цього релізу, зосереджена на визначенні необхідного фреймворку для активації різних &amp;quot;структурованих моделей&amp;quot; та реалізації моделі &amp;quot;пойменованих ресурсів&amp;quot;. Ця модель дозволяє перераховувати окремі екземпляри ресурсів та, на відміну від традиційного API пристроїв, додає можливість вибору цих екземплярів індивідуально за атрибутами.&lt;/p&gt;
&lt;h3 id=&#34;node-memory-swap-support-kep-2400-https-kep-k8s-io-2400&#34;&gt;Підтримка своп-памʼяті на вузлах (&lt;a href=&#34;https://kep.k8s.io/2400&#34;&gt;KEP-2400&lt;/a&gt;)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#node-memory-swap-support-kep-2400-https-kep-k8s-io-2400&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.30 підтримка своп-памʼяті на вузлах Linux отримує значущі зміни в способі її функціонування, з основним акцентом на покращенні стабільності системи. В попередніх версіях Kubernetes функція &lt;code&gt;NodeSwap&lt;/code&gt; була типово вимкненою, а при увімкненні використовувала поведінку &lt;code&gt;UnlimitedSwap&lt;/code&gt;. З метою досягнення кращої стабільності, поведінка &lt;code&gt;UnlimitedSwap&lt;/code&gt; (яка може компрометувати стабільність вузла) буде видалена у версії v1.30.&lt;/p&gt;
&lt;p&gt;Оновлена, все ще бета-версія підтримки своп на вузлах Linux буде стандартно доступною. Однак типовою поведінкою буде запуск вузла в режимі &lt;code&gt;NoSwap&lt;/code&gt; (а не &lt;code&gt;UnlimitedSwap&lt;/code&gt;). У режимі &lt;code&gt;NoSwap&lt;/code&gt; kubelet підтримує роботу на вузлі, де активний простір своп, але Podʼи не використовують жодного page-файлу. Для того, щоб kubelet працював на цьому вузлі, вам все ще потрібно встановити &lt;code&gt;--fail-swap-on=false&lt;/code&gt;. Однак велика зміна стосується іншого режиму: &lt;code&gt;LimitedSwap&lt;/code&gt;. У цьому режимі kubelet фактично використовує page-файл на вузлі та дозволяє Podʼам виділяти деяку частину їхньої віртуальної памʼяті. Контейнери (і їхні батьківські Podʼи) не мають доступу до своп поза їхнім обмеженням памʼяті, але система все ще може використовувати простір своп, якщо він доступний.&lt;/p&gt;
&lt;p&gt;Група Kubernetes Node (SIG Node) також оновить документацію, щоб допомогти вам зрозуміти, як використовувати оновлену реалізацію, на основі відгуків від кінцевих користувачів, учасників та широкої спільноти Kubernetes.&lt;/p&gt;
&lt;p&gt;Для отримання додаткових відомостей про підтримку своп на вузлах Linux в Kubernetes, прочитайте попередній &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2023/08/24/swap-linux-beta/&#34;&gt;пост блогу&lt;/a&gt; чи &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/nodes/#swap-memory&#34;&gt;документацію про своп на вузлах&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;support-user-namespaces-in-pods-kep-127-https-kep-k8s-io-127&#34;&gt;Підтримка просторів імен користувачів в Pod (&lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP-127&lt;/a&gt;)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-user-namespaces-in-pods-kep-127-https-kep-k8s-io-127&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/user-namespaces/&#34;&gt;Простори імен користувачів&lt;/a&gt; — це функція лише для Linux, яка краще ізолює Podʼи для запобігання або помʼякшення кількох важливих CVEs із високим/критичним рейтингом, включаючи &lt;a href=&#34;https://github.com/opencontainers/runc/security/advisories/GHSA-xr7r-f8xq-vfvv&#34;&gt;CVE-2024-21626&lt;/a&gt;, опубліковану у січні 2024 року. У Kubernetes 1.30 підтримка просторів імен користувачів переходить у бета-версію і тепер підтримує Podʼи з томами та без них, власні діапазони UID/GID та багато іншого!&lt;/p&gt;
&lt;h3 id=&#34;structured-authorization-configuration-kep-3221-https-kep-k8s-io-3221&#34;&gt;Конфігурація структурованої авторизації (&lt;a href=&#34;https://kep.k8s.io/3221&#34;&gt;KEP-3221&lt;/a&gt;)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#structured-authorization-configuration-kep-3221-https-kep-k8s-io-3221&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Підтримка &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file&#34;&gt;конфігурації структурованої авторизації&lt;/a&gt; переходить у бета-версію та буде типово увімкненою. Ця функція дозволяє створювати ланцюги авторизації з кількома вебхуками із чітко визначеними параметрами, які перевіряють запити в певному порядку та надають деталізований контроль — такий, як явна відмова у випадку невдач. Використання конфігураційного файлу навіть дозволяє вказати правила &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/cel/&#34;&gt;CEL&lt;/a&gt; для попередньої фільтрації запитів, перш ніж вони будуть відправлені до вебхуків, допомагаючи вам запобігти непотрібним викликам. Сервер API також автоматично перезавантажує ланцюг авторизатора при зміні конфігураційного файлу.&lt;/p&gt;
&lt;p&gt;Вам необхідно вказати шлях до конфігурації авторизації, використовуючи аргумент командного рядка &lt;code&gt;--authorization-config&lt;/code&gt;. Якщо ви хочете продовжувати використовувати аргументи командного рядка замість конфігураційного файлу, вони продовжать працювати як є. Щоб отримати доступ до нових можливостей вебхуків авторизації, таких як кілька вебхуків, політика невдачі та правила попередньої фільтрації, перейдіть до використання параметрів у файлі &lt;code&gt;--authorization-config&lt;/code&gt;. З версії Kubernetes 1.30 формат конфігураційного файлу є бета-рівнем, і потрібно вказувати лише &lt;code&gt;--authorization-config&lt;/code&gt;, оскільки feature gate вже увімкнено. Приклад конфігурації із всіма можливими значеннями наведено в &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file&#34;&gt;документації з авторизації&lt;/a&gt;. Докладніше читайте в &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file&#34;&gt;документації з авторизації&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;container-resource-based-pod-autoscaling-kep-1610-https-kep-k8s-io-1610&#34;&gt;Автомасштабування Podʼів на основі ресурсів контейнера (&lt;a href=&#34;https://kep.k8s.io/1610&#34;&gt;KEP-1610&lt;/a&gt;)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#container-resource-based-pod-autoscaling-kep-1610-https-kep-k8s-io-1610&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Горизонтальне автомасштабування Podʼів на основі метрик &lt;code&gt;ContainerResource&lt;/code&gt; перейде у стабільний стан у версії v1.30. Це нова функціональність для HorizontalPodAutoscaler дозволяє налаштовувати автоматичне масштабування на основі використання ресурсів для окремих контейнерів, а не загального використання ресурсів для всіх контейнерів у Podʼіві. Докладні відомості можна знайти у нашій &lt;a href=&#34;2023/05/02/hpa-container-resource-metric/&#34;&gt;попередній статті&lt;/a&gt; або в &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/run-application/horizontal-pod-autoscale/#container-resource-metrics&#34;&gt;метриках ресурсів контейнера&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;cel-for-admission-control-kep-3488-https-kep-k8s-io-3488&#34;&gt;CEL для керування допуском (&lt;a href=&#34;https://kep.k8s.io/3488&#34;&gt;KEP-3488&lt;/a&gt;)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cel-for-admission-control-kep-3488-https-kep-k8s-io-3488&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Інтеграція Common Expression Language (CEL) для керування допуском у Kubernetes вводить більш динамічний та виразний спосіб оцінки запитів на допуск. Ця функція дозволяє визначати та застосовувати складні, деталізовані політики безпосередньо через API Kubernetes, підвищуючи безпеку та здатність до управління без втрати продуктивності чи гнучкості.&lt;/p&gt;
&lt;p&gt;Додавання CEL до керування допуском у Kubernetes дає адміністраторам кластерів можливість створювати складні правила, які можуть оцінювати вміст API-запитів на основі бажаного стану та політик кластера, не вдаючись до вебхуків, які використовують контролери доступу. Цей рівень контролю є важливим для забезпечення цілісності, безпеки та ефективності операцій у кластері, роблячи середовища Kubernetes більш надійними та адаптованими до різних сценаріїв використання та вимог. Для отримання докладної інформації щодо використання CEL для керування допуском дивіться &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/validating-admission-policy/&#34;&gt;документацію API&lt;/a&gt; для ValidatingAdmissionPolicy.&lt;/p&gt;
&lt;p&gt;Ми сподіваємося, що ви так само нетерпляче чекаєте на цей випуск, як і ми. Стежте за блогом, щоб дізнатись про офіційний випуск через кілька тижнів, де буде представлено ще більше відомостей!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>pkgs.k8s.io: Представляємо репозиторії пакунків від спільноти Kubernetes</title>
      <link>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2023/08/15/pkgs-k8s-io-introduction/</link>
      <pubDate>Tue, 15 Aug 2023 20:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/blog/2023/08/15/pkgs-k8s-io-introduction/</guid>
      <description>
        
        
        &lt;p&gt;Від імені Kubernetes SIG Release, я дуже радий представити репозиторії програмного забезпечення від спільноти Kubernetes для пакунків Debian та RPM: &lt;code&gt;pkgs.k8s.io&lt;/code&gt;! Нові репозиторії пакунків є заміною для репозиторіїв, що надаються Google (&lt;code&gt;apt.kubernetes.io&lt;/code&gt; та &lt;code&gt;yum.kubernetes.io&lt;/code&gt;), які ми використовували з Kubernetes v1.5.&lt;/p&gt;
&lt;p&gt;Цей допис містить інформацію про ці нові репозиторії пакунків, про те, що це означає для вас як кінцевого користувача, і як перейти на нові репозиторії.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ℹ️ Оновлення (26 березня 2024): &lt;em&gt;застарілі репозиторії, що надаються Google, були прибрані 4 березня 2024. Більше неможливо встановлювати пакунки Kubernetes із застарілих репозиторіїв, що надаються Google.&lt;/em&gt;&lt;/strong&gt; Перегляньте &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2023/08/31/legacy-package-repository-deprecation/&#34;&gt;оголошення про припинення підтримки&lt;/a&gt; для отримання додаткової інформації про цю зміну.&lt;/p&gt;
&lt;h2 id=&#34;what-you-need-to-know-about-the-new-package-repositories&#34;&gt;Що вам потрібно знати про нові репозиторії пакунків?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-you-need-to-know-about-the-new-package-repositories&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;(оновлено 12 січня 2024 та 26 березня 2024)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Це &lt;strong&gt;не автоматична зміна&lt;/strong&gt;; вам потрібно вручну перейти з використання репозиторію, що надається Google, на репозиторії, що належать спільноті Kubernetes. Дивіться &lt;a href=&#34;#how-to-migrate&#34;&gt;як перейти&lt;/a&gt; далі в цьому оголошенні для інформації про міграцію та інструкцій.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Застарілі репозиторії, що надаються Google, було прибрано 4 березня 2024. Більше неможливо встановлювати пакунки Kubernetes із застарілих репозиторіїв, що надаються Google.&lt;/strong&gt; Ці репозиторії були визнані &lt;strong&gt;застарілими з 31 серпня 2023&lt;/strong&gt;, та &lt;strong&gt;заморожені з 13 вересня 2023&lt;/strong&gt;. Перегляньте &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2023/08/31/legacy-package-repository-deprecation/&#34;&gt;оголошення про припинення підтримки&lt;/a&gt; для отримання додаткової інформації про цю зміну.&lt;/li&gt;
&lt;li&gt;&lt;del&gt;&lt;strong&gt;Застарілі репозиторії, що надаються Google, будуть прибрані у січні 2024.&lt;/strong&gt; Ці репозиторії були визнані &lt;strong&gt;застарілими з 31 серпня 2023&lt;/strong&gt;, та &lt;strong&gt;заморожені з 13 вересня 2023&lt;/strong&gt;. Перегляньте &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2023/08/31/legacy-package-repository-deprecation/&#34;&gt;оголошення про припинення підтримки&lt;/a&gt; для отримання додаткової інформації про цю зміну.&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Наявні пакунки в застарілих репозиторіях будуть доступні на невизначений час. Однак, проєкт Kubernetes не може гарантувати, як довго це буде. Застарілі репозиторії та їх вміст можуть бути видалені в будь-який час у майбутньому без додаткового попередження. &lt;strong&gt;Застарілі репозиторії пакунків зникнуть у січні 2024.&lt;/strong&gt;&lt;/del&gt; &lt;strong&gt;Застарілі репозиторії, що надаються Google, були прибрані 4 березня 2024.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Оскільки нові релізи не будуть публікуватися в застарілих репозиторіях після 13 вересня 2023, ви не зможете оновитися до будь-якого патча або мінорного релізу, зробленого з тієї дати і далі, якщо ви не перейдете на нові репозиторії пакунків Kubernetes. &lt;del&gt;Тим не менш, ми рекомендуємо переходити на нові репозиторії пакунків Kubernetes &lt;strong&gt;якнайшвидше&lt;/strong&gt;.&lt;/del&gt; Перехід на нові репозиторії пакунків Kubernetes необхідний для отримання офіційних пакунків Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Нові репозиторії пакунків Kubernetes містять пакунки, починаючи з тих версій Kubernetes, які все ще підтримувалися, коли спільнота взяла на себе збірку пакунків. Це означає, що нові репозиторії пакунків мають пакунки Linux для всіх релізів Kubernetes, починаючи з v1.24.0.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes не має офіційних пакунків Linux, доступних для попередніх релізів Kubernetes; однак, ваш дистрибутив Linux може надавати власні пакунки.&lt;/li&gt;
&lt;li&gt;Існує окремий репозиторій пакунків для кожної мінорної версії Kubernetes. При оновленні до іншої мінорної версії, ви повинні памʼятати, що деталі репозиторію пакунків також змінюються. Перегляньте посібник &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/kubeadm/change-package-repository/&#34;&gt;Зміна репозиторію пакунків Kubernetes&lt;/a&gt; для отримання інформації про кроки, які вам потрібно виконати під час оновлення мінорної версії Kubernetes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-are-we-introducing-new-package-repositories&#34;&gt;Чому ми представляємо нові репозиторії пакунків?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-are-we-introducing-new-package-repositories&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Оскільки проєкт Kubernetes розвивається, ми хочемо забезпечити найкращий можливий досвід використання для кінцевих користувачів. Репозиторій, що надається Google, служив нам добре багато років, але ми почали стикатися з деякими проблемами, які вимагають значних змін у тому, як ми публікуємо пакунки. Інша мета, яку ми маємо, — це використання інфраструктури, що належить спільноті, для всіх критичних компонентів, і це включає репозиторії пакунків.&lt;/p&gt;
&lt;p&gt;Публікація пакунків у репозиторій, що надається Google, є ручним процесом, який може виконуватися лише командою співробітників Google, &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/releases/release-managers/#build-admins&#34;&gt;Google Build Admins&lt;/a&gt;. &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/uk/releases/release-managers/#release-managers&#34;&gt;Команда менеджерів релізів Kubernetes&lt;/a&gt; є дуже різноманітною, особливо щодо часових поясів, у яких ми працюємо. З огляду на це обмеження, нам доводиться дуже ретельно планувати кожен реліз, щоб забезпечити наявність як менеджера релізів, так і Google Build Admin для виконання релізу.&lt;/p&gt;
&lt;p&gt;Інша проблема полягає в тому, що у нас є лише один репозиторій пакунків. Через це, ми не могли публікувати пакунки для передрелізних версій (alpha, beta та rc). Це ускладнювало тестування передрелізних версій Kubernetes для всіх, хто зацікавлений був це робити. Зворотний звʼязок, який ми отримуємо від людей, що тестують ці релізи, є критичним для забезпечення найкращої якості релізів, тому ми хочемо зробити тестування цих релізів якомога простішим. Крім того, наявність лише одного репозиторію обмежувала нас щодо публікації залежностей, таких як &lt;code&gt;cri-tools&lt;/code&gt; та &lt;code&gt;kubernetes-cni&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Незважаючи на всі ці проблеми, ми дуже вдячні Google та Google Build Admins за їх участь, підтримку та допомогу всі ці роки!&lt;/p&gt;
&lt;h2 id=&#34;how-the-new-package-repositories-work&#34;&gt;Як працюють нові репозиторії пакунків?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-the-new-package-repositories-work&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Нові репозиторії пакунків надаються за адресою &lt;code&gt;pkgs.k8s.io&lt;/code&gt; для пакунків Debian та RPM. На цей час цей домен вказує на CloudFront CDN, що працює на основі кошика S3, у якому містяться репозиторії та пакунки. Однак, ми плануємо розгорнути додаткові дзеркала в майбутньому, даючи можливість іншим компаніям допомогти нам з обслуговуванням пакунків.&lt;/p&gt;
&lt;p&gt;Пакунки збираються та публікуються платформою &lt;a href=&#34;http://openbuildservice.org&#34;&gt;OpenBuildService (OBS)&lt;/a&gt;. Після тривалого періоду оцінки різних рішень, ми прийняли рішення використовувати OpenBuildService як платформу для управління нашими репозиторіями та пакунками. По-перше, OpenBuildService є відкритою платформою, що використовується великою кількістю проєктів з відкритим кодом та компаній, таких як openSUSE, VideoLAN, Dell, Intel та інші. OpenBuildService має багато можливостей, що роблять його дуже гнучким та легким для інтеграції з нашими поточними інструментами випусків релізів. Він також дозволяє нам збирати пакунки подібним чином, як для репозиторію, що надається Google, щоб процес міграції був якомога плавнішим.&lt;/p&gt;
&lt;p&gt;SUSE спонсорує проєкт Kubernetes надаючи доступ до свого еталонного розгортання OpenBuildService (&lt;a href=&#34;http://build.opensuse.org&#34;&gt;&lt;code&gt;build.opensuse.org&lt;/code&gt;&lt;/a&gt;) та технічну підтримку для інтеграції OBS з нашими процесами випусків релізів.&lt;/p&gt;
&lt;p&gt;Ми використовуємо екземпляр OBS від SUSE для збірки та публікації пакунків. При збірці нового релізу, наші інструменти автоматично надсилають необхідні артефакти та специфікації пакунків до &lt;code&gt;build.opensuse.org&lt;/code&gt;. Це запускає процес збірки, який збиратиме пакунки для всіх підтримуваних архітектур (AMD64, ARM64, PPC64LE, S390X). Наприкінці, згенеровані пакунки будуть автоматично надіслані до кошика S3, що належить спільноті, роблячи їх доступними для всіх користувачів.&lt;/p&gt;
&lt;p&gt;Ми хочемо скористатися цією можливістю, щоб подякувати SUSE за дозвіл використовувати &lt;code&gt;build.opensuse.org&lt;/code&gt; та їх щедру підтримку для здійснення цієї інтеграції!&lt;/p&gt;
&lt;h2 id=&#34;what-are-significant-differences-between-the-google-hosted-and-kubernetes-package-repositories&#34;&gt;Які значні відмінності між репозиторіями, що надаються Google, та репозиторіями пакунків Kubernetes?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-are-significant-differences-between-the-google-hosted-and-kubernetes-package-repositories&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Існує три значні відмінності, про які ви повинні знати:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Існує окремий репозиторій для кожної мінорної версії Kubernetes. Наприклад, репозиторій з назвою &lt;code&gt;core:/stable:/v1.28&lt;/code&gt; містить лише пакунки для стабільних релізів Kubernetes v1.28. Це означає, що ви можете встановити v1.28.0 з цього репозиторію, але не можете встановити v1.27.0 або будь-яку іншу мінорну версію крім v1.28. При оновленні до іншої мінорної версії, вам потрібно додати новий репозиторій та опціонально видалити старий&lt;/li&gt;
&lt;li&gt;Існує різниця в тому, які версії пакунків &lt;code&gt;cri-tools&lt;/code&gt; та &lt;code&gt;kubernetes-cni&lt;/code&gt; доступні в кожному репозиторії Kubernetes
&lt;ul&gt;
&lt;li&gt;Ці два пакунки є залежностями для &lt;code&gt;kubelet&lt;/code&gt; та &lt;code&gt;kubeadm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Репозиторії Kubernetes для v1.24 до v1.27 мають ті самі версії цих пакунків, що й репозиторій, що надається Google&lt;/li&gt;
&lt;li&gt;Репозиторії Kubernetes для v1.28 та далі будуть публікувати лише версії, що використовуються цією мінорною версією Kubernetes
&lt;ul&gt;
&lt;li&gt;Говорячи про v1.28, лише kubernetes-cni 1.2.0 та cri-tools v1.28 будуть доступні в репозиторії для Kubernetes v1.28&lt;/li&gt;
&lt;li&gt;Подібно для v1.29, ми плануємо публікувати лише cri-tools v1.29 та ту версію kubernetes-cni, що буде використовуватися Kubernetes v1.29&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Частина ревізії версії пакунка (частина &lt;code&gt;-00&lt;/code&gt; у &lt;code&gt;1.28.0-00&lt;/code&gt;) тепер автоматично генерується платформою OpenBuildService та має інший формат. Ревізія тепер у форматі &lt;code&gt;-x.y&lt;/code&gt;, наприклад &lt;code&gt;1.28.0-1.1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;does-this-in-any-way-affect-existing-google-hosted-repositories&#34;&gt;Чи впливає це якимось чином на наявні репозиторії, що надаються Google?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#does-this-in-any-way-affect-existing-google-hosted-repositories&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;(оновлено 26 березня 2024)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Застарілі репозиторії, що надаються Google, були прибрані 4 березня 2024. Більше неможливо встановлювати пакунки Kubernetes із застарілих репозиторіїв, що надаються Google.&lt;/strong&gt; Перегляньте &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/blog/2023/08/31/legacy-package-repository-deprecation/&#34;&gt;оголошення про припинення підтримки&lt;/a&gt; для отримання додаткової інформації про цю зміну.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Репозиторій, що надається Google, та всі пакунки, опубліковані в ньому, будуть продовжувати працювати так само, як і раніше. Немає змін у тому, як ми збираємо та публікуємо пакунки в репозиторій, що надається Google, всі нововведені зміни впливають лише на пакунки, опубліковані в репозиторіях, що належать спільноті.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Однак, як згадувалося на початку цього допису в блозі, ми плануємо припинити публікацію пакунків у репозиторій, що надається Google, у майбутньому.&lt;/del&gt;&lt;/p&gt;
&lt;h2 id=&#34;how-to-migrate&#34;&gt;Як перейти на репозиторії пакунків від спільноти Kubernetes?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-migrate&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;how-to-migrate-deb&#34;&gt;Debian, Ubuntu та операційні системи, що використовують &lt;code&gt;apt&lt;/code&gt;/&lt;code&gt;apt-get&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-migrate-deb&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Замініть визначення репозиторію &lt;code&gt;apt&lt;/code&gt;, щоб &lt;code&gt;apt&lt;/code&gt; вказував на новий репозиторій замість репозиторію, що надається Google. Переконайтеся, що замінили мінорну версію Kubernetes у команді нижче на мінорну версію, яку ви зараз використовуєте:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/kubernetes.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Завантажте публічний ключ підпису для репозиторіїв пакунків Kubernetes. Той самий ключ підпису використовується для всіх репозиторіїв, тому ви можете ігнорувати версію в URL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Оновлення: У релізах старіших за Debian 12 та Ubuntu 22.04, теки &lt;code&gt;/etc/apt/keyrings&lt;/code&gt; типово немає, її слід створити перед виконанням команди curl.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Оновіть індекс пакунків &lt;code&gt;apt&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;how-to-migrate-rpm&#34;&gt;CentOS, Fedora, RHEL та операційні системи, що використовують &lt;code&gt;rpm&lt;/code&gt;/&lt;code&gt;dnf&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-migrate-rpm&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Замініть визначення репозиторію &lt;code&gt;yum&lt;/code&gt;, щоб &lt;code&gt;yum&lt;/code&gt; вказував на новий репозиторій замість репозиторію, що надається Google. Переконайтеся, що замінили мінорну версію Kubernetes у команді нижче на мінорну версію, яку ви зараз використовуєте:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt;EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;[kubernetes]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;name=Kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;enabled=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;gpgcheck=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOF&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;h2 id=&#34;where-can-i-get-packages-for-kubernetes-versions-prior-to-v1-24-0&#34;&gt;Де я можу отримати пакунки для версій Kubernetes до v1.24.0?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#where-can-i-get-packages-for-kubernetes-versions-prior-to-v1-24-0&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;(оновлено 26 березня 2024 року)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Для Kubernetes v1.24 і новіших версій пакунки Linux для компонентів Kubernetes доступні для завантаження через офіційні репозиторії пакунків Kubernetes. Kubernetes не публікує жодних пакунків програмного забезпечення для релізів Kubernetes старіших за v1.24.0; однак, ваш дистрибутив Linux може надавати власні пакунки. Крім того, ви можете безпосередньо завантажити бінарні файли замість використання пакунків. Наприклад, дивіться інструкції &lt;code&gt;Without a package manager&lt;/code&gt; у документі &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/setup/production-environment/tools/kubeadm/install-kubeadm&#34;&gt;&amp;quot;Встановлення kubeadm&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;can-i-rollback-to-the-google-hosted-repository-after-migrating-to-the-kubernetes-repositories&#34;&gt;Чи можу я повернутися до репозиторію, що надається Google, після міграції до репозиторіїв Kubernetes?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#can-i-rollback-to-the-google-hosted-repository-after-migrating-to-the-kubernetes-repositories&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;(оновлено 26 березня 2024 року)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Застарілі репозиторії, що надаються Google, припинили роботу 4 березня 2024 року, тому більше неможливо повернутися до застарілих репозиторіїв, що надаються Google.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;Загалом, так. Просто виконайте ті самі кроки, що й під час міграції, але використовуйте параметри для репозиторію, що надається Google. Ви можете знайти ці параметри в документі, такому як &lt;a href=&#34;https://deploy-preview-59083--kubernetes-io-main-staging.netlify.app/docs/setup/production-environment/tools/kubeadm/install-kubeadm&#34;&gt;&amp;quot;Встановлення kubeadm&amp;quot;&lt;/a&gt;.&lt;/del&gt;&lt;/p&gt;
&lt;h2 id=&#34;why-isn-t-there-a-stable-list-of-domains-ips-why-can-t-i-restrict-package-downloads&#34;&gt;Чому немає стабільного списку доменів/IP? Чому я не можу обмежити завантаження пакунків?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-isn-t-there-a-stable-list-of-domains-ips-why-can-t-i-restrict-package-downloads&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Наш план для &lt;code&gt;pkgs.k8s.io&lt;/code&gt; полягає в тому, щоб зробити його перенаправлювачем до набору бекендів (дзеркал пакунків) на основі розташування користувача. Характер цієї зміни означає, що користувач, який завантажує пакунок, може бути перенаправлений до будь-якого дзеркала в будь-який час. З огляду на архітектуру та наші плани щодо підключення додаткових дзеркал у найближчому майбутньому, ми не можемо надати список IP-адрес або доменів, які ви можете додати до списку дозволених.&lt;/p&gt;
&lt;p&gt;Обмежувальні механізми контролю, такі як проксі man-in-the-middle або мережеві політики, що обмежують доступ до конкретного списку IP/доменів, перестануть працювати після цієї зміни. Для цих сценаріїв ми рекомендуємо віддзеркалювати пакунки релізу до локального репозиторію пакунків, над яким ви маєте повний контроль.&lt;/p&gt;
&lt;h2 id=&#34;what-should-i-do-if-i-detect-some-abnormality-with-the-new-repositories&#34;&gt;Що робити, якщо я виявив якусь аномалію з новими репозиторіями?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-should-i-do-if-i-detect-some-abnormality-with-the-new-repositories&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Якщо ви зіткнулися з будь-якою проблемою з новими репозиторіями пакунків Kubernetes, будь ласка, створіть тікет в репозиторії &lt;a href=&#34;https://github.com/kubernetes/release/issues/new/choose&#34;&gt;&lt;code&gt;kubernetes/release&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

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