<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes Blog</title>
    <link>https://deploy-preview-59115--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-59115--kubernetes-io-main-staging.netlify.app/uk/</link>
    </image>
    
    <atom:link href="https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/feed.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Від робочої групи до SIG Architecture: у центрі уваги AI Conformance</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/29/sig-arch-ai-conformance-2026/</link>
      <pubDate>Thu, 29 Oct 2026 05:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/29/sig-arch-ai-conformance-2026/</guid>
      <description>
        
        
        &lt;p&gt;У цьому випуску «У центрі уваги» від SIG Architecture ми поговорили з &lt;a href=&#34;https://github.com/janetkuo&#34;&gt;Janet Kuo&lt;/a&gt; (Google) та &lt;a href=&#34;https://github.com/terrytangyuan&#34;&gt;Yuan Tang&lt;/a&gt; (TensorScale AI) про шлях AI Conformance у Kubernetes: від початкової &lt;a href=&#34;https://github.com/kubernetes/community/blob/main/governance.md#working-groups&#34;&gt;робочої групи&lt;/a&gt; до інтеграції в &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/architecture/&#34;&gt;SIG Architecture&lt;/a&gt; як підпроєкту.&lt;/p&gt;
&lt;h2 id=&#34;introductions&#34;&gt;Знайомство&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#introductions&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Frederico Muñoz і Kirti Goyal (FK): Вітаємо, Janet і Yuan, і дякуємо за можливість дізнатися трохи більше про AI Conformance. Чи можете розповісти трохи про себе та про те, як ви долучилися до Kubernetes?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet Kuo&lt;/strong&gt;: Я старший інженер-програміст рівня Staff (Senior Staff Software Engineer) у Google і супроводжую Kubernetes з 2015 року, приєднавшись до спільноти саме тоді, коли ми мчали до запуску версії 1.0. Я починала з написання основних контролерів робочих навантажень, які унормували те, як застосунки оркеструються в Kubernetes. Сьогодні я очолюю SIG Apps як співголова та технічний лідер (TL), а також очолюю &lt;a href=&#34;https://www.cncf.io/announcements/2025/11/11/cncf-launches-certified-kubernetes-ai-conformance-program-to-standardize-ai-workloads-on-kubernetes/&#34;&gt;програму AI Conformance&lt;/a&gt;. Мій теперішній фокус — гарантувати, що Kubernetes залишається найкращою платформою для наступного покоління робочих навантажень, як-от AI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yuan Tang&lt;/strong&gt;: Я співзасновник TensorScale AI, де ми створюємо інфраструктуру AI для моделей світу. До цього я був старшим головним інженером-програмістом (Senior Principal Software Engineer) у Red Hat, де керував розробкою платформи Red Hat AI та стратегією розвитку проєктів із відкритим кодом в апстрімі. Я долучився до Kubernetes на ранньому етапі, сприяючи співпраці між спільнотою Kubernetes і проєктами, які я очолював, зокрема Kubeflow, Argo та KServe. Згодом я допоміг заснувати й очолити &lt;a href=&#34;https://github.com/kubernetes-sigs/wg-serving&#34;&gt;WG Serving&lt;/a&gt; та програму AI Conformance, просуваючи інновації та зміцнюючи співпрацю спільноти навколо запуску AI-навантажень у Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;program-working-group-subproject-the-many-shapes-of-ai-conformance&#34;&gt;Програма, робоча група, підпроєкт: яких форм набуває AI Conformance&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#program-working-group-subproject-the-many-shapes-of-ai-conformance&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;FK: AI Conformance починався як програма CNCF — саме тоді ви долучилися?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet Kuo:&lt;/strong&gt; Насправді я брала участь із першого дня, адже запропонувала початкову ідею. Тоді стало очевидно, що всі починають запускати AI в Kubernetes, але постачальники будували свої інфраструктурні стеки по-різному. Я занепокоїлася через фрагментацію екосистеми. Тож я написала початкову пропозицію Kubernetes AI Conformance, подала її керівництву CNCF для схвалення й започаткувала програму AI Conformance. Отримавши зелене світло, я звернулася до своїх співголів Yuan Tang, Rita Zhang і Mario Fahlandt, щоб згуртувати спільноту навколо неї.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yuan Tang:&lt;/strong&gt; Так. На той час я був співголовою WG Serving, і деякі ініціативи, як-от &lt;a href=&#34;https://gateway-api-inference-extension.sigs.k8s.io/&#34;&gt;Gateway AI Inference Extension&lt;/a&gt;, швидко набули популярності. У спільноті був сильний інтерес включити вимоги, повʼязані з інференсом, до програми Kubernetes AI Conformance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FK: Як би ви описали мотивацію створення робочої групи AI Conformance?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Мотивацією створення &lt;a href=&#34;https://github.com/kubernetes/community/blob/main/governance.md#working-groups&#34;&gt;робочої групи&lt;/a&gt; Kubernetes AI Conformance (AI WG) було впоратися зі стрімкою конвергенцією AI-навантажень у Kubernetes і водночас запобігти фрагментації екосистеми.&lt;/p&gt;
&lt;p&gt;У міру прискорення впровадження AI організації починали запускати дедалі складніші навантаження, зокрема розподілене навчання, масштабний інференс, конвеєри з інтенсивним використанням GPU та нові агентні AI-системи на багатьох різних платформах Kubernetes. Однак постачальники реалізовували можливості AI-інфраструктури по-різному, особливо щодо GPU, мереж, планування та оркестрації інференсу. Це створювало проблеми з переносимістю, операційну неоднорідність і дедалі більше занепокоєння щодо привʼязки до постачальника.&lt;/p&gt;
&lt;p&gt;Робочу групу AI WG було створено, щоб обʼєднати спільноту навколо:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;нейтральних щодо постачальників стандартів AI-інфраструктури;&lt;/li&gt;
&lt;li&gt;сумісних між собою AI-платформ на основі Kubernetes;&lt;/li&gt;
&lt;li&gt;узгодженої операційної поведінки для AI-навантажень;&lt;/li&gt;
&lt;li&gt;і спільних вимог для масштабованого розгортання AI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;FK: Робочі групи за своєю природою тимчасові й орієнтовані на результат: чи можна сказати, що головні цілі WG було досягнуто?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Так, WG досягла своїх головних початкових цілей.&lt;/p&gt;
&lt;p&gt;WG досягла успіху в переході екосистеми від фрагментованих, специфічних для окремих постачальників підходів до AI-інфраструктури до спільної, визначеної спільнотою базової лінії для AI-навантажень у Kubernetes.&lt;/p&gt;
&lt;p&gt;Серед конкретних показників успіху:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;запуск програми Certified Kubernetes AI Conformance;&lt;/li&gt;
&lt;li&gt;визначення формальних вимог Kubernetes AI Requirements (KARs);&lt;/li&gt;
&lt;li&gt;широка участь провідних гравців екосистеми;&lt;/li&gt;
&lt;li&gt;зростання кількості сертифікованих платформ з 18 до 31 за кілька місяців;&lt;/li&gt;
&lt;li&gt;узгодження щодо новіших примітивів Kubernetes, потрібних для AI-навантажень;&lt;/li&gt;
&lt;li&gt;формування дорожньої карти для автоматизованої перевірки відповідності.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Найголовніше — WG сформувала консенсус щодо того, що AI-навантаження тепер є першорядним сценарієм використання Kubernetes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/10/29/sig-arch-ai-conformance-2026/ai_conf_kubecon.jpg&#34; alt=&#34;Сцена KubeCon, на якій перебувають 4 людини, одна з них говорить.&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FK: AI Conformance було окремо відзначено на останньому KubeCon — чи є це відображенням зростання важливості AI в межах усього проєкту?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Так, те, наскільки помітною була тема AI Conformance на останньому &lt;a href=&#34;https://www.cncf.io/kubecon-cloudnativecon-events/&#34;&gt;KubeCon + CloudNativeCon&lt;/a&gt;, — яскраве свідчення того, наскільки центральним AI став для всієї екосистеми Kubernetes.&lt;/p&gt;
&lt;p&gt;Кілька років тому AI-навантаження в Kubernetes все ще вважалися доволі спеціалізованими й переважно повʼязаними з ML-платформами чи дослідницькими середовищами з великим обсягом GPU. Що змінилося — те, що AI тепер стає мейнстримною інфраструктурною проблемою майже для кожного великомасштабного оператора платформ.&lt;/p&gt;
&lt;p&gt;Цей зсув природно підносить AI від застосунку, що працює в Kubernetes, до ключової категорії навантажень, для якої Kubernetes має оптимізуватися.&lt;/p&gt;
&lt;p&gt;Ініціатива AI Conformance відображає цю еволюцію. Вона сигналізує, що спільнота тепер вважає вимоги до AI-інфраструктури — як-от планування прискорювачів, високопродуктивні мережі, оркестрацію з урахуванням навантаження та інференс із низькою затримкою — достатньо важливими, щоб стандартизувати їх на рівні екосистеми.&lt;/p&gt;
&lt;p&gt;Її помітність на KubeCon також свідчить про ширше стратегічне усвідомлення: якщо Kubernetes має залишатися універсальною панеллю управління для сучасної інфраструктури, йому потрібно забезпечувати узгоджену основу для AI-навантажень у хмарних, локальних і периферійних середовищах.&lt;/p&gt;
&lt;p&gt;Тож наголос на AI Conformance — це не просто гонитва за ажіотажем навколо AI; це про те, що Kubernetes адаптується до значного зсуву в моделях навантажень і забезпечує згуртований розвиток екосистеми, а не її розпад на специфічні для кожного постачальника AI-стеки.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/10/29/sig-arch-ai-conformance-2026/ai_conf_sponsors.jpg&#34; alt=&#34;(слайд) Перші впроваджувачі та основні контрибʼютори: Akamai (логотип), Alibaba Cloud (логотип), AWS (логотип), Broadcom (логотип), CoreWeave (логотип), DaoCloud (логотип), Google Cloud (логотип), Kubermatic (логотип), Microsoft Azure (логотип), NVIDIA (логотип), Oracle (логотип), SUSE (логотип), Red Hat (логотип), SAP (логотип)&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;from-working-group-to-sig-architecture-subproject&#34;&gt;Від робочої групи до підпроєкту SIG Architecture&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#from-working-group-to-sig-architecture-subproject&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;FK: Як би ви описали перехід від WG до SIG? Чи є це відображенням того, що AI потребує постійного архітектурного нагляду?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: У Kubernetes робочі групи задумані як тимчасові. Наша WG мала конкретну мету — опублікувати початкові вимоги Kubernetes AI Conformance і запустити процес сертифікації. Щойно ми досягли цих віх, ми &lt;a href=&#34;https://github.com/kubernetes/community/tree/main/archive/wg-ai-conformance&#34;&gt;заархівували WG&lt;/a&gt; і перевели AI Conformance у статус &lt;a href=&#34;https://github.com/kubernetes/community/tree/main/sig-architecture#subprojects&#34;&gt;постійного підпроєкту&lt;/a&gt; під егідою SIG Architecture.&lt;/p&gt;
&lt;p&gt;Перехід до SIG Architecture безперечно доводить, що AI потребує постійного нагляду. AI — це не просто минуща тенденція чи разове навантаження. Він став ключовою частиною того, що Kubernetes запускає щодня. Оскільки SIG Architecture вже опікується загальною відповідністю Kubernetes і принципами проєктування API, розміщення підпроєкту AI Conformance саме там цілком логічне. Це гарантує, що наші вимоги AI Conformance залишатимуться узгодженими з рештою екосистеми Kubernetes у довгостроковій перспективі.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FK: І з урахуванням цієї зміни, як би ви описали головні цілі та сфери втручання підпроєкту?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Тепер, коли ми є підпроєктом, наша головна мета — підтримувати стандарти AI Conformance актуальними, нейтральними щодо постачальників і такими, що встановлюють стандарти. Ми хочемо, щоб Kubernetes охоплював найновіші досягнення в AI-інфраструктурі й водночас зберігав екосистему справедливою для всіх. Коли ми виявляємо прогалини, де немає чіткого зразка спільноти, ми допомагаємо виростити й сформувати нові стандарти для їх розвʼязання.&lt;/p&gt;
&lt;h2 id=&#34;ai-conformance-and-kubernetes&#34;&gt;AI Conformance і Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ai-conformance-and-kubernetes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;FK: AI-інфраструктура розвивається дуже швидко, тоді як API Kubernetes створені, щоб залишатися стабільними протягом років. Чи вважаєте ви це викликом?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Це, безумовно, непростий баланс. AI рухається дуже швидко, тоді як Kubernetes створений бути стабільним і передбачуваним. Але ми насправді побудували програму саме навколо цієї напруги.&lt;/p&gt;
&lt;p&gt;По-перше, ми використовуємо багаторівневу модель поетапного підвищення. Коли зʼявляються нові концепції AI-інфраструктури, ми вводимо їх як рекомендовані вимоги SHOULD. Це дає екосистемі простір експериментувати й домовлятися про найкращі практики, не привʼязуючи Kubernetes до жорстких API занадто рано. Коли ці API стабілізуються й набувають поширення в екосистемі, ми підвищуємо їх до обовʼязкових вимог MUST.&lt;/p&gt;
&lt;p&gt;По-друге, ми навмисно зосереджуємося на інфраструктурному рівні. Ми перевіряємо ключові можливості, як-от підтримку прискорювачів через &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/concepts/scheduling-eviction/dynamic-resource-allocation/&#34;&gt;динамічне виділення ресурсів&lt;/a&gt; (DRA), замість того щоб грузнути в конкретних AI-фреймворках чи серверах моделей. Це зберігає базову платформу стабільною, дозволяючи AI-інструментарію розвиватися так швидко, як потрібно.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FK: DRA розвинувся, зокрема завдяки роботі WG Device Management, як важлива частина Kubernetes (особливо для AI-навантажень), і SIG Architecture відіграє важливу роль у тому, як його інтегровано в Kubernetes: чи вбачаєте ви в цьому паралель? Зокрема, чи вважаєте ви, що акцент на інтеграції з архітектурою Kubernetes, що розвивається, посилиться в межах SIG Architecture?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Тут є величезна паралель. Щоразу, коли ми стикаємося з масштабним, складним викликом, який зачіпає кілька частин кодової бази та стосується кількох SIG, робоча група — найкраще місце для початку. Вона дає експертам з різних SIG зібратися разом, щоб розібратися з проблемою й вибудувати консенсус.&lt;/p&gt;
&lt;p&gt;Будучи частиною SIG Architecture, ми приділятимемо набагато більше уваги тому, як можливості AI вплітаються в архітектуру Kubernetes, що розвивається. Замість того щоб розглядати AI як додатковий шар, ми дивимося, як ключові примітиви Kubernetes, як-от планування та виділення ресурсів, мають адаптуватися на фундаментальному рівні, щоб підтримувати наступне десятиліття AI-навантажень.&lt;/p&gt;
&lt;h2 id=&#34;final-remarks&#34;&gt;Завершальні зауваження&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#final-remarks&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;FK: Для зацікавлених контрибʼюторів — який найкращий спосіб долучитися до підпроєкту AI Conformance?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Ми завжди шукаємо нових контрибʼюторів. Найпростіший спосіб почати — зазирнути до нашого головного репозиторію &lt;a href=&#34;https://github.com/kubernetes-sigs/ai-conformance&#34;&gt;kubernetes-sigs/ai-conformance&lt;/a&gt; і долучитися до наших &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/architecture/#meetings&#34;&gt;зустрічей&lt;/a&gt;. Якщо вам цікаво визначати нові вимоги AI Conformance, ви можете долучитися до рецензування PR або запропонувати власні, скориставшись нашим &lt;a href=&#34;https://github.com/kubernetes-sigs/ai-conformance/tree/main/kars/NNNN-kar-template&#34;&gt;шаблоном KAR&lt;/a&gt;. Якщо ви хочете писати код, нам завжди потрібна допомога в розширенні наших автоматизованих наборів тестів на Go у &lt;a href=&#34;https://github.com/kubernetes-sigs/ai-conformance/tree/main/test&#34;&gt;каталозі &lt;code&gt;test/&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Постачальникам, які бажають сертифікувати свої платформи, усі подробиці — у &lt;a href=&#34;https://github.com/cncf/k8s-ai-conformance&#34;&gt;cncf/k8s-ai-conformance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FK: Чи є якісь завершальні коментарі, якими ви хотіли б поділитися?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janet і Yuan&lt;/strong&gt;: Ми вражені тим, як швидко спільнота згуртувалася навколо цього. Коли ми вперше оголосили програму AI Conformance під час пленарної доповіді на &lt;a href=&#34;https://www.cncf.io/reports/kubecon-cloudnativecon-north-america-2025/&#34;&gt;KubeCon NA 2025&lt;/a&gt;, ми не були впевнені, якою буде реакція. Але на момент, коли ми виступали з оновленою доповіддю на &lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/&#34;&gt;KubeCon EU 2026&lt;/a&gt;, ми зросли з 18 сертифікованих платформ до 31 лише за кілька місяців.&lt;/p&gt;
&lt;p&gt;Таке зростання показує, наскільки галузь прагнула єдиного, нейтрального щодо постачальників стандарту. Це дає організаціям упевненість, що вони можуть запускати свої AI-навантаження на будь-якій сертифікованій платформі Kubernetes, не потрапляючи в залежність від пропрієтарного стека.&lt;/p&gt;
&lt;p&gt;Якщо ви постачальник платформи, ми будемо раді бачити вас серед сертифікованих. Якщо ви розробник, якого цікавить перетин AI та хмарно-нативної інфраструктури, долучайтеся до нас у SIG Architecture!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FK: Чудово, дякуємо вам обом за те, що провели нас цією подорожжю світом AI та AI Conformance у Kubernetes.&lt;/strong&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Оголошуємо робочу групу Workload Conformance</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/27/announcing-workload-conformance-wg/</link>
      <pubDate>Tue, 27 Oct 2026 04:30:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/27/announcing-workload-conformance-wg/</guid>
      <description>
        
        
        &lt;p&gt;Ми раді оголосити, що у спільноті Kubernetes тепер є &lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/wg/workload-conformance/&#34;&gt;робоча група з відповідності робочих навантажень&lt;/a&gt;. Робоча група розробляє спільний стандарт поведінки &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/&#34;&gt;робочих навантажень&lt;/a&gt; під час виконання в Kubernetes. Щоб зробити це належним чином, нам потрібні думки тих, хто створює ці робочі навантаження, і тих, хто керує кластерами, у яких вони запускаються.&lt;/p&gt;
&lt;h2 id=&#34;why-workloads-need-a-shared-standard&#34;&gt;Навіщо потрібен спільний стандарт для робочих навантажень&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-workloads-need-a-shared-standard&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://www.cncf.io/training/certification/software-conformance/&#34;&gt;Сертифікований Kubernetes&lt;/a&gt; перевіряє кластер, а &lt;a href=&#34;https://github.com/cncf/k8s-ai-conformance&#34;&gt;Kubernetes AI Conformance&lt;/a&gt; — здатність кластера запускати робочі навантаження AI та машинного навчання. Нічого подібного для самих робочих навантажень не існує, тому перед плановим обслуговуванням або оновленням Kubernetes оператори кластерів досі перевіряють кожен застосунок вручну.&lt;/p&gt;
&lt;p&gt;Проблеми, які вони виявляють, добре знайомі. Зазвичай саме під час &lt;a href=&#34;https://deploy-preview-59115--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-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-guide/&#34;&gt;видаленої версії API&lt;/a&gt;. Інші проблеми проявляються у повсякденній роботі: робочі навантаження запитують непотрібні їм привілеї або резервують ресурси, якими ніколи не користуються.&lt;/p&gt;
&lt;p&gt;У Kubernetes уже задокументовано багато відповідних рекомендацій, зокрема щодо &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/security/&#34;&gt;безпеки&lt;/a&gt; та &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/disruptions/&#34;&gt;обробки порушень&lt;/a&gt;. Попри це, кожен оператор кластера знову й знову проводить ту саму оцінку, а супровідники застосунків отримують однакові запитання з кожного середовища, яке вони підтримують. Спільна специфікація з відтворюваними тестами дала б обом групам однакову базу для початку роботи.&lt;/p&gt;
&lt;h2 id=&#34;what-the-working-group-will-deliver&#34;&gt;Що розробить робоча група&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-the-working-group-will-deliver&#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/blob/main/wg-workload-conformance/charter.md&#34;&gt;Статут&lt;/a&gt; визначає три результати роботи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Специфікацію поведінки робочих навантажень для кожної мінорної версії Kubernetes.&lt;/li&gt;
&lt;li&gt;Метод перевірки кожної вимоги на запущеному робочому навантаженні.&lt;/li&gt;
&lt;li&gt;Інструменти перевірки відповідності в апстрімі, що реалізують ці тести.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Перший крок — вирішити, які робочі навантаження та аспекти поведінки охоплюватиме специфікація. Її сфера охоплює безпеку, стійкість до порушень, використання ресурсів, мережу, сховище, використання API та спостережуваність, але група ще не узгодила конкретні вимоги чи способи їх перевірки. Однак одне правило вже визначено: кожна вимога має бути обʼєктивно перевірюваною тестовим виконуваним файлом, тому до специфікації не включатимуть субʼєктивні критерії.&lt;/p&gt;
&lt;p&gt;Специфікація описує те, як працює робоче навантаження, а не те, що воно робить. Отже, логіка застосунку не входить до сфери відповідності робочих навантажень. Виконуваний файл не перевірятиме повторно те, що вже охоплено &lt;a href=&#34;https://www.cncf.io/training/certification/software-conformance/&#34;&gt;сертифікацією Kubernetes&lt;/a&gt;, і не вимагатиме певного формату пакування робочих навантажень або інструментів постачальника, як-от механізму політик чи сканера безпеки.&lt;/p&gt;
&lt;h2 id=&#34;how-the-work-is-organized&#34;&gt;Як організовано роботу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-the-work-is-organized&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Робочу групу підтримують дві групи за інтересами (SIG):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kubernetes.dev/community/community-groups/sigs/architecture/&#34;&gt;SIG Architecture&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;
&lt;p&gt;Щойно вимога стосуватиметься сфери іншої SIG Kubernetes, наприклад поведінки вузлів чи мережі, робоча група також розпочне обговорення з відповідною SIG.&lt;/p&gt;
&lt;p&gt;Робоча група — це майданчик, на якому SIG можуть долучатися до роботи та визначати напрям розвитку відповідності робочих навантажень під час написання специфікації. Ми прагнемо підготувати першу стабільну специфікацію та робочі тести протягом двох-трьох циклів випуску Kubernetes.&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;Специфікація має ґрунтуватися на реальних прикладах, тож ми хочемо почути про ваш досвід. Якщо ви керуєте кластерами, розкажіть, як оцінюєте робочі навантаження зараз і що зламалося під час останнього оновлення чи періоду обслуговування. Якщо ви супроводжуєте застосунок, розкажіть, що йому потрібно від кластера та де наявні рекомендації залишають простір для здогадок.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Окрім прикладів, нам потрібні рецензенти запропонованих вимог і контрибʼютори, які писатимуть тести та інструменти.&lt;/li&gt;
&lt;li&gt;Коли зʼявляться перші версії тестів, ми також шукатимемо ранніх тестувальників, які запускатимуть виконуваний файл на власних робочих навантаженнях і повідомлятимуть, якщо результати різняться між запусками чи середовищами.&lt;/li&gt;
&lt;li&gt;Якщо вимога стосується сфери вашої SIG, допоможіть перевірити її межі та відповідний тест.&lt;/li&gt;
&lt;li&gt;Оскільки підпроєкт переживе робочу групу, ми також шукаємо людей, які готові підтримувати його в довгостроковій перспективі.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Знайти нас можна в каналі &lt;a href=&#34;https://kubernetes.slack.com/messages/wg-workload-conformance&#34;&gt;&lt;code&gt;#wg-workload-conformance&lt;/code&gt;&lt;/a&gt; у Slack Kubernetes (запрошення можна отримати на &lt;a href=&#34;https://slack.k8s.io/&#34;&gt;slack.k8s.io&lt;/a&gt;) та в &lt;a href=&#34;https://groups.google.com/a/kubernetes.io/g/wg-workload-conformance&#34;&gt;списку розсилки&lt;/a&gt;. Робоча група збирається кожні два тижні, у середу о 15:00 UTC. Посилання на Zoom і порядок денний доступні в &lt;a href=&#34;https://docs.google.com/document/d/16GPnmukPqbTkauWb3CtXzA3aEDUXoVKY34gA41YQmPk/edit&#34;&gt;нотатках зустрічей&lt;/a&gt;. Якщо ви хочете порушити певне питання, додайте його до порядку денного. Після приєднання до списку розсилки запрошення на зустріч зазвичай автоматично додається до календаря.&lt;/p&gt;
&lt;p&gt;Дякуємо всім, хто переглянув і підтримав &lt;a href=&#34;https://github.com/kubernetes/community/pull/9139&#34;&gt;пропозицію створити робочу групу&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Чому мій Kubernetes Job досі в черзі? Відстеження допуску Kueue в Headlamp</title>
      <link>https://deploy-preview-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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>Перехід на cgroup v2 у Kubernetes: що вам потрібно знати</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/06/kubernetes-cgroups-v2-shift/</link>
      <pubDate>Tue, 06 Oct 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/10/06/kubernetes-cgroups-v2-shift/</guid>
      <description>
        
        
        &lt;p&gt;У Linux &lt;em&gt;cgroups&lt;/em&gt; (control groups) — це функція ядра, яка використовується для керування системними ресурсами. Kubernetes використовує cgroups для виділення контейнерам таких ресурсів, як CPU та памʼять, гарантуючи, що застосунки працюють безперебійно, не заважаючи один одному. Починаючи з релізу Kubernetes v1.31, підтримка керування cgroup v1 перейшла в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/08/14/kubernetes-1-31-moving-cgroup-v1-support-maintenance-mode/&#34;&gt;режим підтримки&lt;/a&gt;. Підтримка керування cgroup v2 стабільна, починаючи з Kubernetes v1.25.&lt;/p&gt;
&lt;p&gt;Порівняно з cgroup v1, cgroup v2 надає єдину уніфіковану ієрархію, більш узгоджений інтерфейс та міцнішу основу для ізоляції ресурсів і сучасних функцій керування ресурсами.&lt;/p&gt;
&lt;h2 id=&#34;deprecation-of-cgroup-v1&#34;&gt;Застарівання cgroup v1&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecation-of-cgroup-v1&#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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/cgroups/#deprecation-of-cgroup-v1&#34;&gt;оголосив cgroup v1 застарілим&lt;/a&gt;. Починаючи з Kubernetes v1.35, &lt;code&gt;failCgroupV1&lt;/code&gt; має типове значення &lt;code&gt;true&lt;/code&gt;, тому kubelet типово не запускається на вузлі з cgroup v1. Адміністратори можуть тимчасово встановити &lt;code&gt;failCgroupV1: false&lt;/code&gt; у &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/kubelet-config-file/&#34;&gt;файлі конфігурації kubelet&lt;/a&gt;, але вилучення відбуватиметься відповідно до &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політики застарівання Kubernetes&lt;/a&gt;. Подальша робота з вилучення відстежується в &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5573&#34;&gt;KEP-5573: Remove cgroup v1 support&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Якщо ви все ще використовуєте реліз старіший за v1.35, виконайте міграцію кожного Linux-вузла на cgroup v2 перед оновленням або плануйте встановити тимчасове перевизначення &lt;code&gt;failCgroupV1: false&lt;/code&gt;. Якщо ви вже на v1.35 або пізнішій версії, підтвердьте, що кожен Linux-вузол працює з cgroup v2 (або що ви навмисно зберігаєте перевизначення). За типової конфігурації вузол, що залишився на cgroup v1, зазнає збою під час запуску kubelet.&lt;/p&gt;
&lt;p&gt;Для кластерів, що управляються kubeadm, у Kubernetes v1.35 ця перевірка також відбувається раніше і є більш суворою. Попередня перевірка &lt;code&gt;SystemVerification&lt;/code&gt;, яку надає &lt;code&gt;k8s.io/system-validators&lt;/code&gt;, повертає помилку під час &lt;code&gt;kubeadm init&lt;/code&gt;, &lt;code&gt;kubeadm join&lt;/code&gt; та &lt;code&gt;kubeadm upgrade&lt;/code&gt;, коли виявляє cgroup v1 з kubelet v1.35 або пізнішої версії; зі старішим kubelet перевірка залишається попередженням. Деталі дивіться в &lt;a href=&#34;https://github.com/kubernetes/system-validators/releases/tag/v1.12.1&#34;&gt;примітках до релізу kubernetes/system-validators#1.12.1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Найчастіші запитання охоплюють три основні сфери: чому варто мігрувати, переваги та недоліки, і ключові моменти, про які слід памʼятати при використанні cgroup v2.&lt;/p&gt;
&lt;h2 id=&#34;limitations-of-cgroup-v1-and-improvements-with-cgroup-v2&#34;&gt;Обмеження cgroup v1 та покращення з cgroup v2&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#limitations-of-cgroup-v1-and-improvements-with-cgroup-v2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Документація ядра Linux описує обидва інтерфейси:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kernel.org/doc/Documentation/cgroup-v1/&#34;&gt;документація cgroup v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.kernel.org/admin-guide/cgroup-v2.html&#34;&gt;документація cgroup v2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Перелічимо деякі відомі проблеми.&lt;/p&gt;
&lt;h3 id=&#34;active-file-memory-is-not-considered-available-memory&#34;&gt;Памʼять &lt;code&gt;active_file&lt;/code&gt; не вважається доступною памʼяттю&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#active-file-memory-is-not-considered-available-memory&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubelet вважає памʼять &lt;code&gt;active_file&lt;/code&gt; невідновлюваною. Тому для навантажень з інтенсивним вводом/виводом великий кеш сторінок може змусити kubelet повідомляти про тиск на памʼять та виселяти Podʼи. Це &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/node-pressure-eviction/#active-file-memory-is-not-considered-as-available-memory&#34;&gt;відома проблема kubelet&lt;/a&gt; (&lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/43916&#34;&gt;kubernetes/kubernetes#43916&lt;/a&gt;); міграція на cgroup v2 сама по собі не змінює цей розрахунок. Задокументований обхідний шлях — встановити однакові запити та ліміти памʼяті для контейнерів, які виконують інтенсивний ввід/вивід, попередньо вимірявши відповідне значення.&lt;/p&gt;
&lt;h3 id=&#34;memory-qos-updates-in-kubernetes-v1-36&#34;&gt;Оновлення Memory QoS у Kubernetes v1.36&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#memory-qos-updates-in-kubernetes-v1-36&#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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/pod-qos/#memory-qos-with-cgroup-v2&#34;&gt;Memory QoS&lt;/a&gt; було представлено як альфа-функцію в Kubernetes v1.22 і оновлено у v1.27. Ця функція залишається альфа-функцією у v1.36, але тепер відокремлює обмеження памʼяті від її резервування та додає &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/04/29/kubernetes-v1-36-memory-qos-tiered-protection/&#34;&gt;багаторівневий захист памʼяті&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Memory QoS доступний &lt;strong&gt;лише&lt;/strong&gt; на Linux-вузлах, які використовують cgroup v2. Він покладається на контролер памʼяті cgroup v2: &lt;code&gt;memory.high&lt;/code&gt; забезпечує обмеження, тоді як &lt;code&gt;memory.min&lt;/code&gt; і &lt;code&gt;memory.low&lt;/code&gt; забезпечують жорсткий і мʼякий захист, коли увімкнено багаторівневе резервування. cgroup v1 не може надати таку модель захисту.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Увімкнення функціональної можливості &lt;code&gt;MemoryQoS&lt;/code&gt; застосовує обмеження &lt;code&gt;memory.high&lt;/code&gt; до контейнерів Burstable. Поріг визначається із запиту, ліміту та &lt;code&gt;memoryThrottlingFactor&lt;/code&gt; (типово &lt;code&gt;0.9&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;memoryReservationPolicy: None&lt;/code&gt; є типовим значенням. Воно не записує &lt;code&gt;memory.min&lt;/code&gt; чи &lt;code&gt;memory.low&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;memoryReservationPolicy: TieredReservation&lt;/code&gt; зіставляє запити памʼяті Podʼів Guaranteed з &lt;code&gt;memory.min&lt;/code&gt; (жорсткий захист), а запити Podʼів Burstable — з &lt;code&gt;memory.low&lt;/code&gt; (мʼякий захист). Podʼи BestEffort не отримують жодного захисту.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubelet надає альфа-метрики для загальних резервувань &lt;code&gt;memory.min&lt;/code&gt; та &lt;code&gt;memory.low&lt;/code&gt; на вузлі.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Рекомендується ядро 5.9 або пізнішої версії. На старіших ядрах відновлення &lt;code&gt;memory.high&lt;/code&gt; може спричинити відомий livelock; починаючи з v1.36, kubelet записує попередження в лог, коли Memory QoS увімкнено на ураженому ядрі.&lt;/p&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;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;featureGates&lt;/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;MemoryQoS&lt;/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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;memoryReservationPolicy&lt;/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;TieredReservation&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;memoryThrottlingFactor&lt;/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;0.9&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;Загальна рекомендація Kubernetes — не вмикати альфа-функції у промисловому середовищі; однак, якщо ви вважаєте Memory QoS з багаторівневим резервуванням корисним для вашої платформи у промисловому середовищі, обовʼязково протестуйте конфігурацію &lt;strong&gt;та&lt;/strong&gt; врахуйте жорстко зарезервовану памʼять, перш ніж увімкнути функціональну можливість &lt;code&gt;TieredReservation&lt;/code&gt;. Поточне зіставлення класів QoS Kubernetes з параметрами керування cgroup v2 дивіться у документації &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/pod-qos/#memory-qos-with-cgroup-v2&#34;&gt;Pod QoS&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;container-aware-oom-handling&#34;&gt;Обробка OOM з урахуванням контейнера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#container-aware-oom-handling&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;На вузлах з cgroup v2 kubelet типово встановлює &lt;code&gt;singleProcessOOMKill&lt;/code&gt; у &lt;code&gt;false&lt;/code&gt;. Тому він встановлює &lt;code&gt;memory.oom.group&lt;/code&gt; для кожного cgroup контейнера, щоб подія OOM вбивала всі процеси в цьому контейнері разом, а не залишала частково працездатний багатопроцесний контейнер. Встановіть &lt;code&gt;singleProcessOOMKill: true&lt;/code&gt;, лише якщо вам потрібна поведінка, сумісна з cgroup v1, коли ядро може вбивати по одному процесу за раз. Дивіться &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration&#34;&gt;довідку &lt;code&gt;KubeletConfiguration&lt;/code&gt;&lt;/a&gt; для цього налаштування.&lt;/p&gt;
&lt;p&gt;Ця поведінка обмежена cgroup контейнера, а не всього Podʼа. Крім того, &lt;code&gt;cgroup.kill&lt;/code&gt; — це окремий адміністративний інтерфейс: запис &lt;code&gt;1&lt;/code&gt; у нього надсилає &lt;code&gt;SIGKILL&lt;/code&gt; кожному процесу в цьому cgroup та його нащадках; він не налаштовує поведінку OOM. Контролер памʼяті cgroup v2 додатково надає лічильники &lt;code&gt;memory.events&lt;/code&gt;, які можуть спостерігати системи моніторингу та OOM-менеджери у просторі користувача.&lt;/p&gt;
&lt;h3 id=&#34;rootless-support&#34;&gt;Підтримка rootless&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#rootless-support&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У cgroup v1 делегування контролерів менш привілейованим контейнерам може бути небезпечним.&lt;/p&gt;
&lt;p&gt;На відміну від cgroup v1, cgroup v2 офіційно підтримує делегування. Більшість реалізацій rootless-контейнерів покладаються на systemd для делегування контролерів v2 користувачам, відмінним від root.&lt;/p&gt;
&lt;p&gt;Цей механізм делегування відокремлений від просторів імен користувачів Podʼів Kubernetes, які зіставляють користувачів контейнерів з непривілейованими користувачами хоста. &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/user-namespaces/&#34;&gt;Підтримка просторів імен користувачів Podʼів&lt;/a&gt; досягла стабільності в Kubernetes v1.36; перевірте її вимоги до файлової системи, ядра, середовища виконання CRI та OCI перед увімкненням.&lt;/p&gt;
&lt;h3 id=&#34;what-else&#34;&gt;Що ще?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-else&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Історії eBPF:
&lt;ul&gt;
&lt;li&gt;У cgroup v1 контроль доступу до пристроїв відображається через файли інтерфейсу.&lt;/li&gt;
&lt;li&gt;Контролер пристроїв cgroup v2 не має файлів інтерфейсу і реалізований поверх cgroup BPF.&lt;/li&gt;
&lt;li&gt;Cilium прикріплює BPF-програми cgroup для балансування навантаження на основі сокетів. Його &lt;a href=&#34;https://docs.cilium.io/en/stable/network/kubernetes/kubeproxy-free/#validate-bpf-cgroup-programs-attachment&#34;&gt;типовий кореневий cgroup&lt;/a&gt; — це &lt;code&gt;/run/cilium/cgroupv2&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/understand-psi-metrics/&#34;&gt;Pressure Stall Information (PSI)&lt;/a&gt; повідомляє про конкуренцію за CPU, памʼять та ввід/вивід на рівні вузла, Podʼа та контейнера. На підтримуваних кластерах kubelet типово надає PSI (&lt;code&gt;KubeletPSI&lt;/code&gt; стабільна і заблокована в увімкненому стані). PSI вимагає cgroup v2, Linux 4.20 або пізнішої версії, &lt;code&gt;CONFIG_PSI=y&lt;/code&gt; та ядро, завантажене без &lt;code&gt;psi=0&lt;/code&gt;. Kubelet показує ці дані через &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/node-metrics/#summary-api-source&#34;&gt;Summary API&lt;/a&gt; та &lt;code&gt;/metrics/cadvisor&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Під час міграції оновіть програмне забезпечення, яке читає файлову систему cgroup безпосередньо. &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/cgroups/#migrating-cgroupv2&#34;&gt;Поради щодо міграції&lt;/a&gt; рекомендують cAdvisor v0.43.0 або пізнішої версії та перелічують сумісні версії Java, Node.js та &lt;code&gt;automaxprocs&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;cpu-weight-conversion-in-newer-oci-runtimes&#34;&gt;Перетворення ваги CPU у новіших OCI-середовищах виконання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cpu-weight-conversion-in-newer-oci-runtimes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;cgroup v1 використовує &lt;code&gt;cpu.shares&lt;/code&gt;, тоді як cgroup v2 використовує &lt;code&gt;cpu.weight&lt;/code&gt;. Новіші середовища виконання OCI використовують покращене нелінійне перетворення, яке зберігає типовий пріоритет і надає малим CPU-запитам кориснішу гранулярність. Зміну реалізовано в середовищі виконання OCI, а не в Kubernetes: вона доступна в crun v1.23 та runc v1.3.2. Після оновлення середовища виконання інструменти моніторингу або політик, які передбачають точні значення &lt;code&gt;cpu.weight&lt;/code&gt;, можуть потребувати оновлень. Читайте «&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/01/30/new-cgroup-v1-to-v2-cpu-conversion-formula/&#34;&gt;Нове перетворення з cgroup v1 CPU Shares на v2 CPU Weight&lt;/a&gt;» щодо формули, прикладів та міркувань сумісності.&lt;/p&gt;
&lt;h3 id=&#34;in-place-resource-updates&#34;&gt;Оновлення ресурсів на місці&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#in-place-resource-updates&#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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/pod-lifecycle/#pod-resize-inplace&#34;&gt;Вертикальне масштабування Podʼів на місці&lt;/a&gt; досягло стабільності в Kubernetes v1.35. Kubernetes v1.36 потім типово &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/04/30/kubernetes-v1-36-inplace-pod-level-resources-beta/&#34;&gt;увімкнув&lt;/a&gt; вертикальне масштабування на місці для ресурсів рівня Podʼа, як бета-функцію. Kubelet координує зміни між cgroups рівня Podʼа та рівня контейнерів так, щоб збільшення створювали запас простору до зростання лімітів контейнера, тоді як зменшення обмежували контейнери перед звуженням межі рівня Podʼа. Точне сукупне застосування цієї функції v1.36 вимагає cgroup v2.&lt;/p&gt;
&lt;h2 id=&#34;adopting-cgroup-version-2&#34;&gt;Впровадження cgroup версії 2&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#adopting-cgroup-version-2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;requirements&#34;&gt;Вимоги&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#requirements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ось що вам потрібно для використання cgroup v2 з Kubernetes. По-перше, вам потрібна версія Kubernetes з підтримкою керування cgroup v2; вона стабільна, починаючи з Kubernetes v1.25, і всі підтримувані релізи Kubernetes включають цю підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вам потрібен щонайменше один Linux-вузол; cgroup — це суто Linux-концепція&lt;/li&gt;
&lt;li&gt;Ваше встановлення ОС має працювати з увімкненим cgroup v2&lt;/li&gt;
&lt;li&gt;Версія ядра має бути 5.8 або пізнішою (5.9 або пізніша рекомендується при використанні Memory QoS)&lt;/li&gt;
&lt;li&gt;Середовище виконання контейнерів має підтримувати cgroup v2. Наприклад:
&lt;ul&gt;
&lt;li&gt;containerd v1.4 або пізніша підтримує cgroup v2; використовуйте containerd v2.0 або пізнішу для автоматичного виявлення cgroup-драйвера&lt;/li&gt;
&lt;li&gt;CRI-O v1.20 або пізніша&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kubelet і середовище виконання контейнерів мають бути налаштовані на використання правильного cgroup-драйвера. Дивіться &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/&#34;&gt;Налаштування cgroup-драйвера kubelet відповідно до cgroup-драйвера середовища виконання контейнерів&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Наразі ви можете повернутися до використання cgroup v1; проєкт Kubernetes рекомендує використовувати cgroup v2, але в Kubernetes 1.36 (поточний реліз) варіант cgroup v1 все ще підтримується як запасний. Цей запасний варіант заплановано вилучити в Kubernetes v1.38. Якщо ви запускаєте старіший кластер, плануйте міграцію; якщо ви налаштовуєте новий кластер з Linux-вузлами, вам слід віддати перевагу cgroup v2. В обох випадках перегляньте &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/setup/production-environment/container-runtimes/#systemd-cgroup-driver&#34;&gt;документацію Kubernetes щодо середовищ виконання контейнерів&lt;/a&gt; та (якщо застосовно) &lt;a href=&#34;https://github.com/containerd/containerd/blob/main/RELEASES.md#kubernetes-support&#34;&gt;матрицю сумісності containerd&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;kernel-updates-around-cgroup-v2&#34;&gt;Оновлення ядра, що стосуються cgroup v2&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#kernel-updates-around-cgroup-v2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Коли Kubernetes був вперше анонсований, у 2014 році, існував лише cgroup v1. Керування cgroup версії 2 вперше зʼявилося в ядрі Linux 4.5, випущеному у 2016 році.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;У Linux 4.5 підтримувалися контролери cgroup v2 &lt;code&gt;io&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt; та &lt;code&gt;pids&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Linux 4.15 додав підтримку контролера &lt;code&gt;cpu&lt;/code&gt; cgroup v2.&lt;/li&gt;
&lt;li&gt;Підтримка &lt;a href=&#34;https://docs.kernel.org/accounting/psi.html&#34;&gt;Pressure Stall Information&lt;/a&gt; (PSI) почалася з Linux 4.20.&lt;/li&gt;
&lt;li&gt;Проєкт Kubernetes не рекомендує використовувати cgroup v2 з ядром Linux старішим за 5.2 через відсутність підтримки заморожувача завдань на рівні cgroup.&lt;/li&gt;
&lt;li&gt;Kubernetes визначає версію 5.8 як мінімальну версію ядра для cgroup v2; системний файл &lt;code&gt;cpu.stat&lt;/code&gt; кореневого cgroup було додано в Linux 5.8.&lt;/li&gt;
&lt;li&gt;Виправлення livelock &lt;code&gt;memory.high&lt;/code&gt;, яке використовує Memory QoS, присутнє в Linux 5.9 та пізніших.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memory.peak&lt;/code&gt; було додано в Linux 5.19.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cgroup-driver-configuration&#34;&gt;Конфігурація cgroup-драйвера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cgroup-driver-configuration&#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-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/&#34;&gt;Налаштуйте cgroup-драйвер kubelet відповідно до cgroup-драйвера середовища виконання контейнерів&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Якщо ви використовуєте &lt;code&gt;kubeadm&lt;/code&gt; для керування кластером, Kubernetes рекомендує використовувати cgroup-драйвер &lt;code&gt;systemd&lt;/code&gt;, оскільки &lt;code&gt;kubeadm&lt;/code&gt; керує kubelet як службою systemd. Для інших інструментів керування перевірте документацію інструмента, який ви використовуєте для керування кластером.&lt;/p&gt;
&lt;p&gt;Якщо ви можете обрати будь-який варіант, я рекомендую використовувати драйвер systemd.&lt;/p&gt;
&lt;p&gt;Який би інструмент ви не обрали, kubelet автоматично намагається виявити рекомендований cgroup-драйвер середовища виконання. Це автоматичне виявлення покладається на використання середовища виконання, яке реалізує RPC &lt;code&gt;RuntimeConfig&lt;/code&gt; CRI (наприклад: containerd v2.0+ або CRI-O v1.28+).&lt;/p&gt;
&lt;p&gt;Якщо ви використовуєте середовище виконання контейнерів, яке підтримує cgroup v2, але не підтримує автоматичне виявлення cgroup-драйвера, ви можете вручну налаштувати перевизначення, відредагувавши файл конфігурації kubelet. Наприклад:&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;cgroupDriver&lt;/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;systemd&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;Автоматичне виявлення cgroup-драйвера середовища виконання через CRI, яке відстежується &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/4033&#34;&gt;KEP-4033&lt;/a&gt;, досягло стабільності в Kubernetes v1.34. Воно вимагає середовища виконання, яке реалізує CRI RPC &lt;code&gt;RuntimeConfig&lt;/code&gt; (containerd v2.0+ або CRI-O v1.28+). Коли воно доступне, kubelet використовує значення, повідомлене середовищем виконання, замість налаштованого значення &lt;code&gt;cgroupDriver&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;tools-and-commands-for-troubleshooting&#34;&gt;Інструменти та команди для усунення несправностей&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#tools-and-commands-for-troubleshooting&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Інструменти та команди, про які вам слід знати щодо cgroups:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stat -fc %T /sys/fs/cgroup/&lt;/code&gt;: Перевірте, чи увімкнено cgroup v2; вона повертає &lt;code&gt;cgroup2fs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl list-units &#39;kube*&#39; --type=slice&lt;/code&gt; або &lt;code&gt;--type=scope&lt;/code&gt;: Перелічіть одиниці, повʼязані з Kubernetes, які systemd наразі має в памʼяті.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bpftool cgroup list /sys/fs/cgroup/*&lt;/code&gt;: Перелічіть усі програми, прикріплені до CGROUP cgroup.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemd-cgls /sys/fs/cgroup/*&lt;/code&gt;: Рекурсивно покажіть вміст контрольних груп.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemd-cgtop&lt;/code&gt;: Покажіть верхні контрольні групи за їхнім використанням ресурсів.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tree -L 2 -d /sys/fs/cgroup/kubepods.slice&lt;/code&gt;: Покажіть теки cgroups, повʼязані з Podʼами.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;how-to-check-if-a-pod-cpu-or-memory-limit-is-successfully-applied-to-the-cgroup-file&#34;&gt;Як перевірити, чи ліміт CPU або памʼяті Podʼа успішно застосовано до файлу cgroup?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-check-if-a-pod-cpu-or-memory-limit-is-successfully-applied-to-the-cgroup-file&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&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;kubectl get pod &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -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;{.spec.nodeName}{&amp;#34;\n&amp;#34;}&amp;#39;&lt;/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;kubectl get pod &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -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;{range .spec.containers[*]}{.name}{&amp;#34; spec\t&amp;#34;}{.resources}{&amp;#34;\n&amp;#34;}{end}&amp;#39;&lt;/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;kubectl get pod &amp;lt;pod-name&amp;gt; -n &amp;lt;namespace&amp;gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -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;{range .status.containerStatuses[*]}{.name}{&amp;#34; status\t&amp;#34;}{.resources}{&amp;#34;\n&amp;#34;}{end}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;На цьому вузлі, від імені root, з cgroup-драйвером systemd та cgroup v2 (ці фрагменти також потребують &lt;code&gt;jq&lt;/code&gt;). Визначте контейнер за мітками kubelet; сама лише назва контейнера не є унікальною на вузлі. Використовуйте &lt;code&gt;crictl ps -a&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;&lt;span class=&#34;nv&#34;&gt;CONTAINER_ID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;crictl ps &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --label io.kubernetes.pod.namespace&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;lt;namespace&amp;gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --label io.kubernetes.pod.name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&amp;lt;pod-name&amp;gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --name &amp;lt;container-name&amp;gt; -q &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n1&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;
&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;# OCI-представлення (не імена полів protobuf CRI)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;crictl inspect &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CONTAINER_ID&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.info.runtimeSpec.linux.resources&amp;#39;&lt;/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;# Шлях cgroup ядра для цього контейнера&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;crictl inspect &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CONTAINER_ID&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;.info.pid&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;&lt;span class=&#34;nv&#34;&gt;CGROUP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/sys/fs/cgroup&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;awk -F: &lt;span class=&#34;s1&#34;&gt;&amp;#39;$1==&amp;#34;0&amp;#34;{print $3}&amp;#39;&lt;/span&gt; /proc/&lt;span class=&#34;nv&#34;&gt;$PID&lt;/span&gt;/cgroup&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/cpu.weight&amp;#34;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# request.cpu → shares → weight; не ліміт&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/cpu.max&amp;#34;&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;# limit.cpu як &amp;#34;quota period&amp;#34;; без ліміту — &amp;#34;max &amp;lt;period&amp;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;cat &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/memory.max&amp;#34;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# limit.memory; без ліміту — &amp;#34;max&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;c1&#34;&gt;# Cgroup рівня Podʼа (батьківський slice), використовується ресурсами рівня Podʼа&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;dirname &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&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;&lt;span class=&#34;s2&#34;&gt;/cpu.max&amp;#34;&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;dirname &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&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;&lt;span class=&#34;s2&#34;&gt;/memory.max&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;c1&#34;&gt;# Присутні, коли увімкнено MemoryQoS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/memory.high&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/memory.min&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/memory.low&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;nv&#34;&gt;SCOPE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;basename &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CGROUP&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;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl show &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SCOPE&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -p CPUWeight -p CPUQuotaPerSecUSec -p CPUQuotaPeriodUSec -p MemoryMax
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Не трактуйте &lt;code&gt;info.runtimeSpec.linux.cgroupsPath&lt;/code&gt; як шлях файлової системи, коли середовище виконання використовує драйвер systemd; це значення — шлях одиниці systemd (&lt;code&gt;slice:runtime:id&lt;/code&gt;), а не тека під &lt;code&gt;/sys/fs/cgroup&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Очікуване зіставлення на кожному рівні:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes: &lt;code&gt;spec.containers[*].resources&lt;/code&gt; (бажані) та &lt;code&gt;status.containerStatuses[*].resources&lt;/code&gt; (фактичні після зміни розміру на місці). Ресурси рівня Podʼа знаходяться в &lt;code&gt;spec.resources&lt;/code&gt; та батьківському pod-slice.&lt;/li&gt;
&lt;li&gt;CRI (kubelet → середовище виконання; ці назви protobuf залишаються в стилі cgroup v1 навіть на v2): &lt;code&gt;cpu_shares&lt;/code&gt;, &lt;code&gt;cpu_quota&lt;/code&gt;, &lt;code&gt;cpu_period&lt;/code&gt;, &lt;code&gt;memory_limit_in_bytes&lt;/code&gt;, плюс &lt;code&gt;unified&lt;/code&gt; для Memory QoS. &lt;code&gt;crictl inspect&lt;/code&gt; не показує ці назви; він показує OCI-специфікацію, яку середовище виконання отримало з них.&lt;/li&gt;
&lt;li&gt;OCI-специфікація: &lt;code&gt;linux.resources.cpu.{shares,quota,period}&lt;/code&gt;, &lt;code&gt;linux.resources.memory.limit&lt;/code&gt; та &lt;code&gt;linux.resources.unified&lt;/code&gt;. Середовище виконання перетворює shares, quota та period у файли cgroup v2. Після оновлення crun або runc формула перетворення shares у weight може змінитися; дивіться &lt;a href=&#34;#cpu-weight-conversion-in-newer-oci-runtimes&#34;&gt;перетворення ваги CPU&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;scope systemd: &lt;code&gt;CPUWeight&lt;/code&gt;, &lt;code&gt;CPUQuotaPerSecUSec&lt;/code&gt;, &lt;code&gt;CPUQuotaPeriodUSec&lt;/code&gt;, &lt;code&gt;MemoryMax&lt;/code&gt;. Безлімітні або невстановлені значення часто відображаються як &lt;code&gt;[not set]&lt;/code&gt; або нескінченність.&lt;/li&gt;
&lt;li&gt;cgroupfs: &lt;code&gt;cpu.weight&lt;/code&gt; (з CPU-запиту; невстановлений запит все одно дає типове значення у 2 shares), &lt;code&gt;cpu.max&lt;/code&gt; та &lt;code&gt;memory.max&lt;/code&gt; у scope контейнера. Memory QoS додає &lt;code&gt;memory.high&lt;/code&gt;, &lt;code&gt;memory.min&lt;/code&gt; та &lt;code&gt;memory.low&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;further-reading&#34;&gt;Подальше читання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#further-reading&#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-59115--kubernetes-io-main-staging.netlify.app/blog/2024/08/14/kubernetes-1-31-moving-cgroup-v1-support-maintenance-mode/&#34;&gt;Kubernetes 1.31: Moving cgroup v1 Support into Maintenance Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/04/29/kubernetes-v1-36-memory-qos-tiered-protection/&#34;&gt;Kubernetes v1.36: Tiered Memory Protection with Memory QoS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/05/12/kubernetes-v1-36-psi-metrics-ga/&#34;&gt;Kubernetes v1.36: PSI Metrics for Kubernetes Graduates to GA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2022/08/31/cgroupv2-ga-1-25/&#34;&gt;Kubernetes 1.25: cgroup v2 graduates to GA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KubeCon NA 2022 &lt;a href=&#34;https://www.youtube.com/watch?v=WxZK-UXKvXk&#34;&gt;cgroup v2: Before You Jump In&lt;/a&gt; від Tony Gosselin та Mike Tougeron, Adobe Systems&lt;/li&gt;
&lt;li&gt;KubeCon NA 2022 &lt;a href=&#34;https://www.youtube.com/watch?v=sgyFCp1CRhA&#34;&gt;Cgroupv2 Is Coming Soon To a Cluster Near You&lt;/a&gt; — David Porter, Google та Mrunal Patel, RedHat&lt;/li&gt;
&lt;li&gt;KubeCon EU 2020 &lt;a href=&#34;https://www.youtube.com/watch?v=u8h0e84HxcE&amp;t=783s&#34;&gt;Kubernetes On cgroup v2&lt;/a&gt; від Giuseppe Scrivano, Red Hat.&lt;/li&gt;
&lt;li&gt;Цей допис охоплює лише базові вимоги та конфігурацію компонентів Kubernetes. Він не включатиме, як увімкнути cgroup fs у дистрибутивах ОС. Для міграції ви можете звернутися до &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/cgroups/#migrating-cgroupv2&#34;&gt;міграції на cgroup v2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.37: Захист зберігання контейнерів через параметри bind mount та режими EmptyDir</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/16/kubernetes-v1-37-hardening-container-storage/</link>
      <pubDate>Wed, 16 Sep 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/16/kubernetes-v1-37-hardening-container-storage/</guid>
      <description>
        
        
        &lt;p&gt;Kubernetes v1.37 приносить важливі можливості безпеки зберігання: режими дозволів &lt;code&gt;emptyDir&lt;/code&gt; та параметри bind mount. Вони допомагають розробникам застосунків та фахівцям з безпеки впроваджувати суворі політики безпеки, наприклад, забороняти видалення файлів між контейнерами або виконання довільних бінарних файлів із томів з правами запису, безпосередньо в Kubernetes без будь-яких складних обхідних шляхів.&lt;/p&gt;
&lt;h2 id=&#34;linux-storage-and-permission-fundamentals&#34;&gt;Основи Linux: зберігання та дозволи&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#linux-storage-and-permission-fundamentals&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Перш ніж заглибитись у нові можливості Kubernetes, коротко оглянемо низькорівневі механізми безпеки Linux, які роблять їх можливими.&lt;/p&gt;
&lt;h3 id=&#34;bind-mount-flags&#34;&gt;Прапорці bind mount&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#bind-mount-flags&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Коли Linux монтує або повторно монтує теку, прапорці Virtual File System (VFS) контролюють, які дії дозволені в цій файловій системі:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noexec&lt;/code&gt;&lt;/strong&gt;: Не дозволяє безпосереднє виконання будь-яких бінарних файлів у змонтованій файловій системі.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;nosuid&lt;/code&gt;&lt;/strong&gt;: Не дозволяє бітам set-user-identifier або set-group-identifier діяти.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;nodev&lt;/code&gt;&lt;/strong&gt;: Не інтерпретує символьні або блокові спеціальні пристрої у файловій системі.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;directory-permissions-and-the-sticky-bit&#34;&gt;Дозволи теки та sticky-біт&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#directory-permissions-and-the-sticky-bit&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Стандартні Unix-дозволи регулюють доступ у трьох областях: Власник, Група та Інші (наприклад, &lt;code&gt;0755&lt;/code&gt; або &lt;code&gt;0777&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Окрім стандартних бітів читання, запису та виконання, Linux підтримує &lt;em&gt;sticky-біт&lt;/em&gt; (як у режимі &lt;code&gt;01777&lt;/code&gt;). Коли sticky-біт застосовується до теки, він гарантує, що файл у цій теці може бути видалений або перейменований лише власником файлу або root. Це є необхідним для спільних тек з правом на запис, таких як &lt;code&gt;/tmp&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;motivation-for-the-improvements&#34;&gt;Причини для вдосконалень&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#motivation-for-the-improvements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Чому Kubernetes потребує параметрів bind mount та дозволів &lt;code&gt;emptyDir&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Основна мета цих можливостей — підвищити безпеку робочих навантажень Kubernetes, дозволяючи параметри bind mount, повʼязані з безпекою, при монтуванні томів. Типово томи монтуються як bind mount у контейнери середовищем виконання контейнерів та kubelet без прапорців &lt;code&gt;noexec&lt;/code&gt;, &lt;code&gt;nosuid&lt;/code&gt; або &lt;code&gt;nodev&lt;/code&gt;. Така типова поведінка може підривати безпеку. Наприклад, без &lt;code&gt;noexec&lt;/code&gt;, скомпрометований процес може використовувати будь-який том з правами на запис (&lt;code&gt;emptyDir&lt;/code&gt;, PersistentVolume тощо) для завантаження, &lt;code&gt;chmod +x&lt;/code&gt; та виконання довільних бінарних файлів, навіть коли коренева файлова система контейнера доступна лише для читання (&lt;code&gt;readOnlyRootFilesystem: true&lt;/code&gt;). Підтримка &lt;code&gt;noexec&lt;/code&gt;, &lt;code&gt;nodev&lt;/code&gt; та &lt;code&gt;nosuid&lt;/code&gt; надає користувачам вбудований спосіб посилення монтування томів відповідно до стандартів безпеки та політик.&lt;/p&gt;
&lt;p&gt;Проблема найбільш помітна з томами &lt;code&gt;emptyDir&lt;/code&gt;, які є найпоширенішим типом тому з правом на запис та були предметом кількох повідомлень про проблеми з безпекою:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/48912&#34;&gt;Issue #48912&lt;/a&gt;: Визнано прогалину в безпеці — нездатність встановити параметри монтування для &lt;code&gt;emptyDir&lt;/code&gt; була виявлена під час аудиту, але залишилася невирішеною до теперішнього часу.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/119627&#34;&gt;Issue #119627&lt;/a&gt;: Аудит безпеки Kubernetes 1.24 (Finding NCC-E003660-7HM) — зовнішній аудит спеціально зазначав, що нездатність монтувати &lt;code&gt;emptyDir&lt;/code&gt; з &lt;code&gt;noexec&lt;/code&gt; являє собою збій в безпеці.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Однак та ж прогалина стосується всіх типів томів. У PersistentVolume є поле &lt;code&gt;mountOptions&lt;/code&gt;, але ці параметри є прапорцями рівня файлової системи, які застосовуються CSI-драйвером на вузлі, тому вони не надійно перетворюються на прапорці bind mount всередині контейнера. Раніше не було механізму для встановлення &lt;code&gt;noexec&lt;/code&gt;, &lt;code&gt;nosuid&lt;/code&gt; або &lt;code&gt;nodev&lt;/code&gt; на bind mount, який створює середовище виконання контейнерів для будь-якого типу тому.&lt;/p&gt;
&lt;p&gt;Крім того, тип тому &lt;code&gt;emptyDir&lt;/code&gt; типово створює теки з жорстко заданим режимом &lt;code&gt;0777&lt;/code&gt;. Раніше це означало, що &lt;strong&gt;будь-який&lt;/strong&gt; процес, який може знайти том, може читати, записувати та видаляти все в томі, незалежно від того, хто його створив.&lt;/p&gt;
&lt;p&gt;Ви могли, і все ще можете, використовувати init-контейнер для встановлення іншого режиму доступу, але це складніше і важче перевірити на відповідність вимогам.&lt;/p&gt;
&lt;p&gt;Це викликає реальні проблеми:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Podʼи з кількома контейнерами, що спільно використовують &lt;code&gt;emptyDir&lt;/code&gt;, не могли завадити одному контейнеру видаляти файли іншого. Sticky-біт (&lt;code&gt;01777&lt;/code&gt;) вирішує цю проблему, але не було вбудованого способу його встановити.&lt;/li&gt;
&lt;li&gt;Деякі застосунки та фреймворки безпеки очікують, що теки &lt;code&gt;/tmp&lt;/code&gt; мають встановлений sticky-біт (режим &lt;code&gt;01777&lt;/code&gt;). Без вбудованої підтримки встановлення режиму &lt;code&gt;emptyDir&lt;/code&gt; користувачам доводилося використовувати init-контейнери або альтернативні типи томів, щоб задовольнити цю вимогу.&lt;/li&gt;
&lt;li&gt;Інженерам платформ, які бажають більш суворі дозволи (наприклад, &lt;code&gt;0750&lt;/code&gt; лише для власника та групи), доводилося використовувати init-контейнери з &lt;code&gt;chmod&lt;/code&gt;, що додає зайву складність.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Тип тому &lt;code&gt;emptyDir&lt;/code&gt; був помітною прогалиною. Як один із найпоширеніших типів томів з можливістю запису у Kubernetes, він не мав жодного способу контролювати свої дозволи створення.&lt;/p&gt;
&lt;h2 id=&#34;real-world-use-cases&#34;&gt;Приклади використання в реальних умовах&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#real-world-use-cases&#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;strong&gt;Запобігання підвищенню привілеїв на змонтованих томах із правом запису&lt;/strong&gt;: Розробник застосунку, який налаштовує тимчасові робочі томи (як &lt;code&gt;emptyDir&lt;/code&gt; або монтування &lt;code&gt;/tmp&lt;/code&gt;), може переконатися, що вони монтуються з &lt;code&gt;nosuid&lt;/code&gt; та &lt;code&gt;noexec&lt;/code&gt;. Це гарантує, що навіть якщо застосунок скомпрометовано та завантажено зловмисне навантаження, робоче навантаження не може виконати це навантаження або використати його для підвищення привілеїв на вузлі.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Захист спільного тимчасового простору в Podʼах з кількома контейнерами&lt;/strong&gt;: Розробник, який налаштовує Podʼи конвеєрів CI/CD, часто потребує кількох контейнерів (наприклад, контейнера збірки та sidecar-контейнера логування) для спільного робочого простору. Встановивши &lt;code&gt;mode: 01777&lt;/code&gt; на &lt;code&gt;emptyDir&lt;/code&gt;, розробник гарантує, що спільний робочий простір працює як традиційна Unix-тека &lt;code&gt;/tmp&lt;/code&gt;. Кожен контейнер може незалежно записувати файли, але скомпрометований процес в одному контейнері не може видалити артефакти збірки, створені іншим.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Впровадження принципу найменшого привілею для даних застосунку&lt;/strong&gt;: Розробник застосунку, який розгортає Pod бази даних, може заблокувати доступ до тимчасового сховища бази даних. Встановивши &lt;code&gt;mode: 0750&lt;/code&gt; на &lt;code&gt;emptyDir&lt;/code&gt;, розробник гарантує, що лише конкретний користувач та група бази даних можуть читати або записувати до тому, явно відмовляючи в доступі до будь-яких інших процесів або sidecar-контейнерів у тому самому Podʼі.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Примітка&lt;/strong&gt;: Обидві можливості доступні за функціональними можливостями рівня Alpha в Kubernetes v1.37. Для їх використання увімкніть &lt;code&gt;VolumeBindMountOptions&lt;/code&gt; та &lt;code&gt;EmptyDirVolumeMode&lt;/code&gt; на API-сервері та kubelet.&lt;/p&gt;
&lt;h2 id=&#34;example-1-enforcing-bind-mount-options&#34;&gt;Приклад 1: Впровадження параметрів bind mount&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-1-enforcing-bind-mount-options&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей повний маніфест Podʼа монтує том &lt;code&gt;emptyDir&lt;/code&gt; у &lt;code&gt;/tmp&lt;/code&gt; з &lt;code&gt;bindMountOptions: [noexec, nosuid]&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;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;hardened-bindmount-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;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;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;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;os&lt;/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;linux&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;hardened-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;alpine:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;command&lt;/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;sleep&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 class=&#34;s2&#34;&gt;&amp;#34;3600&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;securityContext&lt;/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;readOnlyRootFilesystem&lt;/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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumeMounts&lt;/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;temp-storage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mountPath&lt;/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;/tmp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;bindMountOptions&lt;/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;l&#34;&gt;noexec&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;nosuid&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/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;temp-storage&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;emptyDir&lt;/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;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;example-2-emptydir-volume-permission-mode-with-sticky-bit&#34;&gt;Приклад 2: Режим дозволів тому &lt;code&gt;emptyDir&lt;/code&gt; зі sticky-бітом&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-2-emptydir-volume-permission-mode-with-sticky-bit&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей повний маніфест Podʼа створює том &lt;code&gt;emptyDir&lt;/code&gt; із використанням &lt;code&gt;mode: 01777&lt;/code&gt; для впровадження стандартних захисних механізмів Unix sticky-біту &lt;code&gt;/tmp&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;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;hardened-emptydir-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;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;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;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;os&lt;/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;linux&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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-container&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;alpine:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;command&lt;/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;sleep&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 class=&#34;s2&#34;&gt;&amp;#34;3600&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;volumeMounts&lt;/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;shared-tmp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;mountPath&lt;/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;/tmp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/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;shared-tmp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;emptyDir&lt;/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;mode&lt;/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;01777&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;verifying-the-features-in-linux&#34;&gt;Перевірка можливостей у Linux&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#verifying-the-features-in-linux&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Щоб перевірити, що ці можливості активно впроваджують обмеження, ви можете виконати &lt;code&gt;kubectl exec&lt;/code&gt; у контейнері. Наведені нижче приклади імітують спроби виконати дії, які ці можливості успішно блокують.&lt;/p&gt;
&lt;h3 id=&#34;verifying-noexec&#34;&gt;Перевірка noexec&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#verifying-noexec&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Спроба запису та виконання скрипту на тому, змонтованому з &lt;code&gt;noexec&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;&lt;span class=&#34;c1&#34;&gt;# 1. Виконайте exec у Podʼі&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it hardened-bindmount-pod -- sh
&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;# 2. Створіть виконуваний скрипт на змонтованому томі&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&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;s1&#34;&gt;&amp;#39;#!/bin/sh&amp;#39;&lt;/span&gt; &amp;gt; test.sh
&lt;/span&gt;&lt;/span&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;s1&#34;&gt;&amp;#39;echo &amp;#34;Executing untrusted code...&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; test.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod +x test.sh
&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;# 3. Спроба виконати скрипт&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./test.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Очікуваний результат:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-none&#34; data-lang=&#34;none&#34;&gt;sh: ./test.sh: Permission denied
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Навіть якщо виконуваний файл створено, ядро Linux відмовляє у виконанні, оскільки &lt;code&gt;MS_NOEXEC&lt;/code&gt; впроваджується на рівні bind mount.&lt;/p&gt;
&lt;h3 id=&#34;verifying-the-sticky-bit&#34;&gt;Перевірка sticky-біту&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#verifying-the-sticky-bit&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Спроба видалення файлу іншого користувача в &lt;code&gt;emptyDir&lt;/code&gt; із режимом дозволів &lt;code&gt;01777&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;&lt;span class=&#34;c1&#34;&gt;# 1. Виконайте exec у Podʼі&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it hardened-emptydir-pod -- sh
&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;# 2. Перевірте дозволи теки /tmp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -ld /tmp
&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;# Вивід: drwxrwxrwt 2 root root ... /tmp (Зверніть увагу на &amp;#39;t&amp;#39;, що вказує на sticky-біт)&lt;/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;# 3. Створіть файл як користувач guest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;su -s /bin/sh -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;touch /tmp/guest_file&amp;#34;&lt;/span&gt; guest
&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;# 4. Спроба видалити цей файл як nobody&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;su -s /bin/sh -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;rm /tmp/guest_file&amp;#34;&lt;/span&gt; nobody
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Очікуваний результат:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-none&#34; data-lang=&#34;none&#34;&gt;rm: can&amp;#39;t remove &amp;#39;/tmp/guest_file&amp;#39;: Operation not permitted
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ядро блокує видалення, оскільки sticky-біт (&lt;code&gt;01777&lt;/code&gt;) обмежує видалення файлів суворо власником файлу.&lt;/p&gt;
&lt;h2 id=&#34;things-to-know&#34;&gt;Важливі деталі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#things-to-know&#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-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/configure-bind-mount-options/&#34;&gt;параметрів bind mount&lt;/a&gt;, &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/configure-emptydir-volume-mode/&#34;&gt;режиму тому &lt;code&gt;emptyDir&lt;/code&gt;&lt;/a&gt; та &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/storage/volumes/#emptydir&#34;&gt;томів &lt;code&gt;emptyDir&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Типова поведінка не змінилася&lt;/strong&gt;: Якщо ви пропускаєте &lt;code&gt;bindMountOptions&lt;/code&gt; або не встановлюєте &lt;code&gt;mode&lt;/code&gt; для &lt;code&gt;emptyDir&lt;/code&gt;, ви отримуєте типову поведінку (як-от дозволи &lt;code&gt;0777&lt;/code&gt;) точно так само, як і раніше.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Широка підтримка томів&lt;/strong&gt;: &lt;code&gt;bindMountOptions&lt;/code&gt; працює з &lt;code&gt;emptyDir&lt;/code&gt;, PersistentVolume, CSI-томами, проєкційними томами, ConfigMap, Secret та іншими. Єдиним винятком є томи образів, які явно не підтримуються. Поле &lt;code&gt;mode&lt;/code&gt; працює з усіма типами середовища &lt;code&gt;emptyDir&lt;/code&gt;: default (на основі диска), &lt;code&gt;Memory&lt;/code&gt; (tmpfs) та &lt;code&gt;HugePages&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Можливості середовища виконання мають значення (для &lt;code&gt;bindMountOptions&lt;/code&gt;)&lt;/strong&gt;: Середовище виконання контейнерів &lt;strong&gt;повинно&lt;/strong&gt; підтримувати поле CRI &lt;code&gt;mount_options&lt;/code&gt; та оголошувати це через &lt;code&gt;runtimeFeatures&lt;/code&gt;. Планувальник використовує &lt;em&gt;оголошені вузлом можливості&lt;/em&gt;, щоб уникати розміщення Podʼів на несумісних вузлах. Якщо Pod все ж досягає такого вузла, kubelet відхиляє його. Непомітної деградації не буває. Однак використання &lt;code&gt;mode&lt;/code&gt; для &lt;code&gt;emptyDir&lt;/code&gt; не потребує підтримки середовища виконання.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Не те саме, що PV mountOptions&lt;/strong&gt;: &lt;code&gt;mountOptions&lt;/code&gt; PersistentVolume застосовуються на рівні сховища через CSI-драйвер. Нові &lt;code&gt;bindMountOptions&lt;/code&gt; контролюють прапорці bind mount, які застосовуються всередині контейнера середовищем виконання. Вони працюють на різних рівнях і не конфліктують.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Взаємодія fsGroup&lt;/strong&gt;: Якщо &lt;code&gt;fsGroup&lt;/code&gt; встановлено в контексті безпеки Podʼа, дозволи групи, які застосовуються &lt;code&gt;fsGroup&lt;/code&gt;, перевизначать &lt;code&gt;mode&lt;/code&gt;, вказаний для тому &lt;code&gt;emptyDir&lt;/code&gt;. Це та сама поведінка, що існує для &lt;code&gt;defaultMode&lt;/code&gt; на томах Secret та ConfigMap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Тільки Linux&lt;/strong&gt;: Прапорці на кшталт &lt;code&gt;noexec&lt;/code&gt;, &lt;code&gt;nosuid&lt;/code&gt;, &lt;code&gt;nodev&lt;/code&gt; та Unix-дозволи є концепціями Linux. &lt;code&gt;bindMountOptions&lt;/code&gt; не має ефекту на вузлах Windows. На Windows поле &lt;code&gt;mode&lt;/code&gt; також пропускається для томів &lt;code&gt;emptyDir&lt;/code&gt;, оскільки Windows не підтримує Unix-дозволи на файли.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Безпека при розбіжності версій&lt;/strong&gt;: Обидві можливості є додатковими. Для &lt;code&gt;emptyDir&lt;/code&gt; &lt;code&gt;mode&lt;/code&gt;: якщо на API-сервері функціональну можливість увімкнено, а на kubelet — ні, поле приймається, але ігнорується — kubelet повертається до &lt;code&gt;0777&lt;/code&gt;. Для &lt;code&gt;bindMountOptions&lt;/code&gt;: планувальник використовує Node Declared Features, щоб запобігти розміщенню Podʼів на вузлах без підтримки середовища виконання; якщо Pod досягає такого вузла, kubelet відхиляє його, а не ігнорує параметри мовчки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Функціональні можливості&lt;/strong&gt;: Обидві можливості доступні як Alpha-можливості в Kubernetes v1.37:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VolumeBindMountOptions&lt;/code&gt;: Контролює прапорці bind mount при монтуванні томів.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EmptyDirVolumeMode&lt;/code&gt;: Контролює режими дозволів створення на томах &lt;code&gt;emptyDir&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;Як долучитись?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-do-i-get-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&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;. Ви можете знайти більше деталей у KEP для цих покращень: &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5855/&#34;&gt;KEP-5855&lt;/a&gt; (параметри bind mount) та &lt;a href=&#34;https://www.kubernetes.dev/resources/keps/5502/&#34;&gt;KEP-5502&lt;/a&gt; (режим дозволів &lt;code&gt;emptyDir&lt;/code&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;Список розсилки&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Звʼяжіться з SIG Storage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-storage&#34;&gt;#sig-storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-storage&#34;&gt;Список розсилки&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.37: Менеджери ресурсів на рівні Pod переходять у бета</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/15/kubernetes-v1-37-pod-level-resource-managers-beta/</link>
      <pubDate>Tue, 15 Sep 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/15/kubernetes-v1-37-pod-level-resource-managers-beta/</guid>
      <description>
        
        
        &lt;p&gt;З випуском Kubernetes v1.37, можливість &lt;strong&gt;Pod-Level Resource Managers&lt;/strong&gt; перейшла в статус &lt;strong&gt;Beta&lt;/strong&gt; (типово вимкнена)!&lt;/p&gt;
&lt;p&gt;Вперше представлена як можливість Alpha у &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/05/01/kubernetes-v1-36-feature-pod-level-resource-managers-alpha/&#34;&gt;Kubernetes v1.36&lt;/a&gt;, це вдосконалення розширює можливості &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/09/22/kubernetes-v1-34-pod-level-resources/&#34;&gt;Pod-Level Resources&lt;/a&gt;, надаючи Topology Manager, CPU Manager і Memory Manager у kubelet змогу використовувати декларації ресурсів на рівні Podʼа (&lt;code&gt;.spec.resources&lt;/code&gt;) безпосередньо під час ухвалення рішень про розміщення на апаратних ресурсах.&lt;/p&gt;
&lt;h2 id=&#34;bringing-pod-level-resources-to-node-managers&#34;&gt;Використання ресурсів рівня Podʼа менеджерами вузлів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#bringing-pod-level-resources-to-node-managers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;До появи цієї можливості отримання ексклюзивних CPU-ядер, вирівняних за NUMA, або памʼяті для застосунків з критичною затримкою змушувало операторів кластерів робити вибір &amp;quot;все або нічого&amp;quot;: призначати цілі запити ресурсів &lt;em&gt;кожному&lt;/em&gt; контейнеру в Podʼі або повністю відмовитися від ексклюзивного вирівнювання за NUMA. Для сучасних робочих навантажень, що запускають легкі sidecar-контейнери (такі як агенти логування або експортери телеметрії), виділення спеціальних фізичних ядер допоміжним контейнерам було марнотратним.&lt;/p&gt;
&lt;p&gt;Функція Pod-Level Resource Managers вирішує цю проблему, дозволяючи гібридні моделі розподілу ресурсів. Kubelet може резервувати ексклюзивні ресурси, вирівняні за NUMA, для основних контейнерів застосунків, одночасно розміщуючи sidecar-контейнери без класу Guaranteed у спільному пулі, ізольованому в межах Podʼа. Це забезпечує основним робочим навантаженням необмежену продуктивність, локальну для NUMA, тоді як sidecar-контейнери працюють в ізольованому спільному пулі Podʼа, отримуючи локальним вирівнюванням за NUMA та захистом від зовнішніх втручань вузла без використання спеціальних фізичних ядер.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new-in-beta&#34;&gt;Що нового у бета-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-s-new-in-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Перехід у бета-версію приносить ключові операційні та API покращення:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Перехід у бета-версію:&lt;/strong&gt; Керується функціональною можливістю &lt;code&gt;PodLevelResourceManagers&lt;/code&gt;, яку можна ввімкнути (типово вимкнена) у Kubernetes v1.37.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Звітування PodResources API:&lt;/strong&gt; gRPC-сервіс &lt;code&gt;v1&lt;/code&gt; PodResources (&lt;code&gt;PodResourcesLister&lt;/code&gt;) вводить поля верхнього рівня &lt;code&gt;cpu_ids&lt;/code&gt; і &lt;code&gt;memory&lt;/code&gt; у відповідях &lt;code&gt;PodResources&lt;/code&gt;. Інструменти моніторингу та втулки пристроїв можуть безпосередньо запитувати ексклюзивні призначення на рівні Podʼа без подвійного підрахунку виділень контейнерів.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;getting-started-and-providing-feedback&#34;&gt;Початок роботи та надання відгуків&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#getting-started-and-providing-feedback&#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://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/pod-level-resource-managers/&#34;&gt;Менеджери ресурсів на рівні Podʼа&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/node/pod-level-resource-managers/&#34;&gt;Довідник менеджерів ресурсів на рівні Podʼа&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Щоб ознайомитися з покроковим посібником з налаштування та розгортання робочих навантажень:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tutorials/cluster-management/use-pod-level-resource-managers/&#34;&gt;Використання ресурсів рівня Podʼа з менеджерами ресурсів kubelet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Щоб дізнатися більше про те, як призначати ресурси Podʼам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/assign-pod-level-resources/&#34;&gt;Призначення ресурсів CPU і памʼяті рівня Pod&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Оскільки ця можливість проходить шлях від бета-версії до GA, ваш відгук є надзвичайно цінним. Повідомляйте про будь-які проблеми або діліться своїм досвідом через стандартні канали комунікації Kubernetes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34;&gt;Список розсилки&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/labels/sig%2Fnode&#34;&gt;Відкриті issue та PR спільноти&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.37: Витіснення планувальником для зміни розміру Podʼів на місці (Alpha)</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/10/kubernetes-v1-37-scheduler-preemption-for-in-place-pod-resize-alpha/</link>
      <pubDate>Thu, 10 Sep 2026 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/09/10/kubernetes-v1-37-scheduler-preemption-for-in-place-pod-resize-alpha/</guid>
      <description>
        
        
        &lt;p&gt;У Kubernetes виділення ресурсів історично було статичним рішенням, прийнятим під час початкового планування та розміщення Podʼа. З переходом основної можливості &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/12/19/kubernetes-v1-35-in-place-Pod-resize-ga/&#34;&gt;in-Place Pod resize&lt;/a&gt; до загальної доступності (GA) у v1.35, розробники застосунків та оператори кластерів отримали потужну здатність динамічно коригувати виділення CPU та памʼяті запущених контейнерів без руйнівних перезапусків або простою застосунків.&lt;/p&gt;
&lt;p&gt;Однак зміна розміру на місці створила унікальну прогалину в плануванні ресурсів: якщо запущений Pod запитував масштабування ресурсів, що перевищувало запас ресурсів хост-вузла, доступних для розподілу, Kubelet був змушений позначити запит як &lt;code&gt;Deferred&lt;/code&gt;. Pod залишався у цьому стані невизначений час, очікуючи, доки ресурси на вузлі не звільняться природним шляхом.&lt;/p&gt;
&lt;p&gt;Для закриття цієї прогалини в плануванні Kubernetes v1.37 вводить &lt;em&gt;витіснення планувальником для зміни розміру Podʼа на місці&lt;/em&gt; (Alpha), з функціональною можливістю &lt;code&gt;InPlacePodVerticalScalingSchedulerPreemption&lt;/code&gt;. Ця можливість дозволяє планувальнику Kubernetes активно звільняти ресурси на повністю завантаженому вузлі шляхом витіснення робочих навантажень з нижчим пріоритетом, уможливлюючи успіх очікуваних in-place масштабувань критичних застосунків з вищим пріоритетом.&lt;/p&gt;
&lt;h2 id=&#34;the-deferred-resize-challenge&#34;&gt;Проблема відкладеної («deferred») зміни розміру&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-deferred-resize-challenge&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Щоб зрозуміти, чому цей механізм витіснення потрібен, корисно подивитися, як Kubernetes обробляє зміну розміру запущених Podʼів. Коли користувач або контролер (такий як &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/autoscaling/vertical-pod-autoscale/&#34;&gt;Vertical Pod Autoscaler&lt;/a&gt;) оновлює запити ресурсів активного контейнера, Kubelet оцінює, чи базовий вузол має достатньо вільної потужності для задоволення збільшення.&lt;/p&gt;
&lt;p&gt;Якщо ресурси вузла повністю використані і не можуть задовольнити нові обмеження, Kubelet встановлює &lt;code&gt;resizeStatus&lt;/code&gt; контейнера (повідомлений у &lt;code&gt;status.containerStatuses[]&lt;/code&gt; Podʼа) на &lt;code&gt;Deferred&lt;/code&gt;. На відміну від запиту на зміну розміру &lt;code&gt;Infeasible&lt;/code&gt; (який негайно відхиляється, бо він перевищує фізичні межі машини, LimitRange простору імен або квоти допуску), статус &lt;code&gt;Deferred&lt;/code&gt; вказує на те, що запит є дійсним, але тимчасово не може бути реалізований, очікуючи, доки потужність вузла не стане доступною.&lt;/p&gt;
&lt;p&gt;Перед введенням цього механізму витіснення запит на in-place масштабування Podʼа міг стати постійно заблокованим, якщо вузол був інтенсивно використаний. Навіть коли критичному застосунку (такому як in-memory база даних або real-time веб-сервер) потрібно більше памʼяті для запобігання неминучому збою out-of-memory (OOM), а вузол не мав вільної потужності, resize залишався &lt;code&gt;Deferred&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;У цьому сценарії оператори кластера мали обмежений вибір:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Вручну виселити Podʼи з нижчим пріоритетом з вузла, щоб звільнити запас ресурсів.&lt;/li&gt;
&lt;li&gt;Покладатися на кластерний автомасштабувач, який зрештою запустить більший вузол і перепланує Pod. Однак це операція, яка є надзвичайно руйнівною і порушує основну пропозицію цінності «без перезапуску» in-place масштабування.&lt;/li&gt;
&lt;li&gt;Покладатися на власне рішення автоматичного масштабування, наприклад, кластерний автомасштабувач, який може сам ініціювати операції динамічної зміни розміру вузла.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Оскільки &lt;code&gt;kube-scheduler&lt;/code&gt; не знав про відкладені зміни розміру на запущених 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;У промислових середовищах Kubernetes оператори кластерів прагнуть максимізувати використання ресурсів та ефективність. Поширена стратегія — bin-pack (упакування) невикористаної потужності на ще не повних вузлах робочими навантаженнями з нижчим пріоритетом, такими як пакетні завдання, фонова обробка даних або best-effort задачі.&lt;/p&gt;
&lt;p&gt;Без витіснення планувальником для зміни розміру на місці це створювало велику операційну дилему. Якщо робочі навантаження з нижчим пріоритетом споживали залишковий запас на вузлі, застосунки з вищим пріоритетом, що запущені на тому самому вузлі, ставали заблокованими (&lt;code&gt;Deferred&lt;/code&gt;), коли їм потрібно було масштабуватися для обробки раптових стрибків трафіку або сплесків використання памʼяті. Оператори були змушені вибирати між запуском кластерів з низьким використанням та вільним буферним запасом або ризиком того, що критичні робочі навантаження не зможуть масштабуватися, коли це потрібно.&lt;/p&gt;
&lt;p&gt;З витісненням планувальником для зміни розміру Podʼа на місці ви можете впевнено упакувати невикористаний простір у своїх кластерах робочими навантаженнями з нижчим пріоритетом, не переймаючись тим, що вони погіршать роботу Podʼів з вищим пріоритетом або блокують їхні запити на масштабування. Якщо робоче навантаження з високим пріоритетом вимагає зміни розміру на місці, що перевищує доступну потужність вузла, планувальник автоматично витісняє Podʼи з нижчим пріоритетом для звільнення запасу. Ви досягаєте високого використання кластера та ефективності витрат, зберігаючи при цьому швидкість реагування та надійність критичних сервісів.&lt;/p&gt;
&lt;h2 id=&#34;architectural-mechanics-how-it-works&#34;&gt;Архітектурна механіка: Як це працює&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#architectural-mechanics-how-it-works&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Витіснення планувальником для зміни розміру Podʼа на місці&lt;/strong&gt; інтегрується безпосередньо в основний цикл планування для динамічної та безпечної координації ресурсів.&lt;/p&gt;
&lt;h3 id=&#34;centralized-scheduler-tracking&#34;&gt;Централізоване відстеження планувальником&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#centralized-scheduler-tracking&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;kube-scheduler&lt;/code&gt; відстежує в кластері Podʼи, що виконуються зі статусом зміни розміру &lt;code&gt;Deferred&lt;/code&gt;. Зазвичай Podʼи із заповненим полем &lt;code&gt;spec.nodeName&lt;/code&gt; вважаються успішно розміщеними й оминають активну чергу планування. У рамках цієї функціональної можливості планувальник перехоплює Podʼи зі статусом &lt;code&gt;Deferred&lt;/code&gt;, дозволяючи їм залишатися в активній черзі планування спеціально для запуску витіснення. Планувальник здійснює безперервне відстеження цих Podʼів, доки Kubelet не завершить успішно операцію зміни розміру.&lt;/p&gt;
&lt;h3 id=&#34;single-node-preemption-boundary&#34;&gt;Межа витіснення на одному вузлі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#single-node-preemption-boundary&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;На відміну від витіснення при розміщенні, яке аналізує всі вузли в кластері для пошуку оптимального варіанту планування, витіснення для зміни розміру на місці суворо обмежується вузлом, якому наразі призначено Pod. Планувальник визначає відповідні Podʼи з нижчим пріоритетом — «жертви» — на тому самому хості та ініціює їх належне виселення, звільняючи локальні ресурси. Витіснення суворо обмежується тим самим вузлом, на якому працює Pod із відкладеним зміненням розміру; якщо вузол не може забезпечити змінення розміру навіть після виселення всіх відповідних робочих навантажень з нижчим пріоритетом, змінення розміру залишається у стані &lt;code&gt;Deferred&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;resource-reservation-safety&#34;&gt;Безпека резервування ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#resource-reservation-safety&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб запобігти станам гонитви під час планування і подвійному виділенню ресурсів, планувальник розглядає ресурси, запитувані для зміни розміру, як &lt;strong&gt;вже використані&lt;/strong&gt;. Це дозволяє Kubelet запустити зміну розміру, щойно витіснення набуде чинності.&lt;/p&gt;
&lt;h3 id=&#34;separation-of-concerns-critical-admission&#34;&gt;Розділення зон відповідальності та критичний допуск&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#separation-of-concerns-critical-admission&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Коли вузол перебуває під тиском нестачі ресурсів, Kubelet включає локальний механізм, відомий як &lt;strong&gt;critical Pod admission handler&lt;/strong&gt; (обробник критичного допуску Podʼів). Під час початкового допуску Podʼа, якщо критичний системний Pod надходить на вузол, в якого бракує вільної потужності, цей локальний обробник може безпосередньо виселити Podʼи з нижчим пріоритетом на цьому вузлі для гарантування допуску критичного робочого навантаження.&lt;/p&gt;
&lt;p&gt;Значною архітектурною перевагою цієї нової можливості є суворе розділення зон відповідальності між Kubelet та планувальником. З функціональною можливістю &lt;code&gt;InPlacePodVerticalScalingSchedulerPreemption&lt;/code&gt; &lt;strong&gt;обробник допуску критичних Podʼів Kubelet НЕ виконує локальні перевірки витіснення і НЕ ініціює локальні витіснення для операцій зміни розміру на місці.&lt;/strong&gt; Замість цього Kubelet відкладає запит і повністю делегує рішення про витіснення планувальнику. Це гарантує, що єдиний централізований оркестратор керує всією логікою витіснення, повʼязаною зі зміною розміру на місці, поважаючи глобальні пріоритети, Pod Disruption Budgets (PDB) та політики належного завершення роботи.&lt;/p&gt;
&lt;h3 id=&#34;managing-competing-updates-races&#34;&gt;Керування конкурентними оновленнями та станами гонитви&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#managing-competing-updates-races&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Якщо під час активного циклу витіснення надходить конкуруючий запит на зміну розміру з вищим пріоритетом для іншого Podʼа, що виконується на тому самому вузлі, Kubelet надає пріоритет запиту з вищим пріоритетом. Планувальник призначений для відстеження таких оновлень і динамічно запускатиме новий цикл витіснення, якщо для досягнення нового стану знадобиться більше ресурсів.&lt;/p&gt;
&lt;h2 id=&#34;node-level-preemption-configuration&#34;&gt;Конфігурація витіснення на рівні вузла&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#node-level-preemption-configuration&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Адміністратори та автоматизовані контролери (наприклад, автомасштабувальник кластера) можуть вимкнути витіснення спеціально для зміни розміру на місці на окремих вузлах. Це налаштовується за допомогою нового поля &lt;code&gt;spec.podPreemptionPolicy&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;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;batch-workload-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;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;podPreemptionPolicy&lt;/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;disableResizePreemption&lt;/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;s2&#34;&gt;&amp;#34;cluster-autoscaler.kubernetes.io/disable-preemption&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;s2&#34;&gt;&amp;#34;operator.example.com/policy-override&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;Приклад випадку використання цієї політики — коли контролер надає перевагу зміні розміру інших Podʼів або динамічній корекції потужності власного вузла, коли це можливо, вмикаючи витіснення планувальником лише як останній засіб.&lt;/p&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Спробуйте це!&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#try-it-out&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Для використання витіснення планувальника для зміни розміру Podʼа на місці:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ваш кластер має працювати на Kubernetes версії &lt;strong&gt;v1.37 або новішій&lt;/strong&gt;, як на панелі управління, так і на всіх робочих вузлах.&lt;/li&gt;
&lt;li&gt;Функціональна можливість &lt;code&gt;InPlacePodVerticalScalingSchedulerPreemption&lt;/code&gt; має бути увімкнена на всіх компонентах панелі управління (&lt;code&gt;kube-apiserver&lt;/code&gt;, &lt;code&gt;kube-scheduler&lt;/code&gt;) та &lt;code&gt;kubelet&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;mini-tutorial-observe-resize-preemption-in-action&#34;&gt;Міні-посібник: Спостереження за витісненням планувальника для зміни розміру на місці в дії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mini-tutorial-observe-resize-preemption-in-action&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб побачити цю можливість в дії локально, ви можете протестувати витіснення планувальника на одновузловому кластері &lt;code&gt;kind&lt;/code&gt; з обмеженим запасом CPU.&lt;/p&gt;
&lt;h4 id=&#34;1-create-a-kind-cluster-with-scheduler-resize-preemption-enabled&#34;&gt;1. Створіть kind-кластер з увімкненим витісненням планувальника для зміни розміру на місці&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-create-a-kind-cluster-with-scheduler-resize-preemption-enabled&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Створіть файл конфігурації кластера &lt;code&gt;kind&lt;/code&gt; з назвою &lt;code&gt;kind-config.yaml&lt;/code&gt; з увімкненою функціональною можливістю &lt;code&gt;InPlacePodVerticalScalingSchedulerPreemption&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;c&#34;&gt;# kind-config.yaml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;Cluster&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;kind.x-k8s.io/v1alpha4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;featureGates&lt;/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;InPlacePodVerticalScalingSchedulerPreemption&lt;/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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Створіть кластер, використовуючи цю конфігурацію, передаючи прапорець &lt;code&gt;--image&lt;/code&gt;, щоб переконатися, що кластер працює на Kubernetes &lt;strong&gt;v1.37&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-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 --config kind-config.yaml --image kindest/node:v1.37.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;alert alert-info&#34; role=&#34;note&#34;&gt;&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка:&lt;/h4&gt;Переконайтеся, що образ вузла, який ви вказуєте, відповідає Kubernetes-кластеру &lt;strong&gt;v1.37&lt;/strong&gt; або новішому (такому як &lt;code&gt;kindest/node:v1.37.0&lt;/code&gt;). Старіші релізи Kubernetes не підтримують функціональну можливість &lt;code&gt;InPlacePodVerticalScalingSchedulerPreemption&lt;/code&gt;.&lt;/div&gt;

&lt;p&gt;Після готовності кластера перевірте вузол, щоб дізнатися, скільки ядер CPU, доступних для розподілу, він має:&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 nodes -o custom-columns&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;NAME:.metadata.name,ALLOCATABLE_CPU:.status.allocatable.cpu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;У стандартному локальному середовищі &lt;code&gt;kind&lt;/code&gt; вивід показує &lt;strong&gt;8&lt;/strong&gt; ядер CPU, доступних для розподілу:&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;NAME                 ALLOCATABLE_CPU
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kind-control-plane   &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;2-create-priorityclasses-and-deploy-pods&#34;&gt;2. Створіть PriorityClasses та розгорніть Podʼи&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-create-priorityclasses-and-deploy-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Створіть два PriorityClasses та розгорніть Pod з низьким пріоритетом (що запитує &lt;code&gt;3&lt;/code&gt; CPU) поруч з Podʼом з високим пріоритетом (що запитує &lt;code&gt;4&lt;/code&gt; CPU). Разом ці робочі навантаження споживають &lt;code&gt;7&lt;/code&gt; з &lt;code&gt;8&lt;/code&gt; доступних ядер CPU, залишаючи &lt;code&gt;1&lt;/code&gt; CPU вільного запасу, доступного для розподілу, на вузлі.&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;# preemption-demo.yaml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;scheduling.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;PriorityClass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;high-priority&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;m&#34;&gt;1000000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;globalDefault&lt;/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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/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;High priority workload&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;scheduling.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;PriorityClass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;low-priority&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;m&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;globalDefault&lt;/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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/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;Low priority workload&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;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;low-priority-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;priorityClassName&lt;/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;low-priority&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;nginx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;s2&#34;&gt;&amp;#34;3&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;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;s2&#34;&gt;&amp;#34;500Mi&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;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;s2&#34;&gt;&amp;#34;3&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;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;s2&#34;&gt;&amp;#34;500Mi&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;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;high-priority-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;priorityClassName&lt;/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;high-priority&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;nginx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;s2&#34;&gt;&amp;#34;4&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;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;s2&#34;&gt;&amp;#34;1Gi&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;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;s2&#34;&gt;&amp;#34;4&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;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;s2&#34;&gt;&amp;#34;1Gi&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;code&gt;preemption-demo.yaml&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 preemption-demo.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods
&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;NAME                READY   STATUS    RESTARTS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;high-priority-pod   1/1     Running   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;          9s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;low-priority-pod    1/1     Running   &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;          9s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;3-request-an-in-place-scale-up&#34;&gt;3. Запит на in-place scale-up&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#3-request-an-in-place-scale-up&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Застосуйте patch до Podʼа з високим пріоритетом, щоб збільшити його запит CPU з &lt;code&gt;4&lt;/code&gt; до &lt;code&gt;6&lt;/code&gt; (+2 CPU). Оскільки на вузлі вільний лише &lt;code&gt;1&lt;/code&gt; CPU, цей запит на зміну розміру перевищує залишкову доступну ємність:&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 patch pod high-priority-pod --subresource resize --patch &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;containers&amp;#34;:[{&amp;#34;name&amp;#34;:&amp;#34;app&amp;#34;, &amp;#34;resources&amp;#34;:{&amp;#34;requests&amp;#34;:{&amp;#34;cpu&amp;#34;:&amp;#34;6&amp;#34;}, &amp;#34;limits&amp;#34;:{&amp;#34;cpu&amp;#34;:&amp;#34;6&amp;#34;}}}]}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;4-inspect-the-preemption-event-on-the-low-priority-pod&#34;&gt;4. Перевірка події витіснення на Podʼі з низьким пріоритетом&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#4-inspect-the-preemption-event-on-the-low-priority-pod&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Якщо увімкнено &lt;code&gt;InPlacePodVerticalScalingSchedulerPreemption&lt;/code&gt;, планувальник перехоплює стан зміни розміру &lt;code&gt;Deferred&lt;/code&gt; у &lt;code&gt;high-priority-pod&lt;/code&gt; і вибирає &lt;code&gt;low-priority-pod&lt;/code&gt; для витіснення.&lt;/p&gt;
&lt;p&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get events --field-selector involvedObject.name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;low-priority-pod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;У потоці подій (або через &lt;code&gt;kubectl describe pod low-priority-pod&lt;/code&gt;) ви побачите подію &lt;code&gt;Preempted&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;LAST SEEN   TYPE     REASON      OBJECT                 MESSAGE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5s          Normal   Preempted   pod/low-priority-pod   Preempted by pod 97dba925-6b5f-4e2f-99f9-d51c30016586 on node kind-control-plane
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5s          Normal   Killing     pod/low-priority-pod   Stopping container worker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;5-trace-the-resize-event-lifecycle-on-the-high-priority-pod&#34;&gt;5. Відстеження життєвого циклу події зміни розміру на Podʼі з високим пріоритетом&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#5-trace-the-resize-event-lifecycle-on-the-high-priority-pod&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Далі перегляньте історію подій на &lt;code&gt;high-priority-pod&lt;/code&gt;, щоб спостерегти, як зміна розміру перейшла від стану deferred до успішного завершення:&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 events --field-selector involvedObject.name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;high-priority-pod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ви спостерігатимете послідовність подій, коли Kubelet координується з планувальником:&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;LAST SEEN   TYPE      REASON            OBJECT                  MESSAGE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;33s         Warning   ResizeDeferred    pod/high-priority-pod   Pod resize OutOfcpu: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;containers&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;app&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;resources&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limits&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;memory&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;requests&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;memory&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}}}]&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;:2,&lt;span class=&#34;s2&#34;&gt;&amp;#34;error&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;Node didn&amp;#39;t have enough resource: cpu, requested: 6000, used: 3950, capacity: 8000&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;32s         Normal    ResizeStarted     pod/high-priority-pod   Pod resize started: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;containers&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;app&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;resources&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limits&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;memory&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;requests&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;memory&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}}}]&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;:2&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;32s         Normal    ResizeCompleted   pod/high-priority-pod   Pod resize completed: &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;containers&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;app&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;resources&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limits&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;memory&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;requests&amp;#34;&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cpu&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;6&amp;#34;&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;memory&amp;#34;&lt;/span&gt;:&lt;span class=&#34;s2&#34;&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}}}]&lt;/span&gt;,&lt;span class=&#34;s2&#34;&gt;&amp;#34;generation&amp;#34;&lt;/span&gt;:2&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ResizeDeferred&lt;/code&gt;&lt;/strong&gt;: Kubelet початково позначає запит на зміну розміру як deferred (&lt;code&gt;Warning&lt;/code&gt;) через нестачу запасу CPU на вузлі (&lt;code&gt;OutOfcpu&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ResizeStarted&lt;/code&gt;&lt;/strong&gt;: Як тільки планувальник витісняє &lt;code&gt;low-priority-pod&lt;/code&gt; і потужність звільняється, Kubelet приймає нове виділення і починає застосування зміни розміру.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ResizeCompleted&lt;/code&gt;&lt;/strong&gt;: Kubelet успішно оновлює обмеження cgroup контейнера через середовище виконання контейнерів без перезапуску Podʼа.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Нарешті, перевірте, що виділений CPU на контейнері відображає новий запит (додавання &lt;code&gt;{&amp;quot;\n&amp;quot;}&lt;/code&gt; до JSONPath запиту забезпечує завершальний новий рядок у вашому терміналі):&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 pod high-priority-pod -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.containerStatuses[0].allocatedResources.cpu}{&amp;#34;\n&amp;#34;}&amp;#39;&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-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;m&#34;&gt;6&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;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;code&gt;InPlacePodVerticalScalingSchedulerPreemption&lt;/code&gt; у своїх тестових середовищах та поділитися своїми відгуками.&lt;/p&gt;
&lt;p&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;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.37: Представляємо стани життєвого циклу вузла</title>
      <link>https://deploy-preview-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--kubernetes-io-main-staging.netlify.app/uk/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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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>Від Kubernetes Dashboard до Headlamp: покроковий посібник</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/07/13/kubernetes-dashboard-to-headlamp/</link>
      <pubDate>Mon, 13 Jul 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/07/13/kubernetes-dashboard-to-headlamp/</guid>
      <description>
        
        
        &lt;h2 id=&#34;1-before-you-start-know-what-is-changing&#34;&gt;1. До того, як почати: що змінюється&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-before-you-start-know-what-is-changing&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes Dashboard та Headlamp обидва показують, що працює в кластері, але вони працюють по-різному. Коли Headlamp запускається на робочому столі, він використовує ваш наявний kubeconfig для підключення до одного або кількох кластерів і може бути розширений втулками. Коли Headlamp запускається всередині кластера, він використовує Kubernetes ServiceAccount для доступу до API та дотримання правил RBAC. Kubernetes Dashboard, навпаки, працює лише всередині кластера і завжди покладається на токени службового облікового запису. Розуміння цих моделей на ранньому етапі допомагає вибрати правильну конфігурацію та дозволи.&lt;/p&gt;
&lt;h3 id=&#34;1-1-how-kubernetes-dashboard-works&#34;&gt;1.1 Як працює Kubernetes Dashboard&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-1-how-kubernetes-dashboard-works&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Dashboard — це вебзастосунок, який працює всередині вашого кластера.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ви встановлюєте його в кластері, часто за допомогою Helm.&lt;/li&gt;
&lt;li&gt;Зазвичай ви запускаєте один Dashboard на кластер.&lt;/li&gt;
&lt;li&gt;Часто ви отримуєте доступ до нього через &lt;code&gt;kubectl port-forward&lt;/code&gt; або ingress.&lt;/li&gt;
&lt;li&gt;Ви входите за допомогою токена на предʼявника. Цей токен часто походить від службового облікового запису.&lt;/li&gt;
&lt;li&gt;Він включає форми, які допомагають створювати ресурси.&lt;/li&gt;
&lt;li&gt;Він спирається на таблиці та списки для навігації.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Відчуття таке: інтерфейс користувача, який живе разом із кластером.&lt;/p&gt;
&lt;h3 id=&#34;1-2-how-headlamp-works&#34;&gt;1.2 Як працює Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-2-how-headlamp-works&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp діє більше як клієнт Kubernetes з інтерфейсом користувача.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Він може працювати на вашому робочому столі або в кластері.&lt;/li&gt;
&lt;li&gt;Він читає ваш kubeconfig, як це робить kubectl.&lt;/li&gt;
&lt;li&gt;Він може показувати більше одного кластера в одному місці.&lt;/li&gt;
&lt;li&gt;Він віддає перевагу YAML при створенні або зміні ресурсів.&lt;/li&gt;
&lt;li&gt;Він включає списки та візуальну мапу.&lt;/li&gt;
&lt;li&gt;Ви можете додавати функції за допомогою втулків.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Headlamp — це інтерфейс користувача, який слідує за вашою ідентичністю, а не за кластером.&lt;/p&gt;
&lt;h3 id=&#34;1-3-what-stays-the-same&#34;&gt;1.3 Що залишається без змін&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-3-what-stays-the-same&#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;/li&gt;
&lt;li&gt;Фільтрація за простором імен&lt;/li&gt;
&lt;li&gt;Перегляд YAML, подій та стану&lt;/li&gt;
&lt;li&gt;Перегляд журналів&lt;/li&gt;
&lt;li&gt;Виконання дій, дозволених вашим RBAC&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-4-what-changes&#34;&gt;1.4 Що змінюється&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-4-what-changes&#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;Вхід змінюється з вставлених токенів на kubeconfig (а іноді і SSO).&lt;/li&gt;
&lt;li&gt;Створення змінюється з заповнення форм на &amp;quot;застосування YAML&amp;quot;.&lt;/li&gt;
&lt;li&gt;Багатокластерність стає нормою, а не особливим випадком.&lt;/li&gt;
&lt;li&gt;Візуальна мапа допомагає бачити, як повʼязані ресурси.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-pre-migration-checklist&#34;&gt;2. Контрольний список перед міграцією&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-pre-migration-checklist&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей контрольний список допоможе уникнути неприємних сюрпризів під час переходу. Він гарантує, що Headlamp може використовувати ту ж ідентичність та дозволи, яким ви вже довіряєте в Kubernetes. Він також дає швидкий спосіб перевірити, чи працює міграція, перш ніж вимкнути Dashboard.&lt;/p&gt;
&lt;h3 id=&#34;2-1-write-down-what-you-use-today&#34;&gt;2.1 Запишіть, що ви використовуєте сьогодні&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-1-write-down-what-you-use-today&#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;Які кластери ви використовуєте (dev, staging, prod)&lt;/li&gt;
&lt;li&gt;Які простори імен ви використовуєте найчастіше&lt;/li&gt;
&lt;li&gt;Що ви робите найчастіше (перегляд, редагування, масштабування, видалення, налагодження)&lt;/li&gt;
&lt;li&gt;Як ви отримуєте доступ до Dashboard сьогодні (port-forward або ingress)&lt;/li&gt;
&lt;li&gt;Як ви входите (токен службового облікового запису та які RBAC-приʼязки)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це ваша відправна точка.&lt;/p&gt;
&lt;h3 id=&#34;2-2-check-that-kubeconfig-works&#34;&gt;2.2 Перевірте, чи працює kubeconfig&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-2-check-that-kubeconfig-works&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp використовує kubeconfig, особливо на робочому столі. Переконайтеся, що ваш працює, перш ніж встановлювати будь-що.&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl config current-context
&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;kubectl get nodes
&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;kubectl get pods -n &amp;lt;namespace&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо ці команди працюють, Headlamp може використовувати ту ж ідентичність та RBAC.&lt;/p&gt;
&lt;h3 id=&#34;2-3-pick-a-rollout-plan&#34;&gt;2.3 Виберіть план розгортання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-3-pick-a-rollout-plan&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Немає потреби поспішати. Більшість команд обирають один з цих варіантів:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Паралельне розгортання (рекомендовано)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Встановіть Headlamp&lt;/li&gt;
&lt;li&gt;Дайте людям спробувати його&lt;/li&gt;
&lt;li&gt;Залиште Dashboard на короткий час&lt;/li&gt;
&lt;li&gt;Видаліть Dashboard після того, як команда буде готова&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Перемикання&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Встановіть Headlamp&lt;/li&gt;
&lt;li&gt;Перемкніть документацію та посилання&lt;/li&gt;
&lt;li&gt;Видаліть Dashboard незабаром після цього&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Паралельне розгортання безпечніше для спільних кластерів.&lt;/p&gt;
&lt;h3 id=&#34;2-4-decide-where-headlamp-will-run&#34;&gt;2.4 Виберіть, де буде працювати Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-4-decide-where-headlamp-will-run&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ви можете використовувати будь-який варіант. Багато команд використовують обидва.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Робочий стіл&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Використовує ваш kubeconfig&lt;/li&gt;
&lt;li&gt;Не використовує ресурси кластера&lt;/li&gt;
&lt;li&gt;Не потребує port-forward&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;ul&gt;
&lt;li&gt;Працює добре для спільного доступу через оглядач&lt;/li&gt;
&lt;li&gt;Може керуватися як інші застосунки в кластері&lt;/li&gt;
&lt;li&gt;Часто використовується разом з ingress та SSO&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-5-note-optional-dependencies&#34;&gt;2.5 Зверніть увагу на необовʼязкові залежності&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-5-note-optional-dependencies&#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;metrics-server&lt;/code&gt; (для графіків використання CPU та памʼяті)&lt;/li&gt;
&lt;li&gt;ingress (для URL всередині кластера)&lt;/li&gt;
&lt;li&gt;OIDC / SSO (для входу через оглядач)&lt;/li&gt;
&lt;li&gt;очищення старих службових облікових записів Dashboard та RBAC&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-choose-where-headlamp-will-run-desktop-or-in-cluster&#34;&gt;3. Виберіть, де буде працювати Headlamp (робочий стіл або в кластері)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#3-choose-where-headlamp-will-run-desktop-or-in-cluster&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Headlamp може працювати на вашому робочому столі або всередині кластера. Обидва варіанти добре працюють, але вони підходять для різних потреб. Варіант для робочого столу — найшвидший спосіб почати, оскільки він використовує ваш kubeconfig і не працює в кластері. Варіант у кластері найкраще підходить, коли потрібен спільний URL і ви хочете, щоб команда платформи керувала оновленнями та доступом.&lt;/p&gt;
&lt;h3 id=&#34;option-a-desktop-user-managed&#34;&gt;Варіант A: Робочий стіл (керується користувачем)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#option-a-desktop-user-managed&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp для робочого столу запускається на компʼютері кожного користувача. Він читає той самий kubeconfig, який ви використовуєте з kubectl. Завдяки цьому доступ залишається привʼязаним до ідентичності та RBAC кожного користувача.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Чому команди обирають цей варіант&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Немає сервісу в кластері для розгортання або відкриття.&lt;/li&gt;
&lt;li&gt;Не використовує ресурси кластера (CPU або памʼять).&lt;/li&gt;
&lt;li&gt;Використовує ваш kubeconfig і RBAC.&lt;/li&gt;
&lt;li&gt;Працює з багатьма кластерами в одному застосунку.&lt;/li&gt;
&lt;li&gt;Не потребує port-forward для щоденного використання.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;option-b-in-cluster-best-for-shared-access&#34;&gt;Варіант B: У кластері (найкраще для спільного доступу)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#option-b-in-cluster-best-for-shared-access&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp у кластері встановлюється як робоче навантаження Kubernetes (часто через Helm). Це дозволяє адміністраторам кластера керувати ним як іншими застосунками в кластері.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Адміністратори кластера керують встановленням, оновленнями та конфігурацією через Helm-чарт та стандартні інструменти Kubernetes.&lt;/li&gt;
&lt;li&gt;Адміністратори контролюють ingress і можуть налаштувати вхід через OIDC для спільного доступу.&lt;/li&gt;
&lt;li&gt;Підтримує спільне використання в командних середовищах.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;4-install-headlamp-desktop-and-in-cluster&#34;&gt;4. Встановлення Headlamp (робочий стіл та в кластері)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#4-install-headlamp-desktop-and-in-cluster&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей розділ допоможе запустити Headlamp. Дотримуйтесь шляху, який ви обрали в розділі 3.&lt;/p&gt;
&lt;h3 id=&#34;4-1-desktop-install-fastest-way-to-start&#34;&gt;4.1 Встановлення на робочий стіл (найшвидший спосіб почати)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#4-1-desktop-install-fastest-way-to-start&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Встановіть Headlamp на вашому компʼютері. Потім відкрийте його як будь-який інший застосунок. Headlamp читає ваш kubeconfig і використовує ту саму ідентичність і ті самі правила RBAC, що й kubectl.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Встановлення за допомогою WinGet:&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;winget install headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Або з Chocolatey:&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;choco install headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Встановлення за допомогою Homebrew:&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;brew install --cask headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Встановлення за допомогою Flatpak (Flathub):&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;flatpak install flathub io.kinvolk.Headlamp
&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;ol&gt;
&lt;li&gt;Запустіть Headlamp.&lt;/li&gt;
&lt;li&gt;Підтвердьте, що ви бачите контекст кластера.&lt;/li&gt;
&lt;li&gt;Відкрийте простір імен, до якого у вас є доступ, і підтвердьте, що ви можете переглядати робочі навантаження. Headlamp покаже лише ті дії, які дозволяє ваш RBAC.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;4-2-in-cluster-install-shared-access&#34;&gt;4.2 Встановлення в кластері (спільний доступ)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#4-2-in-cluster-install-shared-access&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Використовуйте цей шлях, якщо ви хочете спільний інтерфейс, яким може керувати команда платформи. Headlamp підтримує розгортання в кластері за допомогою Helm або YAML-маніфесту.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Встановлення за допомогою Helm&lt;/strong&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm repo add headlamp https://kubernetes-sigs.github.io/headlamp/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm repo update
&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;kubectl create namespace headlamp
&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;helm install headlamp headlamp/headlamp --namespace headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Встановлення за допомогою YAML-маніфесту (опціонально)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Headlamp також надає YAML-маніфест, який ви можете застосувати, а потім налаштувати відповідно до ваших потреб.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Перевірка встановлення&lt;/strong&gt;&lt;/p&gt;
&lt;p&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods -n headlamp
&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;kubectl get svc -n headlamp
&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;p&gt;&lt;em&gt;Швидка перевірка за допомогою port-forward&lt;/em&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl port-forward -n headlamp svc/headlamp 8080:80
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Потім відкрийте: http://localhost:8080&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Спільний доступ через ingress&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Якщо ви хочете мати стабільний URL, відкрийте сервіс через ваш контролер Ingress. Точний YAML для ingress залежить від вашої конфігурації. URL зворотного виклику OIDC у Headlamp — це ваш публічний URL плюс &lt;code&gt;/oidc-callback&lt;/code&gt;, тому налаштування ingress і TLS мають значення.&lt;/p&gt;
&lt;h3 id=&#34;4-3-updating-headlamp&#34;&gt;4.3 Оновлення Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#4-3-updating-headlamp&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Оновлення залежить від того, як ви встановили Headlamp. Менеджери пакунків оновлюють застосунок на місці. Встановлення через DMG або EXE оновлюється шляхом повторного встановлення нової версії.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Якщо ви встановили за допомогою Homebrew, виконайте:&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;brew upgrade headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо ви встановили з DMG, завантажте новий DMG і перетягніть Headlamp у &lt;code&gt;/Applications&lt;/code&gt;, замінивши стару версію. Встановлення через DMG не оновлюється автоматично.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Якщо ви встановили за допомогою WinGet, виконайте:&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;winget upgrade headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо ви встановили за допомогою Chocolatey, виконайте:&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;choco upgrade headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо ви встановили з EXE, завантажте новий інсталятор і запустіть його знову. Встановлення через EXE не оновлюється автоматично.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Якщо ви встановили за допомогою Flatpak, виконайте:&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;flatpak update io.kinvolk.Headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо ви встановили за допомогою AppImage, завантажте новий AppImage і запустіть цей файл замість старого.&lt;/p&gt;
&lt;p&gt;Якщо ви встановили за допомогою tarball, завантажте новий tarball, розпакуйте його і запустіть новий бінарний файл headlamp.&lt;/p&gt;
&lt;h3 id=&#34;4-4-notes-for-in-cluster-access-keep-it-safe&#34;&gt;4.4 Примітки щодо доступу в кластері (тримайте в безпеці)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#4-4-notes-for-in-cluster-access-keep-it-safe&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ставтеся до інтерфейсу користувача в кластері як до будь-якого іншого сервісу, що надає доступ до кластера. Використовуйте TLS, обмежте коло тих, хто може до нього дістатися, і покладайтеся на автентифікацію Kubernetes та RBAC для контролю дій користувачів.&lt;/p&gt;
&lt;h2 id=&#34;5-authentication-and-rbac&#34;&gt;5. Автентифікація та RBAC&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#5-authentication-and-rbac&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Headlamp використовує API Kubernetes так само, як і kubectl. Ваш кластер все ще вирішує, хто що може робити. Headlamp лише показує дії, які дозволені вашій ідентичності.&lt;/p&gt;
&lt;p&gt;Цей розділ охоплює два варіанти налаштування: на робочому столі та в кластері.&lt;/p&gt;
&lt;h3 id=&#34;5-1-desktop-use-kubeconfig&#34;&gt;5.1 Робочий стіл: використання kubeconfig&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#5-1-desktop-use-kubeconfig&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;На робочому столі Headlamp читає ваш kubeconfig і використовує ті ж облікові дані, що й kubectl. Немає окремого потоку входу з токеном для керування.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Крок 1: Підтвердьте, що ваш kubeconfig працює&lt;/strong&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl config current-context
&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;kubectl get nodes
&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;kubectl get pods -n &amp;lt;namespace&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо ці команди працюють, ваш kubeconfig і облікові дані дійсні для Headlamp також.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Крок 2: Вкажіть Headlamp правильний kubeconfig (якщо потрібно)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Headlamp може використовувати типовий шлях до kubeconfig. Він також може використовувати власний шлях до файлу. Ви можете встановити &lt;code&gt;KUBECONFIG&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-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;KUBECONFIG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/path/to/config headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ви також можете використовувати більше одного файлу kubeconfig одночасно. В системах Unix розділяйте шляхи за допомогою &lt;code&gt;:&lt;/code&gt;. У Windows розділяйте шляхи за допомогою &lt;code&gt;;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Що очікувати в інтерфейсі користувача&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Headlamp адаптується до ваших дозволів RBAC. Якщо у вас немає дозволу редагувати або видаляти ресурс, Headlamp не запропонує ці дії.&lt;/p&gt;
&lt;h3 id=&#34;5-2-in-cluster-shared-access-needs-a-sign-in-plan&#34;&gt;5.2 У кластері: спільний доступ потребує плану входу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#5-2-in-cluster-shared-access-needs-a-sign-in-plan&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp у кластері спільно використовують багато користувачів. Вам потрібен чіткий план для входу та доступу. Headlamp підтримує OpenID Connect (OIDC) для потоку &amp;quot;Sign in&amp;quot;.&lt;/p&gt;
&lt;p&gt;Зазвичай ви обираєте один із цих варіантів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A.&lt;/strong&gt; Налаштуйте Headlamp з OIDC (вбудований).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B.&lt;/strong&gt; Розмістіть шар автентифікації перед Headlamp (поширено на підприємствах).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;A. Вбудований OIDC (Headlamp)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Щоб використовувати OIDC, Headlamp потребує:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ідентифікатор клієнта (Client ID)&lt;/li&gt;
&lt;li&gt;Секрет клієнта (Client secret)&lt;/li&gt;
&lt;li&gt;URL видавця (Issuer URL)&lt;/li&gt;
&lt;li&gt;(Необовʼязково) області доступу (scopes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ваш провайдер OIDC також повинен дозволяти URL зворотного виклику Headlamp. URL зворотного виклику — це ваш URL Headlamp плюс:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/oidc-callback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Приклад:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://headlamp.example.com/oidc-callback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Примітка щодо Ingress&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Якщо Headlamp знаходиться за ingress або балансувальником навантаження, переконайтеся, що він пересилає &lt;code&gt;X-Forwarded-Proto&lt;/code&gt;. Якщо ні, Headlamp може згенерувати URL зворотного виклику з &lt;code&gt;http&lt;/code&gt; замість &lt;code&gt;https&lt;/code&gt;. Це може порушити вхід.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B. Шар автентифікації перед Headlamp&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Деякі команди захищають Headlamp за допомогою проксі, що розпізнає особу користувача, або системи автентифікації платформи. Це забезпечує узгоджений вхід у всі інструменти. Документація Headlamp містить приклад використання OpenUnison, який може розгорнути Headlamp з посиленими типовими налаштуваннями та інтегруватися з провайдерами ідентифікації.&lt;/p&gt;
&lt;h3 id=&#34;5-3-rbac-keep-it-least-privilege&#34;&gt;5.3 RBAC: дотримуйтесь принципу найменших привілеїв&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#5-3-rbac-keep-it-least-privilege&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Безпека Kubernetes починається з автентифікації та авторизації API (RBAC). Headlamp дотримується цих правил.&lt;/p&gt;
&lt;p&gt;Практичні поради:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Почніть з найнижчих дозволів, які все ще дозволяють користувачам виконувати свою роботу.&lt;/li&gt;
&lt;li&gt;Якщо Dashboard використовував токен службового облікового запису з високими привілеями, плануйте видалити або обмежити цей доступ після переходу.&lt;/li&gt;
&lt;li&gt;Для варіанта в кластері ставтеся до інтерфейсу користувача як до будь-якої іншої точки доступу. Використовуйте TLS і обмежуйте мережевий доступ.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-4-quick-troubleshooting&#34;&gt;5.4 Швидке усунення несправностей&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#5-4-quick-troubleshooting&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Робочий стіл: &amp;quot;Я не бачу свій кластер&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ваш kubeconfig може не знаходитися в типовому місці. Вкажіть Headlamp файл за допомогою &lt;code&gt;KUBECONFIG&lt;/code&gt; або шляху до файлу.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;У кластері: &amp;quot;Після перенаправлення не вдається увійти в OIDC&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Підтвердьте, що ваш провайдер дозволяє &lt;code&gt;https://YOUR_URL/oidc-callback&lt;/code&gt;. Якщо ви використовуєте ingress, переконайтеся, що він пересилає &lt;code&gt;X-Forwarded-Proto&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;6-manage-multiple-clusters&#34;&gt;6. Керування кількома кластерами&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#6-manage-multiple-clusters&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes Dashboard зазвичай привʼязаний лише до одного кластера водночас. Headlamp створений для роботи з кількома кластерами. Це клієнт, який слідує за вашим kubeconfig, а не встановлення для одного кластера. Це означає, що ви можете тримати один інтерфейс відкритим і перемикатися між кластерами під час роботи.&lt;/p&gt;
&lt;h3 id=&#34;clusters-come-from-your-kubeconfig&#34;&gt;Кластери беруться з вашого kubeconfig&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#clusters-come-from-your-kubeconfig&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp читає кластери з ваших файлів kubeconfig. Це означає, що кластери, до яких ви можете отримати доступ за допомогою kubectl, також можуть показуватися в Headlamp.&lt;/p&gt;
&lt;h3 id=&#34;switch-clusters-in-the-ui&#34;&gt;Перемикання між кластерами в інтерфейсі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#switch-clusters-in-the-ui&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Після завантаження kubeconfig у Headlamp, ви можете перемикатися між кластерами за допомогою селектора кластерів. Це полегшує переміщення між dev, staging та prod без зміни інструментів.&lt;/p&gt;
&lt;h3 id=&#34;optional-use-more-than-one-kubeconfig-file&#34;&gt;Опціонально: використання більше ніж одного файлу kubeconfig&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#optional-use-more-than-one-kubeconfig-file&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Якщо у вас є окремі файли kubeconfig, ви можете завантажити їх разом. Headlamp підтримує кілька шляхів до kubeconfig у &lt;code&gt;KUBECONFIG&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Unix/macOS/Linux (роздільник &lt;code&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-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;KUBECONFIG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;~/.kube/dev:~/.kube/prod headlamp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows (роздільник &lt;code&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-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:KUBECONFIG&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;\.kube\dev;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;\.kube\prod&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;optional-add-a-cluster-from-inside-headlamp&#34;&gt;Опціонально: додавання кластера зсередини Headlamp&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#optional-add-a-cluster-from-inside-headlamp&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ви також можете додавати кластери, завантажуючи додаткові файли kubeconfig з інтерфейсу користувача.&lt;/p&gt;
&lt;h3 id=&#34;permissions-stay-the-same&#34;&gt;Дозволи залишаються тими ж&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#permissions-stay-the-same&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Робота з кількома кластерами не змінює правила безпеки. Кожен кластер все ще застосовує власний RBAC. Headlamp показує лише те, що ваша ідентичність може робити в обраному кластері.&lt;/p&gt;
&lt;h2 id=&#34;7-navigate-and-understand-resources&#34;&gt;7. Навігація та розуміння ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#7-navigate-and-understand-resources&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Якщо ви використовували Kubernetes Dashboard, ця частина буде знайома. Headlamp зберігає ті ж основні перегляди ресурсів, але полегшує переміщення та розуміння того, що з чим повʼязано.&lt;/p&gt;
&lt;h3 id=&#34;find-resources-in-familiar-places&#34;&gt;Знаходження ресурсів у знайомих місцях&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#find-resources-in-familiar-places&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp групує ресурси таким чином, що це близько до Dashboard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Workloads&lt;/strong&gt; для Pods, Deployments, StatefulSets та Jobs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network&lt;/strong&gt; для Services та Ingress&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage&lt;/strong&gt; для PersistentVolumes та Claims&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration&lt;/strong&gt; для ConfigMaps та Secrets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nodes&lt;/strong&gt; для інфраструктури кластера&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ви можете фільтрувати за простором імен у верхній частині інтерфейсу, так само як у Dashboard.&lt;/p&gt;
&lt;h3 id=&#34;inspect-and-edit-resources&#34;&gt;Перегляд та редагування ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#inspect-and-edit-resources&#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;Статус і стани (conditions)&lt;/li&gt;
&lt;li&gt;Події&lt;/li&gt;
&lt;li&gt;Мітки та анотації&lt;/li&gt;
&lt;li&gt;Повне визначення в YAML&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Якщо ваш RBAC дозволяє, ви можете редагувати YAML безпосередньо з інтерфейсу. Якщо ні, Headlamp показує ресурс лише для читання. Це відповідає поведінці kubectl.&lt;/p&gt;
&lt;h3 id=&#34;use-search-and-filters-to-move-faster&#34;&gt;Використання пошуку та фільтрів для швидшої роботи&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#use-search-and-filters-to-move-faster&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp додає швидший пошук та фільтри у списках. Це допомагає, коли кластери або простори імен стають великими. Ви можете звужувати перегляди без переходу між сторінками.&lt;/p&gt;
&lt;h3 id=&#34;understand-relationships-with-map-view&#34;&gt;Розуміння взаємозвʼязків за допомогою Map View&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#understand-relationships-with-map-view&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Dashboard в основному показує ресурси у вигляді списків. Headlamp також включає Map View.&lt;/p&gt;
&lt;p&gt;Map View показує, як ресурси взаємоповʼязані:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deployments&lt;/li&gt;
&lt;li&gt;ReplicaSets&lt;/li&gt;
&lt;li&gt;Pods&lt;/li&gt;
&lt;li&gt;Services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це допомагає під час усунення несправностей. Замість того, щоб переходити через кілька сторінок, ви можете бачити звʼязки одразу. Ви можете швидше виявити відсутні або порушені взаємозвʼязки.&lt;/p&gt;
&lt;h3 id=&#34;when-to-use-lists-vs-map-view&#34;&gt;Коли використовувати списки, а коли Map View&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#when-to-use-lists-vs-map-view&#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;Map View&lt;/strong&gt;, коли ви намагаєтеся зрозуміти, чому щось не працює.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Обидва перегляди працюють з одними й тими ж даними. Ви просто обираєте, скільки контексту вам потрібно в даний момент.&lt;/p&gt;
&lt;h2 id=&#34;8-deploy-applications-with-yaml&#34;&gt;8. Розгортання застосунків за допомогою YAML&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#8-deploy-applications-with-yaml&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей момент є найбільшою зміною для більшості користувачів Kubernetes Dashboard. Dashboard покладався на форми. Headlamp покладається на маніфести. Мета не в тому, щоб уповільнити вас. Мета — узгодити інтерфейс користувача з тим, як Kubernetes зазвичай працює на практиці.&lt;/p&gt;
&lt;h3 id=&#34;from-forms-to-manifests&#34;&gt;Від форм до маніфестів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#from-forms-to-manifests&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes Dashboard ви часто розгортали застосунок, заповнюючи форму:&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;Headlamp не включає той самий майстер. Замість цього він дозволяє застосовувати YAML безпосередньо з інтерфейсу.&lt;/p&gt;
&lt;p&gt;Це відповідає тому, як більшість команд виконують розгортання сьогодні:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;маніфести зберігаються в Git&lt;/li&gt;
&lt;li&gt;CI/CD застосовує їх&lt;/li&gt;
&lt;li&gt;Helm або інструменти GitOps керують змінами&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Headlamp вписується в цей процес, а не замінює його.&lt;/p&gt;
&lt;h3 id=&#34;create-resources-using-yaml&#34;&gt;Створення ресурсів за допомогою YAML&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#create-resources-using-yaml&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб розгорнути застосунок у Headlamp:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Виберіть кластер і простір імен.&lt;/li&gt;
&lt;li&gt;Натисніть &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Вставте або завантажте YAML-маніфест.&lt;/li&gt;
&lt;li&gt;Перегляньте його.&lt;/li&gt;
&lt;li&gt;Натисніть &lt;strong&gt;Apply&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&#34;./create-highlight.png&#34; alt=&#34;Виділена кнопка Create&#34; style=&#34;display: block; margin-bottom: 0.5em;&#34; /&gt;
&lt;p&gt;Ресурс зʼявляється негайно в інтерфейсі.&lt;/p&gt;
&lt;p&gt;Якщо маніфест недійсний, Headlamp показує ті самі помилки, які ви б побачили від API Kubernetes.&lt;/p&gt;
&lt;h3 id=&#34;generate-yaml-the-easy-way&#34;&gt;Генерація YAML простим способом&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#generate-yaml-the-easy-way&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Якщо вам не вистачає майстра Dashboard, ви все ще можете швидко згенерувати YAML.&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl create deployment nginx &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --image&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;nginx &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --dry-run&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;client &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -o yaml &amp;gt; nginx.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ви можете відредагувати файл за потреби, а потім вставити його в Headlamp і застосувати.&lt;/p&gt;
&lt;p&gt;Це дає вам повторюваний маніфест замість обʼєкта, створеного лише через інтерфейс користувача.&lt;/p&gt;
&lt;h3 id=&#34;what-if-you-use-helm-or-gitops&#34;&gt;Що робити, якщо ви використовуєте Helm або GitOps?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-if-you-use-helm-or-gitops&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це добре працює з Headlamp.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Встановлюйте за допомогою Helm як зазвичай.&lt;/li&gt;
&lt;li&gt;Розгортайте за допомогою GitOps-конвеєрів як зазвичай.&lt;/li&gt;
&lt;li&gt;Використовуйте Headlamp для перегляду, інспекції та налагодження того, що працює.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Headlamp не замінює ці інструменти. Він дає вам видимість того, що вони створюють.&lt;/p&gt;
&lt;h3 id=&#34;what-to-expect-compared-to-dashboard&#34;&gt;Чого очікувати порівняно з Dashboard&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-to-expect-compared-to-dashboard&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Ви не побачите багатокрокову форму розгортання.&lt;/li&gt;
&lt;li&gt;Ви будете більше працювати з YAML.&lt;/li&gt;
&lt;li&gt;Ви отримаєте ясність щодо того, що фактично застосовується до кластера.&lt;/li&gt;
&lt;li&gt;Той самий маніфест можна повторно використовувати в CI, Git або інших інструментах.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;9-deploy-and-debug-workloads&#34;&gt;9. Розгортання та налагодження робочих навантажень&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#9-deploy-and-debug-workloads&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Однією з основних причин, чому люди використовували Kubernetes Dashboard, було щоденне налагодження. Headlamp охоплює ті самі завдання і додає кілька корисних покращень.&lt;/p&gt;
&lt;h3 id=&#34;view-logs&#34;&gt;Перегляд журналів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#view-logs&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ви можете переглядати журнали Podʼів безпосередньо в інтерфейсі користувача.&lt;/p&gt;
&lt;p&gt;Щоб перевірити журнали:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Відкрийте &lt;strong&gt;Workloads&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Виберіть &lt;strong&gt;Pods&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Натисніть на Pod.&lt;/li&gt;
&lt;li&gt;Відкрийте вкладку &lt;strong&gt;Logs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;img src=&#34;./workloads.png&#34; alt=&#34;Перегляд Workloads&#34; style=&#34;display: block; margin-bottom: 0.5em;&#34; /&gt;
&lt;p&gt;Якщо Pod має більше одного контейнера, ви можете перемикатися між контейнерами. Журнали транслюються в реальному часі, що допомагає під час розгортання або активних інцидентів.&lt;/p&gt;
&lt;h3 id=&#34;exec-into-running-pods&#34;&gt;Виконання команд у запущених Podʼах&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#exec-into-running-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp також дозволяє відкрити оболонку всередині контейнера.&lt;/p&gt;
&lt;p&gt;Зі сторінки Podʼа:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Відкрийте меню дій Podʼа.&lt;/li&gt;
&lt;li&gt;Виберіть &lt;strong&gt;Terminal&lt;/strong&gt; або &lt;strong&gt;Exec&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це призведе до відкриття інтерактивної сесії всередині контейнера. Це замінює необхідність повертатися до терміналу для швидких перевірок.&lt;/p&gt;
&lt;p&gt;Ця дія дотримується правил RBAC. Якщо ви не можете виконати &lt;code&gt;kubectl exec&lt;/code&gt;, Headlamp також не дозволить це зробити.&lt;/p&gt;
&lt;h3 id=&#34;check-metrics-and-resource-usage&#34;&gt;Перевірка метрик та використання ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#check-metrics-and-resource-usage&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Headlamp може показувати використання CPU та памʼяті для Podʼів і вузлів. Це працює так само, як і в Dashboard.&lt;/p&gt;
&lt;p&gt;Декілька речей, які варто знати:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Метрики вимагають встановлення &lt;code&gt;metrics-server&lt;/code&gt; у кластері.&lt;/li&gt;
&lt;li&gt;Якщо метрики відсутні, Headlamp показує чітке повідомлення.&lt;/li&gt;
&lt;li&gt;Після того як метрики стануть доступними, використання показується на сторінках Podʼів і вузлів.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це дозволяє легко відповісти на прості запитання:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Чи використовує цей Pod занадто багато памʼяті?&lt;/li&gt;
&lt;li&gt;Чи знаходиться вузол під тиском навантаження?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;view-events-when-something-goes-wrong&#34;&gt;Перегляд подій, коли щось пішло не так&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#view-events-when-something-goes-wrong&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Події часто є найшвидшим способом зрозуміти причини збоїв.&lt;/p&gt;
&lt;p&gt;У Headlamp ви можете:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Переглядати події на сторінках деталей ресурсів.&lt;/li&gt;
&lt;li&gt;Бачити попередження та помилки, повʼязані з Podʼами, вузлами або розгортаннями.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це часто перше місце, куди варто звернутися, коли робоче навантаження застрягає або аварійно завершується.&lt;/p&gt;
&lt;h3 id=&#34;how-this-compares-to-dashboard&#34;&gt;Як це в порівнянні з Dashboard&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-this-compares-to-dashboard&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Що залишається без змін:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Перегляд журналів&lt;/li&gt;
&lt;li&gt;Перегляд подій&lt;/li&gt;
&lt;li&gt;Дії, що враховують RBAC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Що покращується:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вбудовані сесії exec&lt;/li&gt;
&lt;li&gt;Чіткіше розташування та фільтрація&lt;/li&gt;
&lt;li&gt;Менше перемикань між UI та CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;10-remove-kubernetes-dashboard&#34;&gt;10. Видалення Kubernetes Dashboard&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#10-remove-kubernetes-dashboard&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Після того як Headlamp працює і ваша команда звикла до нього, ви можете видалити Kubernetes Dashboard. Це останній крок очищення.&lt;/p&gt;
&lt;p&gt;Видалення Dashboard зменшує безлад і запобігає збереженню невикористовуваних шляхів доступу.&lt;/p&gt;
&lt;h3 id=&#34;confirm-headlamp-covers-your-needs&#34;&gt;Підтвердження, що Headlamp відповідає вашим потребам&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#confirm-headlamp-covers-your-needs&#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;Користувачі можуть отримати доступ до потрібних кластерів у Headlamp.&lt;/li&gt;
&lt;li&gt;Основні завдання працюють:
&lt;ul&gt;
&lt;li&gt;перегляд ресурсів&lt;/li&gt;
&lt;li&gt;розгортання за допомогою YAML&lt;/li&gt;
&lt;li&gt;перегляд журналів та подій&lt;/li&gt;
&lt;li&gt;виконання команд у Podʼах (якщо дозволено)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RBAC працює відповідно до очікувань для різних ролей.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Після того як ці перевірки пройдено, ви готові видалити Dashboard.&lt;/p&gt;
&lt;h3 id=&#34;uninstall-the-dashboard&#34;&gt;Видалення Dashboard&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#uninstall-the-dashboard&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Якщо ви встановили Kubernetes Dashboard за допомогою 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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;helm uninstall kubernetes-dashboard -n kubernetes-dashboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Якщо Dashboard був встановлений за допомогою маніфесту або надбудови, видаліть його, використовуючи той самий метод, який ви використовували для його встановлення.&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-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kubectl get pods -n kubernetes-dashboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;clean-up-access-artifacts-recommended&#34;&gt;Очищення артефактів доступу (рекомендовано)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#clean-up-access-artifacts-recommended&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Багато налаштувань Dashboard використовували виділені службові облікові записи та ролі на рівні кластера.&lt;/p&gt;
&lt;p&gt;Перегляньте та видаліть усе, що було створено лише для доступу до Dashboard, наприклад:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;службові облікові записи&lt;/li&gt;
&lt;li&gt;привʼязки ролей або привʼязки ролей кластера&lt;/li&gt;
&lt;li&gt;стара документація, яка вказує користувачам на URL-адреси Dashboard або команди port-forward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це зменшує кількість довготривалих облікових даних та невикористовуваних дозволів.&lt;/p&gt;
&lt;h3 id=&#34;communicate-the-change&#34;&gt;Повідомлення про зміну&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#communicate-the-change&#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;Headlamp тепер є основним інтерфейсом Kubernetes.&lt;/li&gt;
&lt;li&gt;Як отримати до нього доступ (застосунок для робочого столу або URL).&lt;/li&gt;
&lt;li&gt;Куди звертатися за допомогою, якщо щось виглядає інакше.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;11-post-migration-checklist&#34;&gt;11. Контрольний список після міграції&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#11-post-migration-checklist&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей фінальний контрольний список допоможе вам переконатися, що міграція завершена. Він дає впевненість, що Headlamp працює належним чином і що нічого важливого не залишилося поза увагою.&lt;/p&gt;
&lt;h3 id=&#34;access-and-visibility&#34;&gt;Доступ та видимість&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#access-and-visibility&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Headlamp відкривається без помилок.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Користувачі можуть отримати доступ до правильних кластерів.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Фільтрація за просторами імен працює належним чином.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Перемикання між кластерами працює правильно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;authentication-and-rbac&#34;&gt;Автентифікація та RBAC&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#authentication-and-rbac&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Користувачі Headlamp на робочому столі отримують доступ до кластерів за допомогою kubeconfig.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Користувачі Headlamp у кластері можуть увійти, використовуючи обраний метод автентифікації.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Користувачі бачать лише ті дії, які дозволяє їхній RBAC.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Під час нормального використання не виникають несподівані помилки дозволів.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;core-workflows&#34;&gt;Основні робочі процеси&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#core-workflows&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Ресурси завантажуються у Workloads, Network та Configuration.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; YAML можна переглядати та редагувати там, де дозволяють права.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Застосунки можна розгортати за допомогою Create та YAML.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Журнали завантажуються правильно для запущених Podʼів.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Exec працює для користувачів, яким дозволено його використовувати.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Метрики зʼявляються, якщо встановлено metrics-server.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;operational-confidence&#34;&gt;Операційна впевненість&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#operational-confidence&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Команди можуть усувати несправності без перемикання інструментів.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Map View допомагає пояснити взаємозвʼязки під час налагодження.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Команди платформи або DevOps знають, як встановлюється та керується Headlamp.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;cleanup-confirmation&#34;&gt;Підтвердження очищення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cleanup-confirmation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Kubernetes Dashboard більше не працює.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Службові облікові записи і привʼязки RBAC, призначені лише для Dashboard, видалені.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Внутрішня документація більше не містить посилань на URL-адреси Dashboard або команди port-forward.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;team-alignment&#34;&gt;Узгодження з командою&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#team-alignment&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Команда знає, що Headlamp є типовим інтерфейсом Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Документація для новачків вказує новим користувачам на Headlamp.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Існує чіткий шлях для зворотного звʼязку або запитань.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Тепер ви завершили перехід з Kubernetes Dashboard на Headlamp. Ваша команда може використовувати ту ж модель доступу до Kubernetes, працювати з різними кластерами та покладатися на робочі процеси, які відповідають сучасному використанню Kubernetes. Відтепер Headlamp стає вашим типовим інтерфейсом, як на робочому столі, так і в спільних середовищах. Зі зростанням ваших потреб ви можете продовжувати використовувати його в поточному вигляді або з часом розширювати його за допомогою втулків і нових переглядів.&lt;/p&gt;
&lt;p&gt;Якщо ви хочете допомогти формувати майбутнє Headlamp, приєднуйтесь до спільноти Headlamp і робіть внесок на &lt;a href=&#34;https://headlamp.dev&#34;&gt;headlamp.dev&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Представляємо втулок Cluster API для Headlamp</title>
      <link>https://deploy-preview-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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>Kubernetes v1.36: Застарівання та видалення Service ExternalIPs</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/05/14/kubernetes-v1-36-deprecation-and-removal-of-service-externalips/</link>
      <pubDate>Thu, 14 May 2026 10:35:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/05/14/kubernetes-v1-36-deprecation-and-removal-of-service-externalips/</guid>
      <description>
        
        
        &lt;p&gt;Поле &lt;code&gt;.spec.externalIPs&lt;/code&gt; для &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/service/&#34;&gt;Service&lt;/a&gt; було ранньою спробою забезпечити функціональність, подібну до балансувальника навантаження в хмарі, для кластерів без хмари. На жаль, API передбачає, що кожному користувачу в кластері повністю довіряють, і в будь-якій ситуації, коли це не так, це відкриває можливості для різних зловживань у системі безпеки, як описано в &lt;a href=&#34;https://www.cvedetails.com/cve/CVE-2020-8554/&#34;&gt;CVE-2020-8554&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Починаючи з Kubernetes 1.21, проєкт Kubernetes рекомендує усім користувачам вимкнути &lt;code&gt;.spec.externalIPs&lt;/code&gt;. Щоб спростити цей процес, у Kubernetes також було додано контролер допуску (&lt;code&gt;DenyServiceExternalIPs&lt;/code&gt;), який можна увімкнути для цього. На той час SIG Network вважала, що типове блокування цієї функціональності було б надто великою зміною, що порушує сумісність.&lt;/p&gt;
&lt;p&gt;Однак проблеми безпеки все ще залишаються, і як проєкт ми все більше незадоволені тим, що ця можливість &amp;quot;типово небезпечна&amp;quot;. Крім того, тепер існує кілька кращих альтернатив для кластерів без хмари, які бажають мати функціональність, подібну до балансувальника навантаження.&lt;/p&gt;
&lt;p&gt;У результаті поле &lt;code&gt;.spec.externalIPs&lt;/code&gt; для Service тепер офіційно визнано застарілим в Kubernetes 1.36. Ми очікуємо, що в майбутньому мінорному випуску Kubernetes реалізацію цієї поведінки буде видалено з &lt;code&gt;kube-proxy&lt;/code&gt;, а критерії &lt;a href=&#34;https://www.cncf.io/training/certification/software-conformance/&#34;&gt;відповідності&lt;/a&gt; Kubernetes будуть оновлені, щоб вимагати, щоб відповідні реалізації &lt;strong&gt;не надавали&lt;/strong&gt; таку підтримку.&lt;/p&gt;
&lt;h2 id=&#34;terminology&#34;&gt;Примітка щодо термінології та того, що не застаріло&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#terminology&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Фраза &lt;em&gt;external IP&lt;/em&gt; має дещо перевантажене значення в Kubernetes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;API Service має поле &lt;code&gt;.spec.externalIPs&lt;/code&gt;, яке можна використовувати для додавання додаткових IP-адрес, на які Service буде відповідати.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API Node має поле &lt;code&gt;.status.addresses&lt;/code&gt;, яке може містити адреси кількох різних типів, один з яких називається &lt;code&gt;ExternalIP&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Інструмент &lt;code&gt;kubectl&lt;/code&gt;, при виводі інформації про Service типу LoadBalancer у типовому форматі виводу, покаже IP-адресу балансувальника навантаження в стовпці з заголовком &lt;code&gt;EXTERNAL-IP&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це застарівання стосується саме першого з них. Якщо ви не задаєте поле &lt;code&gt;externalIPs&lt;/code&gt; у жодному зі своїх Service, то це вас не стосується.&lt;/p&gt;
&lt;p&gt;Проте, як запобіжний захід, ви все одно можете увімкнути контролер допуску &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/admission-controllers/#denyserviceexternalips&#34;&gt;DenyServiceExternalIPs&lt;/a&gt;, щоб заблокувати будь-яке майбутнє використання поля &lt;code&gt;externalIPs&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;alternatives&#34;&gt;Альтернативи для &lt;code&gt;externalIPs&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alternatives&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Якщо ви використовуєте &lt;code&gt;.spec.externalIPs&lt;/code&gt;, то існує кілька альтернатив.&lt;/p&gt;
&lt;p&gt;Розглянемо Service, як показано нижче:&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-example-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;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;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;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-example-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;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;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;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;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;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;externalIPs&lt;/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;s2&#34;&gt;&amp;#34;192.0.2.4&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;h3 id=&#34;alternative-LoadBalancer&#34;&gt;Використання вручну керованих Service типу LoadBalancer замість &lt;code&gt;externalIPs&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alternative-LoadBalancer&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Найпростіший (але також найгірший) варіант — просто перейти від використання &lt;code&gt;externalIPs&lt;/code&gt; до використання Service з &lt;code&gt;type: LoadBalancer&lt;/code&gt; і призначення IP-адреси балансувальника навантаження вручну. Це, по суті, точно те ж саме, що і &lt;code&gt;externalIPs&lt;/code&gt;, з однією важливою відмінністю: IP-адреса балансувальника навантаження є частиною &lt;code&gt;.status&lt;/code&gt; Service, а не його &lt;code&gt;.spec&lt;/code&gt;, і в кластері з увімкненим RBAC її типово не можуть редагувати звичайні користувачі. Таким чином, ця заміна для &lt;code&gt;externalIPs&lt;/code&gt; буде доступна лише користувачам, яким адміністратори надали дозволи (хоча ці користувачі тоді будуть повністю уповноважені повторити CVE-2020-8554; все одно не буде жодних додаткових перевірок, щоб переконатися, що один користувач не краде IP-адреси іншого користувача тощо).&lt;/p&gt;
&lt;p&gt;Через те, як працює &lt;code&gt;.status&lt;/code&gt; у Kubernetes, спочатку потрібно створити Service без IP-адреси балансувальника навантаження, а потім додати IP як другий крок:&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; cat loadbalancer-service.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;apiVersion: v1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;kind: Service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;metadata:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  name: my-example-service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;spec:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  # prevent any real load balancer controllers from managing this service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  # by using a non-existent loadBalancerClass
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  loadBalancerClass: non-existent-class
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  type: LoadBalancer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  selector:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;    app.kubernetes.io/name: my-example-app
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;  ports:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;    - protocol: TCP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;      port: 80
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;      targetPort: 8080
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; kubectl apply -f loadbalancer-service.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;service/my-example-service created
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; kubectl patch service my-example-service --subresource&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;status --type&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;merge -p &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;status&amp;#34;:{&amp;#34;loadBalancer&amp;#34;:{&amp;#34;ingress&amp;#34;:[{&amp;#34;ip&amp;#34;:&amp;#34;192.0.2.4&amp;#34;}]}}}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;alternative-load-balancer-controller&#34;&gt;Використання контролера балансування навантаження, що працює не у хмарі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alternative-load-balancer-controller&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Хоча Service типу &lt;code&gt;LoadBalancer&lt;/code&gt; спочатку були розроблені для підтримки хмарних балансувальників навантаження, Kubernetes також може підтримувати їх на не хмарних платформах за допомогою стороннього контролера балансування навантаження, такого як &lt;a href=&#34;https://metallb.io/&#34;&gt;MetalLB&lt;/a&gt;. Це вирішує проблеми безпеки, повʼязані з &lt;code&gt;externalIPs&lt;/code&gt;, оскільки адміністратор може налаштувати, які діапазони IP-адрес контролер призначатиме Service, і контролер забезпечить, щоб два Service не могли одночасно використовувати одну й ту ж IP-адресу.&lt;/p&gt;
&lt;p&gt;Отже, наприклад, після &lt;a href=&#34;https://metallb.io/installation/&#34;&gt;встановлення&lt;/a&gt; та &lt;a href=&#34;https://metallb.io/configuration/&#34;&gt;налаштування&lt;/a&gt; MetalLB, адміністратор кластера може налаштувати пул IP-адрес для використання в кластері:&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;metallb.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;IPAddressPool&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;production&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;metallb-system&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;addresses&lt;/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;m&#34;&gt;192.0.2.0&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/24&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;autoAssign&lt;/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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;avoidBuggyIPs&lt;/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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Після цього користувач може створити Service з &lt;code&gt;type: LoadBalancer&lt;/code&gt;, і MetalLB обробить призначення IP-адреси. MetalLB навіть підтримує застаріле поле &lt;code&gt;loadBalancerIP&lt;/code&gt; у Service, тому кінцевий користувач може запитати конкретну IP-адресу (за умови, що вона доступна) для зворотної сумісності з підходом &lt;code&gt;externalIPs&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;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-example-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;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;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;LoadBalancer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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-example-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;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;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;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;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;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;loadBalancerIP&lt;/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;192.0.2.4&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;Подібні підходи працюватимуть і з іншими контролерами балансування навантаження. Цей підхід дозволяє адміністраторам кластера контролювати, які IP-адреси призначаються, замість того щоб це робили користувачі.&lt;/p&gt;
&lt;h3 id=&#34;alternative-gateway-api&#34;&gt;Використання Gateway API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alternative-gateway-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ще одним потенційним рішенням є використання реалізації &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gateway API дозволяє адміністраторам кластера визначати ресурс Gateway, до якого можна прикріпити IP-адресу через поле &lt;code&gt;.spec.addresses&lt;/code&gt;. Оскільки ресурси Gateway призначені для керування &lt;a href=&#34;https://gateway-api.sigs.k8s.io/concepts/security/&#34;&gt;адміністраторами кластера&lt;/a&gt;, можна встановити правила RBAC, щоб лише привілейовані користувачі могли ними керувати.&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;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;example-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;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;example-gateway-class&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addresses&lt;/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;IPAddress&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;192.0.2.4&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;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;example-route&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;example-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;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;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;example-svc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;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-svc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;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;example-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;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;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;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;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;8080&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 API — це нове покоління API-інтерфейсів Kubernetes для Ingress, балансування навантаження та Service Mesh. Gateway API було створено з метою усунення недоліків ресурсів Service та Ingress, що робить його надзвичайно надійним і стабільним рішенням, яке наразі активно розвивається.&lt;/p&gt;
&lt;h2 id=&#34;timeline-for-externalips-deprecation&#34;&gt;План дій щодо припинення підтримки &lt;code&gt;externalIPs&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#timeline-for-externalips-deprecation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Орієнтовний план дій щодо припинення підтримки виглядає так:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;З випуском Kubernetes 1.36 поле було визнане застарілим; Kubernetes тепер видає &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2020/09/03/warnings/&#34;&gt;попередження&lt;/a&gt;, коли користувач використовує це поле&lt;/li&gt;
&lt;li&gt;Приблизно через рік (v1.40 найраніше) підтримка &lt;code&gt;.spec.externalIPs&lt;/code&gt; буде вимкнена в kube-proxy, але користувачі матимуть можливість повторно ввімкнути її, якщо їм знадобиться більше часу для міграції&lt;/li&gt;
&lt;li&gt;Приблизно через ще один рік (v1.43 найраніше) підтримка буде повністю вимкнена; користувачі не матимуть можливості повторно ввімкнути її&lt;/li&gt;
&lt;/ol&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.36: ハル (Хару)</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/04/22/kubernetes-v1-36-release/</link>
      <pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/04/22/kubernetes-v1-36-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Редактори:&lt;/strong&gt; Chad M. Crowell, Kirti Goyal, Sophia Ugochukwu, Swathi Rao, Utkarsh Umre&lt;/p&gt;
&lt;p&gt;Подібно до попередніх випусків, випуск Kubernetes v1.36 представляє нові стабільні, бета- та альфа-функції. Постійний випуск високоякісних версій підкреслює силу нашого циклу розробки та активну підтримку з боку нашої спільноти.&lt;/p&gt;
&lt;p&gt;Цей випуск складається з 70 удосконалень. З них 18 стали стабільними, 25 переходять у бета-версію, а 25 стали альфа-функціями.&lt;/p&gt;
&lt;p&gt;У цьому випуску також є деякі &lt;a href=&#34;#deprecations-removals-and-community-updates&#34;&gt;застарівання та вилучення&lt;/a&gt;; обовʼязково ознайомтеся з ними.&lt;/p&gt;
&lt;h2 id=&#34;release-theme-and-logo&#34;&gt;Тема випуску та логотип&lt;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-59115--kubernetes-io-main-staging.netlify.app/blog/2026/04/22/kubernetes-v1-36-release/k8s-v1.36.svg&#34;
         alt=&#34;Логотип Kubernetes v1.36 Haru: шестикутний значок з назвою Haru, виписаною плавним рукописним шрифтом під v1.36; праворуч височіє гора Фудзі, її вершина освітлена червоним світлом зі смугами блідого снігу, а японську каліграфію 晴れに翔け виписано пензлем вниз по її схилу; білий штурвал Kubernetes ширяє в блакитному небі ліворуч серед стилізованих хмар у манері укійо-е; на передньому плані стоять два коти як парні охоронці, сіро-білий кіт ліворуч і рудий смугастий кіт праворуч, кожен у нашийнику з маленькою синьою підвіскою у вигляді штурвала Kubernetes&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Ми відкриваємо 2026 рік з Kubernetes v1.36, випуском, який приходить, коли сезон змінюється і світло на горі зміщується. ハル (&lt;em&gt;Хару&lt;/em&gt;) — це звук у японській мові, який несе багато значень; серед них ми найбільше цінуємо 春 (весна), 晴れ (&lt;em&gt;харе&lt;/em&gt;, ясне небо) та 遥か (&lt;em&gt;харука&lt;/em&gt;, далекий, віддалений). Сезон, небо та горизонт. Ви знайдете всі три в наступному тексті.&lt;/p&gt;
&lt;p&gt;Логотип створено &lt;a href=&#34;https://x.com/avocadoneko&#34;&gt;avocadoneko / Natsuho Ide&lt;/a&gt; під впливом серії &lt;a href=&#34;https://en.wikipedia.org/wiki/Thirty-six_Views_of_Mount_Fuji&#34;&gt;&lt;em&gt;Тридцять шість видів Фудзі&lt;/em&gt;&lt;/a&gt; (富嶽三十六景, &lt;em&gt;Fugaku Sanjūrokkei&lt;/em&gt;) художника &lt;a href=&#34;https://en.wikipedia.org/wiki/Hokusai&#34;&gt;Кацусіки Хокусая&lt;/a&gt;, тієї ж серії, що подарувала світу &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Great_Wave_off_Kanagawa&#34;&gt;&lt;em&gt;Велику хвилю в Канаґаві&lt;/em&gt;&lt;/a&gt;. Наш логотип v1.36 переосмислює одну з найвідоміших гравюр серії, &lt;a href=&#34;https://en.wikipedia.org/wiki/Fine_Wind,_Clear_Morning&#34;&gt;&lt;em&gt;Ніжний вітер. Ясний ранок&lt;/em&gt;&lt;/a&gt; (凱風快晴, &lt;em&gt;Gaifū Kaisei&lt;/em&gt;), також відому як Червона Фудзі (赤富士, &lt;em&gt;Aka Fuji&lt;/em&gt;): гора, освітлена червоним світлом літнього світанку, без снігу після довгої відлиги. Тридцять шість видів здавалися підходящим числом для v1.36, і нагадуванням, що навіть Хокусай не зупинився на цьому.&lt;sup&gt;1&lt;/sup&gt; За сценою пильнує штурвал Kubernetes, вміщений у небо поруч з горою.&lt;/p&gt;
&lt;p&gt;Біля підніжжя Фудзі сидять Стелла (ліворуч) та Начо (праворуч), два коти зі штурвалом Kubernetes на нашийниках, які виконують роль &lt;a href=&#34;https://en.wikipedia.org/wiki/Komainu&#34;&gt;&lt;em&gt;комаїну&lt;/em&gt;&lt;/a&gt; — пари охоронців у вигляді левоподібних собак, що стережуть японські святилища. Саме пари, адже ніщо не охороняють поодинці. Стелла та Начо символізують набагато більшу групу: SIG та робочі групи, супровідників та рецензентів, людей, які стоять за документацією, блогами та перекладами, команду випуску, нових учасників, які роблять свої перші кроки, та досвідчених учасників, які повертаються сезон за сезоном. Kubernetes v1.36, як завжди, тримається на багатьох руках.&lt;/p&gt;
&lt;p&gt;На Червоній Фудзі в логотипі пензлем виписано каліграфію 晴れに翔け (&lt;em&gt;hare ni kake&lt;/em&gt;), «злітай у ясне небо». Це перша половина двовірша, який був занадто довгим, щоб поміститися на горі:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;晴れに翔け、未来よ明け&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;hare ni kake, asu yo ake&lt;/em&gt;&lt;br&gt;
«Злітай у ясне небо; назустріч завтрашньому світанку».&lt;sup&gt;2&lt;/sup&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Саме таке бажання ми вкладаємо в цей випуск: злетіти в ясне небо — для самого випуску, для проєкту та для всіх, хто спільно його випускає. Світанок над Червоною Фудзі не є кінцем, а переходом: цей випуск веде нас до наступного, а той — до наступного, у напрямку горизонтів, що виходять далеко за межі того, що може вмістити будь-який окремий вид.&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;1. Ця серія була настільки популярною, що Хокусай додав ще десять гравюр, довівши загальну кількість до сорока шести.&lt;/sub&gt;&lt;br&gt;
&lt;sub&gt;2. 未来 означає «майбутнє» у найширшому сенсі, не лише завтра, а все, що ще попереду. Зазвичай читається як &lt;em&gt;mirai&lt;/em&gt;; тут використовується неформальне читання &lt;em&gt;asu&lt;/em&gt;.&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.36 містить безліч нових функцій та покращень. Ось кілька оновлень, на які команда випуску хотіла б звернути вашу увагу!&lt;/p&gt;
&lt;h3 id=&#34;stable-fine-grained-api-authorization&#34;&gt;Stable: Детальна авторизація API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#stable-fine-grained-api-authorization&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Від імені Kubernetes SIG Auth та SIG Node ми раді оголосити про перехід детальної авторизації API &lt;code&gt;kubelet&lt;/code&gt; у стан загальної доступності (GA) в Kubernetes v1.36!&lt;/p&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;KubeletFineGrainedAuthz&lt;/code&gt; була впроваджена як необовʼязкова альфа-функція в Kubernetes v1.32, потім перейшла в бета-версію (стала типово увімкненою) в v1.33. Тепер ця функція стала загальнодоступною. Ця функція забезпечує більш точний контроль доступу з мінімальними привілеями до HTTPS API kubelet, усуваючи необхідність надавати надто широкий дозвіл nodes/proxy для типових сценаріїв моніторингу та спостереження.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/2862&#34;&gt;KEP #2862&lt;/a&gt;, яку очолювали SIG Auth та SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;beta-resource-health-status&#34;&gt;Beta: Статус справності ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#beta-resource-health-status&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;До випуску v1.34 Kubernetes не мав вбудованого способу повідомляти про справність виділених пристроїв, що ускладнювало діагностику аварій Podʼів через апаратні збої. Спираючись на початковий альфа-випуск у v1.31, який зосереджувався на Device Plugins, Kubernetes v1.36 розширює цю функцію, підвищуючи поле &lt;code&gt;allocatedResourcesStatus&lt;/code&gt; у &lt;code&gt;.status&lt;/code&gt; для кожного Podʼа до бета-версії. Це поле забезпечує єдиний механізм звітування про справність для всього спеціалізованого апаратного забезпечення.&lt;/p&gt;
&lt;p&gt;Користувачі тепер можуть запускати &lt;code&gt;kubectl describe pod&lt;/code&gt;, щоб визначити, чи спричинений цикл аварійних перезапусків контейнера станом пристрою &lt;code&gt;Unhealthy&lt;/code&gt; або &lt;code&gt;Unknown&lt;/code&gt;, незалежно від того, чи було апаратне забезпечення надано через традиційні втулки або новіший фреймворк DRA. Така покращена наочність дозволяє адміністраторам та автоматизованим контролерам швидко виявляти несправне обладнання та оптимізувати відновлення високопродуктивних робочих навантажень.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4680&#34;&gt;KEP #4680&lt;/a&gt;, яку очолював SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;alpha-workload-aware-scheduling-was-features&#34;&gt;Alpha: Функції планування з урахуванням навантаження (Workload Aware Scheduling, WAS)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alpha-workload-aware-scheduling-was-features&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Раніше планувальник Kubernetes та контролери завдань керували Podʼами як незалежними одиницями, що часто призводило до фрагментованого планування або марнування ресурсів для складних розподілених робочих навантажень. Kubernetes v1.36 представляє комплексний набір функцій Workload Aware Scheduling (WAS) в альфа-версії, нативно інтегруючи контролер Job з оновленим &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/workload-api/&#34;&gt;Workload&lt;/a&gt; API та новим відокремленим PodGroup API, щоб розглядати повʼязані Podʼи як єдину логічну сутність.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 вже підтримував &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/scheduling-eviction/gang-scheduling/&#34;&gt;групове планування&lt;/a&gt;, вимагаючи, щоб мінімальна кількість Podʼів могла бути запланована, перш ніж будь-який з них буде привʼязано до вузлів. v1.36 іде далі з новим циклом планування PodGroup, який оцінює всю групу атомарно: або всі Podʼи в групі привʼязуються разом, або жоден з них.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках кількох KEP (включаючи &lt;a href=&#34;https://kep.k8s.io/4671&#34;&gt;#4671&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5547&#34;&gt;#5547&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5832&#34;&gt;#5832&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5732&#34;&gt;#5732&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/5710&#34;&gt;#5710&lt;/a&gt;) під керівництвом SIG Scheduling та SIG Apps.&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;&lt;em&gt;В цьому розділі представлено деякі з покращень, які тепер є стабільними після випуску v1.36.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;volume-group-snapshots&#34;&gt;Знімки груп томів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#volume-group-snapshots&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Після кількох циклів у бета-версії підтримка VolumeGroupSnapshot досягає загальної доступності (GA) в Kubernetes v1.36. Ця функція дозволяє робити аварійно-узгоджені знімки одночасно для кількох PersistentVolumeClaims. Підтримка знімків груп томів базується на наборі &lt;a href=&#34;https://kubernetes-csi.github.io/docs/group-snapshot-restore-feature.html#volume-group-snapshot-apis&#34;&gt;API розширень для групових знімків&lt;/a&gt;. Ці API дозволяють користувачам робити аварійно-узгоджені знімки для набору томів. Основна мета полягає в тім, щоб дозволити відновлювати цей набір знімків у нові томи та відновлювати робоче навантаження на основі аварійно-узгодженої точки відновлення.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3476&#34;&gt;KEP #3476&lt;/a&gt; під керівництвом SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;mutable-volume-attach-limits&#34;&gt;Змінювані обмеження на підключення томів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mutable-volume-attach-limits&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функція &lt;em&gt;mutable &lt;code&gt;CSINode&lt;/code&gt; allocatable&lt;/em&gt; переходить у стабільний стан. Це удосконалення дозволяє драйверам &lt;a href=&#34;https://kubernetes-csi.github.io/docs/introduction.html&#34;&gt;Container Storage Interface (CSI)&lt;/a&gt; динамічно оновлювати повідомлену максимальну кількість томів, які вузол може обробляти.&lt;/p&gt;
&lt;p&gt;З цим оновленням &lt;code&gt;kubelet&lt;/code&gt; може динамічно оновлювати обмеження томів і інформацію про ємність вузла. &lt;code&gt;kubelet&lt;/code&gt; коригує ці обмеження на основі періодичних перевірок або у відповідь на помилки вичерпання ресурсів від драйвера CSI, без необхідності перезапуску компонента. Це забезпечує точне відображення доступності сховища для планувальника Kubernetes, запобігаючи помилкам планування Podʼів через застарілі обмеження томів.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;KEP #4876&lt;/a&gt; під керівництвом SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;api-for-external-signing-of-service-account-tokens&#34;&gt;API для зовнішнього підписування токенів ServiceAccount&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#api-for-external-signing-of-service-account-tokens&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функція &lt;em&gt;зовнішнього підписувача токенів ServiceAccount&lt;/em&gt; для службових облікових записів переходить у стабільний стан, що дозволяє передавати підписування токенів зовнішній системі, водночас чисто інтегруючись з API Kubernetes. Тепер кластери можуть використовувати зовнішній модуль підпису JWT для видачі проєкційних токенів службових облікових записів, що відповідають стандартному формату токенів службових облікових записів, включаючи підтримку подовженого терміну дії за потреби. Це особливо корисно для кластерів, які вже покладаються на зовнішні системи управління ідентифікацією або ключами, дозволяючи Kubernetes інтегруватися без дублювання управління ключами всередині панелі управління.&lt;/p&gt;
&lt;p&gt;kube-apiserver налаштований на виявлення публічних ключів зовнішнього підписувача, їх кешування та перевірку токенів, які він не підписував самостійно, завдяки чому наявні процеси автентифікації та авторизації продовжують працювати належним чином. Протягом альфа- та бета-фаз API та конфігурація втулка зовнішнього підписувача, перевірка шляхів та виявлення OIDC були вдосконалені для безпечного забезпечення реальних розгортань та схем ротації.&lt;/p&gt;
&lt;p&gt;З випуском GA у версії 1.36 зовнішнє підписування токенів ServiceAccount тепер є повністю підтримуваною опцією для платформ, що централізують ідентифікацію та підписування, спрощуючи інтеграцію із зовнішніми системами IAM та зменшуючи необхідність керувати ключами підписування безпосередньо всередині панелі управління.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/740&#34;&gt;KEP #740&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;dra-features-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;p&gt;Частина екосистеми динамічного виділення ресурсів (Dynamic Resource Allocation, DRA) досягає повної промислової зрілості в Kubernetes v1.36, оскільки ключові функції управління та вибору переходять у стабільний стан. Перехід &lt;em&gt;адміністративного доступу DRA&lt;/em&gt; до GA забезпечує постійний, безпечний каркас для адміністраторів кластера для доступу та управління апаратними ресурсами на глобальному рівні, тоді як стабілізація &lt;em&gt;пріоритетних списків&lt;/em&gt; гарантує, що логіка вибору ресурсів залишається послідовною та передбачуваною у всіх середовищах кластера.&lt;/p&gt;
&lt;p&gt;Тепер організації можуть впевнено впроваджувати автоматизацію критично важливого апаратного забезпечення з гарантією довгострокової стабільності API та зворотної сумісності. Ці функції дозволяють користувачам реалізовувати складні політики спільного використання ресурсів та адміністративні перевизначення, які є необхідними для великих кластерів GPU та багатокористувацьких платформ AI, що означає завершення основного архітектурного фундаменту для управління ресурсами наступного покоління.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках KEP &lt;a href=&#34;https://kep.k8s.io/5018&#34;&gt;#5018&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/4816&#34;&gt;#4816&lt;/a&gt; під керівництвом SIG Auth та SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;mutating-admission-policies&#34;&gt;Змінювальні політики допуску&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mutating-admission-policies&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Декларативне керування кластерами досягає нового рівня досконалості в Kubernetes v1.36 з переходом &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/mutating-admission-policy/&#34;&gt;MutatingAdmissionPolicies&lt;/a&gt; у стабільний стан. Ця подія забезпечує нативну, високопродуктивну альтернативу традиційним вебхукам, дозволяючи адміністраторам визначати зміни ресурсів безпосередньо в API-сервері за допомогою Common Expression Language (CEL), повністю замінюючи потребу в зовнішній інфраструктурі для багатьох поширених випадків використання.&lt;/p&gt;
&lt;p&gt;Тепер оператори кластера можуть змінювати вхідні запити без затримок та операційної складності, повʼязаної з управлінням власними вебхуками допуску. Перенісши логіку мутації в декларативну, версіоновану політику, організації можуть досягти більш передбачуваної поведінки кластера, зменшити мережеве навантаження та зміцнити модель безпеки з повною гарантією довгострокової стабільності API.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3962&#34;&gt;KEP #3962&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;declarative-validation-of-kubernetes-native-types-with-validation-gen&#34;&gt;Декларативна валідація нативних типів Kubernetes за допомогою &lt;code&gt;validation-gen&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#declarative-validation-of-kubernetes-native-types-with-validation-gen&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Розробка власних ресурсів досягає нового рівня ефективності в Kubernetes v1.36, оскільки &lt;em&gt;декларативна валідація&lt;/em&gt; (з &lt;code&gt;validation-gen&lt;/code&gt;) переходить у стабільний стан. Ця подія замінює ручне та часто схильне до помилок завдання написання складних схем OpenAPI, дозволяючи розробникам визначати складну логіку валідації безпосередньо в тегах структур Go за допомогою Common Expression Language (CEL).&lt;/p&gt;
&lt;p&gt;Замість написання власних функцій валідації, учасники Kubernetes тепер можуть визначати правила валідації за допомогою коментарів маркерів IDL (таких як &lt;code&gt;+k8s:minimum&lt;/code&gt; або &lt;code&gt;+k8s:enum&lt;/code&gt;) безпосередньо у визначеннях типів API (&lt;code&gt;types.go&lt;/code&gt;). Інструмент &lt;code&gt;validation-gen&lt;/code&gt; аналізує ці коментарі для автоматичної генерації надійного коду валідації API під час компіляції. Це зменшує витрати на обслуговування та забезпечує, що валідація API залишається послідовною та синхронізованою з вихідним кодом.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5073&#34;&gt;KEP #5073&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;remove-gogo-protobuf-dependency-for-kubernetes-api-types&#34;&gt;Вилучення залежності від gogo protobuf для типів API Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#remove-gogo-protobuf-dependency-for-kubernetes-api-types&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Безпека та довгострокова підтримуваність кодової бази Kubernetes роблять великий крок уперед у Kubernetes v1.36 із завершенням вилучення &lt;code&gt;gogoprotobuf&lt;/code&gt;. Ця ініціатива усунула значну залежність від непідтримуваної бібліотеки &lt;code&gt;gogoprotobuf&lt;/code&gt;, яка стала джерелом потенційних вразливостей безпеки та блокером для впровадження сучасних функцій мови Go.&lt;/p&gt;
&lt;p&gt;Замість переходу на стандартне генерування Protobuf, що несло ризики сумісності для типів API Kubernetes, проєкт вирішив створити форк необхідної логіки генерації та перенести її всередину &lt;code&gt;k8s.io/code-generator&lt;/code&gt;. Цей підхід успішно усуває непідтримувані залежності часу виконання з графа залежностей Kubernetes, зберігаючи при цьому поточну поведінку API та сумісність серіалізації. Для споживачів типів Go API Kubernetes ця зміна зменшує технічний борг і запобігає випадковому неправильному використанню зі стандартними бібліотеками protobuf.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5589&#34;&gt;KEP #5589&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;node-log-query&#34;&gt;Запит журналів вузлів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#node-log-query&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Раніше Kubernetes вимагав від адміністраторів кластера входу на вузли через SSH або реалізації клієнтського читача для налагодження проблем, що стосуються вузлів панелі управління або робочих вузлів. Хоча деякі проблеми все ще потребують прямого доступу до вузлів, проблеми з kube-proxy або kubelet можна діагностувати, переглядаючи їх журнали. Журнали вузлів надають адміністраторам кластера метод перегляду цих журналів за допомогою API kubelet та втулка kubectl, спрощуючи пошук несправностей без входу на вузли, подібно до налагодження проблем, повʼязаних з Podʼом або контейнером. Цей метод є незалежним від операційної системи і вимагає, щоб сервіси або вузли записували журнали в &lt;code&gt;/var/log&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;З переходом цієї функції до GA в Kubernetes 1.36 після ретельної перевірки продуктивності на робочих навантаженнях у промисловій експлуатації, вона типово увімкнена в kubelet через функціональну можливість &lt;code&gt;NodeLogQuery&lt;/code&gt;. Крім того, також потрібно увімкнути параметр конфігурації kubelet &lt;code&gt;enableSystemLogQuery&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/2258&#34;&gt;KEP #2258&lt;/a&gt; під керівництвом SIG Windows.&lt;/p&gt;
&lt;h3 id=&#34;support-user-namespaces-in-pods&#34;&gt;Підтримка просторів імен користувачів у Podʼах&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-user-namespaces-in-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ізоляція контейнерів та безпека вузлів досягають важливого етапу зрілості в Kubernetes v1.36, оскільки підтримка просторів імен користувачів переходить у стабільну версію. Ця довгоочікувана функція забезпечує критичний рівень ешелонованого захисту, дозволяючи зіставляти користувача root контейнера з непривілейованим користувачем на хості, гарантуючи, що навіть якщо процес вийде за межі контейнера, він не матиме адміністративних прав над базовим вузлом.&lt;/p&gt;
&lt;p&gt;Тепер оператори кластерів можуть впевнено увімкнути цю посилену ізоляцію для робочих навантажень у виробничому середовищі, щоб зменшити вплив вразливостей виходу з контейнера. Відокремлюючи внутрішню ідентичність контейнера від ідентичності хоста, Kubernetes забезпечує надійний, стандартизований механізм захисту багатокористувацьких середовищ та чутливої інфраструктури від несанкціонованого доступу, з повною гарантією довгострокової стабільності API.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP #127&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;support-psi-based-on-cgroupv2&#34;&gt;Підтримка PSI на основі cgroupv2&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-psi-based-on-cgroupv2&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Управління ресурсами вузлів та їх спостережуваність стають більш точними в Kubernetes v1.36, оскільки експорт метрик Pressure Stall Information (PSI) переходить у стабільну версію. Ця функція надає kubelet можливість повідомляти метрики «тиску» на CPU, памʼять та I/O, пропонуючи більш детальний погляд на конкуренцію за ресурси, ніж традиційні метрики використання.&lt;/p&gt;
&lt;p&gt;Оператори кластерів та автомасштабувальники можуть використовувати ці метрики, щоб відрізнити систему, яка просто зайнята, від системи, яка активно простоює через вичерпання ресурсів. Використовуючи ці сигнали, користувачі можуть точніше налаштовувати запити ресурсів для Podʼів, покращувати надійність вертикального автомасштабування та виявляти ефекти «шумних сусідів» до того, як вони призведуть до погіршення продуктивності застосунків або нестабільності вузлів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4205&#34;&gt;KEP #4205&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;volumesource-oci-artifact-and-or-image&#34;&gt;Джерело томів: OCI-артефакт та/або образ&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#volumesource-oci-artifact-and-or-image&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Поширення даних контейнерів стає більш гнучким у Kubernetes v1.36, оскільки підтримка &lt;em&gt;OCI-джерела томів&lt;/em&gt; переходить у стабільну версію. Ця функція виходить за межі традиційної вимоги монтування томів з зовнішніх постачальників сховищ або конфігураційних мап (config map), дозволяючи kubelet безпосередньо завантажувати та монтувати вміст з будь-якого реєстру, що відповідає стандарту OCI, наприклад, образу контейнера або репозиторію артефактів.&lt;/p&gt;
&lt;p&gt;Тепер розробники та інженери платформ можуть пакувати дані застосунків, моделі або статичні ресурси як OCI-артефакти та доставляти їх у Podʼи, використовуючи ті самі реєстри та робочі процеси версіонування, які вони вже використовують для образів контейнерів. Це поєднання управління образами та томами спрощує CI/CD-пайплайни, зменшує залежність від спеціалізованих сховищ для контенту лише для читання та забезпечує переносимість і безпечний доступ до даних у будь-якому середовищі.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4639&#34;&gt;KEP #4639&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-beta&#34;&gt;Нові функції у бета-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#new-features-in-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Цей розділ містить вибірку деяких покращень, які тепер доступні у бета-версії після випуску v1.36.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;staleness-mitigation-for-controllers&#34;&gt;Зменшення неактуальності даних у контролерах&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#staleness-mitigation-for-controllers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Неактуальність даних у контролерах Kubernetes є проблемою, яка впливає на багато контролерів і може непомітно впливати на їхню поведінку. Зазвичай проблема виявляється занадто пізно, коли контролер у виробничому середовищі вже вчинив неправильну дію, через деякі припущення, зроблені автором контролера. Це може призвести до конфліктних оновлень або пошкодження даних під час узгодження контролера в умовах застарівання кешу.&lt;/p&gt;
&lt;p&gt;Ми раді повідомити, що Kubernetes v1.36 включає нові функції, які допомагають зменшити неактуальність даних у контролерах і забезпечують кращу спостережуваність їхньої поведінки. Це запобігає узгодженню на основі застарілого уявлення про стан кластера, що часто може призвести до шкідливої поведінки.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5647&#34;&gt;KEP #5647&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;ip-cidr-validation-improvements&#34;&gt;Покращення перевірки IP/CIDR&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ip-cidr-validation-improvements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функція &lt;code&gt;StrictIPCIDRValidation&lt;/code&gt; для полів API IP та CIDR переходить у бета-версію, посилюючи перевірку для виявлення некоректних адрес і префіксів, які раніше могли проходити непоміченими. Це допомагає запобігти непомітним помилкам конфігурації, коли Service, Pod, NetworkPolicy або інші ресурси посилаються на недійсні IP-адреси, що в іншому випадку могло б призвести до заплутаної поведінки під час виконання або проблем з безпекою.&lt;/p&gt;
&lt;p&gt;Контролери оновлено для канонізації IP-адрес, які вони записують назад в обʼєкти, та для попередження, коли вони стикаються з неправильними значеннями, які вже були збережені, щоб кластери могли поступово приходити до чистих, узгоджених даних. У бета-версії &lt;code&gt;StrictIPCIDRValidation&lt;/code&gt; готова до ширшого використання, надаючи операторам більш надійні засоби контролю за конфігураціями, повʼязаними з IP, під час розвитку мереж і політик з часом.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4858&#34;&gt;KEP #4858&lt;/a&gt; під керівництвом SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;separate-kubectl-user-preferences-from-cluster-configs&#34;&gt;Відокремлення налаштувань користувача kubectl від конфігурацій кластера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#separate-kubectl-user-preferences-from-cluster-configs&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Функція &lt;code&gt;.kuberc&lt;/code&gt; для налаштування параметрів користувача &lt;code&gt;kubectl&lt;/code&gt; продовжує бути в бета-версії та є типово увімкненою. Файл &lt;code&gt;~/.kube/kuberc&lt;/code&gt; дозволяє користувачам зберігати псевдоніми, типові прапорці та інші особисті налаштування окремо від файлів &lt;code&gt;kubeconfig&lt;/code&gt;, які містять точки доступу кластера та облікові дані. Це відокремлення запобігає впливу особистих налаштувань на CI-конвеєри або спільні файли &lt;code&gt;kubeconfig&lt;/code&gt;, забезпечуючи при цьому послідовний досвід роботи з &lt;code&gt;kubectl&lt;/code&gt; у різних кластерах і контекстах.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.36 &lt;code&gt;.kuberc&lt;/code&gt; було розширено можливістю визначати політики для втулків облікових даних (allowlists або denylists) для забезпечення безпечнішої автентифікації. Користувачі можуть вимкнути цю функціональність, якщо потрібно, встановивши змінні середовища &lt;code&gt;KUBECTL_KUBERC=false&lt;/code&gt; або &lt;code&gt;KUBERC=off&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;KEP #3104&lt;/a&gt; під керівництвом SIG CLI, за допомогою SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;mutable-container-resources-when-job-is-suspended&#34;&gt;Змінювані ресурси контейнера, коли Job призупинено&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mutable-container-resources-when-job-is-suspended&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функція &lt;code&gt;MutablePodResourcesForSuspendedJobs&lt;/code&gt; переходить у бета-версію та є типово увімкненою. Це оновлення послаблює валідацію Job, дозволяючи оновлювати запити та обмеження ресурсів контейнера, таких як CPU, памʼять, GPU та розширені ресурси, поки Job призупинено.&lt;/p&gt;
&lt;p&gt;Ця можливість дозволяє контролерам черг і операторам коригувати вимоги до пакетних робочих навантажень на основі умов кластера в реальному часі. Наприклад, система черг може призупинити вхідні Job, скоригувати їхні вимоги до ресурсів відповідно до доступної ємності або квоти, а потім відновити їх. Функція суворо обмежує змінюваність призупиненими Job (або Job, чиї Podʼи були завершені під час призупинення), щоб запобігти руйнівним змінам в активно працюючих Podʼах.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5440&#34;&gt;KEP #5440&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;constrained-impersonation&#34;&gt;Обмежена імперсоніфікація&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#constrained-impersonation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функція &lt;code&gt;ConstrainedImpersonation&lt;/code&gt; для імперсоніфікації користувачів переходить у бета-версію, перетворюючи історичний механізм все-або-нічого на щось, що дійсно може дотримуватися принципів найменших привілеїв. Коли ця функція увімкнена, імперсонатор повинен мати два окремі набори дозволів: один для імперсоніфікації певної особи, а інший для виконання конкретних дій від імені цієї особи. Це запобігає використанню інструментами підтримки, контролерами або агентами вузлів імперсоніфікації для отримання ширшого доступу, ніж їм дозволено, навіть якщо їхні правила RBAC для імперсоніфікації налаштовані неправильно. Наявні правила імперсоніфікації продовжують працювати, але API-сервер спочатку віддає перевагу новим обмеженим перевіркам, роблячи перехід поступовим, а не одномоментним. З бета-версією в v1.36 &lt;code&gt;ConstrainedImpersonation&lt;/code&gt; протестована, задокументована і готова до ширшого використання командами платформ, які покладаються на імперсоніфікацію для налагодження, проксирування або контролерів на рівні вузлів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5284&#34;&gt;KEP #5284&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;dra-features-in-beta&#34;&gt;Функції DRA у стані бета&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-features-in-beta&#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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/&#34;&gt;динамічного виділення ресурсів (Dynamic Resource Allocation, DRA)&lt;/a&gt; досягає ще одного етапу зрілості в Kubernetes v1.36, оскільки кілька основних функцій переходять у бета-версію та стають типово увімкненими. Цей перехід виводить DRA за межі базового виділення завдяки переходу в бета-версію &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/dra-features/#partitionable-devices&#34;&gt;пристроїв, що розділяються на розділи&lt;/a&gt;, та &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/dra-features/#consumable-capacity&#34;&gt;споживчої ємності&lt;/a&gt;, що дозволяє більш детально ділити апаратне забезпечення, таке як GPU, тоді як &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/device-taints/#device-taints-and-tolerations&#34;&gt;позначки taint та toleration пристроїв&lt;/a&gt; забезпечують використання спеціалізованих ресурсів лише відповідними робочими навантаженнями.&lt;/p&gt;
&lt;p&gt;Тепер користувачі отримують значно надійніший та спостережуваний життєвий цикл ресурсів завдяки &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/dra-observability/#resourceclaim-device-status&#34;&gt;статусу пристрою ResourceClaim&lt;/a&gt; та можливості забезпечити підключення пристрою перед плануванням Podʼа. Інтегруючи ці функції з підтримкою &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/dra-features/#extended-resource&#34;&gt;розширених ресурсів&lt;/a&gt;, Kubernetes надає надійну, готову до промислового використання альтернативу застарілій системі втулків пристроїв, що дозволяє складним робочим навантаженням AI та HPC керувати апаратним забезпеченням з безпрецедентною точністю та операційною безпекою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках кількох KEP (включаючи &lt;a href=&#34;https://kep.k8s.io/5004&#34;&gt;#5004&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/4817&#34;&gt;#4817&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5055&#34;&gt;#5055&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5075&#34;&gt;#5075&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/4815&#34;&gt;#4815&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/issues/5007&#34;&gt;#5007&lt;/a&gt;) під керівництвом SIG Scheduling та SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;statusz-for-kubernetes-components&#34;&gt;Statusz для компонентів Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#statusz-for-kubernetes-components&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функціональна можливість &lt;code&gt;ComponentStatusz&lt;/code&gt; для основних компонентів Kubernetes переходить у бета-версію, надаючи точку доступу &lt;code&gt;/statusz&lt;/code&gt; (типово увімкнена), яка показує деталі збірки та версії в реальному часі для кожного компонента. Ця &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/zpages/&#34;&gt;z-сторінка&lt;/a&gt; з низькими накладними витратами показує інформацію, таку як час запуску, час роботи, версія Go, версія бінарного файлу, версія емуляції та мінімальна сумісна версія, що дозволяє операторам та розробникам швидко бачити, що саме працює, без необхідності переглядати журнали або конфігурації.&lt;/p&gt;
&lt;p&gt;Точка доступу типово пропонує текстовий вигляд, зрозумілий для людей, а також версіоноване структуроване API (&lt;code&gt;config.k8s.io/v1beta1&lt;/code&gt;) для програмного доступу у форматах JSON, YAML або CBOR через явне узгодження вмісту. Доступ надається групі &lt;code&gt;system:monitoring&lt;/code&gt;, що забезпечує відповідність наявним захистам на точках доступу справності та метрик і запобігає витоку конфіденційних даних.&lt;/p&gt;
&lt;p&gt;З бета-версією &lt;code&gt;ComponentStatusz&lt;/code&gt; типово увімкнено для всіх основних компонентів панелі управління та агентів вузлів, підтримується модульними, інтеграційними та наскрізними тестами, що дозволяє безпечно використовувати його в продуктивних середовищах для спостереження та налагодження робочих процесів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4827&#34;&gt;KEP #4827&lt;/a&gt; під керівництвом SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;flagz-for-kubernetes-components&#34;&gt;Flagz для компонентів Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#flagz-for-kubernetes-components&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функціональна можливість &lt;code&gt;ComponentFlagz&lt;/code&gt; для основних компонентів Kubernetes переходить у бета-версію, стандартизуючи точку доступу &lt;code&gt;/flagz&lt;/code&gt;, яка показує фактичні прапорці командного рядка, з якими був запущений кожен компонент. Це дає операторам кластерів та розробникам можливість у реальному часі бачити конфігурацію компонентів у кластері, що значно полегшує налагодження несподіваної поведінки або перевірку того, що зміни прапорців дійсно набули чинності після перезапуску.&lt;/p&gt;
&lt;p&gt;Точка доступу підтримує як текстовий вигляд, зрозумілий для людей, так і версіоноване структуроване API (спочатку &lt;code&gt;config.k8s.io/v1beta1&lt;/code&gt;), тож ви можете або використовувати &lt;code&gt;curl&lt;/code&gt; під час інциденту, або інтегрувати його в автоматизовані інструменти, коли будете готові. Доступ надається групі &lt;code&gt;system:monitoring&lt;/code&gt;, а конфіденційні значення можуть бути приховані, що забезпечує відповідність наявним практикам безпеки щодо точок доступу справності та стану.&lt;/p&gt;
&lt;p&gt;З бета-версією &lt;code&gt;ComponentFlagz&lt;/code&gt; тепер типово увімкнено та реалізовано в усіх основних компонентах панелі управління та агентах вузлів, із підтримкою модульних, інтеграційних та наскрізних тестів, які гарантують надійність точки доступу в продуктивних кластерах.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4828&#34;&gt;KEP #4828&lt;/a&gt; під керівництвом SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;mixed-version-proxy&#34;&gt;Проксі змішаних версій (також відомий як &lt;em&gt;проксі сумісності для невідомої версії&lt;/em&gt;)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mixed-version-proxy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.36 функція &lt;em&gt;проксі змішаних версій&lt;/em&gt; переходить у бета-версію, будуючись на її альфа-впровадженні у v1.28, щоб забезпечити безпечніше оновлення панелі управління для кластерів зі змішаними версіями. Тепер кожен запит API може бути направлений до екземпляра apiserver, який обслуговує запитану групу, версію та ресурс, зменшуючи кількість помилок 404 та збоїв через розбіжності версій.&lt;/p&gt;
&lt;p&gt;Функція покладається на агреговане виявлення між однорідними екземплярами (peer), тому apiserver обмінюються інформацією про те, які ресурси та версії вони надають, а потім використовують ці дані для прозорого перенаправлення запитів за потреби. Нові метрики щодо перенаправленого трафіку та поведінки проксі допомагають операторам зрозуміти, як часто запити пересилаються і до яких екземплярів. Разом ці зміни полегшують запуск високодоступних панелей управління API зі змішаними версіями в продуктивному середовищі під час виконання багатокрокових або часткових оновлень панелі управління.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4020&#34;&gt;KEP #4020&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;memory-qos-with-cgroups-v2&#34;&gt;QoS памʼяті з cgroups v2&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#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) памʼяті на вузлах Linux із cgroup v2 завдяки більш інтелектуальній багаторівневій системі захисту памʼяті, яка краще узгоджує механізми керування ядра з запитами та обмеженнями Podʼів, зменшуючи взаємні перешкоди та перевантаження (thrashing) для робочих навантажень, що використовують один і той самий вузол. У цій версії також вдосконалено спосіб, у який kubelet програмує параметри memory.high та memory.min, додано метрики та захисні механізми для запобігання активним блокуванням (livelock), а також запроваджено параметри конфігурації, що дозволяють операторам кластерів налаштовувати поведінку системи захисту памʼяті відповідно до своїх середовищ.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/2570&#34;&gt;KEP #2570&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-alpha&#34;&gt;Нові функції в альфа-версії&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;p&gt;Цей розділ містить вибір деяких покращень, які тепер знаходяться в альфа-версії після випуску v1.36.&lt;/p&gt;
&lt;h3 id=&#34;hpa-scale-to-zero-for-custom-metrics&#34;&gt;Масштабування HPA до нуля для власних метрик&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#hpa-scale-to-zero-for-custom-metrics&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Дотепер HorizontalPodAutoscaler (HPA) вимагав, щоб принаймні одна репліка залишалася активною, оскільки він міг розраховувати потреби в масштабуванні лише на основі метрик (таких як CPU або памʼять) від запущених Podʼів. Kubernetes v1.36 продовжує розвиток функції &lt;em&gt;HPA scale to zero&lt;/em&gt; (типово вимкнена) в альфа-версії, дозволяючи робочим навантаженням масштабуватися до нуля реплік саме при використанні метрик Object або External.&lt;/p&gt;
&lt;p&gt;Тепер користувачі можуть експериментувати зі значним зменшенням витрат на інфраструктуру, повністю зупиняючи важкі робочі навантаження, коли немає завдань в очікуванні. Хоча функція залишається за функціональною можливістю &lt;code&gt;HPAScaleToZero&lt;/code&gt;, вона дозволяє HPA залишатися активним навіть при нульовій кількості запущених Podʼів, автоматично масштабуючи розгортання назад, як тільки зовнішня метрика (наприклад, довжина черги) вказує на появу нових завдань.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/2021&#34;&gt;KEP #2021&lt;/a&gt; під керівництвом SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;dra-features-in-alpha&#34;&gt;Функції DRA в альфа-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-features-in-alpha&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Історично фреймворк динамічного виділення ресурсів (DRA) не мав безшовної інтеграції з високорівневими контролерами та забезпечував обмежену видимість метаданих пристроїв або їх доступності. Kubernetes v1.36 представляє хвилю удосконалень DRA в альфа-версії, включаючи нативну підтримку ResourceClaim для робочих навантажень та нативні ресурси DRA, що надають гнучкість DRA для управління CPU.&lt;/p&gt;
&lt;p&gt;Зараз користувачі можуть використовувати &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/downward-api/&#34;&gt;downward API&lt;/a&gt; для надання складних атрибутів ресурсів безпосередньо контейнерам та отримувати переваги від покращеної видимості доступності ресурсів для більш передбачуваного планування. Ці оновлення, у поєднанні з підтримкою типів списків у атрибутах пристроїв, перетворюють DRA з низькорівневого примітиву на потужну систему, здатну обробляти складні мережеві та обчислювальні вимоги сучасних стеків штучного інтелекту та високопродуктивних обчислень (HPC).&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках кількох KEP (включаючи &lt;a href=&#34;https://kep.k8s.io/5729&#34;&gt;#5729&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5304&#34;&gt;#5304&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5517&#34;&gt;#5517&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5677&#34;&gt;#5677&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/5491&#34;&gt;#5491&lt;/a&gt;) під керівництвом SIG Scheduling та SIG Node.&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 v1.36 з введенням нативної підтримки гістограм в альфа-версії. У той час як класичні гістограми Prometheus покладалися на статичні, заздалегідь визначені кошики, що часто вимагало компромісу між точністю даних та використанням памʼяті, це оновлення дозволяє панелі управління експортувати розріджені гістограми, які динамічно регулюють свою роздільну здатність на основі даних у реальному часі.&lt;/p&gt;
&lt;p&gt;Тепер оператори кластерів можуть отримувати точні розподіли затримок для kube-apiserver та інших основних компонентів без додаткових витрат на ручне керування кошиками. Ця архітектурна зміна забезпечує більш надійні SLI та SLO, надаючи високоточні теплові мапи, які залишаються точними навіть під час найнепередбачуваніших піків навантаження.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5808&#34;&gt;KEP #5808&lt;/a&gt; під керівництвом SIG Instrumentation.&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 v1.36 з введенням конфігурації &lt;em&gt;контролю допуску на основі маніфестів&lt;/em&gt; в альфа-версії. Ця зміна вирішує давню проблему налаштування втулків допуску через різні прапорці командного рядка або окремі, складні файли конфігурації, дозволяючи адміністраторам визначати бажаний стан контролю допуску безпосередньо через структурований маніфест.&lt;/p&gt;
&lt;p&gt;Тепер оператори кластерів можуть керувати налаштуваннями втулків допуску за допомогою тих самих версіонованих, декларативних робочих процесів, що використовуються для інших обʼєктів Kubernetes, значно зменшуючи ризик відхилення конфігурації та ручних помилок під час оновлень кластера. Централізуючи ці конфігурації в єдиний маніфест, kube-apiserver стає легшим для аудиту та автоматизації, прокладаючи шлях до більш безпечних та відтворюваних розгортань кластера.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5793&#34;&gt;KEP #5793&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;cri-list-streaming&#34;&gt;Потокова передача списків CRI&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cri-list-streaming&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;З введенням &lt;em&gt;потокової передачі списків CRI&lt;/em&gt; в альфа-версії Kubernetes v1.36 використовує нові внутрішні операції потокової передачі. Це удосконалення вирішує проблему тиску на памʼять та піків затримки, які часто спостерігаються на вузлах великого масштабу, замінюючи традиційні, монолітні запити &lt;code&gt;List&lt;/code&gt; між kubelet та середовищем виконання контейнерів на більш ефективний серверний потоковий RPC.&lt;/p&gt;
&lt;p&gt;Тепер, замість очікування на одну велику відповідь, що містить усі дані про контейнери або образи, kubelet може обробляти результати поступово, у міру їх надходження. Цей підхід значно зменшує пікове використання памʼяті kubelet і покращує відгук на вузлах з високою щільністю, забезпечуючи плавне управління кластером навіть при зростанні кількості контейнерів на вузол.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5825&#34;&gt;KEP #5825&lt;/a&gt; під керівництвом SIG Node.&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;ingress-nginx-retirement&#34;&gt;Виведення з експлуатації Ingress NGINX&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ingress-nginx-retirement&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб забезпечити безпеку та надійність екосистеми, Kubernetes SIG Network та Комітет з реагування на загрози безпеці вивели з експлуатації Ingress NGINX 24 березня 2026 року. З цієї дати не було випущено жодних нових версій, виправлень помилок або оновлень для усунення виявлених вразливостей безпеки. Наявні розгортання Ingress NGINX продовжуватимуть працювати, а артефакти встановлення, такі як Helm charts та образи контейнерів, залишатимуться доступними.&lt;/p&gt;
&lt;p&gt;За повними деталями звертайтесь до &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/11/11/ingress-nginx-retirement/&#34;&gt;офіційного повідомлення про виведення Ingress NGINX з експлуатації&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;volume-selinux-labelling&#34;&gt;Швидше позначення мітками SELinux для томів (GA)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#volume-selinux-labelling&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.36 робить покращення монтування томів SELinux загальнодоступним. Ця зміна замінила рекурсивне переназначення міток файлів на опцію &lt;code&gt;mount -o context=XYZ&lt;/code&gt;, застосовуючи правильну мітку SELinux до всього тому під час монтування. Це забезпечує більш стабільну продуктивність і зменшує затримки запуску Podʼів на системах з увімкненим SELinux.&lt;/p&gt;
&lt;p&gt;Ця функція була впроваджена як бета у v1.28 для томів &lt;code&gt;ReadWriteOncePod&lt;/code&gt;. У v1.32 вона отримала метрики та опцію відмови (&lt;code&gt;securityContext.seLinuxChangePolicy: Recursive&lt;/code&gt;) для допомоги у виявленні конфліктів. Тепер у v1.36 вона досягає стабільного стану і типово застосовується до всіх томів, а Podʼи або CSIDrivers вмикають її через &lt;code&gt;spec.seLinuxMount&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Однак ми очікуємо, що ця функція може створити ризик виникнення змін, що порушують сумісність, у майбутніх випусках Kubernetes, потенційно через спільне використання одного тому між привілейованими та непривілейованими Podʼами на одному вузлі.&lt;/p&gt;
&lt;p&gt;Розробники несуть відповідальність за налаштування поля &lt;code&gt;seLinuxChangePolicy&lt;/code&gt; та міток томів SELinux на Podʼах. Незалежно від того, чи вони створюють Deployment, StatefulSet, DaemonSet або навіть власний ресурс, що включає шаблон Podʼа, недбалість у цих налаштуваннях може призвести до різних проблем, таких як неправильний запуск Podʼів при спільному використанні тому.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.36 є ідеальним випуском для аудиту ваших кластерів. Щоб дізнатися більше, перегляньте допис у блозі &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2026/04/22/breaking-changes-in-selinux-volume-labeling/&#34;&gt;SELinux Volume Label Changes goes GA (and likely implications in v1.37)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Для отримання додаткової інформації про це удосконалення звертайтесь до &lt;a href=&#34;https://kep.k8s.io/1710&#34;&gt;KEP-1710: Speed up recursive SELinux label change&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-v1-36&#34;&gt;Переходи, застарівання та вилучення у v1.36&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#graduations-deprecations-and-removals-in-v1-36&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Переходи до стабільного стану&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;Цей розділ містить усі функції, які перейшли до стабільного стану (також відомого як загальна доступність). Для повного списку оновлень, включаючи нові функції та переходи з альфа-версії до бета-версії, дивіться примітки до випуску.&lt;/p&gt;
&lt;p&gt;У цьому випуску всього 18 удосконалень, які були переведені до стабільного стану:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;Support User Namespaces in pods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/740&#34;&gt;API for external signing of Service Account tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/1710&#34;&gt;Speed up recursive SELinux label change&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/2589&#34;&gt;Portworx file in-tree to CSI driver migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/2862&#34;&gt;Fine grained Kubelet API authorization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3962&#34;&gt;Mutating Admission Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/2258&#34;&gt;Node log query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3476&#34;&gt;VolumeGroupSnapshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;Mutable CSINode Allocatable Property&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4816&#34;&gt;DRA: Prioritized Alternatives in Device Requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4205&#34;&gt;Support PSI based on cgroupv2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4265&#34;&gt;add ProcMount option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3695&#34;&gt;DRA: Extend PodResources to include resources from Dynamic Resource Allocation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4639&#34;&gt;VolumeSource: OCI Artifact and/or Image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5109&#34;&gt;Split L3 Cache Topology Awareness in CPU Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5018&#34;&gt;DRA: AdminAccess for ResourceClaims and ResourceClaimTemplates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5589&#34;&gt;Remove gogo protobuf dependency for Kubernetes API types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5538&#34;&gt;CSI driver opt-in for service account tokens via secrets field&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 функції можуть ставати застарілими, вилучатися або замінюватися кращими для покращення загального стану проєкту. Докладніше про цей процес дивіться в політиці Kubernetes щодо застарівання та вилучення. Kubernetes v1.36 включає кілька застарівань.&lt;/p&gt;
&lt;h3 id=&#34;deprecate-service-spec-externalips&#34;&gt;Застарівання поля Service .spec.externalIPs&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecate-service-spec-externalips&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;З цим випуском поле &lt;code&gt;externalIPs&lt;/code&gt; у Service &lt;code&gt;spec&lt;/code&gt; визнано застарілим. Це означає, що функціональність існує, але більше не буде працювати в &lt;strong&gt;майбутній&lt;/strong&gt; версії Kubernetes. Вам слід планувати міграцію, якщо ви наразі покладаєтеся на це поле. Це поле було відомою проблемою безпеки протягом багатьох років, дозволяючи атаки типу «людина посередині» на трафік вашого кластера, як це задокументовано в &lt;a href=&#34;https://github.com/kubernetes/kubernetes/issues/97076&#34;&gt;CVE-2020-8554&lt;/a&gt;. Починаючи з Kubernetes v1.36, ви будете бачити попередження про застарівання при його використанні, а повне вилучення заплановано на v1.43.&lt;/p&gt;
&lt;p&gt;Якщо ваші Service все ще покладаються на &lt;code&gt;externalIPs&lt;/code&gt;, розгляньте можливість використання Service типу LoadBalancer для керованого хмарою ingress, NodePort для простого відкриття портів або &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API&lt;/a&gt; для більш гнучкого та безпечного способу обробки зовнішнього трафіку.&lt;/p&gt;
&lt;p&gt;Для отримання додаткової інформації про це поле та його застарівання зверніться до розділу &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/service/#external-ips&#34;&gt;Зовнішні IP&lt;/a&gt; або прочитайте &lt;a href=&#34;https://kep.k8s.io/5707&#34;&gt;KEP-5707: Deprecate service.spec.externalIPs&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;remove-gitrepo-volume-driver&#34;&gt;Вилучення драйвера томів &lt;code&gt;gitRepo&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#remove-gitrepo-volume-driver&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Тип томів &lt;code&gt;gitRepo&lt;/code&gt; був визнаний застарілим з версії v1.11. У Kubernetes v1.36 втулок томів &lt;code&gt;gitRepo&lt;/code&gt; назавжди вимкнено і його не можна знову увімкнути. Ця зміна захищає кластери від критичної проблеми безпеки, коли використання &lt;code&gt;gitRepo&lt;/code&gt; могло дозволити зловмиснику виконувати код від імені root на вузлі.&lt;/p&gt;
&lt;p&gt;Хоча &lt;code&gt;gitRepo&lt;/code&gt; був застарілим протягом багатьох років і рекомендувалися кращі альтернативи, його все ще технічно можна було використовувати в попередніх випусках. Починаючи з v1.36, цей шлях закрито назавжди, тому будь-які наявні робочі навантаження, що залежать від &lt;code&gt;gitRepo&lt;/code&gt;, треба мігрувати на підтримувані підходи, такі як контейнери ініціалізації або зовнішні інструменти типу &lt;code&gt;git-sync&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Для отримання додаткової інформації про це вилучення зверніться до &lt;a href=&#34;https://kep.k8s.io/5040&#34;&gt;KEP-5040: Remove gitRepo volume driver&lt;/a&gt;&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Перегляньте повні деталі випуску Kubernetes v1.36 у наших &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.36.md&#34;&gt;примітках до випуску&lt;/a&gt;.&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Kubernetes v1.36 доступний для завантаження на &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.36.0&#34;&gt;GitHub&lt;/a&gt; або на &lt;a href=&#34;https://kubernetes.io/releases/download/&#34;&gt;сторінці завантаження Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щоб почати роботу з Kubernetes, ознайомтеся з &lt;a href=&#34;https://kubernetes.io/docs/tutorials/&#34;&gt;цими навчальними посібниками&lt;/a&gt; або запустіть локальні кластери Kubernetes за допомогою &lt;a href=&#34;https://minikube.sigs.k8s.io/&#34;&gt;minikube&lt;/a&gt;. Ви також можете легко &lt;a href=&#34;https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/&#34;&gt;встановити v1.36 за допомогою kubeadm&lt;/a&gt;.&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;Kubernetes можливий лише завдяки підтримці, відданості та наполегливій праці його спільноти. Кожна команда випуску складається з відданих волонтерів спільноти, які працюють разом, щоб створити численні компоненти, що складають випуски Kubernetes, на які ви покладаєтеся. Це вимагає спеціалізованих навичок людей з усіх куточків нашої спільноти, від самого коду до його документації та управління проєктом.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати всій &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.36/release-team.md&#34;&gt;команді випуску&lt;/a&gt; за години наполегливої праці, щоб представити випуск Kubernetes v1.36 нашій спільноті. Склад команди випуску варіюється від новачків-стажерів (shadows) до досвідчених керівників команд, які повертаються з досвідом, здобутим за кілька циклів випуску. Особлива подяка нашому керівнику випуску, Ryota Sawada, за керівництво успішним циклом випуску, за його практичний підхід до вирішення проблем і за енергію та турботу, які рухають нашу спільноту вперед.&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Проєкт CNCF K8s &lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;var-period=m&amp;var-repogroup_name=All&#34;&gt;DevStats&lt;/a&gt; обʼєднує низку цікавих даних, повʼязаних зі швидкістю розвитку Kubernetes та різних підпроєктів. Сюди входить все, від індивідуальних внесків до кількості компаній, які роблять внески, і це ілюструє глибину та широту зусиль, що докладаються для розвитку цієї екосистеми.&lt;/p&gt;
&lt;p&gt;Під час циклу випуску v1.36, який тривав 15 тижнів з 12 січня 2026 року по 22 квітня 2026 року, Kubernetes отримав внески від 106 різних компаній та 491 окремого учасника. У ширшій екосистемі хмарних технологій ця цифра зростає до 370 компаній, а загальна кількість учасників становить 2235.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що «внесок» враховується, коли хтось робить коміт, рецензує код, коментує, створює тікет або PR, рецензує PR (включаючи блоги та документацію) або коментує тікети та PR. Якщо ви зацікавлені у співпраці, відвідайте розділ &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/#getting-started&#34;&gt;Початок роботи&lt;/a&gt; на нашому вебсайті для учасників.&lt;/p&gt;
&lt;p&gt;Джерела цих даних:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;from=1747609200000&amp;to=1756335599000&amp;var-period=d28&amp;var-repogroup_name=Kubernetes&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Компанії, що роблять внесок у Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;from=1747609200000&amp;to=1756335599000&amp;var-period=d28&amp;var-repogroup_name=All&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Загальні внески в екосистему&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;events-update&#34;&gt;Оновлення подій&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#events-update&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Дізнайтеся про майбутні події, присвячені Kubernetes та хмарним технологіям, зокрема KubeCon + CloudNativeCon, KCD та інші важливі конференції по всьому світу. Будьте в курсі подій та долучайтеся до спільноти Kubernetes!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Квітень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-guadalajara-presents-kcd-guadalajara-2026/cohost-kcd-guadalajara/&#34;&gt;Kubernetes Community Days: Guadalajara&lt;/a&gt;: 18 квітня 2026 | Гвадалахара, Мексика&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Травень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-toronto-presents-kcd-toronto-2026/&#34;&gt;Kubernetes Community Days: Toronto&lt;/a&gt;: 13 травня 2026 | Торонто, Канада&lt;/li&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-texas-presents-kcd-texas-2026/cohost-kcd-texas/&#34;&gt;Kubernetes Community Days: Texas&lt;/a&gt;: 15 травня 2026 | Остін, США&lt;/li&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-istanbul-presents-kcd-istanbul-2026/&#34;&gt;Kubernetes Community Days: Istanbul&lt;/a&gt;: 15 травня 2026 | Стамбул, Туреччина&lt;/li&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-helsinki-presents-kubernetes-community-days-helsinki-2026/&#34;&gt;Kubernetes Community Days: Helsinki&lt;/a&gt;: 20 травня 2026 | Гельсінкі, Фінляндія&lt;/li&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-czech-slovak-presents-kcd-czech-amp-slovak-prague-2026/&#34;&gt;Kubernetes Community Days: Czech &amp;amp; Slovak&lt;/a&gt;: 21 травня 2026 | Прага, Чехія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Червень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-new-york-presents-kcd-new-york-2026/&#34;&gt;Kubernetes Community Days: New York&lt;/a&gt;: 10 червня 2026 | Нью-Йорк, США&lt;/li&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-kuala-lumpur-2026-presents-kcd-kuala-lumpur-2026/&#34;&gt;Kubernetes Community Days: Kuala Lumpur&lt;/a&gt;: 27 червня 2026 | Куала-Лумпур, Малайзія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-india/&#34;&gt;KubeCon + CloudNativeCon India 2026: 18-19 червня 2026&lt;/a&gt; | Мумбаї, Індія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Липень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-japan/&#34;&gt;KubeCon + CloudNativeCon Japan 2026: 29-30 липня 2026&lt;/a&gt; | Йокогама, Японія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Вересень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community2.cncf.io/events/details/cncf-kcd-sf-bay-area-presents-kcd-san-francisco-bay-area-2026/&#34;&gt;Kubernetes Community Days: San Francisco Bay Area&lt;/a&gt;: 1 вересня 2026 | Маунтін-Вʼю, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.lfopensource.cn/kubecon-cloudnativecon-openinfra-summit-pytorch-conference-china/&#34;&gt;KubeCon + CloudNativeCon China 2026: 8-9 вересня 2026&lt;/a&gt; | Шанхай, Китай&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Жовтень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-uk-presents-kubernetes-community-days-uk-edinburgh-2026/&#34;&gt;Kubernetes Community Days: UK: 19 жовтня 2026&lt;/a&gt; | Едінбург, Велика Британія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Листопад 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KCD — &lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-porto-presents-kcd-porto-2026-collab-with-devops-days-portugal/&#34;&gt;Kubernetes Community Days: Porto&lt;/a&gt;: 19 листопада 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 2026&lt;/a&gt;: 9-12 листопада 2026 | Солт-Лейк-Сіті, США&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Найсвіжіші відомості про події можна знайти &lt;a href=&#34;https://community.cncf.io/events/#/list&#34;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;upcoming-release-webinar&#34;&gt;Вебінар, присвячений новому випуску&lt;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;/h2&gt;&lt;p&gt;Приєднуйтесь до членів команди випуску Kubernetes v1.36 у &lt;strong&gt;середу, 20 травня 2026 року о 16:00 (UTC)&lt;/strong&gt;, щоб дізнатися про основні моменти цього випуску. Для отримання додаткової інформації та реєстрації відвідайте &lt;a href=&#34;https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cloud-native-live-kubernetes-v136-release/&#34;&gt;сторінку події&lt;/a&gt; на сайті CNCF Online Programs.&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;Груп спеціальних інтересів&lt;/a&gt; (SIG), які відповідають вашим інтересам. Маєте щось, що хочете донести до спільноти Kubernetes? Поділіться своїми ідеями на нашій щотижневій &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зустрічі спільноти&lt;/a&gt; та через наведені нижче канали. Дякуємо за вашу постійну підтримку та відгуки.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами в Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@kubernetes.io&lt;/a&gt; для останніх оновлень&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до обговорення спільноти на &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до спільноти в &lt;a href=&#34;https://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Задавайте питання (або відповідайте на питання) на &lt;a href=&#34;https://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Читайте більше про те, що відбувається з Kubernetes, у &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Забезпечення безпечного налагодження в Kubernetes</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/03/18/securing-production-debugging-in-kubernetes/</link>
      <pubDate>Wed, 18 Mar 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/03/18/securing-production-debugging-in-kubernetes/</guid>
      <description>
        
        
        &lt;p&gt;Під час налагодження в промисловому середовищі найшвидший шлях часто передбачає широкий доступ, такий як &lt;code&gt;cluster-admin&lt;/code&gt; (ClusterRole, що надає доступ рівня адміністратора), спільні bastions/jump boxes або довготривалі SSH-ключі. Це працює в моменті, але має дві поширені проблеми: аудит стає складним, а тимчасові винятки мають тенденцію ставати звичними.&lt;/p&gt;
&lt;p&gt;Цей допис пропонує рекомендації, які можна застосувати до поточних середовищ Kubernetes з мінімальними змінами інструментів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Мінімальні привілеї з RBAC&lt;/li&gt;
&lt;li&gt;Короткострокові облікові дані, привʼязані до ідентичності&lt;/li&gt;
&lt;li&gt;Модель рукостискання в стилі SSH для хмарно-орієнтованого налагодження&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Хороша архітектура для забезпечення безпечного налагодження в промислових середовищах полягає у використанні шлюзу SSH за принципом &amp;quot;just-in-time&amp;quot; (часто розгортається як Pod на вимогу в кластері). Він діє як SSH-подібні &amp;quot;парадні двері&amp;quot;, що робить тимчасовий доступ дійсно тимчасовим. Ви можете автентифікуватися за допомогою короткострокових облікових даних, привʼязаних до ідентичності, встановити сеанс до шлюзу, а шлюз використовує API Kubernetes та RBAC для контролю того, що вони можуть робити, наприклад &lt;code&gt;pods/log&lt;/code&gt;, &lt;code&gt;pods/exec&lt;/code&gt; та &lt;code&gt;pods/portforward&lt;/code&gt;. Сеанси автоматично закінчуються, а логи шлюзу та логи аудиту Kubernetes фіксують, хто отримав доступ до чого і коли, без облікових записів bastion для спільного використання або довготривалих ключів.&lt;/p&gt;
&lt;h2 id=&#34;1-using-an-access-broker-on-top-of-kubernetes-rbac&#34;&gt;1) Використання брокера доступу поверх RBAC Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#1-using-an-access-broker-on-top-of-kubernetes-rbac&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;RBAC контролює, хто і що може робити в Kubernetes. Багато середовищ Kubernetes покладаються в основному на RBAC для авторизації, хоча Kubernetes також підтримує інші режими авторизації, такі як авторизація через Webhook. Ви можете забезпечити доступ безпосередньо за допомогою Kubernetes RBAC або розмістити брокера доступу перед кластером, який все ще покладається на дозволи Kubernetes під капотом. У будь-якій моделі Kubernetes RBAC залишається джерелом істини щодо того, що дозволяє API Kubernetes і в якому обсязі.&lt;/p&gt;
&lt;p&gt;Брокер доступу додає елементи керування, які RBAC покриває погано. Наприклад, він може вирішувати, чи запит автоматично схвалюється або потребує ручного схвалення, чи може користувач виконувати команду, і які команди дозволені в сеансі. Він також може керувати членством у групах, щоб ви надавали дозволи групам замість окремих користувачів. Kubernetes RBAC може дозволяти дії, такі як pods/exec, але не може обмежити, які команди виконуються всередині сеансу exec.&lt;/p&gt;
&lt;p&gt;З цією моделлю Kubernetes RBAC визначає дозволені дії для користувача або групи (наприклад, чергової команди в одному просторі імен). Рекомендується визначати правила доступу лише для груп або ServiceAccount — ніколи для окремих користувачів. Брокер або постачальник ідентичності потім додає або видаляє користувачів з цієї групи за потреби.&lt;/p&gt;
&lt;p&gt;Брокер також може застосовувати додаткову політику, наприклад, які команди дозволені в інтерактивному сеансі та які запити можуть бути автоматично схвалені або потребують ручного схвалення. Ця політика може зберігатися у файлі JSON або XML і підтримуватися через рецензування коду, тому оновлення проходять через формальний pull request і рецензуються так само, як будь-які інші зміни в промисловому середовищі.&lt;/p&gt;
&lt;h3 id=&#34;example-a-namespaced-on-call-debug-role&#34;&gt;Приклад: роль налагодження для чергового в межах простору імен&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-a-namespaced-on-call-debug-role&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&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;rbac.authorization.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;Role&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;oncall-debug&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;&amp;lt;namespace&amp;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;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;apiGroups&lt;/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;&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pods&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 class=&#34;s2&#34;&gt;&amp;#34;events&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;verbs&lt;/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;get&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 class=&#34;s2&#34;&gt;&amp;#34;list&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 class=&#34;s2&#34;&gt;&amp;#34;watch&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&gt;&lt;/span&gt;&lt;span class=&#34;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;apiGroups&lt;/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;&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pods/log&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;verbs&lt;/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;get&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&gt;&lt;/span&gt;&lt;span class=&#34;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;apiGroups&lt;/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;&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pods/exec&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 class=&#34;s2&#34;&gt;&amp;#34;pods/portforward&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;verbs&lt;/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;create&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&gt;&lt;/span&gt;&lt;span class=&#34;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;apiGroups&lt;/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;apps&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;deployments&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 class=&#34;s2&#34;&gt;&amp;#34;replicasets&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;verbs&lt;/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;get&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 class=&#34;s2&#34;&gt;&amp;#34;list&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 class=&#34;s2&#34;&gt;&amp;#34;watch&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&gt;&lt;/span&gt;&lt;span class=&#34;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;# Необовʼязково: дозволити ефемерні контейнери для kubectl debug&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;apiGroups&lt;/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;&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pods/ephemeralcontainers&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;verbs&lt;/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;update&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;/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;rbac.authorization.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;RoleBinding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;oncall-debug&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;&amp;lt;namespace&amp;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;subjects&lt;/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;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;Group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;oncall-&amp;lt;team-name&amp;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;apiGroup&lt;/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;rbac.authorization.k8s.io&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;roleRef&lt;/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;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;Role&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;oncall-debug&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiGroup&lt;/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;rbac.authorization.k8s.io&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;2-short-lived-identity-bound-credentials&#34;&gt;2) Короткострокові облікові дані, привʼязані до особи&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#2-short-lived-identity-bound-credentials&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Мета полягає в тому, щоб використовувати короткострокові облікові дані, привʼязані до особи, які чітко повʼязують сеанс з реальною людиною та швидко закінчуються. Ці облікові дані можуть включати ідентичність користувача та обсяг того, що йому дозволено робити. Вони зазвичай підписуються за допомогою приватного ключа, який залишається у інженера, наприклад, апаратно захищеного ключа (наприклад, YubiKey), тому їх не можна підробити без доступу до цього ключа.&lt;/p&gt;
&lt;p&gt;Ви можете реалізувати це за допомогою автентифікації, вбудованої в Kubernetes (наприклад, клієнтські сертифікати або потік на основі OIDC), або дозволити брокеру доступу з попереднього розділу видавати короткострокові облікові дані від імені користувача. У багатьох налаштуваннях Kubernetes все ще використовує RBAC для застосування дозволів на основі автентифікованої особи та груп/тверджень. Якщо ви використовуєте брокера доступу, він також може кодувати додаткові обмеження обсягу в облікових даних і застосовувати їх під час сеансу, наприклад, до якого кластера або простору імен застосовується сеанс і які дії (або затверджені команди) дозволені для Podʼів або вузлів. У будь-якому випадку облікові дані повинні бути підписані сертифікаційним центром (CA), і цей CA слід регулярно оновлювати (наприклад, щоквартально), щоб обмежити довгострокові ризики.&lt;/p&gt;
&lt;h3 id=&#34;option-a-short-lived-oidc-tokens&#34;&gt;Варіант A: короткострокові токени OIDC&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#option-a-short-lived-oidc-tokens&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Багато керованих кластерів Kubernetes вже надають короткострокові токени. Головне — переконатися, що ваш kubeconfig автоматично оновлює їх замість того, щоб копіювати довгостроковий токен у файл.&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;users&lt;/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;oncall&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;user&lt;/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;exec&lt;/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;client.authentication.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;command&lt;/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;cred-helper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;args&lt;/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;--cluster=prod&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 class=&#34;s2&#34;&gt;&amp;#34;--ttl=30m&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;option-b-short-lived-client-certificates-x-509&#34;&gt;Варіант B: короткострокові клієнтські сертифікати (X.509)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#option-b-short-lived-client-certificates-x-509&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Якщо ваш API-сервер (або брокер доступу з попереднього розділу) налаштований на довіру до клієнтського CA, ви можете використовувати короткострокові клієнтські сертифікати для доступу до відлагодження. Ідея така:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Приватний ключ створюється і зберігається на машині інженера (бажано з апаратною підтримкою, наприклад, ключ, який неможливо експортувати, у YubiKey/PIV токені)&lt;/li&gt;
&lt;li&gt;Видається короткостроковий сертифікат (часто через API &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/certificate-signing-requests/#certificate-signing-requests&#34;&gt;CertificateSigningRequest&lt;/a&gt; або вашого брокера доступу з попереднього розділу, з TTL).&lt;/li&gt;
&lt;li&gt;RBAC зіставляє автентифіковану особу з мінімальною роллю&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це просто реалізувати за допомогою API Kubernetes CertificateSigningRequest.&lt;/p&gt;
&lt;p&gt;Згенеруйте ключ і CSR локально:&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;&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;c1&#34;&gt;# OpenSSL та кілька подібних інструментів підтримують це.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;openssl genpkey -algorithm Ed25519 -out oncall.key
&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;openssl req -new -key oncall.key -out oncall.csr &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  -subj &lt;span class=&#34;s2&#34;&gt;&amp;#34;/CN=user/O=oncall-payments&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Створіть CertificateSigningRequest з коротким терміном дії:&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;certificates.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;CertificateSigningRequest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;oncall-&amp;lt;user&amp;gt;-20260218&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;request&lt;/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;base64-encoded oncall.csr&amp;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;signerName&lt;/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;kubernetes.io/kube-apiserver-client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;1800&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 30 minutes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;usages&lt;/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;l&#34;&gt;client auth&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;Після того як CSR буде затверджено та підписано, ви можете витягти виданий сертифікат і використовувати його разом із приватним ключем для автентифікації, наприклад через kubectl.&lt;/p&gt;
&lt;h2 id=&#34;3-use-a-just-in-time-access-gateway-to-run-debugging-commands&#34;&gt;3) Використання шлюзу доступу &amp;quot;just-in-time&amp;quot; для виконання команд відлагодження&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#3-use-a-just-in-time-access-gateway-to-run-debugging-commands&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Після отримання короткострокових облікових даних ви можете використовувати їх для відкриття сеансу безпечного доступу до шлюзу доступу &amp;quot;just-in-time&amp;quot;, часто доступного через SSH і створюваного за потреби. Якщо шлюз доступу доступний через SSH, поширеним підходом є видача інженеру короткострокового сертифіката користувача OpenSSH для сеансу. Шлюз довіряє вашому SSH CA, автентифікує інженера під час підключення, а потім застосовує затверджену політику сеансу перед виконанням викликів API Kubernetes від імені користувача. Сертифікати OpenSSH відокремлені від клієнтських сертифікатів Kubernetes X.509, тому зазвичай вони розглядаються як окремі рівні.&lt;/p&gt;
&lt;p&gt;Отриманий сеанс також повинен бути обмежений, щоб його не можна було повторно використовувати поза затвердженою областю дії. Наприклад, шлюз або брокер можуть обмежити його до конкретного кластера та простору імен, а за бажанням до більш вузької цілі, такої як Pod або вузол. Таким чином, навіть якщо хтось спробує повторно використати доступ, він не працюватиме поза призначеною областю дії. Після встановлення сеансу шлюз виконує лише дозволені дії та записує, що сталося для аудиту.&lt;/p&gt;
&lt;h3 id=&#34;example-namespace-scoped-role-bindings&#34;&gt;Приклад: Привʼязки ролей у межах простору імен&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-namespace-scoped-role-bindings&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&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;rbac.authorization.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;Role&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit-debug&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;&amp;lt;namespace&amp;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;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;kubernetes.io/description&lt;/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;&amp;gt;&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      Colleagues performing semi-privileged debugging, with access provided
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      just in time and on demand.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;apiGroups&lt;/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;&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pods&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 class=&#34;s2&#34;&gt;&amp;#34;pods/log&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;verbs&lt;/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;get&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 class=&#34;s2&#34;&gt;&amp;#34;list&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 class=&#34;s2&#34;&gt;&amp;#34;watch&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;apiGroups&lt;/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;&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pods/exec&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;verbs&lt;/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;create&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;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;rbac.authorization.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;RoleBinding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit-debug&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;&amp;lt;namespace&amp;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;subjects&lt;/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;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;Group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit:oncall:&amp;lt;namespace&amp;gt;  &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# зіставлено з короткостроковим обліковим записом (сертифікат/OIDC)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiGroup&lt;/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;rbac.authorization.k8s.io&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;roleRef&lt;/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;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;Role&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit-debug&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiGroup&lt;/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;rbac.authorization.k8s.io&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;Ці обʼєкти RBAC та правила, які вони визначають, дозволяють відлагодження лише в межах зазначеного простору імен; спроби доступу до інших просторів імен не дозволяються.&lt;/p&gt;
&lt;h3 id=&#34;example-cluster-scoped-role-binding&#34;&gt;Приклад: Привʼязки ролей у межах кластера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-cluster-scoped-role-binding&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&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;rbac.authorization.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;ClusterRole&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit-cluster-read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;apiGroups&lt;/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;&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;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 class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;nodes&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 class=&#34;s2&#34;&gt;&amp;#34;namespaces&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;verbs&lt;/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;get&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 class=&#34;s2&#34;&gt;&amp;#34;list&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 class=&#34;s2&#34;&gt;&amp;#34;watch&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;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;rbac.authorization.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;ClusterRoleBinding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit-cluster-read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;subjects&lt;/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;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;Group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit:oncall:cluster&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiGroup&lt;/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;rbac.authorization.k8s.io&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;roleRef&lt;/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;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;ClusterRole&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;jit-cluster-read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;apiGroup&lt;/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;rbac.authorization.k8s.io&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;Ці правила RBAC надають доступ для читання в межах усього кластера (наприклад, до вузлів і просторів імен) і повинні використовуватися лише для робочих процесів, які дійсно потребують ресурсів, обмежених кластером.&lt;/p&gt;
&lt;p&gt;Більш детальні обмеження, такі як «тільки цей Pod/вузол» або «тільки ці команди», зазвичай застосовуються шлюзом/брокером доступу під час сеансу, але Kubernetes також пропонує інші варіанти, такі як ValidatingAdmissionPolicy для обмеження записів і webhook authorization для власної авторизації за діями.&lt;/p&gt;
&lt;p&gt;У середовищах з більш жорсткими правилами доступу можна додати додатковий, тимчасовий шар посередництва, щоб відокремити встановлення сеансу від виконання привілейованих дій. Обидва шари є тимчасовими, використовують облікові дані, привʼязані до ідентичності, та генерують незалежні логи аудиту. Шар посередництва обробляє встановлення/передачу сеансу, а шар виконання виконує лише дозволені Kubernetes дії за RBAC. Це розділення може зменшити ризики, звузивши відповідальність, визначаючи область для облікових даних на кожному кроці та забезпечуючи завершення сеансу.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;Посилання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#references&#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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/reference/access-authn-authz/authorization/&#34;&gt;Авторизація&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/rbac/&#34;&gt;Використання RBAC авторизації&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/authentication/&#34;&gt;Автентифікація&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/access-authn-authz/certificate-signing-requests/&#34;&gt;Сертифікати та запити на підпис сертифікатів&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/tls/certificate-issue-client-csr/&#34;&gt;Випуск сертифіката для клієнта API Kubernetes за допомогою CertificateSigningRequest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/security/rbac-good-practices/&#34;&gt;Поради щодо контролю доступу на основі ролей&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Відмова від відповідальності: Думки, висловлені в цьому дописі, належать виключно автору і не відображають погляди роботодавця автора або будь-якої іншої організації.&lt;/em&gt;&lt;/p&gt;

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

      </description>
    </item>
    
    <item>
      <title>Представляємо контролер готовності вузлів</title>
      <link>https://deploy-preview-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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>Уніфікований доступ до API-сервера за допомогою clientcmd</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/19/clientcmd-apiserver-access/</link>
      <pubDate>Mon, 19 Jan 2026 10:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2026/01/19/clientcmd-apiserver-access/</guid>
      <description>
        
        
        &lt;p&gt;Якщо ви коли-небудь хотіли створювати консольного клієнта для API Kubernetes, особливо якщо ви розглядали можливість використання вашого клієнта як втулка &lt;code&gt;kubectl&lt;/code&gt;, ви, можливо, замислювалися над тим, як зробити вашого клієнта звичним для користувачів &lt;code&gt;kubectl&lt;/code&gt;. Швидкий погляд на вихідні дані &lt;code&gt;kubectl options&lt;/code&gt; може вас збентежити: «Невже я повинен реалізувати всі ці опції?»&lt;/p&gt;
&lt;p&gt;Не бійтеся, інші вже зробили за вас велику частину роботи. Насправді проєкт Kubernetes надає дві бібліотеки, які допоможуть вам обробляти аргументи командного рядка в стилі &lt;code&gt;kubectl&lt;/code&gt; у програмах Go: &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd&#34;&gt;&lt;code&gt;clientcmd&lt;/code&gt;&lt;/a&gt; та &lt;a href=&#34;https://pkg.go.dev/k8s.io/cli-runtime&#34;&gt;&lt;code&gt;cli-runtime&lt;/code&gt;&lt;/a&gt; (яка використовує &lt;code&gt;clientcmd&lt;/code&gt;). У цій статті ми покажемо, як використовувати першу з них.&lt;/p&gt;
&lt;h2 id=&#34;general-philosophy&#34;&gt;Загальна філософія&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#general-philosophy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Як і слід було очікувати, оскільки це частина &lt;code&gt;client-go&lt;/code&gt;, кінцевою метою &lt;code&gt;clientcmd&lt;/code&gt; є надання екземпляра &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/rest#Config&#34;&gt;&lt;code&gt;restclient.Config&lt;/code&gt;&lt;/a&gt;, який може надсилати запити до API-сервера.&lt;/p&gt;
&lt;p&gt;Він дотримується семантики &lt;code&gt;kubectl&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;типові значення беруться з &lt;code&gt;~/.kube&lt;/code&gt; або еквівалентного файлу;&lt;/li&gt;
&lt;li&gt;файли можна вказати за допомогою змінної середовища &lt;code&gt;KUBECONFIG&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;усі вищезазначені налаштування можна додатково замінити за допомогою аргументів командного рядка.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Він не встановлює аргумент командного рядка &lt;code&gt;--kubeconfig&lt;/code&gt;, що може знадобитися для узгодження з &lt;code&gt;kubectl&lt;/code&gt;; як це зробити, ви дізнаєтеся в розділі «&lt;a href=&#34;#bind-the-flags&#34;&gt;Привʼязування прапорців&lt;/a&gt;».&lt;/p&gt;
&lt;h2 id=&#34;available-features&#34;&gt;Доступні можливості&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#available-features&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;clientcmd&lt;/code&gt; дозволяє програмам обробляти&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;вибір &lt;code&gt;kubeconfig&lt;/code&gt; (за допомогою &lt;code&gt;KUBECONFIG&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;вибір контексту;&lt;/li&gt;
&lt;li&gt;вибір простору імен;&lt;/li&gt;
&lt;li&gt;сертифікати клієнта та приватні ключі;&lt;/li&gt;
&lt;li&gt;імітацію користувача;&lt;/li&gt;
&lt;li&gt;підтримку базової автентифікації HTTP (імʼя користувача/пароль).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-merging&#34;&gt;Обʼєднання конфігурацій&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configuration-merging&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У різних сценаріях &lt;code&gt;clientcmd&lt;/code&gt; підтримує &lt;em&gt;обʼєднання&lt;/em&gt; параметрів конфігурацій: &lt;code&gt;KUBECONFIG&lt;/code&gt; може вказувати декілька файлів, вміст яких обʼєднується. Це може викликати плутанину, оскільки параметри обʼєднуються в різних напрямках залежно від того, як вони реалізовані. Якщо параметр визначений у мапі, перше визначення має пріоритет, а наступні визначення ігноруються. Якщо параметр не визначений у мапі, останнє визначення має пріоритет.&lt;/p&gt;
&lt;p&gt;Коли налаштування отримуються за допомогою &lt;code&gt;KUBECONFIG&lt;/code&gt;, відсутні файли призводять лише до попереджень. Якщо користувач явно вказує шлях (у стилі &lt;code&gt;--kubeconfig&lt;/code&gt;), повинен бути відповідний файл.&lt;/p&gt;
&lt;p&gt;Якщо &lt;code&gt;KUBECONFIG&lt;/code&gt; не визначено, замість нього використовується типовий файл конфігурації &lt;code&gt;~/.kube/config&lt;/code&gt;, якщо він є.&lt;/p&gt;
&lt;h3 id=&#34;overall-process&#34;&gt;Загальний процес&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#overall-process&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Загальна схема використання стисло викладена в документації до пакунка &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd&#34;&gt;&lt;code&gt;clientcmd&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;nx&#34;&gt;loadingRules&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewDefaultClientConfigLoadingRules&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&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;configOverrides&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ConfigOverrides&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&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;kubeConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewNonInteractiveDeferredLoadingClientConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;loadingRules&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;configOverrides&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;config&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;nx&#34;&gt;kubeConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ClientConfig&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;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;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;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;client&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;nx&#34;&gt;metav1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;New&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;config&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;У контексті цієї статті є шість кроків:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;#configure-the-loading-rules&#34;&gt;Налаштування правил завантаження&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#configure-the-overrides&#34;&gt;Налаштування перевизначення&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#build-a-set-of-flags&#34;&gt;Створення набору прапорців&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#bind-the-flags&#34;&gt;Привʼязування прапорців&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#build-the-merged-configuration&#34;&gt;Створення обʼєднаної конфігурації&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#obtain-an-api-client&#34;&gt;Отримання клієнта API&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;configure-the-loading-rules&#34;&gt;Налаштування правил завантаження&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configure-the-loading-rules&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;clientcmd.NewDefaultClientConfigLoadingRules()&lt;/code&gt; створює правила завантаження, які будуть використовувати або вміст змінної середовища &lt;code&gt;KUBECONFIG&lt;/code&gt;, або типове імʼя файлу конфігурації (&lt;code&gt;~/.kube/config&lt;/code&gt;). Крім того, якщо використовується типовий файл конфігурації, він може перенести налаштування з (дуже) старого типового файлу конфігурації (&lt;code&gt;~/.kube/.kubeconfig&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Ви можете створити власні &lt;code&gt;ClientConfigLoadingRules&lt;/code&gt;, але в більшості випадків типові налаштування підходять.&lt;/p&gt;
&lt;h3 id=&#34;configure-the-overrides&#34;&gt;Налаштування перевизначення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configure-the-overrides&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;clientcmd.ConfigOverrides&lt;/code&gt; — це &lt;code&gt;struct&lt;/code&gt;, що зберігає перевизначення, які будуть застосовані до налаштувань, завантажених із конфігурації, отриманої за допомогою правил завантаження. У контексті цієї статті її основною метою є зберігання значень, отриманих з аргументів командного рядка. Вони обробляються за допомогою бібліотеки &lt;a href=&#34;https://github.com/spf13/pflag&#34;&gt;pflag&lt;/a&gt;, яка є повноцінною заміною пакунка Go &lt;a href=&#34;https://pkg.go.dev/flag&#34;&gt;&lt;code&gt;flag&lt;/code&gt;&lt;/a&gt; і додає підтримку аргументів з подвійним дефісом і довгими іменами.&lt;/p&gt;
&lt;p&gt;У більшості випадків в перевизначеннях нічого не потрібно встановлювати; я лише привʼяжу їх до прапорців.&lt;/p&gt;
&lt;h3 id=&#34;build-a-set-of-flags&#34;&gt;Створення набору прапорців&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#build-a-set-of-flags&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У цьому контексті прапорець є уособленням аргументу командного рядка, що вказує його повну назву (наприклад, &lt;code&gt;--namespace&lt;/code&gt;), його скорочену назву, якщо така є (наприклад, &lt;code&gt;-n&lt;/code&gt;), його типове значення та опис, що показується в інформації про використання. Прапорці зберігаються в екземплярах структури &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#FlagInfo&#34;&gt;&lt;code&gt;FlagInfo&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Доступні три набори прапорців, що представляють такі аргументи командного рядка:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;аргументи автентифікації (сертифікати, токени, імітації іншого користувача, імʼя користувача/пароль);&lt;/li&gt;
&lt;li&gt;аргументи кластера (API-сервер, центр сертифікації, конфігурація TLS, проксі, стиснення)&lt;/li&gt;
&lt;li&gt;аргументи контексту (імʼя кластера, імʼя користувача &lt;code&gt;kubeconfig&lt;/code&gt;, простір імен)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Рекомендований вибір включає всі три з аргументом вибору іменованого контексту та аргументом часу очікування.&lt;/p&gt;
&lt;p&gt;Всі вони доступні за допомогою функцій &lt;code&gt;Recommended…Flags&lt;/code&gt;. Функції приймають префікс, який додається до всіх довгих імен аргументів.&lt;/p&gt;
&lt;p&gt;Отже, виклик &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#RecommendedConfigOverrideFlags&#34;&gt;&lt;code&gt;clientcmd.RecommendedConfigOverrideFlags(&amp;quot;&amp;quot;)&lt;/code&gt;&lt;/a&gt; призводить до появи аргументів командного рядка, таких як &lt;code&gt;--context&lt;/code&gt;, &lt;code&gt;--namespace&lt;/code&gt; тощо. Аргументу &lt;code&gt;--timeout&lt;/code&gt; присвоюється типове значення 0, а аргумент &lt;code&gt;--namespace&lt;/code&gt; має відповідний короткий варіант &lt;code&gt;-n&lt;/code&gt;. Додавання префікса, наприклад &lt;code&gt;&amp;quot;from-&amp;quot;&lt;/code&gt;, призводить до появи аргументів командного рядка, таких як &lt;code&gt;--from-context&lt;/code&gt;, &lt;code&gt;--from-namespace&lt;/code&gt; тощо. Це може здатися не особливо корисним для команд, що стосуються одного API-сервера, але вони стають у пригоді, коли залучено кілька API-серверів, наприклад у сценаріях із кількома кластерами.&lt;/p&gt;
&lt;p&gt;Тут є потенційна проблема: префікси не змінюють коротке імʼя, тому &lt;code&gt;--namespace&lt;/code&gt; потребує певної обережності, якщо використовується кілька префіксів: лише один із префіксів може бути повʼязаний із коротким імʼям &lt;code&gt;-n&lt;/code&gt;. Вам доведеться очистити короткі імена &lt;code&gt;--namespace&lt;/code&gt; для інших префіксів або, можливо, для всіх префіксів, якщо немає логічної привʼязки до &lt;code&gt;-n&lt;/code&gt;. Короткі імена можна очистити таким чином:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;nx&#34;&gt;kflags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;RecommendedConfigOverrideFlags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prefix&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;kflags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ContextOverrideFlags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ShortName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Аналогічним чином прапорці можна повністю вимкнути, очистивши їх довге імʼя:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;nx&#34;&gt;kflags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ContextOverrideFlags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LongName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;bind-the-flags&#34;&gt;Привʼязування прапорців&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#bind-the-flags&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Після визначення набору прапорців його можна використовувати для привʼязки аргументів командного рядка до перевизначення за допомогою &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#BindOverrideFlags&#34;&gt;&lt;code&gt;clientcmd.BindOverrideFlags&lt;/code&gt;&lt;/a&gt;. Для цього потрібен &lt;a href=&#34;https://pkg.go.dev/github.com/spf13/pflag&#34;&gt;&lt;code&gt;pflag&lt;/code&gt;&lt;/a&gt; &lt;code&gt;FlagSet&lt;/code&gt;, а не пакунок &lt;code&gt;flag&lt;/code&gt; з Go.&lt;/p&gt;
&lt;p&gt;Якщо ви також хочете привʼязати &lt;code&gt;--kubeconfig&lt;/code&gt;, зробіть це зараз, привʼязавши &lt;code&gt;ExplicitPath&lt;/code&gt; у правилах завантаження:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;nx&#34;&gt;flags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;StringVarP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;loadingRules&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ExplicitPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;kubeconfig&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&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;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;absolute path(s) to the kubeconfig file(s)&amp;#34;&lt;/span&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;h3 id=&#34;build-the-merged-configuration&#34;&gt;Створення обʼєднаної конфігурації&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#build-the-merged-configuration&#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://pkg.go.dev/k8s.io/client-go/tools/clientcmd#NewInteractiveDeferredLoadingClientConfig&#34;&gt;&lt;code&gt;clientcmd.NewInteractiveDeferredLoadingClientConfig&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#NewNonInteractiveDeferredLoadingClientConfig&#34;&gt;&lt;code&gt;clientcmd.NewNonInteractiveDeferredLoadingClientConfig&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Як випливає з назв, різниця між цими двома функціями полягає в тому, що перша може запитувати інформацію для автентифікації в інтерактивному режимі, використовуючи наданий зчитувач, тоді як друга працює тільки з інформацією, наданою їй викликом.&lt;/p&gt;
&lt;p&gt;Слово «deferred» (відкладене) у назвах цих функцій означає, що остаточна конфігурація буде визначена якомога пізніше. Це означає, що ці функції можна викликати до аналізу аргументів командного рядка, а в результаті конфігурація буде використовувати будь-які значення, проаналізовані на момент її фактичного створення.&lt;/p&gt;
&lt;h3 id=&#34;obtain-an-api-client&#34;&gt;Отримання клієнта API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#obtain-an-api-client&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Обʼєднана конфігурація повертається як екземпляр &lt;a href=&#34;https://pkg.go.dev/k8s.io/client-go/tools/clientcmd#ClientConfig&#34;&gt;&lt;code&gt;ClientConfig&lt;/code&gt;&lt;/a&gt;. API-клієнт можна отримати з нього, викликавши метод &lt;code&gt;ClientConfig()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Якщо конфігурація не вказана (&lt;code&gt;KUBECONFIG&lt;/code&gt; порожній або вказує на відсутні файли, &lt;code&gt;~/.kube/config&lt;/code&gt; не існує, а конфігурація не вказана за допомогою аргументів командного рядка), типове налаштування поверне незрозумілу помилку, що посилається на &lt;code&gt;KUBERNETES_MASTER&lt;/code&gt;. Це застаріла поведінка; було зроблено кілька спроб позбутися її, але вона збереглася для аргументів командного рядка &lt;code&gt;--local&lt;/code&gt; та &lt;code&gt;--dry-run&lt;/code&gt; у &lt;code&gt;--kubectl&lt;/code&gt;. Ви повинні перевіряти наявність помилок «порожньої конфігурації», викликаючи &lt;code&gt;clientcmd.IsEmptyConfig()&lt;/code&gt;, і надавати чіткіше повідомлення про помилку.&lt;/p&gt;
&lt;p&gt;Метод &lt;code&gt;Namespace()&lt;/code&gt; також корисний: він повертає простір імен, який слід використовувати. Він також вказує, чи був простір імен перевизначений користувачем (за допомогою &lt;code&gt;--namespace&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;full-example&#34;&gt;Повний приклад&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#full-example&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&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;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;context&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;fmt&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;os&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/spf13/pflag&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;nx&#34;&gt;v1&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;k8s.io/apimachinery/pkg/apis/meta/v1&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;k8s.io/client-go/kubernetes&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;k8s.io/client-go/tools/clientcmd&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;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;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;loadingRules&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewDefaultClientConfigLoadingRules&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;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;configOverrides&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ConfigOverrides&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;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pflag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewFlagSet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;clientcmddemo&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pflag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ExitOnError&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;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;BindOverrideFlags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;configOverrides&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;flags&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;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;RecommendedConfigOverrideFlags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&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&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;flags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;StringVarP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;loadingRules&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ExplicitPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;kubeconfig&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&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;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;absolute path(s) to the kubeconfig file(s)&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;flags&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Args&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;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;kubeConfig&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewNonInteractiveDeferredLoadingClientConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;loadingRules&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;configOverrides&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;config&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;nx&#34;&gt;kubeConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ClientConfig&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;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;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;clientcmd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;IsEmptyConfig&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 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;nb&#34;&gt;panic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Please provide a configuration pointing to the Kubernetes API server&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;nb&#34;&gt;panic&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;nx&#34;&gt;client&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;nx&#34;&gt;kubernetes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewForConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;config&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;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;nb&#34;&gt;panic&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&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;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;overridden&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;nx&#34;&gt;kubeConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Namespace&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;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;nb&#34;&gt;panic&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;nx&#34;&gt;fmt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Chosen namespace: %s; overridden: %t\n&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;overridden&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;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;nodeList&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;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CoreV1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Nodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;TODO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;v1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ListOptions&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;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;nb&#34;&gt;panic&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;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;node&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;nodeList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Items&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;fmt&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;nx&#34;&gt;node&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Name&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;

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


&lt;div class=&#34;alert alert-info&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Примітка&lt;/h4&gt;

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

&lt;/div&gt;

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

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.35: Timbernetes (Випуск «Світове дерево»)</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/17/kubernetes-v1-35-release/</link>
      <pubDate>Wed, 17 Dec 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/12/17/kubernetes-v1-35-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Редактори&lt;/strong&gt;: Aakanksha Bhende, Arujjwal Negi, Chad M. Crowell, Graziano Casto, Swathi Rao&lt;/p&gt;
&lt;p&gt;Як і попередні випуски, випуск Kubernetes v1.35 містить нові стабільні, бета- та альфа-функції. Постійне створення високоякісних випусків підкреслює силу нашого циклу розробки та активну підтримку з боку нашої спільноти.&lt;/p&gt;
&lt;p&gt;Цей випуск містить 60 удосконалень, включаючи 17 стабільних, 19 бета- та 22 альфа-функції.&lt;/p&gt;
&lt;p&gt;У цьому випуску також є кілька &lt;a href=&#34;#deprecations-removals-and-community-updates&#34;&gt;застарівань і вилучень&lt;/a&gt;; обовʼязково ознайомтеся з ними.&lt;/p&gt;
&lt;h2 id=&#34;release-theme-and-logo&#34;&gt;Тема та логотип випуску&lt;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-59115--kubernetes-io-main-staging.netlify.app/blog/2025/12/17/kubernetes-v1-35-release/k8s-v1.35.png&#34;
         alt=&#34;Логотип Kubernetes v1.35 Timbernetes: шестикутний значок у стилі казкової ілюстрації з сяючим світовим деревом, гілки якого обіймають Землю та біле колесо Kubernetes; нижче стоять три веселі білки — чарівник у сливовій мантії, що тримає сувій LGTM, воїн із сокирою та синім щитом Kubernetes і розбійник із ліхтарем у темно-синьому плащі — на зеленій траві над золотою стрічкою з написом World Tree Release, на тлі мʼяких обрисів гір та неба, вкритого хмарами&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;2025 рік розпочався у сяйві Octarine: The Color of Magic (v1.33) і пронісся на поривах Of Wind &amp;amp; Will (v1.34). Ми завершуємо цей рік, тримаючись за Світове дерево, натхненні Іггдрасілем, деревом життя, що поєднує багато світів. Як і будь-яке велике дерево, Kubernetes росте кільце за кільцем і випуск за випуском, формуючись під опікою глобальної спільноти.&lt;/p&gt;
&lt;p&gt;У його центрі знаходиться колесо Kubernetes, що охоплює Землю, яке тримається на стійких мейнтейнерах, контрибʼюторах та користувачах, які знову й знову долучаються до роботи. Між повсякденною роботою, змінами в житті та постійною турботою про відкритий код вони обрізають старі API, прищеплюють нові функції та підтримують у доброму стані один з найбільших у світі проєктів з відкритим кодом.&lt;/p&gt;
&lt;p&gt;Три білки охороняють дерево: чарівник, що тримає сувій LGTM, — для рецензентів, воїн із сокирою та щитом Kubernetes — для команд випуску, які зрізають нові гілки, та розбійник із ліхтарем — для сортувальників, які проливають світло на темні черги тікетів.&lt;/p&gt;
&lt;p&gt;Разом вони уособлюють набагато більшу групу шукачів пригод. Kubernetes v1.35 додає ще одне кільце росту до Світового дерева, свіжий зріз, сформований багатьма руками, багатьма шляхами та спільнотою, гілки якої досягають все більших висот, а коріння — все більшої глибини.&lt;/p&gt;
&lt;h2 id=&#34;spotlight-on-key-updates&#34;&gt;Основні оновлення&lt;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.35 містить безліч нових функцій та вдосконалень. Ось кілька оновлень, на які команда випуску хотіла б звернути вашу увагу!&lt;/p&gt;
&lt;h3 id=&#34;stable-in-place-update-of-pod-resources&#34;&gt;Stable: Оновлення ресурсів Podʼів на місці&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#stable-in-place-update-of-pod-resources&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes перевів оновлення ресурсів Podʼів на місці в статус загальної доступності (GA).
Ця функція дозволяє користувачам налаштовувати ресурси CPU та памʼяті без перезапуску Podʼів або контейнерів. Раніше такі зміни вимагали повторного створення Podʼів, що могло порушити роботу робочих навантажень, особливо застосунків зі збереженням стану або пакетних застосунків. У попередніх випусках Kubernetes можна було змінювати лише налаштування ресурсів інфраструктури (запити та обмеження) для наявних Podʼів. Нова функціональність зміни на місці дозволяє здійснювати більш плавне вертикальне масштабування без перебоїв, підвищує ефективність, а також може спростити розробку.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP #1287&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;beta-pod-certificates-for-workload-identity-and-security&#34;&gt;Beta: Сертифікати Podʼів для ідентифікації та безпеки робочого навантаження&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#beta-pod-certificates-for-workload-identity-and-security&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Раніше для доставки сертифікатів до Podʼів були потрібні зовнішні контролери (cert-manager, SPIFFE/SPIRE), оркестрування CRD та управління Secret, а ротація здійснювалася за допомогою sidecar-контейнерів або контейнерів ініціалізації. Kubernetes v1.35 забезпечує вбудовану ідентифікацію робочого навантаження з автоматизованою ротацією сертифікатів, що значно спрощує використання сервісних мереж та архітектур нульової довіри.&lt;/p&gt;
&lt;p&gt;Тепер &lt;code&gt;kubelet&lt;/code&gt; генерує ключі, запитує сертифікати через PodCertificateRequest і записує пакети облікових даних безпосередньо у файлову систему Podʼа. &lt;code&gt;kube-apiserver&lt;/code&gt; застосовує обмеження вузлів під час допуску, усуваючи найпоширенішу пастку для сторонніх підписантів: випадкове порушення меж ізоляції вузлів. Це забезпечує чисті потоки mTLS без токенів на предʼявника у шляху видачі.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4317&#34;&gt;KEP #4317&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;alpha-node-declared-features-before-scheduling&#34;&gt;Alpha: Функції, що декларуються вузлом перед плануванням&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alpha-node-declared-features-before-scheduling&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Коли панелі управління вмикають нові функції, але вузли відстають (що дозволено політикою розбіжності версій Kubernetes), планувальник може розміщувати Podʼи, що потребують цих функцій, на несумісних старих вузлах.
Фреймворк оголошення функцій вузлів дозволяє вузлам декларувати підтримувані ними функції Kubernetes. З увімкненою новою альфа-функцією вузол повідомляє про функції, які він підтримує, публікуючи цю інформацію для панелі управління через нове поле &lt;code&gt;.status.declaredFeatures&lt;/code&gt;. Потім &lt;code&gt;kube-scheduler&lt;/code&gt;, контролери допуску та сторонні компоненти можуть використовувати ці декларації. Наприклад, ви можете застосувати обмеження планування та перевірки API, щоб гарантувати, що Podʼи працюють тільки на сумісних вузлах.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5328&#34;&gt;KEP #5328&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;features-graduating-to-stable&#34;&gt;Функції, що перейшли в стабільний стан&lt;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;&lt;em&gt;Це підбірка деяких поліпшень, які тепер є стабільними після випуску v1.35.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;prefersamenode-traffic-distribution&#34;&gt;Розподіл трафіку PreferSameNode&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#prefersamenode-traffic-distribution&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Поле &lt;code&gt;trafficDistribution&lt;/code&gt; для Service було оновлено, щоб забезпечити більш чіткий контроль за маршрутизацією трафіку. Було додано нову опцію &lt;code&gt;PreferSameNode&lt;/code&gt;, яка дозволяє сервісам суворо пріоритезувати точки доступу на локальному вузлі, якщо вони доступні, а в іншому випадку переходити на віддалені точки доступу.&lt;/p&gt;
&lt;p&gt;Одночасно наявну опцію &lt;code&gt;PreferClose&lt;/code&gt; було перейменовано на &lt;code&gt;PreferSameZone&lt;/code&gt;. Ця зміна робить API зрозумілим без пояснень, явно вказуючи, що перевага надається трафіку в межах поточної зони доступності. Хоча &lt;code&gt;PreferClose&lt;/code&gt; збережено для зворотної сумісності, &lt;code&gt;PreferSameZone&lt;/code&gt; тепер є стандартом для зональної маршрутизації, що забезпечує чітке розмежування пріоритетів на рівні вузлів і на рівні зон.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3015&#34;&gt;KEP #3015&lt;/a&gt; під керівництвом SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;job-api-managed-by-mechanism&#34;&gt;Механізм managed-by для Job API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#job-api-managed-by-mechanism&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Job API тепер включає поле &lt;code&gt;managedBy&lt;/code&gt;, яке дозволяє зовнішньому контролеру обробляти синхронізацію статусу Job. Ця функція, яка перейшла в стабільний стан у Kubernetes v1.35, розвивається насамперед завдяки потребам &lt;a href=&#34;https://github.com/kubernetes-sigs/kueue/tree/main/keps/693-multikueue&#34;&gt;MultiKueue&lt;/a&gt; — системи диспетчеризації для декількох кластерів, в якій Job, створений в кластері управління, дзеркально відображається і виконується в робочому кластері, а оновлення статусу передаються назад. Щоб уможливити цей робочий процес, вбудований контролер Job не повинен діяти на конкретний ресурс Job, щоб контролер Kueue міг замість цього керувати оновленнями статусу.&lt;/p&gt;
&lt;p&gt;Метою є забезпечення чіткого делегування синхронізації Job іншому контролеру. Мета не полягає в передачі власних параметрів цьому контролеру або зміні політик паралельності CronJob.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4368&#34;&gt;KEP #4368&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;reliable-pod-update-tracking-with-metadata-generation&#34;&gt;Надійне відстеження оновлень Podʼів за допомогою &lt;code&gt;.metadata.generation&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#reliable-pod-update-tracking-with-metadata-generation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Історично в API Pod не було поля &lt;code&gt;metadata.generation&lt;/code&gt;, яке є в інших обʼєктах Kubernetes, таких як Deployment.
Через це контролери та користувачі не мали надійного способу перевірити, чи &lt;code&gt;kubelet&lt;/code&gt; дійсно обробив останні зміни в специфікації Podʼа. Ця неоднозначність була особливо проблематичною для таких функцій, як &lt;a href=&#34;#stable-in-place-update-of-pod-resources&#34;&gt;вертикальне масштабування Podʼів на місці&lt;/a&gt;, де було важко точно визначити, коли було виконано запит на зміну розміру ресурсу.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.33 було додано поля &lt;code&gt;.metadata.generation&lt;/code&gt; для Podʼів як альфа-функцію. Це поле тепер є стабільним у Pod API v1.35, що означає, що кожного разу, коли оновлюється &lt;code&gt;spec&lt;/code&gt; Podʼа, значення &lt;code&gt;.metadata.generation&lt;/code&gt; збільшується. В рамках цього вдосконалення Pod API також отримав поле &lt;code&gt;.status.observedGeneration&lt;/code&gt;, яке повідомляє про покоління, яке &lt;code&gt;kubelet&lt;/code&gt; успішно побачив і обробив. Кожна з умов Podʼа також містить власне індивідуальне поле &lt;code&gt;observedGeneration&lt;/code&gt;, яке клієнти можуть повідомляти та/або спостерігати.&lt;/p&gt;
&lt;p&gt;Оскільки ця функція стала стабільною у v1.35, вона доступна для всіх робочих навантажень.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5067&#34;&gt;KEP #5067&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;configurable-numa-node-limit-for-topology-manager&#34;&gt;Настроюваний ліміт NUMA-вузлів для менеджера топології&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configurable-numa-node-limit-for-topology-manager&#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-59115--kubernetes-io-main-staging.netlify.app/docs/concepts/policy/node-resource-managers/&#34;&gt;менеджер топології&lt;/a&gt; використовував жорстко заданий ліміт у 8 для максимальної кількості NUMA-вузлів, які він може підтримувати, запобігаючи вибуху стану під час обчислення спорідненості. (Тут є важлива деталь: &lt;em&gt;вузол NUMA&lt;/em&gt; не є тим самим, що й Node в API Kubernetes.) Це обмеження кількості вузлів NUMA заважало Kubernetes повною мірою використовувати сучасні високопродуктивні сервери, які все частіше оснащуються архітектурами ЦП з більш ніж 8 вузлами NUMA.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.31 було введено нову опцію &lt;strong&gt;beta&lt;/strong&gt; &lt;code&gt;max-allowable-numa-nodes&lt;/code&gt; для конфігурації політики менеджера топології. У Kubernetes v1.35 ця опція є стабільною. Адміністратори кластерів, які її вмикають, можуть використовувати сервери з більш ніж 8 вузлами NUMA.&lt;/p&gt;
&lt;p&gt;Хоча опція конфігурації є стабільною, спільнота Kubernetes усвідомлює низьку продуктивність великих хостів NUMA, і існує &lt;a href=&#34;https://kep.k8s.io/5726&#34;&gt;пропозиція щодо вдосконалення&lt;/a&gt; (KEP-5726), яка має на меті її покращити. Більше про це можна дізнатися, прочитавши &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/administer-cluster/topology-manager/&#34;&gt;Керування політиками топології на вузлі&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4622&#34;&gt;KEP #4622&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-beta&#34;&gt;Нові функції в бета-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#new-features-in-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Це підбірка деяких поліпшень, які зараз знаходяться в бета-версії після випуску v1.35.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;expose-node-topology-labels-via-downward-api&#34;&gt;Експонування міток топології вузлів через Downward API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#expose-node-topology-labels-via-downward-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для доступу до інформації про топологію вузлів, такої як регіон і зона, зсередини Podʼа зазвичай потрібно було надсилати запит до API-сервера Kubernetes. Хоча цей підхід є функціональним, він створює складності та ризики для безпеки, оскільки вимагає широких дозволів RBAC або sidecar-контейнерів лише для отримання метаданих інфраструктури. Kubernetes v1.35 просуває можливість експонування міток топології вузлів безпосередньо через Downward API до бета-версії.&lt;/p&gt;
&lt;p&gt;Тепер &lt;code&gt;kubelet&lt;/code&gt; може робити інʼєкцію стандартних міток топології, таких як &lt;code&gt;topology.kubernetes.io/zone&lt;/code&gt; та &lt;code&gt;topology.kubernetes.io/region&lt;/code&gt;, у Podʼи як змінні середовища або у файли проєкційних томів. Основна перевага полягає в більш безпечному та ефективному способі забезпечення топологічної обізнаності робочих навантажень. Це дозволяє застосункам природно адаптуватися до своєї зони доступності або регіону без залежності від API-сервера, посилюючи безпеку завдяки дотриманню принципу мінімальних привілеїв та спрощуючи конфігурацію кластера.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Примітка:&lt;/strong&gt; Kubernetes тепер робить інʼєкцію доступних міток топології в кожен Pod, щоб їх можна було використовувати як вхідні дані для &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/downward-api/&#34;&gt;downward API&lt;/a&gt;. З оновленням до версії v1.35 більшість адміністраторів кластерів побачать кілька нових міток, доданих до кожного Podʼа; це очікувана поведінка, передбачена дизайном.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4742&#34;&gt;KEP #4742&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;native-support-for-storage-version-migration&#34;&gt;Вбудована підтримка міграції версій сховища&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#native-support-for-storage-version-migration&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.35 вбудована підтримка міграції версій сховища переходить до бета-версії і є типово увімкненою. Цей крок інтегрує логіку міграції безпосередньо в основну панель управління Kubernetes («in-tree»), усуваючи залежність від зовнішніх інструментів.&lt;/p&gt;
&lt;p&gt;Раніше адміністратори покладалися на ручні «цикли читання/запису», часто передаючи вивід &lt;code&gt;kubectl get&lt;/code&gt; до &lt;code&gt;kubectl replace&lt;/code&gt;, для оновлення схем або повторного шифрування даних у стані спокою. Цей метод був неефективним і схильним до конфліктів, особливо для великих ресурсів, таких як Secret. У цьому випуску вбудований контролер автоматично обробляє конфлікти оновлень і токени узгодженості, забезпечуючи безпечний, оптимізований і надійний спосіб гарантувати актуальність збережених даних з мінімальними операційними витратами.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4192&#34;&gt;KEP #4192&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h3 id=&#34;mutable-volume-attach-limits&#34;&gt;Змінювані ліміти підключення томів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mutable-volume-attach-limits&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Драйвер CSI (Container Storage Interface) — це втулок Kubernetes, який забезпечує послідовний спосіб підключення систем зберігання даних до контейнеризованих робочих навантажень. Обʼєкт &lt;code&gt;CSINode&lt;/code&gt; записує детальну інформацію про всі драйвери CSI, встановлені на вузлі. Однак може виникнути невідповідність між заявленою та фактичною ємністю підключень на вузлах. Коли після запуску драйвера CSI використовуються слоти томів, &lt;code&gt;kube-scheduler&lt;/code&gt; може призначити Podʼи зі збереженням стану вузлам без достатньої ємності, і зрештою вони зависнуть у стані &lt;code&gt;ContainerCreating&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 робить &lt;code&gt;CSINode.spec.drivers[*].allocatable.count&lt;/code&gt; змінюваним, щоб доступна ємність підключення томів вузла могла оновлюватися динамічно. Це також дозволяє драйверам CSI контролювати частоту оновлення значення &lt;code&gt;allocatable.count&lt;/code&gt; на всіх вузлах шляхом введення настроюваного інтервалу оновлення, визначеного через обʼєкт &lt;code&gt;CSIDriver&lt;/code&gt;. Крім того, Kubernetes автоматично оновлює &lt;code&gt;CSINode.spec.drivers[*].allocatable.count&lt;/code&gt; при виявленні збою в підключенні томів через недостатню ємність. Хоча ця функція перейшла в бета-версію в v1.34 з функціональною можливістю &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt;, яка була типово вимкненою, вона залишається в бета-версії для v1.35, щоб дати час для відгуків, але функціональна можливість тепер є типово увімкненою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;KEP #4876&lt;/a&gt; під керівництвом SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;opportunistic-batching&#34;&gt;Опортуністична пакетна обробка&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#opportunistic-batching&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Історично склалося так, що планувальник Kubernetes обробляє Podʼи послідовно з часовою складністю &lt;code&gt;O(num pods × num nodes)&lt;/code&gt;, що може призвести до надмірних обчислень для сумісних Podʼів. Цей KEP вводить механізм опортуністичної пакетної обробки, який має на меті покращити продуктивність шляхом ідентифікації таких сумісних Podʼів за допомогою &lt;code&gt;Pod scheduling signature&lt;/code&gt; та їх обʼєднання в пакет, що дозволяє застосовувати спільні результати фільтрування та оцінювання до всіх них.&lt;/p&gt;
&lt;p&gt;Підпис планування Podʼа гарантує, що два Podʼи з однаковим підписом є «однаковими» з точки зору планування. Він враховує не тільки атрибути Podʼів і вузлів, але й інші Podʼи в системі та глобальні дані про розміщення Podʼів. Це означає, що будь-який Pod із заданим підписом отримає однакові результати оцінювання/придатності на будь-якому довільному наборі вузлів.&lt;/p&gt;
&lt;p&gt;Механізм пакетної обробки складається з двох операцій, які можна викликати в будь-який час, коли це необхідно — &lt;em&gt;create&lt;/em&gt; та &lt;em&gt;nominate&lt;/em&gt;. Create призводить до створення нового набору інформації про пакет на основі результатів планування Podʼів, які мають дійсний підпис. Nominate використовує інформацію про пакет з create, щоб встановити імʼя номінованого вузла для нового Podʼа, підпис якого відповідає підпису канонічного Podʼа.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5598&#34;&gt;KEP #5598&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;maxunavailable-for-statefulsets&#34;&gt;&lt;code&gt;maxUnavailable&lt;/code&gt; для StatefulSets&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#maxunavailable-for-statefulsets&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;StatefulSet запускає групу Podʼів і підтримує фіксовану ідентичність для кожного з них. Це критично важливо для робочих навантажень зі збереженням стану, які вимагають стабільних мережевих ідентифікаторів або постійного зберігання. Коли &lt;code&gt;.spec.updateStrategy.&amp;lt;type&amp;gt;&lt;/code&gt; StatefulSet встановлено на &lt;code&gt;RollingUpdate&lt;/code&gt;, контролер StatefulSet видалить і перестворить кожен Pod у StatefulSet. Він буде діяти в тому ж порядку, що і при припиненні роботи Podʼів (від найбільшого порядкового номера до найменшого), оновлюючи кожен Pod по черзі.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.24 до налаштувань конфігурації &lt;code&gt;rollingUpdate&lt;/code&gt; StatefulSet додано нове поле &lt;strong&gt;alpha&lt;/strong&gt; з назвою &lt;code&gt;maxUnavailable&lt;/code&gt;. Це поле не було частиною API Kubernetes, якщо адміністратор кластера явно його не вмикав.
У Kubernetes v1.35 це поле є бета-версією і є типово доступним. Ви можете використовувати його для визначення максимальної кількості Podʼів, які можуть бути недоступними під час оновлення. Це налаштування є найбільш ефективним у поєднанні з &lt;code&gt;.spec.podManagementPolicy&lt;/code&gt;, встановленим на Parallel.  Ви можете встановити &lt;code&gt;maxUnavailable&lt;/code&gt; як додатне число (наприклад: 2) або відсоток від бажаної кількості Podʼів (наприклад: 10%). Якщо це поле не вказано, типово буде встановлено значення 1, щоб зберегти попередню поведінку оновлення лише одного Podʼа за раз. Це вдосконалення дозволяє застосункам зі збереженням стану (які можуть витримати недоступність більше ніж одного Podʼа) швидше завершувати оновлення.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/961&#34;&gt;KEP #961&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;configurable-credential-plugin-policy-in-kuberc&#34;&gt;Настроювана політика втулків для облікових даних у &lt;code&gt;kuberc&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configurable-credential-plugin-policy-in-kuberc&#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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/reference/kubectl/kuberc/&#34;&gt;файл &lt;code&gt;kuberc&lt;/code&gt;&lt;/a&gt; дозволяє відокремити конфігурації сервера та облікові дані кластера від налаштувань користувача, не порушуючи роботу вже запущених CI-конвеєрів несподіваними результатами.&lt;/p&gt;
&lt;p&gt;У рамках випуску v1.35 &lt;code&gt;kuberc&lt;/code&gt; отримує додаткову функціональність, яка дозволяє користувачам налаштовувати політику втулків для облікових даних. Ця зміна вводить два поля: &lt;code&gt;credentialPluginPolicy&lt;/code&gt;, яке дозволяє або забороняє всі втулки, та &lt;code&gt;credentialPluginAllowlist&lt;/code&gt;, за допомогою якого можна вказати список дозволених втулків.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;KEP #3104&lt;/a&gt; у співпраці між SIG Auth та SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;kyaml&#34;&gt;KYAML&lt;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;YAML — це формат серіалізації даних, зрозумілий для людини. У Kubernetes файли YAML використовуються для визначення та конфігурації ресурсів, таких як Pod, Service та Deployment. Однак складний YAML важко читати. Значущі пробіли в YAML вимагають ретельної уваги до відступів та вкладеності, а необовʼязкове взяття рядків у лапки може призвести до несподіваного примусового перетворення типів (див.: The Norway Bug). Хоча JSON є альтернативою, він не підтримує коментарі та має суворі вимоги до кінцевих ком і ключів у лапках.&lt;/p&gt;
&lt;p&gt;KYAML — це безпечніший та менш неоднозначний піднабір YAML, розроблений спеціально для Kubernetes. Введена як опціональна альфа-функція у версії 1.34, ця функція перейшла у бета-версію в Kubernetes 1.35 і стала типово увімкненою. Її можна вимкнути, встановивши змінну середовища &lt;code&gt;KUBECTL_KYAML=false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;KYAML вирішує проблеми, повʼязані як з YAML, так і з JSON. Усі файли KYAML також є дійсними файлами YAML. Це означає, що ви можете писати KYAML і передавати його як вхідні дані до будь-якої версії kubectl. Це також означає, що вам не потрібно писати в суворому KYAML, щоб вхідні дані були розібрані.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5295&#34;&gt;KEP #5295&lt;/a&gt; під керівництвом SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;configurable-tolerance-for-horizontalpodautoscalers&#34;&gt;Настроюваний допуск для HorizontalPodAutoscalers&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configurable-tolerance-for-horizontalpodautoscalers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Horizontal Pod Autoscaler (HPA) історично покладався на фіксований глобальний допуск 10% для дій з масштабування. Недоліком цього жорстко заданого значення було те, що робочі навантаження, які вимагають високої чутливості, наприклад ті, що потребують масштабування при збільшенні навантаження на 5%, часто блокувалися, тоді як інші могли коливатися без необхідності.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 функція настроюваного допуску переходить до бета-версії і є типово увімкненою. Це вдосконалення дозволяє користувачам визначати власне вікно допуску для кожного ресурсу в полі HPA &lt;code&gt;behavior&lt;/code&gt;. Встановивши конкретний допуск (наприклад, знизивши його до 0,05 для 5%), оператори отримують точний контроль над чутливістю автомасштабування, забезпечуючи швидку реакцію критичних робочих навантажень на невеликі зміни метрик без необхідності коригування конфігурації всього кластера.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4951&#34;&gt;KEP #4951&lt;/a&gt; під керівництвом SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;support-for-user-namespaces-in-pods&#34;&gt;Підтримка просторів імен користувачів у Podʼах&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-for-user-namespaces-in-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes додає підтримку просторів імен користувачів, що дозволяє Podʼам працювати з ізольованими зіставленнями ідентифікаторів користувачів і груп замість спільного використання ідентифікаторів хостів. Це означає, що контейнери можуть працювати як root внутрішньо, хоча насправді вони зіставлені з непривілейованим користувачем на хості, що зменшує ризик ескалації привілеїв у разі компрометації. Ця функція покращує безпеку на рівні Podʼів і робить більш безпечним виконання робочих навантажень, які потребують прав root всередині контейнера. Згодом підтримка була розширена як на Podʼи без збереження стану, так і на Podʼи зі збереженням стану за допомогою монтування з зіставленням ідентифікаторів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP #127&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;volumesource-oci-artifact-and-or-image&#34;&gt;VolumeSource: артефакт OCI та/або образ&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#volumesource-oci-artifact-and-or-image&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Під час створення Podʼа часто потрібно надати дані, бінарні файли або файли конфігурації для контейнерів. Це означало включення вмісту в основний образ контейнера або використання власного контейнера ініціалізації для завантаження та розпакування файлів у &lt;code&gt;emptyDir&lt;/code&gt;. Обидва ці підходи залишаються дійсними. У Kubernetes v1.31 додано підтримку типу томів &lt;code&gt;image&lt;/code&gt;, що дозволяє Podʼам декларативно завантажувати та розпаковувати артефакти образів контейнерів OCI у том. Це дозволяє пакувати та доставляти артефакти, що містять лише дані, такі як конфігурації, бінарні файли або моделі машинного навчання, використовуючи стандартні інструменти реєстру OCI.&lt;/p&gt;
&lt;p&gt;Завдяки цій функції ви можете повністю відокремити свої дані від образу контейнера та усунути необхідність у додаткових контейнерах ініціалізації або скриптах запуску. Тип тома image перебуває в бета-версії з v1.33 і є типово увімкненим у v1.35. Зверніть увагу, що для використання цієї функції потрібне сумісне середовище виконання контейнерів, таке як containerd v2.1 або пізнішої версії.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4639&#34;&gt;KEP #4639&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;enforced-kubelet-credential-verification-for-cached-images&#34;&gt;Примусова перевірка облікових даних &lt;code&gt;kubelet&lt;/code&gt; для кешованих образів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#enforced-kubelet-credential-verification-for-cached-images&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Налаштування &lt;code&gt;imagePullPolicy: IfNotPresent&lt;/code&gt; наразі дозволяє Podʼу використовувати образ контейнера, який вже кешований на вузлі, навіть якщо сам Pod не має облікових даних для завантаження цього образу. Недоліком такої поведінки є те, що вона створює вразливість безпеки в багатокористувацьких кластерах: якщо Pod з дійсними обліковими даними завантажує конфіденційний приватний образ на вузол, наступний неавторизований Pod на тому самому вузлі може отримати доступ до цього образу, просто використовуючи локальний кеш.&lt;/p&gt;
&lt;p&gt;Цей KEP вводить механізм, за допомогою якого &lt;code&gt;kubelet&lt;/code&gt; забезпечує перевірку облікових даних для кешованих образів. Перш ніж дозволити Podʼу використовувати локально кешований образ, &lt;code&gt;kubelet&lt;/code&gt; перевіряє, чи має Pod дійсні облікові дані для його завантаження. Це гарантує, що тільки авторизовані робочі навантаження можуть використовувати приватні образи, незалежно від того, чи вже присутні вони на вузлі, що значно посилює безпеку спільних кластерів.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 ця функція перейшла в бета-версію і є типово увімкненою. Користувачі все ще можуть вимкнути її, встановивши для функціональної можливості &lt;code&gt;KubeletEnsureSecretPulledImages&lt;/code&gt; значення false. Крім того, прапорець &lt;code&gt;imagePullCredentialsVerificationPolicy&lt;/code&gt; дозволяє операторам налаштувати бажаний рівень безпеки, від режиму, що надає пріоритет зворотній сумісності, до режиму суворого застосування, що забезпечує максимальну безпеку.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/2535&#34;&gt;KEP #2535&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;fine-grained-container-restart-rules&#34;&gt;Деталізовані правила перезапуску контейнерів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#fine-grained-container-restart-rules&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Історично поле &lt;code&gt;restartPolicy&lt;/code&gt; визначалося суворо на рівні Podʼа, що змушувало всі контейнери в Podʼі поводитися однаково. Недоліком цього глобального налаштування була відсутність деталізації для складних робочих навантажень, таких як завдання навчання AI/ML. Вони часто вимагали &lt;code&gt;restartPolicy: Never&lt;/code&gt; для Podʼа, щоб керувати завершенням завдання, але окремі контейнери могли б скористатися перевагами перезапуску на місці для конкретних помилок, після яких можна повторити спробу (наприклад, збої мережі або помилки ініціалізації GPU).&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 вирішує цю проблему, увімкнувши &lt;code&gt;restartPolicy&lt;/code&gt; та &lt;code&gt;restartPolicyRules&lt;/code&gt; у самому API контейнера. Це дозволяє користувачам визначати стратегії перезапуску для окремих звичайних контейнерів та контейнерів ініціалізації, які працюють незалежно від загальної політики Podʼа. Наприклад, контейнер тепер можна налаштувати так, щоб він автоматично перезапускався тільки в разі виходу з певним кодом помилки, що дозволяє уникнути значних витрат на перепланування всього Podʼа через тимчасові збої.&lt;/p&gt;
&lt;p&gt;У цьому випуску функція перейшла в бета-версію і є типово увімкненою. Користувачі можуть негайно використовувати &lt;code&gt;restartPolicyRules&lt;/code&gt; у своїх специфікаціях контейнерів, щоб оптимізувати час відновлення та використання ресурсів для довготривалих робочих навантажень, не змінюючи загальну логіку життєвого циклу своїх Podʼів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5307&#34;&gt;KEP #5307&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;csi-driver-opt-in-for-service-account-tokens-via-secrets-field&#34;&gt;Добровільне ввімкнення драйвером CSI отримання токенів службових облікових записів через поле секретів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#csi-driver-opt-in-for-service-account-tokens-via-secrets-field&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Надання токенів ServiceAccount драйверам Container Storage Interface (CSI) традиційно базувалося на їх інʼєкції у поле &lt;code&gt;volume_context&lt;/code&gt;. Такий підхід становить значний ризик для безпеки, оскільки &lt;code&gt;volume_context&lt;/code&gt; призначене для нечутливих даних конфігурації і часто записується драйверами та інструментами налагодження в журнали у вигляді звичайного тексту, що може призвести до витоку облікових даних.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує механізм добровільного ввімкнення (opt-in) для драйверів CSI, що дозволяє отримувати токени ServiceAccount через спеціальне поле секретів у запиті NodePublishVolume. Тепер драйвери можуть увімкнути цю поведінку, встановивши поле &lt;code&gt;serviceAccountTokenInSecrets&lt;/code&gt; на значення true у своєму обʼєкті CSIDriver, даючи вказівку &lt;code&gt;kubelet&lt;/code&gt; безпечно заповнити токен.&lt;/p&gt;
&lt;p&gt;Основна перевага полягає у запобіганні випадковому розкриттю облікових даних у журналах та повідомленнях про помилки. Ця зміна гарантує, що конфіденційні ідентифікатори робочих навантажень обробляються через відповідні безпечні канали, що відповідає найкращим практикам управління секретами, зберігаючи при цьому зворотну сумісність для наявних драйверів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5538&#34;&gt;KEP #5538&lt;/a&gt; під керівництвом SIG Auth у співпраці з SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;deployment-status-count-of-terminating-replicas&#34;&gt;Стан Deployment: кількість реплік, що завершують роботу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deployment-status-count-of-terminating-replicas&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Раніше стан Deployment надавав детальну інформацію про доступні та оновлені репліки, але не містив чіткої інформації про Podʼи, які перебували в процесі вимкнення. Недоліком такого упущення було те, що користувачі та контролери не могли легко відрізнити стабільний Deployment від такого, в якому Podʼи все ще виконували завдання з очищення або дотримувалися тривалих пільгових періодів.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 переводить поле &lt;code&gt;terminatingReplicas&lt;/code&gt; у статусі Deployment до бета-версії. Це поле надає кількість Podʼів, для яких встановлено час видалення, але які ще не були видалені з системи. Ця функція є фундаментальним кроком у більш масштабній ініціативі щодо поліпшення способу обробки заміни Podʼів у Deployment, що закладає основу для майбутніх політик щодо створення нових Podʼів під час розгортання.&lt;/p&gt;
&lt;p&gt;Основною перевагою є покращення спостережуваності для інструментів управління життєвим циклом та операторів. Завдяки відображенню кількості Podʼів, що припиняють роботу, зовнішні системи тепер можуть приймати більш обґрунтовані рішення, наприклад, чекати повного вимкнення перед продовженням наступних завдань, без необхідності вручну запитувати та фільтрувати списки окремих Podʼів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/3973&#34;&gt;KEP #3973&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-alpha&#34;&gt;Нові функції в альфа-версії&lt;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;p&gt;&lt;em&gt;Це підбірка деяких поліпшень, які зараз знаходяться в альфа-версії після випуску v1.35.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;gang-scheduling-support-in-kubernetes&#34;&gt;Підтримка групового планування в Kubernetes&lt;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;Планування взаємозалежних робочих навантажень, таких як завдання з навчання AI/ML або HPC-симуляції, традиційно було складним завданням, оскільки типовий планувальник Kubernetes розміщує Podʼи індивідуально. Це часто призводить до часткового планування, коли деякі Podʼи запускаються, а інші безкінечно чекають на ресурси, що призводить до взаємних блокувань і марнування ємності кластера.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує вбудовану підтримку так званого «групового планування» (gang scheduling) за допомогою нового API Workload та концепції PodGroup. Ця функція реалізує стратегію планування «все або нічого», гарантуючи, що визначена група Podʼів планується тільки в тому випадку, якщо кластер має достатньо ресурсів для одночасного розміщення всієї групи.&lt;/p&gt;
&lt;p&gt;Основною перевагою є підвищення надійності та ефективності для пакетних і паралельних робочих навантажень. Запобігаючи частковим розгортанням, вона усуває взаємні блокування ресурсів і гарантує, що дорога ємність кластера використовується тільки тоді, коли можна виконати повне завдання, що значно оптимізує оркестрування завдань обробки великих обсягів даних.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4671&#34;&gt;KEP #4671&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;constrained-impersonation&#34;&gt;Обмежена імперсонізація&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#constrained-impersonation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Історично дієслово &lt;code&gt;impersonate&lt;/code&gt; в Kubernetes RBAC функціонувало за принципом «все або нічого»: як тільки користувач отримував дозвіл на імперсонізацію цільової ідентичності, він отримував усі повʼязані з нею дозволи. Недоліком такого широкого дозволу було порушення принципу мінімальних привілеїв, що не дозволяло адміністраторам обмежувати імперсонаторів конкретними діями або ресурсами.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує нову альфа-функцію, обмежену імперсонізацію, яка додає вторинну перевірку авторизації до процесу імперсонізації. Коли ця функція вмикається через функціональну можливість &lt;code&gt;ConstrainedImpersonation&lt;/code&gt;, API-сервер перевіряє не тільки базовий дозвіл &lt;code&gt;impersonate&lt;/code&gt;, але й перевіряє, чи уповноважений імперсонатор на конкретну дію, використовуючи нові префікси дієслів (наприклад, &lt;code&gt;impersonate-on:&amp;lt;mode&amp;gt;:&amp;lt;verb&amp;gt;&lt;/code&gt;). Це дозволяє адміністраторам визначати детальні політики, наприклад, дозволяти інженеру технічної підтримки імперсонувати адміністратора кластера виключно для перегляду журналів, не надаючи повного адміністративного доступу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5284&#34;&gt;KEP #5284&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;flagz-for-kubernetes-components&#34;&gt;Flagz для компонентів Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#flagz-for-kubernetes-components&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для перевірки конфігурації компонентів Kubernetes, таких як API-сервер або &lt;code&gt;kubelet&lt;/code&gt;, під час виконання традиційно був необхідний привілейований доступ до вузла хоста або аргументів процесу. Щоб вирішити цю проблему, було введено точку доступу &lt;code&gt;/flagz&lt;/code&gt; для експонування опцій командного рядка через HTTP. Однак спочатку її вивід був обмежений простим текстом, що ускладнювало автоматизованим інструментам надійний аналіз і перевірку конфігурацій.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 точка доступу &lt;code&gt;/flagz&lt;/code&gt; була вдосконалена для підтримки структурованого, машиночитаного виводу JSON. Авторизовані користувачі тепер можуть запитувати версійну відповідь JSON за допомогою стандартного узгодження вмісту HTTP, тоді як оригінальний формат простого тексту залишається доступним для перевірки людиною. Це оновлення значно покращує спостережуваність і робочі процеси відповідності, дозволяючи зовнішнім системам програмно перевіряти конфігурації компонентів без нестабільного аналізу тексту або прямого доступу до інфраструктури.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4828&#34;&gt;KEP #4828&lt;/a&gt; під керівництвом SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;statusz-for-kubernetes-components&#34;&gt;Statusz для компонентів Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#statusz-for-kubernetes-components&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Усунення несправностей компонентів Kubernetes, таких як &lt;code&gt;kube-apiserver&lt;/code&gt; або &lt;code&gt;kubelet&lt;/code&gt;, традиційно передбачало аналіз неструктурованих журналів або текстового виводу, що було ненадійним і важким для автоматизації. Хоча раніше існувала базова точка доступу &lt;code&gt;/statusz&lt;/code&gt;, вона не мала стандартизованого, машиночитаного формату, що обмежувало її корисність для зовнішніх систем моніторингу.&lt;/p&gt;
&lt;p&gt;У Kubernetes v1.35 точка доступу &lt;code&gt;/statusz&lt;/code&gt; була покращена для підтримки структурованого, машиночитаного JSON-виводу. Авторизовані користувачі тепер можуть запитувати цей формат за допомогою стандартного узгодження вмісту HTTP, щоб отримати точні дані про стан, такі як інформація про версію та показники справності, без залежності від крихкого аналізу тексту. Це покращення забезпечує надійний, узгоджений інтерфейс для автоматизованих інструментів налагодження та спостережуваності у всіх основних компонентах.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/4827&#34;&gt;KEP #4827&lt;/a&gt; під керівництвом SIG Instrumentation.&lt;/p&gt;
&lt;h3 id=&#34;ccm-watch-based-route-controller-reconciliation-using-informers&#34;&gt;CCM: узгодження контролера маршрутів на основі спостереження за допомогою інформерів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ccm-watch-based-route-controller-reconciliation-using-informers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Управління мережевими маршрутами в хмарних середовищах традиційно базувалося на періодичному опитуванні API хмарного провайдера за допомогою Cloud Controller Manager (CCM) для перевірки та оновлення таблиць маршрутів. Цей підхід узгодження з фіксованим інтервалом може бути неефективним, часто генеруючи великий обсяг непотрібних викликів API та створюючи затримку між зміною стану вузла та відповідним оновленням маршруту.&lt;/p&gt;
&lt;p&gt;У випуску Kubernetes v1.35 бібліотека cloud-controller-manager впроваджує стратегію узгодження на основі спостереження для контролера маршрутів. Замість того, щоб покладатися на таймер, контролер тепер використовує інформери для спостереження за конкретними подіями Node, такими як додавання, видалення або відповідні оновлення полів, і запускає синхронізацію маршрутів тільки тоді, коли насправді відбувається зміна.&lt;/p&gt;
&lt;p&gt;Основною перевагою є значне зменшення використання API хмарного провайдера, що знижує ризик досягнення обмежень частоти запитів та зменшує операційні витрати. Крім того, ця модель, керована подіями, покращує швидкість реагування мережевого рівня кластера, забезпечуючи негайне оновлення таблиць маршрутів після змін у топології кластера.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5237&#34;&gt;KEP #5237&lt;/a&gt; під керівництвом SIG Cloud Provider.&lt;/p&gt;
&lt;h3 id=&#34;extended-toleration-operators-for-threshold-based-placement&#34;&gt;Розширені оператори toleration для розміщення на основі порогових значень&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#extended-toleration-operators-for-threshold-based-placement&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Kubernetes v1.35 впроваджує планування з урахуванням SLA, дозволяючи робочим навантаженням формулювати вимоги до надійності. Ця функція додає оператори числового порівняння до toleration, дозволяючи Podʼам обирати або уникати вузлів на основі SLA-орієнтованих позначок taint, таких як гарантії обслуговування або якість домену збоїв.&lt;/p&gt;
&lt;p&gt;Основна перевага полягає в удосконаленні планувальника за допомогою більш точного розміщення. Критичні робочі навантаження можуть вимагати вузлів з вищим SLA, тоді як робочі навантаження з нижчим пріоритетом можуть обирати вузли з нижчим SLA. Це покращує використання та зменшує витрати без шкоди для надійності.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5471&#34;&gt;KEP #5471&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;mutable-container-resources-when-job-is-suspended&#34;&gt;Змінювані ресурси контейнера, коли Job призупинено&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mutable-container-resources-when-job-is-suspended&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Виконання пакетних робочих навантажень часто супроводжується спробами та помилками з обмеженнями ресурсів. Наразі специфікація Job є незмінною, що означає: якщо Job завершується з помилкою Out of Memory (OOM) або через недостатню кількість ресурсів CPU, користувач не може просто налаштувати ресурси; він повинен видалити Job і створити новий, втрачаючи історію виконання та статус.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.35 впроваджує можливість оновлення запитів на ресурси та обмежень для Job, які перебувають у призупиненому стані. Це вдосконалення, яке вмикається за допомогою функціональної можливості &lt;code&gt;MutablePodResourcesForSuspendedJobs&lt;/code&gt;, дозволяє користувачам призупиняти Job, що завершується збоєм, змінювати його шаблон Pod з відповідними значеннями ресурсів, а потім поновлювати виконання з виправленою конфігурацією.&lt;/p&gt;
&lt;p&gt;Основна перевага полягає в більш плавному процесі відновлення для неправильно налаштованих завдань. Завдяки можливості вносити виправлення на місці під час призупинення, користувачі можуть усунути вузькі місця в ресурсах, не порушуючи ідентичності життєвого циклу Job і не втрачаючи контроль над його статусом виконання, що значно покращує роботу розробників з пакетною обробкою.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5440&#34;&gt;KEP #5440&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h2 id=&#34;other-notable-changes&#34;&gt;Інші важливі зміни&lt;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;continued-innovation-in-dynamic-resource-allocation-dra&#34;&gt;Подальші інновації в динамічному виділенні ресурсів (DRA)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#continued-innovation-in-dynamic-resource-allocation-dra&#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/4381&#34;&gt;Основна функціональність&lt;/a&gt; перейшла в стабільний стан у версії 1.34 з можливістю її вимкнення. У версії 1.35 вона завжди ввімкнена. Декілька альфа-функцій також були значно вдосконалені і готові до тестування. Ми закликаємо користувачів надавати відгуки про ці можливості, щоб допомогти прокласти шлях для їх запланованого переходу до бета-версії в майбутніх випусках.&lt;/p&gt;
&lt;h4 id=&#34;extended-resource-requests-via-dra&#34;&gt;Розширені запити на ресурси через DRA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#extended-resource-requests-via-dra&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Було усунено кілька функціональних прогалин порівняно з розширеними запитами на ресурси через втулки пристроїв, наприклад, оцінювання та повторне використання пристроїв у контейнерах ініціалізації.&lt;/p&gt;
&lt;h4 id=&#34;device-taints-and-tolerations&#34;&gt;Taint та toleration для пристроїв&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#device-taints-and-tolerations&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Новий ефект &amp;quot;None&amp;quot; можна використовувати для повідомлення про проблему без негайного впливу на планування або роботу Podʼів. DeviceTaintRule тепер надає інформацію про стан поточного виселення. Ефект &amp;quot;None&amp;quot; можна використовувати для «пробного запуску» перед фактичним виселенням Podʼів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Створіть DeviceTaintRule з &amp;quot;effect: None&amp;quot;.&lt;/li&gt;
&lt;li&gt;Перевірте стан, щоб побачити, скільки Podʼів буде виселено.&lt;/li&gt;
&lt;li&gt;Замініть &amp;quot;effect: None&amp;quot; на &amp;quot;effect: NoExecute&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;partitionable-devices&#34;&gt;Пристрої, що розділяються на розділи&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#partitionable-devices&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Пристрої, що належать до одних і тих самих пристроїв, які можна розділити, тепер можна визначати в різних ResourceSlice.
Більше інформації можна знайти в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/dra-features/#partitionable-devices&#34;&gt;офіційній документації&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;consumable-capacity-device-binding-conditions&#34;&gt;Споживча ємність, умови привʼязки пристроїв&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#consumable-capacity-device-binding-conditions&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Було виправлено кілька помилок та/або додано більше тестів.
Більше інформації про &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/dra-features/#consumable-capacity&#34;&gt;Споживчу ємність&lt;/a&gt; та &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/how-dra-works/#device-binding-conditions&#34;&gt;Умови привʼязки&lt;/a&gt; можна знайти в офіційній документації.&lt;/p&gt;
&lt;h3 id=&#34;comparable-resource-version-semantics&#34;&gt;Семантика порівнянних версій ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#comparable-resource-version-semantics&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.35 змінено спосіб, у який клієнти можуть інтерпретувати &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/api-concepts/#resource-versions&#34;&gt;версії ресурсів&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;До версії v1.35 єдиним підтримуваним порівнянням, яке клієнти могли виконувати, була перевірка рівності рядків: якщо дві версії ресурсів були рівними, вони вважалися однаковими. Клієнти також могли надавати версію ресурсу API-серверу і просити панель управління виконувати внутрішні порівняння, наприклад, передавати всі події з певної версії ресурсу.&lt;/p&gt;
&lt;p&gt;У версії 1.35 усі версії вбудованих ресурсів відповідають новому, більш суворому визначенню: значення є спеціальною формою десяткового числа. А оскільки їх можна порівнювати, клієнти можуть виконувати власні операції для порівняння двох різних версій ресурсів.
Наприклад, це означає, що клієнт, який повторно підключається після збою, може виявити, коли він втратив оновлення, на відміну від випадку, коли було оновлення, але тим часом не було втрачених змін.&lt;/p&gt;
&lt;p&gt;Ця зміна в семантиці дозволяє реалізувати інші важливі випадки використання, такі як &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/manage-kubernetes-objects/storage-version-migration/&#34;&gt;міграція версій сховища&lt;/a&gt;, поліпшення продуктивності &lt;em&gt;informers&lt;/em&gt; (концепція допоміжного засобу клієнта) та надійність контролера. Усі ці випадки вимагають знання того, чи є одна версія ресурсу новішою за іншу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://kep.k8s.io/5504&#34;&gt;KEP #5504&lt;/a&gt; під керівництвом SIG API Machinery.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-v1-35&#34;&gt;Переходи, застарівання та вилучення у v1.35&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#graduations-deprecations-and-removals-in-v1-35&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Переходи до стабільної версії&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;Тут перелічено всі функції, які перейшли до стабільної версії (також відомої як &lt;em&gt;загальна доступність&lt;/em&gt;). Повний перелік оновлень, включаючи нові функції та переходи від альфа-версії до бета-версії, див. у примітках до випуску.&lt;/p&gt;
&lt;p&gt;Цей випуск містить загалом 15 удосконалень, які перейшли до стабільної версії:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4540&#34;&gt;Add CPUManager policy option to restrict reservedSystemCPUs to system daemons and interrupt processing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5067&#34;&gt;Pod Generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5468&#34;&gt;Invariant Testing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;In-Place Update of Pod Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3619&#34;&gt;Fine-grained SupplementalGroups control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3983&#34;&gt;Add support for a drop-in kubelet configuration directory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/5589&#34;&gt;Remove gogo protobuf dependency for Kubernetes API types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4210&#34;&gt;kubelet image GC after a maximum age&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3673&#34;&gt;Kubelet limit of Parallel Image Pulls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4622&#34;&gt;Add a TopologyManager policy option for MaxAllowableNUMANodes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/859&#34;&gt;Include kubectl command metadata in http request headers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/3015&#34;&gt;PreferSameNode Traffic Distribution (formerly PreferLocal traffic policy / Node-level topology)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4368&#34;&gt;Job API managed-by mechanism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kep.k8s.io/4006&#34;&gt;Transition from SPDY to WebSockets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;deprecations-removals-and-community-updates&#34;&gt;Застарівання, вилучення та новини спільноти&lt;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;/h3&gt;&lt;p&gt;У міру розвитку та вдосконалення Kubernetes деякі функції можуть бути визнані застарілими, вилучені або замінені кращими
для поліпшення загального стану проєкту. Докладнішу інформацію про цей процес див. у
&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політиці Kubernetes щодо застарівання та вилучення&lt;/a&gt;. Kubernetes v1.35 містить кілька застарівань.&lt;/p&gt;
&lt;h4 id=&#34;ingress-nginx-retirement&#34;&gt;Виведення з експлуатації Ingress NGINX&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ingress-nginx-retirement&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Протягом багатьох років контролер Ingress NGINX був популярним вибором для маршрутизації трафіку в кластери Kubernetes. Він був гнучким, широко використовувався і служив стандартною точкою входу для незліченних застосунків.&lt;/p&gt;
&lt;p&gt;Однак підтримка проєкту стала неможливою. Через гостру нестачу мейнтейнерів та зростаючий технічний борг спільнота нещодавно прийняла важке рішення про його виведення з експлуатації. Строго кажучи, це не є частиною випуску v1.35, але це настільки важлива зміна, що ми хотіли б наголосити на ній тут.&lt;/p&gt;
&lt;p&gt;Як наслідок, проєкт Kubernetes оголосив, що Ingress NGINX отримуватиме лише підтримку в міру можливостей до &lt;strong&gt;березня 2026 року&lt;/strong&gt;. Після цієї дати він буде заархівований без подальших оновлень. Рекомендований варіант подальших дій — перехід на &lt;a href=&#34;https://gateway-api.sigs.k8s.io/&#34;&gt;Gateway API&lt;/a&gt;, який пропонує більш сучасний, безпечний і розширюваний стандарт управління трафіком.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/11/11/ingress-nginx-retirement/&#34;&gt;офіційному дописі в блозі&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;removal-of-cgroup-v1-support&#34;&gt;Вилучення підтримки cgroup v1&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#removal-of-cgroup-v1-support&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Що стосується управління ресурсами на вузлах Linux, Kubernetes історично покладався на cgroups (контрольні групи). Хоча оригінальний cgroup v1 був функціональним, він часто був непослідовним і обмеженим. Ось чому Kubernetes ще у версії v1.25 запровадив підтримку cgroup v2, пропонуючи набагато чистішу, уніфіковану ієрархію та кращу ізоляцію ресурсів.&lt;/p&gt;
&lt;p&gt;Оскільки cgroup v2 тепер є сучасним стандартом, Kubernetes готовий відмовитися від підтримки застарілого cgroup v1 у версії v1.35. Це важливе повідомлення для адміністраторів кластерів: якщо ви все ще використовуєте вузли на старих дистрибутивах Linux, які не підтримують cgroup v2, ваш &lt;code&gt;kubelet&lt;/code&gt; не запуститься. Щоб уникнути простою, вам потрібно буде перенести ці вузли на системи, де ввімкнено cgroup v2.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше, прочитайте &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/architecture/cgroups/&#34;&gt;про cgroup v2&lt;/a&gt;;&lt;br&gt;
ви також можете стежити за роботою з переходу в &lt;a href=&#34;https://kep.k8s.io/5573&#34;&gt;KEP-5573: Remove cgroup v1 support&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;deprecation-of-ipvs-mode-in-kube-proxy&#34;&gt;Застарівання режиму ipvs у kube-proxy&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecation-of-ipvs-mode-in-kube-proxy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Кілька років тому Kubernetes застосував режим &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-ipvs&#34;&gt;&lt;code&gt;ipvs&lt;/code&gt;&lt;/a&gt; у &lt;code&gt;kube-proxy&lt;/code&gt;, щоб забезпечити швидше балансування навантаження, ніж стандартний режим &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-iptables&#34;&gt;&lt;code&gt;iptables&lt;/code&gt;&lt;/a&gt;. Хоча це забезпечило підвищення продуктивності, синхронізація з мінливими вимогами до мережі створила занадто великий технічний борг і складність.&lt;/p&gt;
&lt;p&gt;Через це навантаження на обслуговування Kubernetes v1.35 оголошує режим &lt;code&gt;ipvs&lt;/code&gt; застарілим. Хоча цей режим залишається доступним у цьому випуску, &lt;code&gt;kube-proxy&lt;/code&gt; тепер видаватиме попередження під час запуску, якщо він налаштований на його використання. Мета полягає в оптимізації кодової бази та зосередженні уваги на сучасних стандартах. Для вузлів Linux слід почати перехід на &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#proxy-mode-nftables&#34;&gt;&lt;code&gt;nftables&lt;/code&gt;&lt;/a&gt;, який зараз є рекомендованою заміною.&lt;/p&gt;
&lt;p&gt;Більше інформації можна знайти в &lt;a href=&#34;https://kep.k8s.io/5495&#34;&gt;KEP-5495: Deprecate ipvs mode in kube-proxy&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;final-call-for-containerd-v1-x&#34;&gt;Останній дзвоник для containerd v1.X&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#final-call-for-containerd-v1-x&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Хоча Kubernetes v1.35 все ще підтримує containerd 1.7 та інші випуски LTS, це остання версія з такою підтримкою. Спільнота SIG Node визначила v1.35 як останній випуск, що підтримує серію containerd v1.X.&lt;/p&gt;
&lt;p&gt;Це важливе нагадування: перед оновленням до наступної версії Kubernetes ви повинні перейти на containerd 2.0 або новішу версію. Щоб визначити, які вузли потребують уваги, ви можете відстежувати метрику &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt; у своєму кластері.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/#announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;офіційному дописі в блозі&lt;/a&gt; або в &lt;a href=&#34;https://kep.k8s.io/4033&#34;&gt;KEP-4033: Discover cgroup driver from CRI&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;improved-pod-stability-during-kubelet-restarts&#34;&gt;Покращена стабільність Podʼів під час перезапуску &lt;code&gt;kubelet&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#improved-pod-stability-during-kubelet-restarts&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Раніше перезапуск служби &lt;code&gt;kubelet&lt;/code&gt; часто спричиняв тимчасове порушення стану Podʼів. Під час перезапуску kubelet скидав стан контейнерів, через що справні Podʼи позначалися як &lt;code&gt;NotReady&lt;/code&gt; і видалялися з балансувальників навантаження, навіть якщо застосунок сам по собі працював належним чином.&lt;/p&gt;
&lt;p&gt;Щоб вирішити цю проблему надійності, таку поведінку було виправлено, щоб забезпечити безперебійне обслуговування вузлів. Тепер &lt;code&gt;kubelet&lt;/code&gt; правильно відновлює стан наявних контейнерів із середовища виконання під час запуску. Це гарантує, що ваші робочі навантаження залишаються в стані &lt;code&gt;Ready&lt;/code&gt;, а трафік продовжує безперебійно надходити під час перезапуску або оновлення &lt;code&gt;kubelet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Більше інформації ви можете знайти в &lt;a href=&#34;https://kep.k8s.io/4781&#34;&gt;KEP-4781: Fix inconsistent container ready state after kubelet restart&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;release-notes&#34;&gt;Примітки до випуску&lt;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;/h2&gt;&lt;p&gt;Ознайомтеся з повною інформацією про випуск Kubernetes v1.35 у наших &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.35.md&#34;&gt;примітках до випуску&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;availability&#34;&gt;Доступність&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#availability&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kubernetes v1.35 доступний для завантаження на &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.35.0&#34;&gt;GitHub&lt;/a&gt; або на &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/releases/download/&#34;&gt;сторінці завантаження Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щоб розпочати роботу з Kubernetes, ознайомтеся з цими &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/tutorials/&#34;&gt;інтерактивними посібниками&lt;/a&gt; або запустіть локальні кластери Kubernetes за допомогою &lt;a href=&#34;https://minikube.sigs.k8s.io/&#34;&gt;minikube&lt;/a&gt;. Ви також можете легко встановити v1.35 за допомогою &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/&#34;&gt;kubeadm&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;release-team&#34;&gt;Команда випуску&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;Kubernetes існує лише завдяки підтримці, відданості та наполегливій праці його спільноти. Кожна команда випуску складається з відданих волонтерів спільноти, які працюють разом над створенням багатьох компонентів, що складають випуски Kubernetes, на які ви покладаєтеся. Це вимагає спеціалізованих навичок людей з усіх куточків нашої спільноти, від самого коду до його документації та управління проєктами.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/cncf/memorials/blob/main/han-kang.md&#34;&gt;Ми вшановуємо памʼять Хана Канга&lt;/a&gt;, багаторічного учасника та шановного інженера, чия технічна досконалість та заразливий ентузіазм залишили незабутній слід у спільноті Kubernetes. Хан був значною силою в SIG Instrumentation та SIG API Machinery, отримавши &lt;a href=&#34;https://www.kubernetes.dev/community/awards/2021/&#34;&gt;нагороду Kubernetes Contributor Award 2021&lt;/a&gt; за свою важливу роботу та постійну відданість стабільності ядра проєкту. Окрім технічного внеску, Хана глибоко поважали за його щедрість як наставника та пристрасть до налагодження звʼязків між людьми. Він був відомий тим, що «відкривав двері» для інших, чи то допомагаючи новим учасникам з їхніми першими pull request, чи то підтримуючи колег з терпінням і добротою. Спадщина Хана живе в інженерах, яких він надихнув, у надійних системах, які він допоміг створити, та в теплій атмосфері співпраці, яку він культивував у хмарній екосистемі.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати всій &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.35/release-team.md&#34;&gt;команді випуску&lt;/a&gt; за години наполегливої праці, щоб надати нашій спільноті випуск Kubernetes v1.35. Склад команди випуску охоплює як тих, хто вперше бере участь як shadow, так і керівників команд, які повертаються з досвідом, набутим протягом кількох циклів випуску. Ми надзвичайно вдячні нашому керівнику випуску, &lt;a href=&#34;https://github.com/drewhagen&#34;&gt;Дрю Хагену&lt;/a&gt;, чиї практичні поради та енергійність не тільки допомогли нам подолати складні виклики, але й підживили дух спільноти, що стоїть за цим успішним випуском.&lt;/p&gt;
&lt;h2 id=&#34;project-velocity&#34;&gt;Швидкість проєкту&lt;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;/h2&gt;&lt;p&gt;Проєкт CNCF K8s &lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;var-period=m&amp;var-repogroup_name=All&#34;&gt;DevStats&lt;/a&gt; обʼєднує низку цікавих даних, повʼязаних зі швидкістю Kubernetes та різних підпроєктів. Сюди входить все, від індивідуальних внесків до кількості компаній, які роблять внески, і це ілюструє глибину та широту зусиль, що докладаються для розвитку цієї екосистеми.&lt;/p&gt;
&lt;p&gt;Під час циклу випуску версії 1.35, який тривав 14 тижнів з 15 вересня 2025 року по 17 грудня 2025 року, Kubernetes отримав внески від 85 різних компаній та 419 окремих осіб. У ширшій екосистемі хмарних технологій ця цифра зростає до 281 компанії, що налічує 1769 учасників.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що «внесок» враховується, коли хтось робить коміт, рецензує код, залишає коментар, створює тікет або PR, рецензує PR (включаючи блоги та документацію) або коментує тікети та PR.&lt;br&gt;
Якщо ви зацікавлені у співпраці, відвідайте розділ &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/#getting-started&#34;&gt;Початок роботи&lt;/a&gt; на нашому вебсайті для учасників.&lt;/p&gt;
&lt;p&gt;Джерела цих даних:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;from=1757890800000&amp;to=1765929599000&amp;var-period=d28&amp;var-repogroup_name=Kubernetes&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Компанії, що роблять внесок у Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;from=1757890800000&amp;to=1765929599000&amp;var-period=d28&amp;var-repogroup_name=All&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Загальні внески в екосистему&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;events-update&#34;&gt;Огляд подій&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#events-update&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Дізнайтеся про майбутні події, присвячені Kubernetes та хмарним технологіям, зокрема KubeCon + CloudNativeCon, KCD та інші важливі конференції по всьому світу. Будьте в курсі подій та долучайтеся до спільноти Kubernetes!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Лютий 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.kcddelhi.com/index.html&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes:  Нью-Делі&lt;/strong&gt;&lt;/a&gt;: 21 лютого 2026 р. | Нью-Делі, Індія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-guadalajara-presents-kcd-guadalajara-open-source-contributor-summit/cohost-kcd-guadalajara&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes:  Гвадалахара&lt;/strong&gt;&lt;/a&gt;: 23 лютого 2026 р. | Гвадалахара, Мексика&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Березень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Europe 2026&lt;/strong&gt;&lt;/a&gt;: 23–26 березня 2026 р. | Амстердам, Нідерланди&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Травень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-toronto-presents-kcd-toronto-canada-2026/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes:  Торонто&lt;/strong&gt;&lt;/a&gt;: 13 травня 2026 р. | Торонто, Канада&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloudnativefinland.org/kcd-helsinki-2026/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes:  Гельсінкі&lt;/strong&gt;&lt;/a&gt;: 20 травня 2026 р. | Гельсінкі, Фінляндія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Червень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-india/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon India 2026&lt;/strong&gt;&lt;/a&gt;: 18–19 червня 2026 р. | Мумбаї, Індія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/kcd-kuala-lumpur-2026/&#34;&gt;&lt;strong&gt;KCD — Дні спільноти Kubernetes:  Куала-Лумпур&lt;/strong&gt;&lt;/a&gt;: 27 червня 2026 р. | Куала-Лумпур, Малайзія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Липень 2026&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-japan/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Japan 2026&lt;/strong&gt;&lt;/a&gt;: 29–30 липня 2026 р. | Йокогама, Японія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Останні подробиці про події можна знайти &lt;a href=&#34;https://community.cncf.io/events/#/list&#34;&gt;тут&lt;/a&gt;.
​&lt;/p&gt;
&lt;h2 id=&#34;upcoming-release-webinar&#34;&gt;Найближчий вебінар про випуск&lt;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;/h2&gt;&lt;p&gt;Приєднуйтесь до членів команди випуску Kubernetes v1.35 у &lt;strong&gt;середу, 14 січня 2026 року, о 17:00 (UTC)&lt;/strong&gt;, щоб дізнатися про основні особливості цього випуску. Для отримання додаткової інформації та реєстрації відвідайте &lt;a href=&#34;https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cloud-native-live-kubernetes-v135-release/&#34;&gt;сторінку події&lt;/a&gt; на сайті CNCF Online Programs.&lt;/p&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Приєднуйтесь&lt;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;спеціальних груп за інтересами&lt;/a&gt; (SIG), яка відповідає вашим інтересам. Хочете поділитися чимось зі спільнотою Kubernetes? Поділіться своєю думкою на наших щотижневих &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зустрічах спільноти&lt;/a&gt; та через наведені нижче канали. Дякуємо за ваші постійні відгуки та підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами у Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@Kubernetesio&lt;/a&gt;, щоб бути в курсі останніх новин&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до обговорення спільноти у &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до спільноти в &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ставте запитання (або відповідайте на запитання) в &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про те, що відбувається з Kubernetes, у &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Gateway API 1.4: Нові можливості</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/06/gateway-api-v1-4/</link>
      <pubDate>Thu, 06 Nov 2025 09:00:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/11/06/gateway-api-v1-4/</guid>
      <description>
        
        
        &lt;p&gt;&lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/11/06/gateway-api-v1-4/gateway-api-logo.svg&#34; alt=&#34;Логотип Gateway API&#34;&gt;&lt;/p&gt;
&lt;p&gt;Готові до революції у сфері мережевих технологій Kubernetes? Спільнота Kubernetes SIG Network представила загальнодоступну версію Gateway API (v1.4.0)! Випущена 6 жовтня 2025 року версія 1.4.0 зміцнює позиції сучасних, динамічних і розширюваних мережевих технологій у Kubernetes.&lt;/p&gt;
&lt;p&gt;Gateway API v1.4.0 приносить три нові можливості до &lt;em&gt;Стандартного каналу&lt;/em&gt; (канал GA-випусків Gateway API):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BackendTLSPolicy для TLS між шлюзами та бекендами&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;supportedFeatures&lt;/code&gt; у статусі GatewayClass&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Іменовані правила для маршрутів&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;та вводить три нові експериментальні можливості:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ресурс Mesh для конфігурації service mesh&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Типові Gateways&lt;/strong&gt; для спрощення конфігурації&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Фільтр &lt;code&gt;externalAuth&lt;/code&gt; для HTTPRoute&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;graduations-to-standard-channel&#34;&gt;Перехід до Стандартного каналу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#graduations-to-standard-channel&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;backend-tls-policy&#34;&gt;Політика TLS для бекендів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#backend-tls-policy&#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/candita&#34;&gt;Candace Holman&lt;/a&gt;, &lt;a href=&#34;https://github.com/snorwin&#34;&gt;Norwin Schnyder&lt;/a&gt;, &lt;a href=&#34;https://github.com/kl52752&#34;&gt;Katarzyna Łach&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-1897: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/1897&#34;&gt;BackendTLSPolicy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gateway-api.sigs.k8s.io/api-types/backendtlspolicy&#34;&gt;BackendTLSPolicy&lt;/a&gt; — це новий тип Gateway API для визначення конфігурації TLS зʼєднання між шлюзом і Podʼами бекенду. До впровадження BackendTLSPolicy не існувало API-специфікації, яка б дозволяла шифрувати трафік на шляху від шлюзу до бекенду.&lt;/p&gt;
&lt;p&gt;Конфігурація &lt;code&gt;BackendTLSPolicy&lt;/code&gt; &lt;code&gt;validation&lt;/code&gt; вимагає імені хоста. Цей &lt;code&gt;hostname&lt;/code&gt; має два призначення. Він використовується як заголовок SNI під час підключення до бекенду, а для автентифікації сертифікат, представлений бекендом, повинен відповідати цьому імені хоста, &lt;em&gt;якщо&lt;/em&gt; &lt;code&gt;subjectAltNames&lt;/code&gt; не вказано явно.&lt;/p&gt;
&lt;p&gt;Якщо &lt;code&gt;subjectAltNames&lt;/code&gt; (SAN) вказано, &lt;code&gt;hostname&lt;/code&gt; використовується тільки для SNI, а автентифікація виконується на основі SAN. Якщо в цьому випадку все одно потрібно виконати автентифікацію на основі значення імені хоста, його НЕОБХІДНО додати до списку &lt;code&gt;subjectAltNames&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Конфігурація BackendTLSPolicy &lt;code&gt;validation&lt;/code&gt; також вимагає або &lt;code&gt;caCertificateRefs&lt;/code&gt;, або &lt;code&gt;wellKnownCACertificates&lt;/code&gt;. &lt;code&gt;caCertificateRefs&lt;/code&gt; посилається на один або декілька (до 8) пакунків сертифікатів TLS, закодованих у форматі PEM. Якщо немає конкретних сертифікатів для використання, то залежно від вашої реалізації ви можете використовувати &lt;code&gt;wellKnownCACertificates&lt;/code&gt;, встановлений у значення &amp;quot;System&amp;quot;, щоб повідомити шлюз про необхідність використання набору довірених сертифікатів CA, характерних для конкретної реалізації.&lt;/p&gt;
&lt;p&gt;У цьому прикладі BackendTLSPolicy налаштований на використання сертифікатів, визначених у ConfigMap auth-cert, для підключення до зашифрованого TLS-зʼєднання, де Podʼи, що підтримують сервіс автентифікації, повинні надавати дійсний сертифікат для &lt;code&gt;auth.example.com&lt;/code&gt;.  Він використовує &lt;code&gt;subjectAltNames&lt;/code&gt; з типом Hostname, але ви також можете використовувати тип URI.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;BackendTLSPolicy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;tls-upstream-auth&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;targetRefs&lt;/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;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;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;auth&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sectionName&lt;/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;https&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;validation&lt;/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;caCertificateRefs&lt;/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;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# основна група API&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;ConfigMap&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;auth-cert&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;subjectAltNames&lt;/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;Hostname&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;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;auth.example.com&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;У цьому прикладі BackendTLSPolicy налаштований на використання системних сертифікатів для підключення до зашифрованого TLS бекенду, де Podʼи, що обслуговують Service dev, повинні надавати дійсний сертифікат для &lt;code&gt;dev.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;BackendTLSPolicy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;tls-upstream-dev&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;targetRefs&lt;/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;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;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;dev&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;sectionName&lt;/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;btls&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;validation&lt;/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;wellKnownCACertificates&lt;/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;System&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;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;l&#34;&gt;dev.example.com&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;Більш детальну інформацію про конфігурацію TLS в Gateway API можна знайти в статті &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/tls/&#34;&gt;Gateway API - TLS Configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;status-information-about-the-features-that-an-implementation-supports&#34;&gt;Інформація про стан можливостей, які підтримує реалізація&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#status-information-about-the-features-that-an-implementation-supports&#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/liorlieberman&#34;&gt;Lior Lieberman&lt;/a&gt;, &lt;a href=&#34;https://github.com/bexxmodd&#34;&gt;Beka Modebadze&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-2162: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/blob/main/geps/gep-2162/index.md&#34;&gt;Supported features in GatewayClass Status&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Статус GatewayClass має нове поле, &lt;code&gt;supportedFeatures&lt;/code&gt;. Це доповнення дозволяє реалізаціям оголошувати набір можливостей, які вони підтримують. Це дає користувачам і інструментам чітке уявлення про можливості даного GatewayClass.&lt;/p&gt;
&lt;p&gt;Назва цієї можливості для тестів на відповідність (та звітування про статус GatewayClass) — &lt;strong&gt;SupportedFeatures&lt;/strong&gt;. Реалізації повинні заповнити поле &lt;code&gt;supportedFeatures&lt;/code&gt; у &lt;code&gt;.status&lt;/code&gt; GatewayClass &lt;strong&gt;до&lt;/strong&gt; прийняття GatewayClass або в рамках тієї ж операції.&lt;/p&gt;
&lt;p&gt;Ось приклад &lt;code&gt;supportedFeatures&lt;/code&gt;, опублікованого в &lt;code&gt;.status&lt;/code&gt; GatewayClass:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;GatewayClass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;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;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;2022-11-16T10:33:06Z&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;Handled by Foo controller&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;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;Accepted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;Accepted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;supportedFeatures&lt;/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;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;l&#34;&gt;HTTPRouteHostRewrite&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;HTTPRoutePortRedirect&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;HTTPRouteQueryParamMatching&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;Перехід SupportedFeatures до Standard допоміг поліпшити процес тестування відповідності для Gateway API. Набір тестів на відповідність тепер автоматично виконуватиме тести на основі можливостей, визначених у статусі GatewayClass. Це створює міцний, перевірюваний звʼязок між заявленими можливостями реалізації та результатами тестування, що полегшує для розробників виконання правильних тестів на відповідність, а для користувачів — довіру до звітів про відповідність.&lt;/p&gt;
&lt;p&gt;Це означає, що коли поле SupportedFeatures заповнюється в статусі GatewayClass, не буде потреби в додаткових прапорцях тестів на відповідність, таких як &lt;code&gt;–suported-features&lt;/code&gt;, або &lt;code&gt;–exempt&lt;/code&gt;, або &lt;code&gt;–all-features&lt;/code&gt;. Важливо зазначити, що можливості Mesh є винятком із цього правила і можуть бути перевірені на відповідність за допомогою &lt;em&gt;Conformance Profiles&lt;/em&gt; або шляхом ручного введення будь-якої комбінації прапорців, повʼязаних з можливостями, доки спеціальний ресурс не вийде з експериментального каналу.&lt;/p&gt;
&lt;h3 id=&#34;named-rules-for-routes&#34;&gt;Іменовані правила для Routes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#named-rules-for-routes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;GEP-995: &lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-995&#34;&gt;Adding a new name field to all xRouteRule types (HTTPRouteRule, GRPCRouteRule, etc.)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Керівники: &lt;a href=&#34;https://github.com/guicassolato&#34;&gt;Guilherme Cassolato&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Це вдосконалення дозволяє чітко ідентифікувати правила маршрутизації та посилатися на них у всій екосистемі Gateway API. Ось деякі з основних випадків використання:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Статус:&lt;/strong&gt; можливість для станів (conditions) у статусі посилатися на конкретні правила безпосередньо за назвою.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Спостережуваність:&lt;/strong&gt; спрощення ідентифікації окремих правил у логах, трейсах та метриках.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Політики:&lt;/strong&gt; дозволяє політикам (&lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-713&#34;&gt;GEP-713&lt;/a&gt;) орієнтуватися на конкретні правила маршрутизації через поле &lt;code&gt;sectionName&lt;/code&gt; у їх &lt;code&gt;targetRef[s]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Інструменти:&lt;/strong&gt; спрощення фільтрування та посилання на правила маршрутизації в таких інструментах, як &lt;code&gt;gwctl&lt;/code&gt;, &lt;code&gt;kubectl&lt;/code&gt;, а також в універсальних утилітах, таких як &lt;code&gt;jq&lt;/code&gt; та &lt;code&gt;yq&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Внутрішнє зіставлення конфігурацій:&lt;/strong&gt; спрощення генерації внутрішніх конфігурацій, які посилаються на правила маршрутизації за іменем у реалізаціях шлюзів і мереж.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Це відповідає добре відпрацьованій схемі, яка вже застосовується для прослуховувачів шлюзів, портів Service, Podʼів (і контейнерів) та багатьох інших ресурсів Kubernetes.&lt;/p&gt;
&lt;p&gt;Хоча нове поле імені є &lt;strong&gt;необовʼязковим&lt;/strong&gt; (тож наявні ресурси залишаються дійсними), його використання &lt;strong&gt;наполегливо рекомендується&lt;/strong&gt;. Від реалізацій не очікується призначення типового значення, але можуть застосовувати обмеження, такі як незмінність.&lt;/p&gt;
&lt;p&gt;Нарешті, майте на увазі, що &lt;a href=&#34;https://gateway-api.sigs.k8s.io/geps/gep-995/?h=995#format&#34;&gt;формат імені&lt;/a&gt; перевіряється, а інші поля (такі як &lt;a href=&#34;https://gateway-api.sigs.k8s.io/reference/spec/?h=sectionname#sectionname&#34;&gt;&lt;code&gt;sectionName&lt;/code&gt;&lt;/a&gt;) можуть накладати додаткові непрямі обмеження.&lt;/p&gt;
&lt;h2 id=&#34;experimental-channel-changes&#34;&gt;Зміни в експериментальному каналі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#experimental-channel-changes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;enabling-external-auth-for-httproute&#34;&gt;Увімкнення зовнішньої автентифікації для HTTPRoute&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#enabling-external-auth-for-httproute&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Надання Gateway API можливості забезпечувати автентифікацію, а можливо, і авторизацію на рівні Gateway або HTTPRoute є дуже запитуваною можливістю протягом тривалого часу. (Див. &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/1494&#34;&gt;тікет GEP-1494&lt;/a&gt; для отримання додаткової інформації.)&lt;/p&gt;
&lt;p&gt;Цей реліз Gateway API додає експериментальний фільтр у HTTPRoute, який вказує реалізації Gateway API викликати зовнішній сервіс для автентифікації (а за бажанням, і авторизації) запитів.&lt;/p&gt;
&lt;p&gt;Цей фільтр базується на &lt;a href=&#34;https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/ext_authz_filter#config-http-filters-ext-authz&#34;&gt;Envoy ext_authz API&lt;/a&gt; і дозволяє спілкуватися із сервісом Auth, яка використовує протокол gRPC або HTTP.&lt;/p&gt;
&lt;p&gt;Обидва методи дозволяють налаштувати, які заголовки пересилати до сервісу Auth, причому протокол HTTP дозволяє передавати додаткову інформацію, таку як префікс шляху.&lt;/p&gt;
&lt;p&gt;Приклад HTTP може виглядати так (зверніть увагу, що для цього прикладу потрібно встановити експериментальний канал та реалізація, яка підтримує зовнішню автентифікацію, щоб вона справді розуміла цю конфігурацію):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;require-auth&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;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;your-gateway-here&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;Prefix&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;/admin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filters&lt;/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;ExternalAuth&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;          &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;externalAuth&lt;/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;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;backendRef&lt;/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;auth-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;http&lt;/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;# Ці заголовки завжди надсилаються для протоколу 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;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;allowedHeaders&lt;/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;l&#34;&gt;Host&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;Method&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;Path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;Content-Length&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;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;Authorization&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;admin-backend&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Це дозволяє бекенд-сервісу Auth використовувати надані заголовки для прийняття рішення про автентифікацію запиту.&lt;/p&gt;
&lt;p&gt;Коли запит дозволено, зовнішній сервіс Auth відповість кодом HTTP 200 і, за бажанням, додатковими заголовками, які будуть включені в запит, що пересилається на бекенд. Коли запит відхилено, сервіс Auth відповість кодом HTTP 403.&lt;/p&gt;
&lt;p&gt;Оскільки заголовок Authorization використовується в багатьох методах автентифікації, цей метод можна використовувати для Basic, Oauth, JWT та інших поширених методів автентифікації та авторизації.&lt;/p&gt;
&lt;h3 id=&#34;mesh-resource&#34;&gt;Ресурс Mesh&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mesh-resource&#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/kflynn&#34;&gt;Flynn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-3949: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/3949&#34;&gt;Mesh-wide configuration and supported features&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gateway API v1.4.0 представляє новий експериментальний ресурс Mesh, який надає можливість налаштовувати параметри для всього mesh та виявляти можливості, що підтримуються певною реалізацією mesh. Цей ресурс аналогічний ресурсу Gateway і спочатку буде використовуватися переважно для тестування відповідності, а в майбутньому планується розширити його використання на шлюзи поза кластером.&lt;/p&gt;
&lt;p&gt;Ресурс Mesh має область дії на рівні кластера і, як експериментальна можливість, має назву &lt;code&gt;XMesh&lt;/code&gt; і знаходиться в групі API &lt;code&gt;gateway.networking.x-k8s.io&lt;/code&gt;. Ключовим полем є controllerName, яке визначає реалізацію mesh, відповідальну за ресурс. Розділ &lt;code&gt;status&lt;/code&gt; ресурсу вказує, чи прийняла його реалізація mesh, і перелічує можливості, які підтримує mesh.&lt;/p&gt;
&lt;p&gt;Однією з цілей цього GEP є не ускладнювати користувачам впровадження mesh. Для спрощення впровадження очікується, що реалізації mesh створюватимуть типовий ресурс Mesh під час запуску, якщо такий з відповідним &lt;code&gt;controllerName&lt;/code&gt; ще не існує. Це усуває необхідність ручного створення ресурсу для початку використання mesh.&lt;/p&gt;
&lt;p&gt;Новий тип XMesh API в групі API gateway.networking.x-k8s.io/v1alpha1 забезпечує центральний пункт для конфігурації mesh і виявлення можливостей (джерело).&lt;/p&gt;
&lt;p&gt;Мінімальний обʼєкт XMesh вказує &lt;code&gt;controllerName&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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.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;XMesh&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;one-mesh-to-mesh-them-all&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;one-mesh.example.com/one-mesh&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;Реалізація mesh заповнює поле статусу, щоб підтвердити, що вона прийняла ресурс, і показує список підтримуваних можливостей (джерело):&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;Accepted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;Accepted&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;supportedFeatures&lt;/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;MeshHTTPRoute&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;OffClusterGateway&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;introducing-default-gateways&#34;&gt;Представляємо типові Gateways&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#introducing-default-gateways&#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/kflynn&#34;&gt;Flynn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-3793: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/issues/3793&#34;&gt;Allowing Gateways to program some routes by default&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Розробники застосунків часто зазначали, що необхідно явно вказувати батьківський шлюз для кожного маршруту північ-південь. Хоча така явність запобігає двозначності, вона створює додаткові труднощі, особливо для розробників, які просто хочуть відкрити свій застосунок для зовнішнього світу, не турбуючись про схему іменування базової інфраструктури. Щоб вирішити цю проблему, ми запровадили поняття &lt;strong&gt;типових Gateways&lt;/strong&gt; (Default Gateways).&lt;/p&gt;
&lt;h4 id=&#34;for-application-developers-just-use-the-default&#34;&gt;Для розробників застосунків: просто «використовуйте типовий»&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#for-application-developers-just-use-the-default&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Як розробник застосунків, ви часто не переймаєтеся тим, через який саме шлюз проходить ваш трафік, вам просто потрібно, щоб він працював. Завдяки цьому вдосконаленню ви тепер можете створити маршрут і просто попросити його використовувати типовий шлюз.&lt;/p&gt;
&lt;p&gt;Для цього потрібно встановити нове поле &lt;code&gt;useDefaultGateways&lt;/code&gt; у &lt;code&gt;spec&lt;/code&gt; вашого маршруту.&lt;/p&gt;
&lt;p&gt;Ось простий &lt;code&gt;HTTPRoute&lt;/code&gt;, який використовує типовий шлюз:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;my-route&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;useDefaultGateways&lt;/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;span class=&#34;line&#34;&gt;&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;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;my-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;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ось і все! Більше не потрібно шукати правильну назву шлюзу для вашого середовища. Ваш маршрут тепер є «маршрутом із типовим шлюзом» (defaulted Route).&lt;/p&gt;
&lt;h4 id=&#34;for-cluster-operators-you-re-still-in-control&#34;&gt;Для операторів кластерів: ви все ще контролюєте ситуацію&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#for-cluster-operators-you-re-still-in-control&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Ця можливість не забирає контроль у операторів кластерів («Chihiro»&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;). Насправді, вони мають явний контроль над тим, які шлюзи можуть діяти як типові. Шлюз прийме ці &lt;em&gt;маршрути з типовим шлюзом&lt;/em&gt; лише в тому випадку, якщо він налаштований на це.&lt;/p&gt;
&lt;p&gt;Ви також можете використовувати ValidatingAdmissionPolicy, щоб вимагати або навіть забороняти маршрутам покладатися на типовий Gateway.&lt;/p&gt;
&lt;p&gt;Як оператор кластера, ви можете призначити шлюз як типовий, встановивши (нове) поле &lt;code&gt;.spec.defaultScope&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;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;my-default-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;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;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;defaultScope&lt;/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;span class=&#34;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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Оператори можуть обрати не використовувати типові шлюзи або навіть використовувати декілька.&lt;/p&gt;
&lt;h4 id=&#34;how-it-works-and-key-details&#34;&gt;Як це працює та основні деталі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-it-works-and-key-details&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Щоб підтримувати чистий, дружній до GitOps робочий процес, типовий шлюз &lt;em&gt;не&lt;/em&gt; змінює &lt;code&gt;spec.parentRefs&lt;/code&gt; вашого маршруту. Натомість, звʼязок відображається у полі &lt;code&gt;status&lt;/code&gt; маршруту. Ви завжди можете перевірити розділ &lt;code&gt;status.parents&lt;/code&gt; вашого маршруту, щоб точно побачити, який шлюз або шлюзи його прийняли. Це зберігає ваш початковий намір і уникає конфліктів з інструментами CD.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Дизайн явно підтримує наявність кількох шлюзів, призначених як типові в межах кластера. Коли це відбувається, маршрут із типовим шлюзом буде привʼязаний до &lt;em&gt;всіх&lt;/em&gt; з них. Це дозволяє операторам кластерів виконувати міграції без простоїв і тестування нових типових шлюзів.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ви можете створити один маршрут, який обробляє як північ-південь (трафік, що входить або виходить з кластера, через типовий шлюз), так і схід-захід/mesh-трафік (трафік між сервісами в межах кластера), явно посилаючись на Service в &lt;code&gt;parentRefs&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Типові шлюзи представляють собою значний крок вперед у спрощенні та інтуїтивності Gateway API для повсякденних випадків використання, поєднуючи гнучкість, необхідну операторам, і простоту, бажану розробниками.&lt;/p&gt;
&lt;h3 id=&#34;configuring-client-certificate-validation&#34;&gt;Налаштування перевірки сертифіката клієнта&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configuring-client-certificate-validation&#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/arkodg&#34;&gt;Arko Dasgupta&lt;/a&gt;, &lt;a href=&#34;https://github.com/kl52752&#34;&gt;Katarzyna Łach&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GEP-91: &lt;a href=&#34;https://github.com/kubernetes-sigs/gateway-api/pull/3942&#34;&gt;Address connection coalescing security issue&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Цей випуск містить оновлення для налаштування перевірки клієнтських сертифікатів, що усуває критичну вразливість безпеки, повʼязану з повторним використанням зʼєднання. Обʼєднання HTTP-зʼєднань — це оптимізація веб-продуктивності, яка дозволяє клієнту повторно використовувати наявне TLS-зʼєднання для запитів до різних доменів. Хоча це зменшує накладні витрати на встановлення нових зʼєднань, воно створює ризик для безпеки в контексті шлюзів API. Можливість повторного використання одного TLS-зʼєднання для декількох прослуховувачів вимагає впровадження спільної конфігурації клієнтських сертифікатів, щоб уникнути несанкціонованого доступу.&lt;/p&gt;
&lt;h4 id=&#34;why-sni-based-mtls-is-not-the-answer&#34;&gt;Чому mTLS на основі SNI не є рішенням&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#why-sni-based-mtls-is-not-the-answer&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Можна було б подумати, що використання Server Name Indication (SNI) для розрізнення між прослуховувачами вирішить цю проблему. Однак TLS SNI не є надійним механізмом для забезпечення політик безпеки в сценарії обʼєднання зʼєднань. Клієнт може використовувати одне TLS-зʼєднання для кількох зʼєднань з партнерами, якщо вони всі покриті одним і тим же сертифікатом. Це означає, що клієнт може встановити зʼєднання, вказавши одну ідентичність партнера (використовуючи SNI), а потім повторно використовувати це зʼєднання для доступу до іншого віртуального хоста, який прослуховує на тій же IP-адресі та порту. Це повторне використання, яке контролюється евристикою з боку клієнта, може обійти політики взаємного TLS, які були специфічні для конфігурації другого прослуховувача.&lt;/p&gt;
&lt;p&gt;Ось приклад, щоб допомогти пояснити це:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;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;wildcard-tls-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;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;example&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;foo-https&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;HTTPS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;443&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;l&#34;&gt;foo.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;tls&lt;/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;certificateRefs&lt;/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;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# основна група API&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;Secret&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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: foo-example-com-cert  # SAN&lt;/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;foo.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;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;wildcard-https&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;HTTPS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;443&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;*.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;tls&lt;/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;certificateRefs&lt;/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;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# основна група API&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;Secret&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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: wildcard-example-com-cert # SAN&lt;/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;cp&#34;&gt;*.example.com&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;foo-http&lt;/code&gt; був доступний тільки для клієнтів, які мають сертифікат &lt;code&gt;foo-example-com-cert&lt;/code&gt;. На відміну від цього, прослуховувач &lt;code&gt;wildcard-https&lt;/code&gt; повинен дозволяти доступ ширшій аудиторії, яка використовує будь-який сертифікат, дійсний для домену &lt;code&gt;*.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Розглянемо сценарій, в якому клієнт спочатку підключається до &lt;code&gt;foo.example.com&lt;/code&gt;. Сервер запитує і успішно перевіряє сертифікат &lt;code&gt;foo-example-com-cert&lt;/code&gt;, встановлюючи зʼєднання. Згодом той самий клієнт бажає отримати доступ до інших сайтів у цьому домені, таких як &lt;code&gt;bar.example.com&lt;/code&gt;, який обробляється прослуховувачем &lt;code&gt;wildcard-https&lt;/code&gt;. Завдяки повторному використанню зʼєднання клієнти можуть отримати доступ до бекендів &lt;code&gt;wildcard-https&lt;/code&gt; без додаткового TLS-рукостискання на наявному зʼєднанні. Цей процес працює як очікується.&lt;/p&gt;
&lt;p&gt;Однак критична вразливість безпеки виникає, коли порядок доступу змінюється на протилежний. Якщо клієнт спочатку підключається до &lt;code&gt;bar.example.com&lt;/code&gt; і надає дійсний сертифікат &lt;code&gt;bar.example.com&lt;/code&gt;, зʼєднання встановлюється успішно. Якщо потім цей клієнт намагається отримати доступ до &lt;code&gt;foo.example.com&lt;/code&gt;, сертифікат клієнта наявного зʼєднання не буде повторно перевірено. Це дозволяє клієнту обійти конкретну вимогу щодо сертифіката для бекенду &lt;code&gt;foo&lt;/code&gt;, що призводить до серйозного порушення безпеки.&lt;/p&gt;
&lt;h4 id=&#34;the-solution-per-port-tls-configuration&#34;&gt;Рішення: конфігурація TLS для кожного порту&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-solution-per-port-tls-configuration&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Оновлений API шлюзу отримує поле &lt;code&gt;tls&lt;/code&gt; у &lt;code&gt;.spec&lt;/code&gt; шлюзу, яке дозволяє визначити конфігурацію типову конфігурацію перевірки сертифіката клієнта для всіх прослуховувачів, а потім, якщо потрібно, перевизначити її для кожного порту. Це забезпечує гнучкий і потужний спосіб керування вашими політиками TLS.&lt;/p&gt;
&lt;p&gt;Ось погляд на оновлені визначення API (показані як вихідний код Go):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; 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;c1&#34;&gt;// GatewaySpec визначає бажаний стан Gateway.&lt;/span&gt;
&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;type&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;GatewaySpec&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;struct&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;o&#34;&gt;...&lt;/span&gt;
&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;// GatewayTLSConfig визначає конфігурацію TLS для шлюзу.&lt;/span&gt;
&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;TLS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GatewayTLSConfig&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`json:&amp;#34;tls,omitempty&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;c1&#34;&gt;// GatewayTLSConfig визначає конфігурацію TLS для шлюзу.&lt;/span&gt;
&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;type&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;GatewayTLSConfig&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;struct&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;// Default визначає типову конфігурацію перевірки сертифіката клієнта&lt;/span&gt;
&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;Default&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TLSConfig&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`json:&amp;#34;default&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;c1&#34;&gt;// PerPort визначає конфігурацію TLS, призначену для кожного порту.&lt;/span&gt;
&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;PerPort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;TLSPortConfig&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`json:&amp;#34;perPort,omitempty&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;c1&#34;&gt;// TLSPortConfig описує конфігурацію TLS для конкретного порту.&lt;/span&gt;
&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;type&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TLSPortConfig&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;struct&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;// Port вказує номер порту, до якого буде застосовано конфігурацію TLS.&lt;/span&gt;
&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;Port&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;PortNumber&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`json:&amp;#34;port&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;c1&#34;&gt;// TLS зберігає конфігурацію, яка буде застосована до всіх прослуховувачів, що обробляють&lt;/span&gt;
&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;// HTTPS-трафік і відповідають заданому порту.&lt;/span&gt;
&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;TLS&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;TLSConfig&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`json:&amp;#34;tls&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;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;h3 id=&#34;breaking-grpcroute&#34;&gt;Standard GRPCRoute - поле &lt;code&gt;.spec&lt;/code&gt; обовʼязкове (технічний аспект)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#breaking-grpcroute&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Переведення GRPCRoute до статусу Standard вносить незначну, але формально несумісну зміну щодо наявності поля верхнього рівня &lt;code&gt;.spec&lt;/code&gt;. В рамках досягнення статусу Standard, Gateway API посилив перевірку схеми OpenAPI в GRPCRoute CustomResourceDefinition (CRD), щоб чітко забезпечити необхідність поля spec для всіх ресурсів GRPCRoute. Ця зміна забезпечує більш суворе дотримання стандартів обʼєктів Kubernetes та підвищує стабільність і передбачуваність ресурсу. Хоча дуже малоймовірно, що користувачі намагалися визначити GRPCRoute без будь-яких специфікацій, будь-які наявні автоматизації або маніфести, які могли покладатися на вільну інтерпретацію, що дозволяла повну відсутність поля &lt;code&gt;spec&lt;/code&gt;, тепер не пройдуть перевірку і &lt;strong&gt;повинні&lt;/strong&gt; бути оновлені, щоб включити поле &lt;code&gt;.spec&lt;/code&gt;, навіть якщо воно порожнє.&lt;/p&gt;
&lt;h3 id=&#34;breaking-httproute&#34;&gt;Експериментальна підтримка CORS в HTTPRoute — несумісна зміна для поля &lt;code&gt;allowCredentials&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#breaking-httproute&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;В рамках підпроєкту Gateway API було внесено несумісну зміну до експериментальної підтримки CORS в HTTPRoute, що стосуються поля &lt;code&gt;allowCredentials&lt;/code&gt; в політиці CORS. Визначення цього поля було приведене у повну відповідність до специфікації CORS, яка вимагає, щоб відповідний заголовок &lt;code&gt;Access-Control-Allow-Credentials&lt;/code&gt; мав булеве значення. Раніше реалізація могла бути надто дозвільною, потенційно приймаючи нестандартні або рядкові представлення, такі як &lt;code&gt;true&lt;/code&gt;, через послаблення перевірки схеми. Користувачі, які налаштовували правила CORS, тепер повинні переглянути свої маніфести та переконатися, що значення &lt;code&gt;allowCredentials&lt;/code&gt; суворо відповідає новій, більш обмежувальній схемі. Будь-які наявні визначення HTTPRoute, які не відповідають цій більш суворій перевірці, тепер будуть відхилені API-сервером, що вимагатиме оновлення конфігурації для збереження функціональності.&lt;/p&gt;
&lt;h2 id=&#34;improving-the-development-and-usage-experience&#34;&gt;Поліпшення досвіду розробки та використання&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#improving-the-development-and-usage-experience&#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-sigs/kube-api-linter&#34;&gt;Kube API Linter&lt;/a&gt; до конвеєрів CI/CD, що зменшує навантаження на рецензентів API, а також зменшує кількість типових помилок.&lt;/li&gt;
&lt;li&gt;Покращено час виконання тестів CRD за допомогою &lt;a href=&#34;https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/envtest&#34;&gt;&lt;code&gt;envtest&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Крім того, в рамках зусиль, спрямованих на поліпшення досвіду використання Gateway API, було зроблено деякі кроки для усунення неоднозначностей та старих технічних боргів з нашого вебсайту з документацією:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Тепер у довідці API чітко вказано, коли поле є &lt;code&gt;experimental&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Навігаційна панель GEP (GatewayAPI Enhancement Proposal) генерується автоматично, показуючи реальний стан вдосконалень.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Спробуйте&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#try-it-out&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;На відміну від інших API Kubernetes, вам не потрібно оновлюватися до останньої версії Kubernetes, щоб отримати останню версію Gateway API. Якщо ви використовуєте Kubernetes 1.26 або новішу версію, ви зможете швидко розпочати роботу з цією версією Gateway API.&lt;/p&gt;
&lt;p&gt;Щоб спробувати API, дотримуйтесь &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides/&#34;&gt;Посібника для початківців&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На момент написання цієї статті сім реалізацій вже відповідають Gateway API v1.4.0. В алфавітному порядку:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kgateway-dev/kgateway/releases/tag/v2.2.0-alpha.1&#34;&gt;Agent Gateway (with kgateway)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/airlock/microgateway/releases/tag/4.8.0-alpha1&#34;&gt;Airlock Microgateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/envoyproxy/gateway/releases/tag/v1.6.0-rc.1&#34;&gt;Envoy Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.cloud.google.com/kubernetes-engine/docs/concepts/gateway-api&#34;&gt;GKE Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/istio/istio/releases/tag/1.28.0-rc.1&#34;&gt;Istio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kgateway-dev/kgateway/releases/tag/v2.1.0&#34;&gt;kgateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/traefik/traefik/releases/tag/v3.6.0-rc1&#34;&gt;Traefik Proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-involved&#34;&gt;Долучайтеся&lt;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;Цікавитесь, коли буде додано нову можливість? Є багато можливостей долучитися та допомогти визначити майбутнє API маршрутизації Kubernetes як для вхідного трафіку, так і для service mesh.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ознайомтеся з &lt;a href=&#34;https://gateway-api.sigs.k8s.io/guides&#34;&gt;посібниками для користувачів&lt;/a&gt;, щоб дізнатися, які випадки використання можна вирішити.&lt;/li&gt;
&lt;li&gt;Спробуйте один з &lt;a href=&#34;https://gateway-api.sigs.k8s.io/implementations/&#34;&gt;наявних контролерів Gateway&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Або &lt;a href=&#34;https://gateway-api.sigs.k8s.io/contributing/&#34;&gt;долучайтеся до нашої спільноти&lt;/a&gt; та допоможіть нам разом створити майбутнє Gateway API!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Супровідники хотіли б подякувати &lt;em&gt;усім&lt;/em&gt;, хто долучився до Gateway API, чи то через коміти в репозиторії, обговорення, ідеї чи загальну підтримку. Ми ніколи не змогли б досягти такого прогресу без підтримки цієї відданої та активної спільноти.&lt;/p&gt;
&lt;h2 id=&#34;related-kubernetes-blog-articles&#34;&gt;Схожі статті блогу Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#related-kubernetes-blog-articles&#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-59115--kubernetes-io-main-staging.netlify.app/blog/2025/06/02/gateway-api-v1-3/&#34;&gt;Gateway API v1.3.0: Advancements in Request Mirroring, CORS, Gateway Merging, and Retry Budgets&lt;/a&gt; (червень 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/11/21/gateway-api-v1-2/&#34;&gt;Gateway API v1.2: WebSockets, Timeouts, Retries, and More&lt;/a&gt; (листопад 2024)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/05/09/gateway-api-v1-1/&#34;&gt;Gateway API v1.1: Service mesh, GRPCRoute, and a whole lot more&lt;/a&gt; (травень 2024)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2023/11/28/gateway-api-ga/&#34;&gt;New Experimental Features in Gateway API v1.0&lt;/a&gt; (листопад 2023)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2023/10/31/gateway-api-ga/&#34;&gt;Gateway API v1.0: GA Release&lt;/a&gt; (жовтень 2023)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Chihiro — одна з персон Gateway API, що уособлює оператора кластера, див. &lt;a href=&#34;https://gateway-api.sigs.k8s.io/docs/concepts/roles-and-personas/#key-roles-and-personas&#34;&gt;https://gateway-api.sigs.k8s.io/docs/concepts/roles-and-personas/#key-roles-and-personas&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

      </description>
    </item>
    
    <item>
      <title>7 типових помилок Kubernetes (і як я навчився їх уникати)</title>
      <link>https://deploy-preview-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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: Перехід Volume Group Snapshots на v1beta2</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/16/kubernetes-v1-34-volume-group-snapshot-beta-2/</link>
      <pubDate>Tue, 16 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/16/kubernetes-v1-34-volume-group-snapshot-beta-2/</guid>
      <description>
        
        
        &lt;p&gt;Volume group snapshots було &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2023/05/08/kubernetes-1-27-volume-group-snapshot-alpha/&#34;&gt;представлено&lt;/a&gt; як альфа-можливість у випуску Kubernetes 1.27, а у випуску Kubernetes 1.32 вони перейшли в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/12/18/kubernetes-1-32-volume-group-snapshot-beta/&#34;&gt;Beta&lt;/a&gt;. Останній випуск Kubernetes v1.34 переніс цю підтримку на другий бета-етап. Підтримка знімків групи томів спирається на набір &lt;a href=&#34;https://kubernetes-csi.github.io/docs/group-snapshot-restore-feature.html#volume-group-snapshot-apis&#34;&gt;додаткових API для групових знімків&lt;/a&gt;. Ці API дозволяють користувачам робити знімки набору томів, узгоджені на момент збою. За лаштунками Kubernetes використовує селектор міток для групування кількох PersistentVolumeClaims для знімків. Основна мета полягає в тому, щоб дозволити вам відновити цей набір знімків на нові томи та відновити ваше робоче навантаження на основі точки відновлення, узгодженої на момент збою.&lt;/p&gt;
&lt;p&gt;Ця нова можливість підтримується лише для &lt;a href=&#34;https://kubernetes-csi.github.io/docs/&#34;&gt;CSI&lt;/a&gt; драйверів томів.&lt;/p&gt;
&lt;h2 id=&#34;what-s-new-in-beta-2&#34;&gt;Що нового в Beta 2?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-s-new-in-beta-2&#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-csi/external-snapshotter/issues/1271&#34;&gt;проблемою&lt;/a&gt;, коли поле &lt;code&gt;restoreSize&lt;/code&gt; не встановлюється для окремих VolumeSnapshotContents і VolumeSnapshots, якщо драйвер CSI не реалізує виклик RPC ListSnapshots. Ми оцінили різні варіанти &lt;a href=&#34;https://docs.google.com/document/d/1LLBSHcnlLTaP6ZKjugtSGQHH2LGZPndyfnNqR1YvzS4/edit?tab=t.0&#34;&gt;тут&lt;/a&gt; і вирішили внести цю зміну, випустивши нову бета-версію для API.&lt;/p&gt;
&lt;p&gt;Конкретно, у v1beta2 додано структуру VolumeSnapshotInfo, яка містить інформацію про окремий знімок тома, що є членом знімка групи томів. VolumeSnapshotInfoList, список VolumeSnapshotInfo, додано до VolumeGroupSnapshotContentStatus, замінюючи VolumeSnapshotHandlePairList. VolumeSnapshotInfoList — це список інформації про знімки, повернутий драйвером CSI для ідентифікації знімків у системі зберігання. VolumeSnapshotInfoList заповнюється sidecar-контейнером csi-snapshotter на основі відповіді CSI CreateVolumeGroupSnapshotResponse, поверненої викликом CreateVolumeGroupSnapshot драйвера CSI.&lt;/p&gt;
&lt;p&gt;Наявні обʼєкти API v1beta1 будуть перетворені на нові обʼєкти API v1beta2 за допомогою вебхука перетворення.&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;Залежно від відгуків та впровадження, проєкт Kubernetes планує перенести реалізацію знімків групи томів у загальну доступність (GA) у майбутньому випуску.&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://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3476-volume-group-snapshot&#34;&gt;Дизайн-специфікація&lt;/a&gt;
для можливості знімків групи томів.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes-csi/external-snapshotter&#34;&gt;Репозиторій коду&lt;/a&gt; для API знімків групи томів
та контролера.&lt;/li&gt;
&lt;li&gt;CSI &lt;a href=&#34;https://kubernetes-csi.github.io/docs/&#34;&gt;документація&lt;/a&gt; про можливість знімків групи.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;Як взяти участь?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-do-i-get-involved&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Цей проєкт, як і весь Kubernetes, є результатом наполегливої роботи багатьох учасників з різним досвідом, які працюють разом. Від імені SIG Storage я хотів би висловити величезну подяку всім учасникам, які допомогли проєкту досягти бета-версії за останні кілька кварталів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ben Swartzlander (&lt;a href=&#34;https://github.com/bswartz&#34;&gt;bswartz&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Hemant Kumar (&lt;a href=&#34;https://github.com/gnufied&#34;&gt;gnufied&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Jan Šafránek (&lt;a href=&#34;https://github.com/jsafrane&#34;&gt;jsafrane&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Madhu Rajanna (&lt;a href=&#34;https://github.com/Madhu-1&#34;&gt;Madhu-1&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Michelle Au (&lt;a href=&#34;https://github.com/msau42&#34;&gt;msau42&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Niels de Vos (&lt;a href=&#34;https://github.com/nixpanic&#34;&gt;nixpanic&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Leonardo Cecchi (&lt;a href=&#34;https://github.com/leonardoce&#34;&gt;leonardoce&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Saad Ali (&lt;a href=&#34;https://github.com/saad-ali&#34;&gt;saad-ali&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Xing Yang (&lt;a href=&#34;https://github.com/xing-yang&#34;&gt;xing-yang&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Yati Padia (&lt;a href=&#34;https://github.com/yati1998&#34;&gt;yati1998&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Якщо ви зацікавлені взяти участь у проєктуванні та розробці CSI або будь-якої частини системи зберігання Kubernetes, приєднуйтесь до &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;Kubernetes Storage Special Interest Group&lt;/a&gt; (SIG). Ми завжди раді новим учасникам.&lt;/p&gt;
&lt;p&gt;Ми також проводимо регулярні &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/wg-data-protection&#34;&gt;зустрічі Data Protection Working Group&lt;/a&gt;. Нові учасники завжди можуть приєднатися до наших обговорень.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Автоматичне налаштування драйвера cgroup вузла переходить у GA</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/</link>
      <pubDate>Fri, 12 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/12/kubernetes-v1-34-cri-cgroup-driver-lookup-now-ga/</guid>
      <description>
        
        
        &lt;p&gt;Історично, налаштування правильного драйвера cgroup було болючою точкою для користувачів, які запускали нові кластери Kubernetes. У системах Linux існують два різні драйвери cgroup: &lt;code&gt;cgroupfs&lt;/code&gt; і &lt;code&gt;systemd&lt;/code&gt;. У минулому як &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/command-line-tools-reference/kubelet/&#34;&gt;kubelet&lt;/a&gt;, так і реалізація CRI (така як CRI-O або containerd) повинні були бути налаштовані на використання одного й того ж драйвера cgroup, інакше kubelet поводився б неправильно без жодного явного повідомлення про помилку. Це було джерелом головного болю для багатьох адміністраторів кластерів. Тепер ми (майже) поклали край цьому головному болю.&lt;/p&gt;
&lt;h2 id=&#34;automated-cgroup-driver-detection&#34;&gt;Автоматичне виявлення драйвера cgroup&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#automated-cgroup-driver-detection&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У v1.28.0 спільнота SIG Node представила функціональну можливість &lt;code&gt;KubeletCgroupDriverFromCRI&lt;/code&gt;, яка вказує kubelet запитувати у реалізації CRI, який драйвер cgroup використовувати. Ви можете прочитати більше &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/08/21/cri-cgroup-driver-lookup-now-beta/&#34;&gt;тут&lt;/a&gt;. Після багатьох випусків очікування, поки кожна реалізація CRI випустить основні версії та упакує їх у основні операційні системи, ця можливість стала загальнодоступною (GA) з Kubernetes 1.34.0.&lt;/p&gt;
&lt;p&gt;На додачу до налаштування функціональної можливості, адміністратори кластерів повинні переконатися, що їх реалізації CRI є достатньо новими:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;containerd: Підтримка була додана в v2.0.0&lt;/li&gt;
&lt;li&gt;CRI-O: Підтримка була додана в v1.28.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34;&gt;Оголошення: Kubernetes припиняє підтримку containerd v1.y&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#announcement-kubernetes-is-deprecating-containerd-v1-y-support&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Хоча CRI-O випускає версії, які відповідають версіям Kubernetes, і, отже, версії CRI-O без цієї поведінки більше не підтримуються, containerd підтримує свій власний цикл випуску. Підтримка цієї можливості в containerd доступна лише в v2.0 і пізніших версіях, але Kubernetes 1.34 все ще підтримує containerd 1.7 та інші LTS-випуски containerd.&lt;/p&gt;
&lt;p&gt;Спільнота Kubernetes SIG Node формально погодилася на остаточний графік підтримки для containerd v1.y. Останній випуск Kubernetes, який запропонує цю підтримку, буде останньою випущеною версією v1.35, а підтримка буде припинена у v1.36.0. Щоб допомогти адміністраторам з майбутнім переходом, доступний новий механізм виявлення. Ви можете моніторити метрику &lt;code&gt;kubelet_cri_losing_support&lt;/code&gt;, щоб визначити, чи використовують будь-які вузли у вашому кластері версію containerd, яка незабаром стане застарілою. Наявність цієї метрики з міткою версії &lt;code&gt;1.36.0&lt;/code&gt; вказуватиме на те, що середовище виконання containerd на вузлі недостатньо нове для майбутніх вимог. Відповідно, адміністратору потрібно буде оновити containerd до v2.0 або пізнішої версії до або одночасно з оновленням kubelet до v1.36.0.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Mutable CSI Node Allocatable переходить у бета</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/11/kubernetes-v1-34-mutable-csi-node-allocatable-count/</link>
      <pubDate>Thu, 11 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/11/kubernetes-v1-34-mutable-csi-node-allocatable-count/</guid>
      <description>
        
        
        &lt;p&gt;&lt;a href=&#34;https://kep.k8s.io/4876&#34;&gt;Можливість драйверів CSI оновлювати інформацію про кількість томів, які можна підключити на вузлах&lt;/a&gt;, вперше представлена в альфа-версії Kubernetes v1.33, перейшла в &lt;strong&gt;бета-версію&lt;/strong&gt; у випуску Kubernetes v1.34! Це є важливою віхою у підвищенні точності планування Podʼів зі станом шляхом зменшення кількості збоїв, спричинених застарілою інформацією про кількість томів, які можна підключити.&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#background&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Традиційно &lt;a href=&#34;https://kubernetes-csi.github.io/docs/introduction.html&#34;&gt;драйвери CSI&lt;/a&gt; Kubernetes повідомляють про статичний максимальний ліміт підключення томів під час ініціалізації. Однак фактичні ємності підключення можуть змінюватися протягом життєвого циклу вузла з різних причин, таких як:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ручні або зовнішні операції з підключення/відключення томів поза контролем Kubernetes.&lt;/li&gt;
&lt;li&gt;Динамічно підключені мережеві інтерфейси або спеціалізоване обладнання (GPU, NIC тощо), що споживає доступні слоти.&lt;/li&gt;
&lt;li&gt;Сценарії з кількома драйверами, коли операції одного драйвера CSI впливають на доступну ємність, про яку повідомляє інший.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Статичне звітування може призвести до того, що Kubernetes запланує Podʼи на вузли, які, здається, мають ємність, але насправді не мають, що призводить до зависання Podʼів у стані &lt;code&gt;ContainerCreating&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;dynamically-adapting-csi-volume-limits&#34;&gt;Динамічна адаптація лімітів томів CSI&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dynamically-adapting-csi-volume-limits&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Завдяки цій новій можливості Kubernetes дозволяє драйверам CSI динамічно налаштовувати та повідомляти про ємності підключення вузлів під час виконання. Це забезпечує наявність у планувальника, а також інших компонентів, які покладаються на цю інформацію, найбільш точної та актуальної інформації про ємність вузлів.&lt;/p&gt;
&lt;h3 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;/h3&gt;&lt;p&gt;Kubernetes підтримує два механізми для оновлення інформації про ліміти томів вузлів:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Періодичні оновлення:&lt;/strong&gt; Драйвери CSI вказують інтервал для періодичного оновлення доступної для розподілу ємності вузла.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Реактивні оновлення:&lt;/strong&gt; Негайне оновлення, яке викликається, коли операція підключення тому не вдається через вичерпані ресурси (помилка &lt;code&gt;ResourceExhausted&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;enabling-the-feature&#34;&gt;Увімкнення можливості&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#enabling-the-feature&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб використовувати цю бета-можливість, необхідно увімкнути функціональну можливість &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt; у таких компонентах:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kube-apiserver&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubelet&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-csi-driver-configuration&#34;&gt;Приклад конфігурації драйвера CSI&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#example-csi-driver-configuration&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Нижче наведено приклад конфігурації драйвера CSI для увімкнення періодичних оновлень кожні 60 секунд:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: example.csi.k8s.io
spec:
  nodeAllocatableUpdatePeriodSeconds: 60
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ця конфігурація вказує kubelet періодично викликати метод &lt;code&gt;NodeGetInfo&lt;/code&gt; драйвера CSI кожні 60 секунд, оновлюючи кількість томів, доступних для розподілу на вузлі. Kubernetes забезпечує мінімальний інтервал оновлення в 10 секунд, щоб збалансувати точність і використання ресурсів.&lt;/p&gt;
&lt;h3 id=&#34;immediate-updates-on-attachment-failures&#34;&gt;Негайні оновлення у разі збоїв підключення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#immediate-updates-on-attachment-failures&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Коли операція підключення тому не вдається через помилку &lt;code&gt;ResourceExhausted&lt;/code&gt; (код gRPC &lt;code&gt;8&lt;/code&gt;), Kubernetes негайно оновлює доступну для розподілу кількість томів замість того, щоб чекати наступного періодичного оновлення. Потім kubelet позначає відповідні Podʼи як Failed, що дає змогу їхнім контролерам створити їх знову. Це запобігає тому, щоб Podʼи назавжди застрягали в стані &lt;code&gt;ContainerCreating&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;getting-started&#34;&gt;Як почати використовувати&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#getting-started&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Щоб увімкнути цю можливість у вашому кластері Kubernetes v1.34:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Увімкніть функціональну можливість &lt;code&gt;MutableCSINodeAllocatableCount&lt;/code&gt; в компонентах &lt;code&gt;kube-apiserver&lt;/code&gt; та &lt;code&gt;kubelet&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Оновіть конфігурацію вашого драйвера CSI, встановивши &lt;code&gt;nodeAllocatableUpdatePeriodSeconds&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Моніторте та спостерігайте за покращеннями в точності планування та надійності розміщення Podʼів.&lt;/li&gt;
&lt;/ol&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;Ця можливість зараз перебуває на стадії beta, і спільнота Kubernetes вітає ваші відгуки. Тестуйте її, діліться своїм досвідом і допомагайте спрямовувати її еволюцію до стабільності GA.&lt;/p&gt;
&lt;p&gt;Приєднуйтесь до обговорень у &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;Kubernetes Storage Special Interest Group (SIG-Storage)&lt;/a&gt;, щоб сформувати майбутнє можливостей зберігання Kubernetes.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: VolumeAttributesClass для зміни атрибутів томів тепер GA</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/08/kubernetes-v1-34-volume-attributes-class/</link>
      <pubDate>Mon, 08 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/08/kubernetes-v1-34-volume-attributes-class/</guid>
      <description>
        
        
        &lt;p&gt;API VolumeAttributesClass, який надає можливість користувачам динамічно змінювати атрибути томів, офіційно перейшов у стадію загальної доступності (GA) у Kubernetes v1.34. Це важлива віха, яка забезпечує надійний і стабільний спосіб налаштування вашого постійного сховища безпосередньо в Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;what-is-volumeattributesclass&#34;&gt;Що таке VolumeAttributesClass?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-is-volumeattributesclass&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;По суті, VolumeAttributesClass — це ресурс рівня кластера, який визначає набір змінних параметрів для тому. Розглядайте це як &amp;quot;профіль&amp;quot; для вашого сховища, що дозволяє адміністраторам кластерів надавати різні рівні якості обслуговування (QoS) або продуктивності.&lt;/p&gt;
&lt;p&gt;Користувачі можуть вказати &lt;code&gt;volumeAttributesClassName&lt;/code&gt; у своїх PersistentVolumeClaim (PVC), щоб вказати, який клас атрибутів вони бажають. Уся магія відбувається через Container Storage Interface (CSI): коли PVC, що посилається на VolumeAttributesClass, оновлюється, відповідний драйвер CSI взаємодіє з базовою системою зберігання, щоб застосувати вказані зміни до тому.&lt;/p&gt;
&lt;p&gt;Це означає, що ви тепер можете:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Динамічно масштабувати продуктивність: збільшити IOPS або пропускну здатність для завантаженої бази даних або зменшити її для менш критичного застосунку.&lt;/li&gt;
&lt;li&gt;Оптимізувати витрати: налаштовувати атрибути на льоту, щоб відповідати вашим поточним потребам, уникаючи надлишкового виділення ресурсів.&lt;/li&gt;
&lt;li&gt;Спростити операції: керувати змінами томів безпосередньо в API Kubernetes, а не покладатися на зовнішні інструменти або ручні процеси.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-new-from-beta-to-ga&#34;&gt;Що нового в GA порівняно з бета&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-is-new-from-beta-to-ga&#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;cancellation-support-when-errors-occur&#34;&gt;Підтримка скасування у разі виникнення помилок&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cancellation-support-when-errors-occur&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб покращити стійкість і зручність використання, випуск GA вводить явну підтримку скасування, коли під час запиту на зміну тома виникає помилка. Якщо базова система зберігання або драйвер CSI вказує, що запитувані зміни не можуть бути застосовані (наприклад, через недійсні аргументи), користувачі можуть скасувати операцію і повернути том до його попередньої стабільної конфігурації, щоб том не залишився в неузгодженому стані.&lt;/p&gt;
&lt;h3 id=&#34;quota-support-based-on-scope&#34;&gt;Підтримка квот на основі області дії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#quota-support-based-on-scope&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Хоча VolumeAttributesClass не додає нового типу квот, панель управління Kubernetes може бути налаштована для примусового дотримання квот на PersistentVolumeClaim, які посилаються на конкретний VolumeAttributesClass.&lt;/p&gt;
&lt;p&gt;Це досягається за допомогою поля &lt;code&gt;scopeSelector&lt;/code&gt; в ResourceQuota для націлювання на PVC, які мають &lt;code&gt;.spec.volumeAttributesClassName&lt;/code&gt;, встановлене на конкретне імʼя VolumeAttributesClass. Докладніше див. &lt;a href=&#34;https://kubernetes.io/docs/concepts/policy/resource-quotas/#resource-quota-per-volumeattributesclass&#34;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;drivers-support-volumeattributesclass&#34;&gt;Підтримка драйверами VolumeAttributesClass&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#drivers-support-volumeattributesclass&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Драйвер Amazon EBS CSI: Драйвер AWS EBS CSI має надійну підтримку VolumeAttributesClass і дозволяє динамічно змінювати такі параметри, як тип тому (наприклад, gp2 на gp3, io1 на io2), IOPS і пропускну здатність томів EBS.&lt;/li&gt;
&lt;li&gt;Драйвер Google Compute Engine (GCE) Persistent Disk CSI (pd.csi.storage.gke.io): цей драйвер також підтримує динамічну зміну атрибутів постійного диска, включаючи IOPS і пропускну здатність, за допомогою VolumeAttributesClass.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;contact&#34;&gt;Контакти&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#contact&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Якщо у вас є запитання або конкретні запити, повʼязані з VolumeAttributesClass, звертайтеся до &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;спільноти SIG Storage&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.34: Метрики PSI для Kubernetes переходять у бета-версію</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/04/kubernetes-v1-34-introducing-psi-metrics-beta/</link>
      <pubDate>Thu, 04 Sep 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/09/04/kubernetes-v1-34-introducing-psi-metrics-beta/</guid>
      <description>
        
        
        &lt;p&gt;У міру зростання розміру та складності кластерів Kubernetes розуміння стану та продуктивності окремих вузлів стає все більш важливим. Ми раді оголосити, що з Kubernetes v1.34 &lt;strong&gt;Метрики інформації про затримки (PSI)&lt;/strong&gt; перейшли в бета-версію.&lt;/p&gt;
&lt;h2 id=&#34;what-is-pressure-stall-information-psi&#34;&gt;Що таке інформація про затримки (PSI)?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#what-is-pressure-stall-information-psi&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://docs.kernel.org/accounting/psi.html&#34;&gt;Pressure Stall Information (PSI)&lt;/a&gt; є функцією ядра Linux (версія 4.20 і новіші), яка забезпечує канонічний спосіб кількісно оцінити тиск на інфраструктурні ресурси з точки зору того, чи перевищує попит на ресурс поточну пропозицію. Вона виходить за межі простих метрик використання ресурсів і натомість вимірює кількість часу, протягом якого завдання затримуються через конкуренцію за ресурси. Це потужний спосіб виявлення та діагностування вузьких місць у ресурсах, які можуть вплинути на продуктивність застосунків.&lt;/p&gt;
&lt;p&gt;PSI надає метрики для CPU, памʼяті та I/O, які класифікуються як тиск &lt;code&gt;some&lt;/code&gt; або &lt;code&gt;full&lt;/code&gt;:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;some&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Відсоток часу, протягом якого &lt;strong&gt;принаймні одне&lt;/strong&gt; завдання затримується на ресурсі. Це вказує на певний рівень конкуренції за ресурси.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;full&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Відсоток часу, протягом якого &lt;strong&gt;всі&lt;/strong&gt; активні завдання затримуються на ресурсі одночасно. Це вказує на більш серйозне вузьке місце в ресурсах.&lt;/dd&gt;
&lt;/dl&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/09/04/kubernetes-v1-34-introducing-psi-metrics-beta/psi-metrics-some-vs-full.svg&#34;
         alt=&#34;Діаграма, що ілюструє різницю між тиском PSI &amp;#39;some&amp;#39; та &amp;#39;full&amp;#39;.&#34;/&gt; &lt;figcaption&gt;
            &lt;h4&gt;PSI: Тиск &amp;#39;Some&amp;#39; та &amp;#39;Full&amp;#39;&lt;/h4&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Ці метрики агрегуються за 10-секундними, 1-хвилинними та 5-хвилинними ковзаючими вікнами, що забезпечує всебічний огляд тиску на ресурси з часом.&lt;/p&gt;
&lt;h2 id=&#34;psi-metrics-in-kubernetes&#34;&gt;Метрики PSI в Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#psi-metrics-in-kubernetes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;З увімкненою функціональною можливістю &lt;code&gt;KubeletPSI&lt;/code&gt;, kubelet тепер може збирати метрики PSI з ядра Linux і надавати їх через два канали: &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/node-metrics#summary-api-source&#34;&gt;Summary API&lt;/a&gt; та точку доступу &lt;code&gt;/metrics/cadvisor&lt;/code&gt; Prometheus. Це дозволяє вам відстежувати та отримувати сповіщення про тиск на ресурси на рівні вузла, Podʼа та контейнера.&lt;/p&gt;
&lt;p&gt;Такі нові метрики доступні у форматі експозиції Prometheus через &lt;code&gt;/metrics/cadvisor&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;container_pressure_cpu_stalled_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_cpu_waiting_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_memory_stalled_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_memory_waiting_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_io_stalled_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container_pressure_io_waiting_seconds_total&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ці метрики, разом з даними з Summary API, забезпечують детальний огляд тиску на ресурси, що дозволяє вам точно визначити джерело проблем з продуктивністю та вжити коригувальних заходів. Наприклад, ви можете використовувати ці метрики для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Виявлення витоків памʼяті:&lt;/strong&gt; Постійно зростаючий тиск &lt;code&gt;some&lt;/code&gt; для памʼяті може вказувати на витік памʼяті в застосунку.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Оптимізація запитів та обмежень ресурсів:&lt;/strong&gt; Розуміючи тиск на ресурси ваших робочих навантажень, ви можете точніше налаштувати їх запити та обмеження ресурсів.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Автоматичне масштабування робочих навантажень:&lt;/strong&gt; Ви можете використовувати метрики PSI для ініціювання подій автоматичного масштабування, забезпечуючи, щоб ваші робочі навантаження мали ресурси, необхідні для оптимальної роботи.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-to-enable-psi-metrics&#34;&gt;Як увімкнути метрики PSI&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-to-enable-psi-metrics&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Щоб увімкнути метрики PSI у вашому кластері Kubernetes, вам потрібно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Переконатися, що ваші вузли працюють на версії ядра Linux 4.20 або новішій та використовують cgroup v2.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Увімкнути функціональну можливість &lt;code&gt;KubeletPSI&lt;/code&gt; у kubelet.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Після увімкнення ви можете почати збирати дані з точки доступу &lt;code&gt;/metrics/cadvisor&lt;/code&gt; за допомогою вашого рішення для моніторингу, сумісного з Prometheus, або запитувати Summary API для збору та візуалізації нових метрик PSI. Зверніть увагу, що PSI є функцією ядра Linux, тому ці метрики недоступні на вузлах Windows. Ваш кластер може містити комбінацію вузлів Linux та Windows, але на вузлах Windows kubelet не надає метрики PSI.&lt;/p&gt;
&lt;h2 id=&#34;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;Ми раді представити метрики PSI спільноті Kubernetes і чекаємо на ваші відгуки. Оскільки це бета-можливість, ми активно працюємо над поліпшенням і розширенням цієї функціональності до стабільного випуску GA. Ми закликаємо вас спробувати її та поділитися своїм досвідом з нами.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше про метрики PSI, ознайомтеся з офіційною &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/instrumentation/understand-psi-metrics/&#34;&gt;документацією Kubernetes&lt;/a&gt;. Ви також можете долучитися до обговорення на каналі &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt; в Slack.&lt;/p&gt;

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

      </description>
    </item>
    
    <item>
      <title>Попередній огляд Kubernetes v1.34</title>
      <link>https://deploy-preview-59115--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-59115--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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/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-59115--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-59115--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. Надалі Kubelet Tracing (&lt;a href=&#34;https://kep.k8s.io/2831&#34;&gt;KEP-2831&lt;/a&gt;) і API Server Tracing (&lt;a href=&#34;https://kep.k8s.io/647&#34;&gt;KEP-647&lt;/a&gt;) планують перевести у стабільний стан у наступному випуску 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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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.33: Оновлення життєвого циклу контейнерів</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/05/14/kubernetes-v1-33-updates-to-container-lifecycle/</link>
      <pubDate>Wed, 14 May 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/05/14/kubernetes-v1-33-updates-to-container-lifecycle/</guid>
      <description>
        
        
        &lt;p&gt;У Kubernetes v1.33 представлено декілька оновлень життєвого циклу контейнерів. Дія Sleep для хуків життєвого циклу контейнера тепер підтримує нульову тривалість сну (можливість типово увімкнена). Також зʼявилася альфа-підтримка для налаштування сигналу зупинки, що надсилається контейнерам при завершенні їхньої роботи.&lt;/p&gt;
&lt;p&gt;У цій статті ви дізнаєтеся більше про ці нові аспекти життєвого циклу контейнера і про те, як ними користуватися.&lt;/p&gt;
&lt;h2 id=&#34;zero-value-for-sleep-action&#34;&gt;Нульове значення для дії Sleep&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#zero-value-for-sleep-action&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;У Kubernetes v1.29 введено дію &lt;code&gt;Sleep&lt;/code&gt; для хуків життєвого циклу контейнерів PreStop і PostStart. Дія Sleep дозволяє вашим контейнерам призупиняти роботу на певний час після запуску контейнера або перед його завершенням. Це було необхідно для забезпечення простого способу керування належним завершенням роботи. До появи дії Sleep люди використовували команду &lt;code&gt;sleep&lt;/code&gt; за допомогою дії exec у своїх хуках життєвого циклу контейнера. Якщо ви хотіли це зробити, вам потрібно було мати двійковий файл для команди &lt;code&gt;sleep&lt;/code&gt; в образі вашого контейнера. Це важко зробити, якщо ви використовуєте сторонні образи.&lt;/p&gt;
&lt;p&gt;Дія sleep, коли її було додано, спочатку не підтримувала тривалість сну у нуль секунд. Функція &lt;code&gt;time.Sleep&lt;/code&gt;, яку приховано використовується дією Sleep, підтримує тривалість сну у нуль секунд. Використання відʼємного або нульового значення для часу сну призводить до негайного повернення, що призводить до невиконання дії. Ми хотіли отримати таку саму поведінку для дії sleep. Цю підтримку нульової тривалості було додано у версії 1.32 за допомогою функціональної можливості &lt;code&gt;PodLifecycleSleepActionAllowZero&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;PodLifecycleSleepActionAllowZero&lt;/code&gt; перейшла до бета-версії у версії 1.33 і тепер типово увімкнена. Оригінальна дія Sleep для хуків &lt;code&gt;preStop&lt;/code&gt; і &lt;code&gt;postStart&lt;/code&gt; типово увімкнена, починаючи з Kubernetes v1.30. У кластері під керуванням Kubernetes v1.33 ви можете встановити нульову тривалість для хуків життєвого циклу сну. Для кластера з типовою конфігурацією вам не потрібно вмикати жодних функціональних можливостей, щоб зробити це можливим.&lt;/p&gt;
&lt;h2 id=&#34;container-stop-signals&#34;&gt;Сигнали зупинки контейнерів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#container-stop-signals&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Такі середовища виконання контейнерів, як containerd та CRI-O, враховують інструкцію &lt;code&gt;StopSignal&lt;/code&gt; у визначенні образу контейнера. За допомогою цієї інструкції можна вказати власний сигнал зупинки, який середовище виконання використовуватиме для завершення роботи контейнерів на основі цього образу. Налаштування сигналу зупинки спочатку не було частиною Pod API у Kubernetes. До версії Kubernetes v1.33 єдиним способом перевизначити сигнал зупинки для контейнерів було перебудувати образ контейнера з новим власним сигналом зупинки (наприклад, вказавши &lt;code&gt;STOPSIGNAL&lt;/code&gt; у &lt;code&gt;Containerfile&lt;/code&gt; або &lt;code&gt;Dockerfile&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Функціональна можливість &lt;code&gt;ContainerStopSignals&lt;/code&gt;, яка була додана у Kubernetes v1.33, додає сигнали зупинки до API Kubernetes. Це дозволяє користувачам вказати власний сигнал зупинки в специфікації контейнера. Сигнали зупинки додаються до API як новий життєвий цикл разом з наявними обробниками життєвого циклу PreStop та PostStart. Для того, щоб використовувати цю можливість, ми очікуємо, що в Pod буде вказана операційна система за допомогою &lt;code&gt;spec.os.name&lt;/code&gt;. Це необхідно для того, щоб ми могли перехресно перевірити сигнал зупинки на відповідність операційній системі і переконатися, що контейнери в Pod створюються з правильним сигналом зупинки для операційної системи, для якої планується створення Pod. Для Podʼів, запланованих на вузлах Windows, допустимими сигналами зупинки є лише &lt;code&gt;SIGTERM&lt;/code&gt; і &lt;code&gt;SIGKILL&lt;/code&gt;. Повний список сигналів, що підтримуються на вузлах Linux, можна знайти &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/8c1094d54af10eacea24a9b98383978fabf93dc0/staging/src/k8s.io/api/core/v1/types.go#L3138-L3206&#34;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;default-behaviour&#34;&gt;Типова поведінка&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#default-behaviour&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Якщо у життєвому циклі контейнера визначено власний сигнал зупинки, то для завершення роботи контейнера буде використано сигнал, визначений у життєвому циклі, враховуючи, що середовище виконання контейнера також підтримує власні сигнали зупинки. Якщо у життєвому циклі контейнера не визначено спеціального сигналу зупинки, середовище виконання повернеться до сигналу зупинки, визначеного в образі контейнера. Якщо в образі контейнера не визначено жодного сигналу зупинки, буде використано типовий сигнал зупинки середовища виконання. Типовим сигналом є &lt;code&gt;SIGTERM&lt;/code&gt; як для containerd, так і для CRI-O.&lt;/p&gt;
&lt;h3 id=&#34;version-skew&#34;&gt;Розбіжність версій&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#version-skew&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб ця можливість працювала належним чином, версії Kubernetes та середовища виконання контейнера повинні підтримувати сигнали зупинки контейнера. Зміни до API Kubernetes та kubelet доступні в альфа-версії, починаючи з v1.33, які можна увімкнути за допомогою функціональної можливості &lt;code&gt;ContainerStopSignals&lt;/code&gt;. Реалізації середовища виконання контейнерів для containerd та CRI-O все ще перебувають у процесі розробки та будуть випущені найближчим часом.&lt;/p&gt;
&lt;h3 id=&#34;using-container-stop-signals&#34;&gt;Використання сигналів зупинки контейнера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#using-container-stop-signals&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Щоб увімкнути цю можливість, вам потрібно увімкнути функціональну можливість &lt;code&gt;ContainerStopSignals&lt;/code&gt; в kube-apiserver та kubelet. Після того, як у вас є вузли з увімкненою функціональною можливістю, ви можете створювати Podʼи з життєвим циклом StopSignal і правильною назвою ОС, наприклад, таким чином:&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;nginx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;os&lt;/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;linux&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;nginx&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;nginx:latest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lifecycle&lt;/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;stopSignal&lt;/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;SIGUSR1&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;SIGUSR1&lt;/code&gt; у цьому прикладі може бути використаний лише у тому випадку, якщо Pod контейнера заплановано на вузол Linux. Отже, нам потрібно вказати &lt;code&gt;spec.os.name&lt;/code&gt; як &lt;code&gt;linux&lt;/code&gt;, щоб мати змогу використовувати цей сигнал. Якщо Pod планується на вузол Windows, ви зможете налаштувати лише сигнали &lt;code&gt;SIGTERM&lt;/code&gt; і &lt;code&gt;SIGKILL&lt;/code&gt;. Ви також не зможете вказати &lt;code&gt;containers[*].lifecycle.stopSignal&lt;/code&gt;, якщо поле &lt;code&gt;spec.os.name&lt;/code&gt; дорівнює nil або не встановлено.&lt;/p&gt;
&lt;h2 id=&#34;how-do-i-get-involved&#34;&gt;Як долучитися?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#how-do-i-get-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/blob/master/sig-node/README.md&#34;&gt;SIG Node&lt;/a&gt;. Якщо ви зацікавлені в тому, щоб допомогти розвивати цю можливість, поділитися відгуками або взяти участь у будь-яких інших поточних проєктах SIG Node, будь ласка, звʼяжіться з нами!&lt;/p&gt;
&lt;p&gt;Ви можете звʼязатися з SIG Node кількома способами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slack: &lt;a href=&#34;https://kubernetes.slack.com/messages/sig-node&#34;&gt;#sig-node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://groups.google.com/forum/#!forum/kubernetes-sig-node&#34;&gt;Список розсилки&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/labels/sig%2Fnode&#34;&gt;Open Community Issues/PRs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ви також можете звʼязатися зі мною напряму:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: @sreeram-venkitesh&lt;/li&gt;
&lt;li&gt;Slack: @sreeram.venkitesh&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.33: Продовження переходу від Endpoints до EndpointSlices</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/04/24/endpoints-deprecation/</link>
      <pubDate>Thu, 24 Apr 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/04/24/endpoints-deprecation/</guid>
      <description>
        
        
        &lt;p&gt;Відтоді як &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2020/09/02/scaling-kubernetes-networking-with-endpointslices/&#34;&gt;EndpointSlices&lt;/a&gt; (&lt;a href=&#34;https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/0752-endpointslices/README.md&#34;&gt;KEP-752&lt;/a&gt;) зʼявились у версії v1.15 як alpha, а згодом стали стабільними (GA) у v1.21, API Endpoints у Kubernetes поступово втрачало актуальність. Нові можливості Service, як-от &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/dual-stack/&#34;&gt;двостекова мережа&lt;/a&gt; та &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#traffic-distribution&#34;&gt;розподіл трафіку&lt;/a&gt;, підтримуються лише через API EndpointSlice, тож усі проксі-сервери сервісів, реалізації Gateway API та подібні контролери мусили перейти від використання Endpoints до EndpointSlices. Наразі API Endpoints існує фактично лише для того, щоб не ламати робочі навантаження та скрипти кінцевих користувачів, які досі його використовують.&lt;/p&gt;
&lt;p&gt;Починаючи з Kubernetes 1.33, API Endpoints офіційно оголошено застарілим, і API-сервер повертатиме попередження користувачам, які читають або записують ресурси Endpoints замість використання EndpointSlices.&lt;/p&gt;
&lt;p&gt;Зрештою, план (як описано в &lt;a href=&#34;https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/4974-deprecate-endpoints/README.md&#34;&gt;KEP-4974&lt;/a&gt;) полягає в тому, щоб змінити критерії &lt;a href=&#34;https://www.cncf.io/training/certification/software-conformance/&#34;&gt;відповідності Kubernetes&lt;/a&gt; так, щоб вони більше не вимагали від кластерів запускати &lt;em&gt;контролер Endpoints&lt;/em&gt; (який генерує обʼєкти Endpoints на основі Service і Podʼів), аби уникнути роботи, яка не потрібна в більшості сучасних кластерів.&lt;/p&gt;
&lt;p&gt;Отже, хоча згідно з &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політикою застарівання Kubernetes&lt;/a&gt; тип Endpoints, ймовірно, ніколи не буде повністю вилучено, користувачам, які досі мають робочі навантаження або скрипти, що використовують API Endpoints, слід починати їх перенесення на EndpointSlices.&lt;/p&gt;
&lt;h2 id=&#34;notes-on-migrating-from-endpoints-to-endpointslices&#34;&gt;Примітки щодо міграції з Endpoints до EndpointSlices&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#notes-on-migrating-from-endpoints-to-endpointslices&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;consuming-endpointslices-rather-than-endpoints&#34;&gt;Використання EndpointSlices замість Endpoints&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#consuming-endpointslices-rather-than-endpoints&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для кінцевих користувачів найбільшою відмінністю між API Endpoints та API EndpointSlice є те, що кожен Service із &lt;code&gt;selector&lt;/code&gt; має рівно один обʼєкт Endpoints (з такою ж назвою, як і сам Service), тоді як у нього може бути будь-яка кількість повʼязаних EndpointSlice:&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; kubectl get endpoints myservice
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;NAME        ENDPOINTS          AGE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;myservice   10.180.3.17:443    1h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;&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;gp&#34;&gt;$&lt;/span&gt; kubectl get endpointslice -l kubernetes.io/service-name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;myservice
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;NAME              ADDRESSTYPE   PORTS   ENDPOINTS          AGE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;myservice-7vzhx   IPv4          443     10.180.3.17        21s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;go&#34;&gt;myservice-jcv8s   IPv6          443     2001:db8:0123::5   21s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;У цьому прикладі сервіс є двостековим (dual-stack), тому має два EndpointSlice: один для IPv4-адрес, інший — для IPv6. (API Endpoints не підтримує подвійний стек, тому обʼєкт Endpoints показує лише адреси з основного сімейства адрес кластера.) Хоча будь-який Service з кількома точками доступу &lt;em&gt;може&lt;/em&gt; мати кілька EndpointSlice, є три основні випадки, коли ви це побачите:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;EndpointSlice може представляти лише точки доступу одного сімейства IP, тож двостекові Service матимуть окремі EndpointSlice для IPv4 та IPv6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Усі точки доступу в EndpointSlice мають бути спрямовані на однакові порти. Тож, наприклад, якщо у вас є набір Podʼів точок доступу, які слухають порт 80, і ви розгортаєте оновлення, щоб натомість вони слухали порт 8080, то поки розгортання триває, Service потребуватиме двох EndpointSlice: одного для точок доступу, що слухають порт 80, і одного для точок доступу, що слухають порт 8080.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Коли Service має понад 100 точок доступу, контролер EndpointSlice розділить їх на кілька EndpointSlice, замість того щоб обʼєднувати їх в один надмірно великий обʼєкт, як це робить контролер Endpoints.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Оскільки між Service і EndpointSlice немає передбачуваного відображення 1:1, неможливо заздалегідь дізнатися, якою буде фактична назва ресурсу (ресурсів) EndpointSlice для Service; тож замість того, щоб отримувати EndpointSlice за назвою, ви запитуєте всі EndpointSlice з &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/overview/working-with-objects/labels/&#34;&gt;міткою&lt;/a&gt; &amp;quot;&lt;code&gt;kubernetes.io/service-name&lt;/code&gt;&amp;quot;, що вказує на Service:&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-console&#34; data-lang=&#34;console&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gp&#34;&gt;$&lt;/span&gt; kubectl get endpointslice -l kubernetes.io/service-name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;myservice
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Подібні зміни потрібні й у Go-коді. Для Endpoints це виглядало б приблизно так:&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;c1&#34;&gt;// Отримати Endpoints з назвою `name` у просторі імен `namespace`.&lt;/span&gt;
&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;endpoint&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;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CoreV1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Endpoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&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;nx&#34;&gt;metav1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GetOptions&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;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;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;apierrors&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;IsNotFound&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 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;// Для Service (ще?) не існує Endpoints&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;		&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&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;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;o&#34;&gt;...&lt;/span&gt;
&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;// обробка `endpoint`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Для EndpointSlice це буде:&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;c1&#34;&gt;// Отримати всі EndpointSlice для Service `name` у просторі імен `namespace`.&lt;/span&gt;
&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;slices&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;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;DiscoveryV1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;EndpointSlices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&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;metav1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ListOptions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LabelSelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;discoveryv1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LabelServiceName&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;name&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;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;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;o&#34;&gt;...&lt;/span&gt;
&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;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;slices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Items&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;mi&#34;&gt;0&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;// Для Service (ще?) не існує EndpointSlice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&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;// обробка `slices.Items`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;generating-endpointslices-rather-than-endpoints&#34;&gt;Генерація EndpointSlices замість Endpoints&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#generating-endpointslices-rather-than-endpoints&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Для користувачів або контролерів, які створюють обʼєкти Endpoints, перехід на EndpointSlices дещо простіший, оскільки в більшості випадків не потрібно опрацьовувати кілька sliceʼів. Достатньо оновити YAML або Go-код, щоб використовувати новий тип (який організовує інформацію дещо інакше, ніж Endpoints).&lt;/p&gt;
&lt;p&gt;Наприклад, цей обʼєкт Endpoints:&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;Endpoints&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;myservice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;subsets&lt;/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;addresses&lt;/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;ip&lt;/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.180.3.17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeName&lt;/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-4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;ip&lt;/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.180.5.22&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeName&lt;/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-9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;ip&lt;/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.180.18.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;nodeName&lt;/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-7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;notReadyAddresses&lt;/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;ip&lt;/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.180.6.6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeName&lt;/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-8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;https&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;443&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;discovery.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;EndpointSlice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;myservice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;kubernetes.io/service-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;myservice&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;addressType&lt;/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;IPv4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;addresses&lt;/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;m&#34;&gt;10.180.3.17&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeName&lt;/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-4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;addresses&lt;/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;m&#34;&gt;10.180.5.22&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeName&lt;/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-9&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;addresses&lt;/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;m&#34;&gt;10.180.18.12&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeName&lt;/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-7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;addresses&lt;/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;m&#34;&gt;10.180.6.6&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodeName&lt;/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-8&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;ready&lt;/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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;https&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&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;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;443&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;ol&gt;
&lt;li&gt;
&lt;p&gt;У цьому прикладі явно вказано &lt;code&gt;name&lt;/code&gt;, але можна використати &lt;code&gt;generateName&lt;/code&gt;, і API-сервер сам додасть унікальний суфікс. Назва обʼєкта не має значення — важлива мітка &lt;code&gt;&amp;quot;kubernetes.io/service-name&amp;quot;&lt;/code&gt;, що вказує на Service.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Необхідно явно вказати &lt;code&gt;addressType: IPv4&lt;/code&gt; (або &lt;code&gt;IPv6&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EndpointSlice подібний до одного елемента масиву &lt;code&gt;&amp;quot;subsets&amp;quot;&lt;/code&gt; в Endpoints. Обʼєкт Endpoints з кількома підмножинами (subsets) зазвичай потрібно буде виразити як кілька EndpointSlice, кожен з іншими &lt;code&gt;&amp;quot;ports&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Поля &lt;code&gt;endpoints&lt;/code&gt; і &lt;code&gt;addresses&lt;/code&gt; — масиви, але за домовленістю кожен масив &lt;code&gt;addresses&lt;/code&gt; містить лише один елемент. Якщо ваш Service має кілька точок доступу, вам потрібно мати кілька елементів у масиві &lt;code&gt;endpoints&lt;/code&gt;, кожен з одним елементом у своєму масиві &lt;code&gt;addresses&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API Endpoints перелічує «готові» та «неготові» точки доступу окремо, тоді як API EndpointSlice дозволяє кожній точці доступу мати повʼязані з нею стани (як-от &amp;quot;&lt;code&gt;ready: false&lt;/code&gt;&amp;quot;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;І, звісно, після переходу на EndpointSlice можна використовувати специфічні для нього можливості, як-от підказки топології та точки доступу, що завершують роботу. Докладніше в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/kubernetes-api/service-resources/endpoint-slice-v1&#34;&gt;документації до API EndpointSlice&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.33: Octarine</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/04/23/kubernetes-v1-33-release/</link>
      <pubDate>Wed, 23 Apr 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/04/23/kubernetes-v1-33-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Редактори:&lt;/strong&gt; Agustina Barbetta, Aakanksha Bhende, Udi Hofesh, Ryota Sawada, Sneha Yadav&lt;/p&gt;
&lt;p&gt;Як і попередні випуски, випуск Kubernetes v1.33 представляє нові стабільні, бета- та альфа-функції. Послідовне постачання високоякісних випусків підкреслює силу нашого циклу розробки та активну підтримку з боку нашої спільноти.&lt;/p&gt;
&lt;p&gt;Цей випуск складається з 64 удосконалень. З них 18 перейшли до стабільного стану, 20 переходять до бета-версії, 24 зʼявилися в альфа-версії, а 2 є застарілими або відкликаними.&lt;/p&gt;
&lt;p&gt;У цьому випуску також є кілька помітних &lt;a href=&#34;#deprecations-and-removals&#34;&gt;застарівань і вилучень&lt;/a&gt;; обовʼязково прочитайте про них, якщо ви вже використовуєте старішу версію Kubernetes.&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-59115--kubernetes-io-main-staging.netlify.app/blog/2025/04/23/kubernetes-v1-33-release/k8s-1.33.svg&#34;
         alt=&#34;Логотип Kubernetes v1.33: Октарин&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Тема Kubernetes v1.33 — &lt;strong&gt;Октарин: Колір магії&lt;/strong&gt;&lt;sup&gt;1&lt;/sup&gt;, натхненням для якої стала серія &lt;em&gt;Дискосвіт&lt;/em&gt; Террі Пратчетта. Цей випуск підкреслює магію відкритого коду&lt;sup&gt;2&lt;/sup&gt;, яку Kubernetes уможливлює в усій екосистемі.&lt;/p&gt;
&lt;p&gt;Якщо ви знайомі зі світом Дискосвіту, ви можете впізнати маленького болотного дракона, що сидить на вежі Невидимого університету й дивиться вгору на місяць Kubernetes над містом Анк-Морпорк з 64 зірками&lt;sup&gt;3&lt;/sup&gt; на задньому плані.&lt;/p&gt;
&lt;p&gt;Оскільки Kubernetes вступає у своє друге десятиліття, ми відзначаємо майстерність його супровідників, допитливість нових учасників та дух співпраці, який живить проєкт. Випуск v1.33 є нагадуванням про те, що, як писав Пратчетт, &lt;em&gt;«Це все одно магія, навіть якщо ви знаєте, як це робиться»&lt;/em&gt;. Навіть якщо ви знаєте всі тонкощі кодової бази Kubernetes, відійшовши на крок назад в кінці циклу випуску, ви зрозумієте, що Kubernetes залишається чарівним.&lt;/p&gt;
&lt;p&gt;Kubernetes v1.33 — це свідчення незмінної сили інновацій з відкритим кодом, де сотні учасників&lt;sup&gt;4&lt;/sup&gt; з усього світу працюють разом, щоб створити щось справді надзвичайне. За кожною новою функцією стоїть робота спільноти Kubernetes над підтримкою та вдосконаленням проєкту, яка гарантує, що він залишається безпечним, надійним та випускається вчасно. Кожен випуск спирається на попередній, створюючи щось більше, ніж ми могли б досягти поодинці.&lt;/p&gt;
&lt;p&gt;&lt;sub&gt;1. Октарин — це міфічний восьмий колір, який бачать лише ті, хто налаштований на таємне: чарівники, відьми та, звісно, коти. А іноді й ті, хто надто довго вдивлявся в правила IPtable.&lt;/sub&gt;&lt;br&gt;
&lt;sub&gt;2. Будь-яка достатньо розвинена технологія не відрізняється від магії…?&lt;/sub&gt;&lt;br&gt;
&lt;sub&gt;3. Не випадково у v1.33 також включено 64 KEP (Kubernetes Enhancement Proposals).&lt;/sub&gt;&lt;br&gt;
&lt;sub&gt;4. Див. розділ «Швидкість проєкту» для v1.33 🚀&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.33 містить багато нових функцій та покращень. Ось кілька вибраних оновлень, на які команда випуску хотіла б звернути увагу!&lt;/p&gt;
&lt;h3 id=&#34;stable-sidecar-containers&#34;&gt;Stable: Sidecar-контейнери&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#stable-sidecar-containers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Шаблон sidecar передбачає розгортання окремих допоміжних контейнерів для роботи з додатковими можливостями в таких сферах, як мережа, ведення журналів і збір метрик. У v1.33 sidecar-контейнери переходять до стабільного стану.&lt;/p&gt;
&lt;p&gt;Kubernetes реалізує sidecar-контейнери як спеціальний клас контейнерів ініціалізації з &lt;code&gt;restartPolicy: Always&lt;/code&gt;, що гарантує, що sidecar-контейнери запускаються перед контейнерами застосунків, залишаються запущеними протягом усього життєвого циклу Podʼа і автоматично завершують свою роботу після завершення роботи основних контейнерів.&lt;/p&gt;
&lt;p&gt;Крім того, sidecar-контейнери можуть використовувати проби (запуску, готовності, життєздатності) для повідомлення про свій робочий стан, а коригування їхніх оцінок Out-Of-Memory (OOM) узгоджено з основними контейнерами, щоб запобігти передчасному завершенню роботи в умовах нестачі памʼяті.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше, прочитайте &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/sidecar-containers/&#34;&gt;Sidecar-контейнери&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/753&#34;&gt;KEP-753: Sidecar Containers&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;beta-in-place-resource-resize-for-vertical-scaling-of-pods&#34;&gt;Beta: Зміна розміру ресурсів на місці для вертикального масштабування Podʼів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#beta-in-place-resource-resize-for-vertical-scaling-of-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Робочі навантаження можна визначити за допомогою API, таких як Deployment, StatefulSet тощо. Вони описують шаблон для Podʼів, які мають бути запущені, включаючи ресурси памʼяті та процесора, а також кількість реплік Podʼів, які мають бути запущені. Робочі навантаження можна масштабувати горизонтально, оновлюючи кількість реплік Podʼів, або вертикально, оновлюючи ресурси, необхідні в контейнері (контейнерах) Podʼів. До цього удосконалення ресурси контейнера, визначені в &lt;code&gt;spec&lt;/code&gt; Podʼа, були незмінними, і оновлення будь-якої з цих деталей у шаблоні Podʼа призводило до заміни Podʼа.&lt;/p&gt;
&lt;p&gt;Але що, якби ви могли динамічно оновлювати конфігурацію ресурсів для наявних Podʼів, не перезапускаючи їх?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP-1287&lt;/a&gt; призначений саме для того, щоб дозволити такі оновлення Podʼів на місці. Його було випущено як альфа-версію у v1.27, а у v1.33 він перейшов до бета-версії. Це відкриває різні можливості для вертикального збільшення масштабу процесів зі станом без жодних простоїв, плавного зменшення масштабу, коли трафік низький, і навіть виділення більших ресурсів під час запуску, які потім можна зменшити після завершення початкового налаштування.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP-1287: In-Place Update of Pod Resources&lt;/a&gt; під керівництвом SIG Node та SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;alpha-new-configuration-option-for-kubectl-with-kuberc-for-user-preferences&#34;&gt;Alpha: Новий параметр конфігурації kubectl за допомогою &lt;code&gt;.kuberc&lt;/code&gt; для налаштувань користувача&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#alpha-new-configuration-option-for-kubectl-with-kuberc-for-user-preferences&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У v1.33 у &lt;code&gt;kubectl&lt;/code&gt; зʼявилася нова альфа-функція з необовʼязковим конфігураційним файлом &lt;code&gt;.kuberc&lt;/code&gt; для налаштувань користувача. Цей файл може містити аліаси та перевизначення &lt;code&gt;kubectl&lt;/code&gt; (наприклад, типове використання &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/server-side-apply/&#34;&gt;server-side apply&lt;/a&gt;), водночас залишаючи облікові дані кластера та інформацію про хост у kubeconfig. Таке розділення дозволяє використовувати одні й ті самі налаштування користувача для взаємодії з &lt;code&gt;kubectl&lt;/code&gt;, незалежно від цільового кластера і використовуваного kubeconfig.&lt;/p&gt;
&lt;p&gt;Щоб увімкнути цю альфа-функцію, користувачі можуть встановити змінну середовища &lt;code&gt;KUBECTL_KUBERC=true&lt;/code&gt; і створити файл конфігурації &lt;code&gt;.kuberc&lt;/code&gt;. Типово &lt;code&gt;kubectl&lt;/code&gt; шукає цей файл у &lt;code&gt;~/.kube/kuberc&lt;/code&gt;. Ви також можете вказати альтернативне розташування за допомогою прапорця &lt;code&gt;--kuberc&lt;/code&gt;, наприклад: &lt;code&gt;kubectl --kuberc /var/kube/rc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3104&#34;&gt;KEP-3104: Separate kubectl user preferences from cluster configs&lt;/a&gt; під керівництвом SIG CLI.&lt;/p&gt;
&lt;h2 id=&#34;features-graduating-to-stable&#34;&gt;Функції, що переходять до статусу Stable&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;&lt;em&gt;Це добірка деяких покращень, які стали стабільними після випуску v1.33.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;backoff-limits-per-index-for-indexed-jobs&#34;&gt;Ліміти повторних спроб для кожного індексу для Indexed Job&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#backoff-limits-per-index-for-indexed-jobs&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У цьому випуску до стабільного стану переходить функція, яка дозволяє встановлювати ліміти повторних спроб для кожного індексу окремо для Indexed Job. Традиційно параметр &lt;code&gt;backoffLimit&lt;/code&gt; у Job Kubernetes задає кількість повторних спроб, після яких весь Job вважається невдалим. Це удосконалення дозволяє кожному індексу в Indexed Job мати власний ліміт повторних спроб, забезпечуючи детальніший контроль над поведінкою повторних спроб для окремих завдань. Це гарантує, що збій певних індексів не призведе до передчасного завершення всього Job, дозволяючи іншим індексам продовжувати обробку незалежно.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3850&#34;&gt;KEP-3850: Backoff Limit Per Index For Indexed Jobs&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;job-success-policy&#34;&gt;Політика успіху Job&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#job-success-policy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Використовуючи &lt;code&gt;.spec.successPolicy&lt;/code&gt;, користувачі можуть вказати, які індекси Podʼів мають завершитися успішно (&lt;code&gt;succeededIndexes&lt;/code&gt;), скільки Podʼів мають завершитися успішно (&lt;code&gt;succeededCount&lt;/code&gt;), або комбінацію обох параметрів. Ця функція корисна для різних робочих навантажень, включаючи симуляції, де достатньо часткового завершення, і шаблони «лідер-працівник», де тільки успіх лідера визначає загальний результат Job.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3998&#34;&gt;KEP-3998: Job success/completion policy&lt;/a&gt; під керівництвом SIG Apps.&lt;/p&gt;
&lt;h3 id=&#34;bound-serviceaccount-token-security-improvements&#34;&gt;Покращення безпеки привʼязаних токенів ServiceAccount&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#bound-serviceaccount-token-security-improvements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це удосконалення запровадило такі функції, як включення до токенів унікального ідентифікатора токена (тобто &lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.7&#34;&gt;JWT ID Claim, також відомого як JTI&lt;/a&gt;) та інформації про вузол, що дозволяє точніше перевіряти токени та проводити аудит. Крім того, воно підтримує обмеження для конкретних вузлів, гарантуючи, що токени можуть бути використані тільки на визначених вузлах, тим самим знижуючи ризик зловживання токенами і потенційних порушень безпеки. Ці покращення, які тепер є загальнодоступними, мають на меті покращити загальний стан безпеки токенів службових облікових записів у кластерах Kubernetes.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4193&#34;&gt;KEP-4193: Bound service account token improvements&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;subresource-support-in-kubectl&#34;&gt;Підтримка субресурсів у kubectl&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#subresource-support-in-kubectl&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Аргумент &lt;code&gt;--subresource&lt;/code&gt; тепер є загальнодоступним для таких підкоманд kubectl, як &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;patch&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt; і &lt;code&gt;replace&lt;/code&gt;, що дозволяє користувачам отримувати та оновлювати субресурси для всіх ресурсів, які їх підтримують. Щоб дізнатися більше про підтримувані субресурси, відвідайте &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/kubectl/conventions/#subresources&#34;&gt;довідник kubectl&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/2590&#34;&gt;KEP-2590: Add subresource support to kubectl&lt;/a&gt; під керівництвом SIG CLI.&lt;/p&gt;
&lt;h3 id=&#34;multiple-service-cidrs&#34;&gt;Кілька Service CIDR&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#multiple-service-cidrs&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це удосконалення запровадило нову реалізацію логіки виділення IP-адрес для Service. У всьому кластері кожен Service з &lt;code&gt;type: ClusterIP&lt;/code&gt; повинен мати унікальну призначену йому IP-адресу. Спроба створити Service з певною кластерною IP-адресою, яку вже було виділено, призведе до помилки. Оновлена логіка виділення IP-адрес використовує два нові стабільні обʼєкти API: &lt;code&gt;ServiceCIDR&lt;/code&gt; і &lt;code&gt;IPAddress&lt;/code&gt;. Тепер ці API є загальнодоступними і дозволяють адміністраторам кластерів динамічно збільшувати кількість IP-адрес, доступних для Service з &lt;code&gt;type: ClusterIP&lt;/code&gt; (шляхом створення нових обʼєктів ServiceCIDR).&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/1880&#34;&gt;KEP-1880: Multiple Service CIDRs&lt;/a&gt; під керівництвом SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;nftables-backend-for-kube-proxy&#34;&gt;Бекенд &lt;code&gt;nftables&lt;/code&gt; для kube-proxy&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#nftables-backend-for-kube-proxy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Бекенд &lt;code&gt;nftables&lt;/code&gt; для kube-proxy тепер стабільний; він додає нову реалізацію, яка значно покращує продуктивність і масштабованість реалізації Service у кластерах Kubernetes. З міркувань сумісності &lt;code&gt;iptables&lt;/code&gt; залишається типовим на вузлах Linux. Ознайомтеся з &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/networking/virtual-ips/#migrating-from-iptables-mode-to-nftables&#34;&gt;посібником з міграції&lt;/a&gt;, якщо ви хочете спробувати.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3866&#34;&gt;KEP-3866: nftables kube-proxy backend&lt;/a&gt; під керівництвом SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;topology-aware-routing-with-trafficdistribution-preferclose&#34;&gt;Маршрутизація з урахуванням топології за допомогою &lt;code&gt;trafficDistribution: PreferClose&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#topology-aware-routing-with-trafficdistribution-preferclose&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У цьому випуску маршрутизація з урахуванням топології та розподіл трафіку переходять до GA, що дозволяє оптимізувати трафік сервісів у багатозонних кластерах. Підказки з урахуванням топології в EndpointSlices дозволяють таким компонентам, як kube-proxy, надавати пріоритет маршрутизації трафіку до кінцевих точок у межах однієї зони, тим самим зменшуючи затримки і витрати на передачу даних між зонами. На основі цього до специфікації Service додано поле &lt;code&gt;trafficDistribution&lt;/code&gt;, а опція &lt;code&gt;PreferClose&lt;/code&gt; спрямовує трафік до найближчих доступних кінцевих точок, виходячи з топології мережі. Така конфігурація підвищує продуктивність та економічну ефективність за рахунок мінімізації міжзонового звʼязку.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4444&#34;&gt;KEP-4444: Traffic Distribution for Services&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/2433&#34;&gt;KEP-2433: Topology Aware Routing&lt;/a&gt; під керівництвом SIG Network.&lt;/p&gt;
&lt;h3 id=&#34;options-to-reject-non-smt-aligned-workload&#34;&gt;Опції для відхилення робочих навантажень, не узгоджених з SMT&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#options-to-reject-non-smt-aligned-workload&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція додала до CPU Manager параметри політики, що дозволяють йому відхиляти робочі навантаження, які не узгоджуються з конфігураціями одночасної багатопоточності (Simultaneous Multithreading, SMT). Це удосконалення, яке тепер є загальнодоступним, гарантує, що коли Pod запитує ексклюзивне використання ядер процесора, CPU Manager може примусово виділяти цілі пари ядер (що складаються з основного і сусіднього потоків) на системах з увімкненим SMT, таким чином запобігаючи сценаріям, коли робочі навантаження ненавмисно спільно використовують ресурси процесора.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/2625&#34;&gt;KEP-2625: node: cpumanager: add options to reject non SMT-aligned workload&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;defining-pod-affinity-or-anti-affinity-using-matchlabelkeys-and-mismatchlabelkeys&#34;&gt;Визначення спорідненості або антиспорідненості Podʼів за допомогою &lt;code&gt;matchLabelKeys&lt;/code&gt; та &lt;code&gt;mismatchLabelKeys&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#defining-pod-affinity-or-anti-affinity-using-matchlabelkeys-and-mismatchlabelkeys&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Поля &lt;code&gt;matchLabelKeys&lt;/code&gt; і &lt;code&gt;mismatchLabelKeys&lt;/code&gt; доступні в умовах спорідненості Podʼів, що дозволяє користувачам точно контролювати область, в якій очікується співіснування Podʼів (Affinity) чи ні (AntiAffinity). Ці нові стабільні опції доповнюють наявний механізм &lt;code&gt;labelSelector&lt;/code&gt;. Поля спорідненості сприяють кращому плануванню для різноманітних поступових оновлень, а також ізоляції сервісів, керованих інструментами або контролерами на основі глобальних конфігурацій.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3633&#34;&gt;KEP-3633: Introduce MatchLabelKeys to Pod Affinity and Pod Anti Affinity&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;considering-taints-and-tolerations-when-calculating-pod-topology-spread-skew&#34;&gt;Врахування taint та toleration під час обчислення відхилення розподілу Podʼів за топологією&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#considering-taints-and-tolerations-when-calculating-pod-topology-spread-skew&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це удосконалило &lt;code&gt;PodTopologySpread&lt;/code&gt;, додавши два поля: &lt;code&gt;nodeAffinityPolicy&lt;/code&gt; та &lt;code&gt;nodeTaintsPolicy&lt;/code&gt;. Ці поля дозволяють користувачам вказати, чи слід враховувати правила спорідненості вузлів та позначки taint вузлів під час обчислення розподілу Podʼів між вузлами. Типово &lt;code&gt;nodeAffinityPolicy&lt;/code&gt; має значення &lt;code&gt;Honor&lt;/code&gt;, що означає, що до обчислення розподілу включаються лише вузли, які відповідають спорідненості вузлів або селектору вузлів Podʼа. Значення &lt;code&gt;nodeTaintsPolicy&lt;/code&gt; типово дорівнює &lt;code&gt;Ignore&lt;/code&gt;, що вказує на те, що позначки taint вузлів не враховуються, якщо це не вказано. Це удосконалення забезпечує детальніший контроль за розміщенням Podʼів, гарантуючи, що Podʼи будуть заплановані на вузлах, які відповідають як вимогам спорідненості, так і вимогам toleration до позначок taint, таким чином запобігаючи сценаріям, коли Podʼи залишаються в стані очікування через незадоволені обмеження.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3094&#34;&gt;KEP-3094: Take taints/tolerations into consideration when calculating PodTopologySpread skew&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;volume-populators&#34;&gt;Заповнювачі томів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#volume-populators&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Після випуску бета-версії у v1.24 &lt;em&gt;заповнювачі томів&lt;/em&gt; перейшли до GA у v1.33. Ця нова стабільна функція дозволяє користувачам попередньо заповнювати томи даними з різних джерел, а не лише з клонів PersistentVolumeClaim (PVC) або знімків томів. Механізм ґрунтується на полі &lt;code&gt;dataSourceRef&lt;/code&gt; у PersistentVolumeClaim. Це поле забезпечує більшу гнучкість, ніж наявне поле &lt;code&gt;dataSource&lt;/code&gt;, і дозволяє використовувати власні ресурси як джерела даних.&lt;/p&gt;
&lt;p&gt;Спеціальний контролер, &lt;code&gt;volume-data-source-validator&lt;/code&gt;, перевіряє ці посилання на джерела даних разом з новим стабільним CustomResourceDefinition (CRD) для виду API з назвою VolumePopulator. API VolumePopulator дозволяє контролерам заповнювачів томів реєструвати типи джерел даних, які вони підтримують. Щоб користуватися заповнювачами томів, вам потрібно налаштувати ваш кластер з відповідним CRD.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/1495&#34;&gt;KEP-1495: Generic data populators&lt;/a&gt; під керівництвом SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;always-honor-persistentvolume-reclaim-policy&#34;&gt;Завжди дотримуватися політики повторного використання PersistentVolume&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#always-honor-persistentvolume-reclaim-policy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це удосконалення вирішило проблему, коли політика повторного використання постійних томів (Persistent Volume, PV) не завжди дотримується, що призводить до потенційних витоків ресурсів сховища. Зокрема, якщо PV видаляється раніше, ніж повʼязана з ним заявка на постійний том (Persistent Volume Claim, PVC), політика повторного використання &amp;quot;Delete&amp;quot; може не виконуватися, залишаючи базові ресурси сховища недоторканими. Щоб запобігти цьому, Kubernetes тепер встановлює завершувачі на відповідні PV, гарантуючи, що політика повторного використання буде застосована незалежно від послідовності видалення. Це удосконалення запобігає ненавмисному збереженню ресурсів сховища та підтримує узгодженість в управлінні життєвим циклом PV.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/2644&#34;&gt;KEP-2644: Always Honor PersistentVolume Reclaim Policy&lt;/a&gt; під керівництвом SIG Storage.&lt;/p&gt;
&lt;h2 id=&#34;new-features-in-beta&#34;&gt;Нові функції в Beta&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#new-features-in-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Це добірка деяких покращень, які стали бета-версією після випуску v1.33.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;support-for-direct-service-return-dsr-in-windows-kube-proxy&#34;&gt;Підтримка Direct Service Return (DSR) у Windows kube-proxy&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-for-direct-service-return-dsr-in-windows-kube-proxy&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;DSR забезпечує оптимізацію продуктивності, дозволяючи зворотному трафіку, що проходить через балансувальники навантаження, оминати балансувальник навантаження і відповідати безпосередньо клієнту, зменшуючи навантаження на балансувальник навантаження, а також загальну затримку. Для отримання інформації про DSR у Windows прочитайте &lt;a href=&#34;https://techcommunity.microsoft.com/blog/networkingblog/direct-server-return-dsr-in-a-nutshell/693710&#34;&gt;Direct Server Return (DSR) in a nutshell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Підтримку DSR, вперше представлену у v1.14, SIG Windows перевела до бета-версії в рамках &lt;a href=&#34;https://kep.k8s.io/5100&#34;&gt;KEP-5100: Support for Direct Service Return (DSR) and overlay networking in Windows kube-proxy&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;structured-parameter-support&#34;&gt;Підтримка структурованих параметрів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#structured-parameter-support&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Хоча підтримка структурованих параметрів залишається бета-функцією в Kubernetes v1.33, ця основна частина динамічного виділення ресурсів (DRA) зазнала значних покращень. Нова версія v1beta2 спрощує API &lt;code&gt;resource.k8s.io&lt;/code&gt;, і звичайні користувачі з кластерною роллю &lt;code&gt;edit&lt;/code&gt; у межах простору імен тепер можуть використовувати DRA.&lt;/p&gt;
&lt;p&gt;У &lt;code&gt;kubelet&lt;/code&gt; додано підтримку безперебійного оновлення, що дозволяє драйверам, розгорнутим як DaemonSet, використовувати механізм поступового оновлення. Для реалізацій DRA це запобігає видаленню і повторному створенню ResourceSlice, дозволяючи їм залишатися незмінними під час оновлень. Крім того, було введено 30-секундний пільговий період перед тим, як &lt;code&gt;kubelet&lt;/code&gt; виконає очищення після скасування реєстрації драйвера, що забезпечує кращу підтримку для драйверів, які не використовують поступові оновлення.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4381&#34;&gt;KEP-4381: DRA: structured parameters&lt;/a&gt; силами WG Device Management, міжфункціональної команди, до складу якої входять SIG Node, SIG Scheduling і SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;dynamic-resource-allocation-dra-for-network-interfaces&#34;&gt;Динамічне виділення ресурсів (DRA) для мережевих інтерфейсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dynamic-resource-allocation-dra-for-network-interfaces&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Стандартизоване звітування про дані мережевих інтерфейсів за допомогою DRA, запроваджене у v1.32, перейшло до бета-версії у v1.33. Це уможливлює більш природну інтеграцію з мережею Kubernetes, спрощуючи розробку та керування мережевими пристроями. Раніше про це було написано в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/12/11/kubernetes-v1-32-release/#dra-standardized-network-interface-data-for-resource-claim-status&#34;&gt;дописі блогу з анонсом випуску v1.32&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4817&#34;&gt;KEP-4817: DRA: Resource Claim Status with possible standardized network interface data&lt;/a&gt; під керівництвом SIG Network, SIG Node та WG Device Management.&lt;/p&gt;
&lt;h3 id=&#34;handle-unscheduled-pods-early-when-scheduler-does-not-have-any-pod-on-activeq&#34;&gt;Рання обробка незапланованих Podʼів, коли планувальник не має жодного Podʼа в activeQ&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#handle-unscheduled-pods-early-when-scheduler-does-not-have-any-pod-on-activeq&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція покращує поведінку планування черги. За лаштунками планувальник досягає цього, вибираючи з &lt;em&gt;backoffQ&lt;/em&gt; Podʼи, які не було відкладено через помилки, коли &lt;em&gt;activeQ&lt;/em&gt; порожня. Раніше планувальник простоював, навіть якщо &lt;em&gt;activeQ&lt;/em&gt; була порожньою; це удосконалення покращує ефективність планування, запобігаючи цьому.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/5142&#34;&gt;KEP-5142: Pop pod from backoffQ when activeQ is empty&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;asynchronous-preemption-in-the-kubernetes-scheduler&#34;&gt;Асинхронне витіснення у планувальнику Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#asynchronous-preemption-in-the-kubernetes-scheduler&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Витіснення гарантує, що Podʼи з вищим пріоритетом отримають необхідні їм ресурси, виселивши Podʼи з нижчим пріоритетом. Асинхронне витіснення, представлене у v1.32 як альфа-версія, у v1.33 перейшло до бета-версії. Завдяки цьому удосконаленню важкі операції, такі як виклики API для видалення Podʼів, обробляються паралельно, що дозволяє планувальнику продовжувати планувати інші Podʼи без затримок. Це покращення особливо корисне для кластерів з високим рівнем плинності Podʼів або частими збоями в плануванні, забезпечуючи ефективніший та стійкіший процес планування.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4832&#34;&gt;KEP-4832: Asynchronous preemption in the scheduler&lt;/a&gt; під керівництвом SIG Scheduling.&lt;/p&gt;
&lt;h3 id=&#34;clustertrustbundles&#34;&gt;ClusterTrustBundles&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#clustertrustbundles&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;ClusterTrustBundle, ресурс рівня кластера, призначений для зберігання якорів довіри X.509 (кореневих сертифікатів), перейшов до бета-версії у v1.33. Цей API полегшує підписувачам сертифікатів у кластері публікацію та передачу якорів довіри X.509 робочим навантаженням кластера.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3257&#34;&gt;KEP-3257: ClusterTrustBundles (previously Trust Anchor Sets)&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;fine-grained-supplementalgroups-control&#34;&gt;Детальний контроль SupplementalGroups&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#fine-grained-supplementalgroups-control&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Вперше зʼявившись у v1.31, ця функція перейшла до бета-версії у v1.33 і тепер є типово увімкненою. За умови, що у вашому кластері увімкнено функціональну можливість &lt;code&gt;SupplementalGroupsPolicy&lt;/code&gt;, поле &lt;code&gt;supplementalGroupsPolicy&lt;/code&gt; у &lt;code&gt;securityContext&lt;/code&gt; Podʼа підтримує дві політики: типова політика Merge підтримує зворотну сумісність, обʼєднуючи вказані групи з групами з файлу &lt;code&gt;/etc/group&lt;/code&gt; образу контейнера, тоді як нова політика Strict застосовується тільки до явно визначених груп.&lt;/p&gt;
&lt;p&gt;Це удосконалення допомагає розвʼязати проблеми безпеки, коли неявне членство в групах з образів контейнерів може призвести до непередбачуваних дозволів на доступ до файлів і обходу засобів контролю політик.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3619&#34;&gt;KEP-3619: Fine-grained SupplementalGroups control&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;support-for-mounting-images-as-volumes&#34;&gt;Підтримка монтування образів як томів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-for-mounting-images-as-volumes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Підтримка використання образів Open Container Initiative (OCI) як томів у Podʼах, що зʼявилася у v1.31, перейшла до бета-версії. Ця функція дозволяє користувачам вказувати посилання на образ як том у Podʼі, повторно використовуючи його як точку монтування тому в контейнерах. Це відкриває можливість пакувати дані тому окремо і спільно використовувати їх між контейнерами в Podʼі, не включаючи їх до основного образу, тим самим зменшуючи вразливості і спрощуючи створення образів.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4639&#34;&gt;KEP-4639: VolumeSource: OCI Artifact and/or Image&lt;/a&gt; під керівництвом SIG Node та SIG Storage.&lt;/p&gt;
&lt;h3 id=&#34;support-for-user-namespaces-within-linux-pods&#34;&gt;Підтримка просторів імен користувачів у Linux Podʼах&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-for-user-namespaces-within-linux-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Одним із найстаріших відкритих KEP на момент написання цієї статті є &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP-127&lt;/a&gt;, покращення безпеки Podʼів за допомогою &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/user-namespaces/&#34;&gt;просторів імен користувачів&lt;/a&gt; Linux. Цей KEP був вперше відкритий наприкінці 2016 року і після декількох ітерацій отримав альфа-випуск у v1.25, початкову бета-версію у v1.30 (де він був типово вимкнений), а у v1.33 перейшов до типово увімкненої бета-версії.&lt;/p&gt;
&lt;p&gt;Ця підтримка не вплине на наявні Podʼи, якщо ви вручну не вкажете &lt;code&gt;pod.spec.hostUsers&lt;/code&gt;, щоб увімкнути її. Як зазначено в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/03/12/kubernetes-1-30-upcoming-changes/&#34;&gt;дописі блогу з попереднім оглядом v1.30&lt;/a&gt;, це важлива віха для усунення вразливостей.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP-127: Support User Namespaces in pods&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;pod-procmount-option&#34;&gt;Опція &lt;code&gt;procMount&lt;/code&gt; для Podʼа&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pod-procmount-option&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Параметр &lt;code&gt;procMount&lt;/code&gt;, представлений як альфа-версія у v1.12 і як типово вимкнена бета-версія у v1.31, у v1.33 став типово увімкненою бета-версією. Це удосконалення покращує ізоляцію Podʼів, дозволяючи користувачам тонко налаштовувати доступ до файлової системи &lt;code&gt;/proc&lt;/code&gt;. Зокрема, воно додає до &lt;code&gt;securityContext&lt;/code&gt; Podʼа поле, яке дозволяє перевизначити типову поведінку маскування та позначення певних шляхів &lt;code&gt;/proc&lt;/code&gt; як доступних лише для читання. Це особливо корисно у випадках, коли користувачі хочуть запускати непривілейовані контейнери всередині Podʼа Kubernetes з використанням просторів імен користувачів. Зазвичай середовище виконання контейнерів (через реалізацію CRI) запускає зовнішній контейнер із суворими параметрами монтування &lt;code&gt;/proc&lt;/code&gt;. Однак для успішного запуску вкладених контейнерів у непривілейованому Podʼі користувачам потрібен механізм для послаблення цих типових налаштувань, і ця функція надає саме це.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4265&#34;&gt;KEP-4265: add ProcMount option&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;cpumanager-policy-to-distribute-cpus-across-numa-nodes&#34;&gt;Політика CPUManager для розподілу CPU між вузлами NUMA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#cpumanager-policy-to-distribute-cpus-across-numa-nodes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція додає нову опцію політики для CPU Manager, яка дозволяє розподіляти CPU між вузлами NUMA (Non-Uniform Memory Access), замість того, щоб концентрувати їх на одному вузлі. Вона оптимізує виділення ресурсів CPU, балансуючи робочі навантаження між декількома вузлами NUMA, тим самим покращуючи продуктивність і використання ресурсів у системах з кількома вузлами NUMA.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/2902&#34;&gt;KEP-2902: Add CPUManager policy option to distribute CPUs across NUMA nodes instead of packing them&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;zero-second-sleeps-for-container-prestop-hooks&#34;&gt;Нуль-секундний сон для хуків PreStop контейнера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#zero-second-sleeps-for-container-prestop-hooks&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes 1.29 було введено дію Sleep для хука життєвого циклу &lt;code&gt;preStop&lt;/code&gt; у Podʼах, яка дозволяє контейнерам призупиняти роботу на певний час перед завершенням. Це забезпечує простий спосіб затримки вимкнення контейнера, полегшуючи виконання таких завдань, як drain зʼєднань або операції очищення.&lt;/p&gt;
&lt;p&gt;Дія Sleep у хуку &lt;code&gt;preStop&lt;/code&gt; тепер може приймати нульову тривалість як бета-функція. Це дає змогу визначати хук &lt;code&gt;preStop&lt;/code&gt;, який нічого не робить (no-op), що корисно у випадках, коли хук &lt;code&gt;preStop&lt;/code&gt; потрібен, але затримка не бажана.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/3960&#34;&gt;KEP-3960: Introducing Sleep Action for PreStop Hook&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/4818&#34;&gt;KEP-4818: Allow zero value for Sleep Action of PreStop Hook&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;internal-tooling-for-declarative-validation-of-kubernetes-native-types&#34;&gt;Внутрішній інструментарій для декларативної валідації нативних типів Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#internal-tooling-for-declarative-validation-of-kubernetes-native-types&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;За лаштунками внутрішні механізми Kubernetes починають використовувати новий механізм валідації обʼєктів та змін до обʼєктів. У Kubernetes v1.33 представлено &lt;code&gt;validation-gen&lt;/code&gt;, внутрішній інструмент, який учасники Kubernetes використовують для створення декларативних правил валідації. Загальна мета полягає у підвищенні надійності та зручності підтримки валідації API, надаючи розробникам можливість декларативно вказувати обмеження валідації, зменшуючи кількість помилок ручного кодування та забезпечуючи узгодженість у кодовій базі.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/5073&#34;&gt;KEP-5073: Declarative Validation Of Kubernetes Native Types With validation-gen&lt;/a&gt; під керівництвом SIG API Machinery.&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;p&gt;&lt;em&gt;Це добірка деяких покращень, які стали альфа-версією після випуску v1.33.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;configurable-tolerance-for-horizontalpodautoscalers&#34;&gt;Налаштовуване допустиме відхилення для HorizontalPodAutoscalers&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configurable-tolerance-for-horizontalpodautoscalers&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція запроваджує налаштовуване допустиме відхилення для HorizontalPodAutoscalers, яке помʼякшує реакцію масштабування на невеликі зміни метрик.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4951&#34;&gt;KEP-4951: Configurable tolerance for Horizontal Pod Autoscalers&lt;/a&gt; під керівництвом SIG Autoscaling.&lt;/p&gt;
&lt;h3 id=&#34;configurable-container-restart-delay&#34;&gt;Налаштовувана затримка перезапуску контейнера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#configurable-container-restart-delay&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Представлена у v1.32 як alpha1, ця функція надає набір конфігурацій на рівні kubelet для тонкого налаштування способу обробки CrashLoopBackOff.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4603&#34;&gt;KEP-4603: Tune CrashLoopBackOff&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;custom-container-stop-signals&#34;&gt;Власні сигнали зупинки контейнера&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#custom-container-stop-signals&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;До Kubernetes v1.33 сигнали зупинки можна було встановити лише у визначеннях образів контейнерів (наприклад, за допомогою поля конфігурації &lt;code&gt;StopSignal&lt;/code&gt; у метаданих образу). Якщо ви хотіли змінити поведінку завершення, вам потрібно було створити власний образ контейнера. Увімкнувши (альфа) функціональну можливість &lt;code&gt;ContainerStopSignals&lt;/code&gt; у Kubernetes v1.33, ви тепер можете визначати власні сигнали зупинки безпосередньо у специфікаціях Podʼів. Сигнал визначається у полі &lt;code&gt;lifecycle.stopSignal&lt;/code&gt; контейнера і вимагає наявності поля &lt;code&gt;spec.os.name&lt;/code&gt; Podʼа. Якщо його не вказано, контейнери використовують сигнал зупинки, визначений в образі (якщо він є), або типовий сигнал середовища виконання контейнерів (зазвичай SIGTERM для Linux).&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4960&#34;&gt;KEP-4960: Container Stop Signals&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;dra-enhancements-galore&#34;&gt;Безліч удосконалень DRA!&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-enhancements-galore&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У Kubernetes v1.33 продовжено розвиток динамічного виділення ресурсів (DRA) з функціями, призначеними для сучасних складних інфраструктур. DRA — це API для запиту та спільного використання ресурсів між Podʼами і контейнерами всередині Podʼа. Зазвичай такими ресурсами є пристрої, такі як графічні процесори, FPGA та мережеві адаптери.&lt;/p&gt;
&lt;p&gt;Нижче перераховані всі альфа-функціональні можливості DRA, представлені у v1.33:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Подібно до позначок taint вузлів, якщо увімкнути функціональну можливість &lt;code&gt;DRADeviceTaints&lt;/code&gt;, пристрої підтримують taint та toleration. Адміністратор або компонент панелі управління може додати пристроям позначки taint, щоб обмежити їхнє використання. Планування Podʼів, які залежать від цих пристроїв, може бути призупинено, поки існує taint, і/або Podʼи, які використовують пристрій з taint, можуть бути виселені.&lt;/li&gt;
&lt;li&gt;Якщо увімкнути функціональну можливість &lt;code&gt;DRAPrioritizedList&lt;/code&gt;, DeviceRequests отримують нове поле з назвою &lt;code&gt;firstAvailable&lt;/code&gt;. Це поле є впорядкованим списком, який дозволяє користувачеві вказати, що запит може бути задоволено різними способами, зокрема не виділяючи взагалі нічого, якщо певне обладнання недоступне.&lt;/li&gt;
&lt;li&gt;З увімкненою функціональною можливістю &lt;code&gt;DRAAdminAccess&lt;/code&gt; лише користувачі, які мають право створювати обʼєкти ResourceClaim або ResourceClaimTemplate у просторах імен, позначених міткою &lt;code&gt;resource.k8s.io/admin-access: &amp;quot;true&amp;quot;&lt;/code&gt;, можуть використовувати поле &lt;code&gt;adminAccess&lt;/code&gt;. Це гарантує, що користувачі, які не мають прав адміністратора, не зможуть зловживати функцією &lt;code&gt;adminAccess&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Хоча використовувати розділи пристроїв можна було ще з v1.31, постачальникам доводилося попередньо розбивати пристрої на розділи і оголошувати їх відповідним чином. Якщо увімкнути функціональну можливість &lt;code&gt;DRAPartitionableDevices&lt;/code&gt; у v1.33, постачальники пристроїв можуть оголошувати декілька розділів, у тому числі ті, що перетинаються. Планувальник Kubernetes вибере розділ на основі запитів робочого навантаження і запобігатиме одночасному виділенню конфліктуючих розділів. Ця функція дає постачальникам можливість динамічно створювати розділи під час виділення. Виділення та динамічне створення розділів відбуваються автоматично і є прозорими для користувачів, що сприяє кращому використанню ресурсів.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ці функціональні можливості не мають жодного ефекту, якщо ви також не увімкнете функціональну можливість &lt;code&gt;DynamicResourceAllocation&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/5055&#34;&gt;KEP-5055: DRA: device taints and tolerations&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/4816&#34;&gt;KEP-4816: DRA: Prioritized Alternatives in Device Requests&lt;/a&gt;, &lt;a href=&#34;https://kep.k8s.io/5018&#34;&gt;KEP-5018: DRA: AdminAccess for ResourceClaims and ResourceClaimTemplates&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/4815&#34;&gt;KEP-4815: DRA: Add support for partitionable devices&lt;/a&gt; під керівництвом SIG Node, SIG Scheduling та SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;robust-image-pull-policy-to-authenticate-images-for-ifnotpresent-and-never&#34;&gt;Надійна політика витягування образів для автентифікації образів для &lt;code&gt;IfNotPresent&lt;/code&gt; та &lt;code&gt;Never&lt;/code&gt;&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#robust-image-pull-policy-to-authenticate-images-for-ifnotpresent-and-never&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція дозволяє користувачам гарантувати, що kubelet вимагає перевірки автентифікації під час витягування образу для кожного нового набору облікових даних, незалежно від того, чи образ вже присутній на вузлі.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/2535&#34;&gt;KEP-2535: Ensure secret pulled images&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h3 id=&#34;node-topology-labels-are-available-via-downward-api&#34;&gt;Мітки топології вузлів доступні через downward API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#node-topology-labels-are-available-via-downward-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція дозволяє надавати мітки топології вузлів через downward API. До Kubernetes v1.33 обхідний шлях передбачав використання контейнера ініціалізації для запиту до API Kubernetes щодо вузла, на якому працює Pod; ця альфа-функція спрощує доступ робочих навантажень до інформації про топологію вузла.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4742&#34;&gt;KEP-4742: Expose Node labels via downward API&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;better-pod-status-with-generation-and-observed-generation&#34;&gt;Кращий статус Podʼів завдяки generation та observed generation&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#better-pod-status-with-generation-and-observed-generation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;До цієї зміни поле &lt;code&gt;metadata.generation&lt;/code&gt; не використовувалося в Podʼах. Разом з розширенням підтримки &lt;code&gt;metadata.generation&lt;/code&gt; ця функція запровадить &lt;code&gt;status.observedGeneration&lt;/code&gt;, щоб забезпечити чіткіший статус Podʼів.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/5067&#34;&gt;KEP-5067: Pod Generation&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;support-for-split-level-3-cache-architecture-with-kubelet-s-cpu-manager&#34;&gt;Підтримка архітектури розділеного кешу 3-го рівня в CPU Manager kubelet&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-for-split-level-3-cache-architecture-with-kubelet-s-cpu-manager&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Попередній CPU Manager kubelet не знав про архітектуру розділеного кешу L3 (також відомого як кеш останнього рівня, Last Level Cache, LLC) і потенційно міг розподіляти призначення CPU без урахування розділеного кешу L3, що спричиняло проблему шумних сусідів. Ця альфа-функція вдосконалює CPU Manager, щоб краще призначати ядра CPU для кращої продуктивності.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/5109&#34;&gt;KEP-5109: Split L3 Cache Topology Awareness in CPU Manager&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;psi-pressure-stall-information-metrics-for-scheduling-improvements&#34;&gt;Метрики PSI (Pressure Stall Information) для покращень планування&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#psi-pressure-stall-information-metrics-for-scheduling-improvements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція додає на вузлах Linux підтримку надання статистики та метрик PSI за допомогою cgroupv2. Вона дозволяє виявляти дефіцит ресурсів і надає вузлам детальніший контроль над плануванням Podʼів.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4205&#34;&gt;KEP-4205: Support PSI based on cgroupv2&lt;/a&gt; під керівництвом SIG Node.&lt;/p&gt;
&lt;h3 id=&#34;secret-less-image-pulls-with-kubelet&#34;&gt;Витягування образів без Secret за допомогою kubelet&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#secret-less-image-pulls-with-kubelet&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Провайдер облікових даних kubelet, що зберігається на диску, тепер підтримує необовʼязкове отримання токенів Kubernetes ServiceAccount (SA). Це спрощує автентифікацію в реєстрах образів, дозволяючи хмарним провайдерам краще інтегруватися з OIDC-сумісними рішеннями для ідентифікації.&lt;/p&gt;
&lt;p&gt;Цю роботу було виконано в рамках &lt;a href=&#34;https://kep.k8s.io/4412&#34;&gt;KEP-4412: Projected service account tokens for Kubelet image credential providers&lt;/a&gt; під керівництвом SIG Auth.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-v1-33&#34;&gt;Зміна станів, застарівання та вилучення у v1.33&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#graduations-deprecations-and-removals-in-v1-33&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Перехід до стабільного стану&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;Тут перелічено всі функції, які перейшли до стабільного стану (також відомого як &lt;em&gt;загальна доступність&lt;/em&gt;). Повний список оновлень, включно з новими функціями та переходами з альфа-версії до бета-версії, наведено в примітках до випуску.&lt;/p&gt;
&lt;p&gt;Цей випуск містить загалом 18 удосконалень, які стали стабільними:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3094&#34;&gt;Take taints/tolerations into consideration when calculating PodTopologySpread skew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3633&#34;&gt;Introduce &lt;code&gt;MatchLabelKeys&lt;/code&gt; to Pod Affinity and Pod Anti Affinity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4193&#34;&gt;Bound service account token improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1495&#34;&gt;Generic data populators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1880&#34;&gt;Multiple Service CIDRs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/2433&#34;&gt;Topology Aware Routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/2589&#34;&gt;Portworx file in-tree to CSI driver migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/2644&#34;&gt;Always Honor PersistentVolume Reclaim Policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3866&#34;&gt;nftables kube-proxy backend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4004&#34;&gt;Deprecate status.nodeInfo.kubeProxyVersion field&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/2590&#34;&gt;Add subresource support to kubectl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3850&#34;&gt;Backoff Limit Per Index For Indexed Jobs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3998&#34;&gt;Job success/completion policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/753&#34;&gt;Sidecar Containers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4008&#34;&gt;CRD Validation Ratcheting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/2625&#34;&gt;node: cpumanager: add options to reject non SMT-aligned workload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4444&#34;&gt;Traffic Distribution for Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3857&#34;&gt;Recursive Read-only (RRO) mounts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;deprecations-and-removals&#34;&gt;Застарівання та вилучення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecations-and-removals&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У міру розвитку та дозрівання Kubernetes функції можуть ставати застарілими, вилучатися або замінюватися кращими, щоб покращити загальний стан проєкту. Докладніше про цей процес дивіться в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політиці застарівання та вилучення&lt;/a&gt; Kubernetes. Про багато з цих застарівань і вилучень було оголошено в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2025/03/26/kubernetes-v1-33-upcoming-changes/&#34;&gt;дописі блогу про застарівання та вилучення&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;deprecation-of-the-stable-endpoints-api&#34;&gt;Застарівання стабільного API Endpoints&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecation-of-the-stable-endpoints-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;API &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/endpoint-slices/&#34;&gt;EndpointSlices&lt;/a&gt; є стабільним з v1.21 і фактично замінив оригінальний API Endpoints. Хоча оригінальний API Endpoints був простим і зрозумілим, він також створював деякі проблеми при масштабуванні на велику кількість мережевих кінцевих точок. API EndpointSlices представив нові функції, такі як двостекова мережа, що робить оригінальний API Endpoints готовим до застарівання.&lt;/p&gt;
&lt;p&gt;Це застарівання впливає тільки на тих, хто використовує API Endpoints безпосередньо з робочих навантажень або скриптів; ці користувачі повинні перейти на використання EndpointSlices. Буде опублікований окремий допис у блозі з детальнішою інформацією про наслідки застарівання і плани міграції.&lt;/p&gt;
&lt;p&gt;Більше інформації можна знайти в &lt;a href=&#34;https://kep.k8s.io/4974&#34;&gt;KEP-4974: Deprecate v1.Endpoints&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;removal-of-kube-proxy-version-information-in-node-status&#34;&gt;Вилучення інформації про версію kube-proxy зі статусу вузла&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#removal-of-kube-proxy-version-information-in-node-status&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Після застарівання у v1.31, як зазначено в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/07/19/kubernetes-1-31-upcoming-changes/#deprecation-of-status-nodeinfo-kubeproxyversion-field-for-nodes-kep-4004-https-github-com-kubernetes-enhancements-issues-4004&#34;&gt;анонсі випуску&lt;/a&gt; v1.31, у v1.33 було вилучено поле &lt;code&gt;.status.nodeInfo.kubeProxyVersion&lt;/code&gt; для Node.&lt;/p&gt;
&lt;p&gt;Це поле встановлювалося kubelet, але його значення не завжди було точним. Оскільки воно було типово вимкнене з v1.31, у v1.33 це поле було повністю вилучено.&lt;/p&gt;
&lt;p&gt;Більше інформації можна знайти в &lt;a href=&#34;https://kep.k8s.io/4004&#34;&gt;KEP-4004: Deprecate status.nodeInfo.kubeProxyVersion field&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;removal-of-in-tree-gitrepo-volume-driver&#34;&gt;Вилучення вбудованого драйвера тому gitRepo&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#removal-of-in-tree-gitrepo-volume-driver&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Тип тому gitRepo є застарілим з v1.11, тобто майже 7 років. Після його застарівання виникали проблеми з безпекою, зокрема те, як типи томів gitRepo можуть бути використані для віддаленого виконання коду від імені root на вузлах. У v1.33 код вбудованого (in-tree) драйвера вилучено.&lt;/p&gt;
&lt;p&gt;Існують альтернативи, такі як git-sync та initContainers. &lt;code&gt;gitVolumes&lt;/code&gt; в API Kubernetes не вилучено, а отже, Podʼи з томами &lt;code&gt;gitRepo&lt;/code&gt; будуть допущені kube-apiserver, але kubeletʼи з функціональною можливістю &lt;code&gt;GitRepoVolumeDriver&lt;/code&gt;, встановленою в false, не запускатимуть їх і повертатимуть користувачеві відповідну помилку. Це дозволяє користувачам за бажанням повторно вмикати драйвер протягом 3 версій, щоб мати достатньо часу для виправлення робочих навантажень.&lt;/p&gt;
&lt;p&gt;Функціональну можливість у kubelet та код вбудованого втулка планується вилучити у випуску v1.39.&lt;/p&gt;
&lt;p&gt;Більше інформації можна знайти в &lt;a href=&#34;https://kep.k8s.io/5040&#34;&gt;KEP-5040: Remove gitRepo volume driver&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;removal-of-host-network-support-for-windows-pods&#34;&gt;Вилучення підтримки мережі хоста для Podʼів Windows&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#removal-of-host-network-support-for-windows-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Мережа Podʼів Windows мала на меті досягти паритету функцій з Linux і забезпечити кращу щільність кластера, дозволивши контейнерам використовувати мережевий простір імен вузла. Початкова реалізація зʼявилася як альфа-версія у v1.26, але оскільки вона зіткнулася з неочікуваною поведінкою containerd і були доступні альтернативні рішення, проєкт Kubernetes вирішив відкликати повʼязаний з нею KEP. Підтримку повністю вилучено у v1.33.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що це не впливає на &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/tasks/configure-pod-container/create-hostprocess-pod/&#34;&gt;контейнери HostProcess&lt;/a&gt;, які надають доступ до мережі хоста, а також доступ на рівні хоста. KEP, відкликаний у v1.33, стосувався надання лише мережі хоста, що ніколи не було стабільним через технічні обмеження мережевої логіки Windows.&lt;/p&gt;
&lt;p&gt;Більше інформації можна знайти в &lt;a href=&#34;https://kep.k8s.io/3503&#34;&gt;KEP-3503: Host network support for Windows pods&lt;/a&gt;.&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Ознайомтеся з повною інформацією про випуск Kubernetes v1.33 у наших &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.33.md&#34;&gt;примітках до випуску&lt;/a&gt;.&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Kubernetes v1.33 доступний для завантаження на &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.33.0&#34;&gt;GitHub&lt;/a&gt; або на &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/releases/download/&#34;&gt;сторінці завантаження Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щоб розпочати роботу з Kubernetes, перегляньте ці &lt;a href=&#34;https://deploy-preview-59115--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.33 за допомогою &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/&#34;&gt;kubeadm&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;release-team&#34;&gt;Команда випуску&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;Kubernetes можливий лише завдяки підтримці, відданості та наполегливій праці його спільноти. Команда випуску складається з відданих волонтерів спільноти, які працюють разом над створенням багатьох частин, з яких складаються випуски Kubernetes, на які ви покладаєтеся. Це вимагає спеціалізованих навичок людей з усіх куточків нашої спільноти, від самого коду до його документації та управління проєктом.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати всій &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.33/release-team.md&#34;&gt;команді випуску&lt;/a&gt; за години наполегливої праці, витрачені на підготовку випуску Kubernetes v1.33 для нашої спільноти. Склад команди випуску варіюється від новачків-стажерів (shadows) до досвідчених лідерів команд, що повертаються, з досвідом, набутим протягом кількох циклів випуску. У цьому циклі випуску було прийнято нову структуру команди, яка полягала в обʼєднанні підкоманд Release Notes і Docs в єдину підкоманду Docs. Завдяки ретельним зусиллям нової команди Docs з організації відповідної інформації та ресурсів, відстеження як Release Notes, так і Docs пройшло плавний та успішний перехід. Нарешті, особлива подяка нашому лідеру випуску, Ніні Полшаковій, за її підтримку протягом усього успішного циклу випуску, її адвокацію, зусилля, спрямовані на те, щоб кожен міг зробити ефективний внесок, а також за її виклики, спрямовані на покращення процесу випуску.&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Проєкт CNCF K8s &lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;var-period=m&amp;var-repogroup_name=All&#34;&gt;DevStats&lt;/a&gt; обʼєднує декілька цікавих даних, повʼязаних зі швидкістю розвитку Kubernetes та різних підпроєктів. Це включає все, від індивідуальних внесків до кількості компаній, що беруть участь, і ілюструє глибину і широту зусиль, які докладаються для розвитку цієї екосистеми.&lt;/p&gt;
&lt;p&gt;Під час циклу випуску v1.33, який тривав 15 тижнів з 13 січня по 23 квітня 2025 року, Kubernetes отримав внески від цілих 121 різної компанії та 570 осіб (на момент написання статті, за кілька тижнів до дати випуску). У ширшій хмарній екосистемі ця цифра зростає до 435 компаній із загальною кількістю 2400 учасників. Ви можете знайти джерело даних на &lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;var-period=d28&amp;var-repogroup_name=All&amp;var-repo_name=kubernetes%2Fkubernetes&amp;from=1736755200000&amp;to=1745477999000&#34;&gt;цій інформаційній панелі&lt;/a&gt;. У порівнянні з &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/12/11/kubernetes-v1-32-release/#project-velocity&#34;&gt;даними про швидкість з попереднього випуску, v1.32&lt;/a&gt;, ми бачимо аналогічний рівень внеску компаній і окремих осіб, що свідчить про сильний інтерес і залученість спільноти.&lt;/p&gt;
&lt;p&gt;Зверніть увагу, що «внесок» зараховується, коли хтось робить коміт, рецензує код, коментує, створює тікет або PR, рецензує PR (включаючи блоги і документацію) або коментує тікети і PR. Якщо ви зацікавлені у внеску, відвідайте &lt;a href=&#34;https://www.kubernetes.dev/docs/guide/#getting-started&#34;&gt;Початок роботи&lt;/a&gt; на нашому вебсайті для учасників.&lt;/p&gt;
&lt;p&gt;&lt;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;h2 id=&#34;event-update&#34;&gt;Інформація про події&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#event-update&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Дізнайтеся про майбутні події, повʼязані з Kubernetes та хмарними технологіями, включаючи KubeCon + CloudNativeCon, KCD та інші визначні конференції по всьому світу. Будьте в курсі подій та долучайтеся до спільноти Kubernetes!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Травень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-costa-rica-presents-kcd-costa-rica-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Коста-Ріка&lt;/strong&gt;&lt;/a&gt;: 3 травня 2025 року | Ередіа, Коста-Ріка&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-helsinki-presents-kcd-helsinki-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Гельсінкі&lt;/strong&gt;&lt;/a&gt;: 6 травня 2025 року | Гельсінкі, Фінляндія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-texas-presents-kcd-texas-austin-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Техас, Остін&lt;/strong&gt;&lt;/a&gt;: 15 травня 2025 року | Остін, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-south-korea-presents-kcd-seoul-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Сеул&lt;/strong&gt;&lt;/a&gt;: 22 травня 2025 року | Сеул, Південна Корея&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-istanbul-presents-kcd-istanbul-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Стамбул, Туреччина&lt;/strong&gt;&lt;/a&gt;: 23 травня 2025 року | Стамбул, Туреччина&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-sf-bay-area-presents-kcd-san-francisco-bay-area/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Район затоки Сан-Франциско&lt;/strong&gt;&lt;/a&gt;: 28 травня 2025 року | Сан-Франциско, США&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Червень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-new-york-presents-kcd-new-york-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Нью-Йорк&lt;/strong&gt;&lt;/a&gt;: 4 червня 2025 року | Нью-Йорк, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-czech-slovak-presents-kcd-czech-amp-slovak-bratislava-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Чехія та Словаччина&lt;/strong&gt;&lt;/a&gt;: 5 червня 2025 року | Братислава, Словаччина&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-bengaluru-presents-kubernetes-community-days-bengaluru-2025-in-person/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Бенгалуру&lt;/strong&gt;&lt;/a&gt;: 6 червня 2025 року | Бенгалуру, Індія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-china/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon China 2025&lt;/strong&gt;&lt;/a&gt;: 10–11 червня 2025 року | Гонконг&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-guatemala-presents-kcd-antigua-guatemala-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Антигуа-Гватемала&lt;/strong&gt;&lt;/a&gt;: 14 червня 2025 року | Антигуа-Гватемала, Гватемала&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-japan&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Japan 2025&lt;/strong&gt;&lt;/a&gt;: 16–17 червня 2025 року | Токіо, Японія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Нігерія, Африка&lt;/strong&gt;&lt;/a&gt;: 19 червня 2025 року | Нігерія, Африка&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Липень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-netherlands-presents-kcd-utrecht-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Утрехт&lt;/strong&gt;&lt;/a&gt;: 4 липня 2025 року | Утрехт, Нідерланди&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-taiwan-presents-kcd-taipei-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Тайбей&lt;/strong&gt;&lt;/a&gt;: 5 липня 2025 року | Тайбей, Тайвань&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-lima-peru-presents-kcd-lima-peru-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Ліма, Перу&lt;/strong&gt;&lt;/a&gt;: 19 липня 2025 року | Ліма, Перу&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Серпень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-india-2025/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon India 2025&lt;/strong&gt;&lt;/a&gt;: 6–7 серпня 2025 року | Гайдарабад, Індія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-colombia-presents-kcd-colombia-2025/&#34;&gt;&lt;strong&gt;KCD - Дні спільноти Kubernetes: Колумбія&lt;/strong&gt;&lt;/a&gt;: 29 серпня 2025 року | Богота, Колумбія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Найновішу інформацію про KCD можна знайти &lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;тут&lt;/a&gt;.&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Приєднуйтеся до членів команди випуску Kubernetes v1.33 у &lt;strong&gt;пʼятницю, 16 травня 2025 року о 16:00 (UTC)&lt;/strong&gt;, щоб дізнатися про основні моменти цього випуску, а також про застарівання та вилучення, що допоможе спланувати оновлення. Для отримання додаткової інформації та реєстрації відвідайте &lt;a href=&#34;https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cncf-live-webinar-kubernetes-133-release/&#34;&gt;сторінку події&lt;/a&gt; на сайті CNCF Online Programs.&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;груп за інтересами&lt;/a&gt; (SIG, Special Interest Groups), які відповідають вашим інтересам. Маєте щось, про що хотіли б розповісти спільноті Kubernetes? Поділіться своєю думкою на нашій щотижневій &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зустрічі спільноти&lt;/a&gt;, а також за допомогою каналів нижче. Дякуємо за ваші постійні відгуки та підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами в Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@kubernetes.io&lt;/a&gt;, щоб бути в курсі останніх оновлень&lt;/li&gt;
&lt;li&gt;Приєднуйтеся до обговорення спільноти на &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтеся до спільноти в &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ставте запитання (або відповідайте на запитання) на &lt;a href=&#34;https://serverfault.com/questions/tagged/kubernetes&#34;&gt;Server Fault&lt;/a&gt; або &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про те, що відбувається з Kubernetes, у &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Попередній огляд Kubernetes v1.33</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/03/26/kubernetes-v1-33-upcoming-changes/</link>
      <pubDate>Wed, 26 Mar 2025 10:30:00 -0800</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2025/03/26/kubernetes-v1-33-upcoming-changes/</guid>
      <description>
        
        
        &lt;p&gt;З наближенням випуску Kubernetes v1.33 проєкт Kubernetes продовжує розвиватися. Функції можуть ставати застарілими, вилучатися або замінюватися для покращення загального стану проєкту. У цьому дописі описано деякі заплановані зміни для випуску v1.33, про які, на думку команди випуску, вам слід знати, щоб забезпечити безперебійну роботу вашого середовища Kubernetes та залишатися в курсі останніх розробок. Інформація нижче базується на поточному статусі випуску v1.33 і може змінитися до дати фінального випуску.&lt;/p&gt;
&lt;h2 id=&#34;the-kubernetes-api-removal-and-deprecation-process&#34;&gt;Процес вилучення та застарівання API Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-kubernetes-api-removal-and-deprecation-process&#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-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політику застарівання&lt;/a&gt; для функцій. Ця політика передбачає, що стабільні API можуть бути визнані застарілими лише тоді, коли доступна новіша, стабільна версія того ж API, і що API мають мінімальний термін служби для кожного рівня стабільності. Застарілий API позначено для вилучення в майбутньому випуску Kubernetes. Він продовжуватиме функціонувати до вилучення (щонайменше рік після застарівання), але його використання призведе до показу попередження. Вилучені API більше недоступні в поточній версії, і в цьому випадку вам потрібно перейти на використання заміни.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Загальнодоступні (GA) або стабільні версії API можуть бути позначені як застарілі, але не повинні бути вилучені в межах основної версії Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Бета-версії або попередні версії API повинні підтримуватися протягом 3 випусків після застарівання.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Альфа-версії або експериментальні версії API можуть бути вилучені в будь-якому випуску без попереднього повідомлення про застарівання; цей процес може стати відкликанням у випадках, коли вже існує інша реалізація для тієї ж функції.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Незалежно від того, чи API вилучається в результаті переходу функції з бета-версії до стабільної, чи тому, що цей API просто не досяг успіху, усі вилучення відповідають цій політиці застарівання. Щоразу, коли API вилучається, варіанти міграції повідомляються в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-guide/&#34;&gt;керівництві із застарівання&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;deprecations-and-removals-for-kubernetes-v1-33&#34;&gt;Застарівання та вилучення у Kubernetes v1.33&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecations-and-removals-for-kubernetes-v1-33&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;deprecation-of-the-stable-endpoints-api&#34;&gt;Застарівання стабільного API Endpoints&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecation-of-the-stable-endpoints-api&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;API &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/services-networking/endpoint-slices/&#34;&gt;EndpointSlices&lt;/a&gt; є стабільним з v1.21, що фактично замінило оригінальний API Endpoints. Хоча оригінальний API Endpoints був простим і зрозумілим, він також створював певні проблеми при масштабуванні до великої кількості мережевих точок доступу. API EndpointSlices запровадив нові функції, такі як двостекова мережа, що робить оригінальний API Endpoints готовим до застарівання.&lt;/p&gt;
&lt;p&gt;Це застарівання впливає лише на тих, хто використовує API Endpoints безпосередньо з робочих навантажень або скриптів; таким користувачам слід перейти на використання EndpointSlices. У найближчі тижні буде опубліковано окремий допис у блозі з детальнішою інформацією про наслідки застарівання та плани міграції.&lt;/p&gt;
&lt;p&gt;Детальніше дивіться в &lt;a href=&#34;https://kep.k8s.io/4974&#34;&gt;KEP-4974: Deprecate v1.Endpoints&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;removal-of-kube-proxy-version-information-in-node-status&#34;&gt;Вилучення інформації про версію kube-proxy у статусі вузла&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#removal-of-kube-proxy-version-information-in-node-status&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Після застарівання у v1.31, як зазначено в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/07/19/kubernetes-1-31-upcoming-changes/#deprecation-of-status-nodeinfo-kubeproxyversion-field-for-nodes-kep-4004-https-github-com-kubernetes-enhancements-issues-4004&#34;&gt;анонсі випуску&lt;/a&gt;, поле &lt;code&gt;status.nodeInfo.kubeProxyVersion&lt;/code&gt; буде вилучено у v1.33. Це поле встановлювалося kubelet, але його значення не завжди було точним. Оскільки воно було типово вимкнене з v1.31, у випуску v1.33 це поле буде повністю вилучене.&lt;/p&gt;
&lt;p&gt;Детальніше дивіться в &lt;a href=&#34;https://kep.k8s.io/4004&#34;&gt;KEP-4004: Deprecate status.nodeInfo.kubeProxyVersion field&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;removal-of-host-network-support-for-windows-pods&#34;&gt;Вилучення підтримки мережі хосту для Podʼів Windows&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#removal-of-host-network-support-for-windows-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Мережа Podʼів Windows мала на меті досягти паритету функцій із Linux і забезпечити кращу щільність кластерів, дозволяючи контейнерам використовувати мережевий простір імен вузла. Оригінальна реалізація зʼявилася як альфа у v1.26, але через несподівану поведінку containerd і наявність альтернативних рішень проєкт Kubernetes вирішив відкликати повʼязаний KEP. Очікується, що підтримка буде повністю вилучена у v1.33.&lt;/p&gt;
&lt;p&gt;Детальніше дивіться в &lt;a href=&#34;https://kep.k8s.io/3503&#34;&gt;KEP-3503: Host network support for Windows pods&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;featured-improvement-of-kubernetes-v1-33&#34;&gt;Основне покращення Kubernetes v1.33&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#featured-improvement-of-kubernetes-v1-33&#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;support-for-user-namespaces-within-linux-pods&#34;&gt;Підтримка просторів імен користувача у Podʼах Linux&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-for-user-namespaces-within-linux-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Одним із найстаріших відкритих KEP сьогодні є &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP-127&lt;/a&gt;, покращення безпеки Podʼів за допомогою &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/workloads/pods/user-namespaces/&#34;&gt;просторів імен користувача&lt;/a&gt; у Linux. Цей KEP був вперше відкритий наприкінці 2016 року, і після кількох ітерацій мав альфа-випуск у v1.25, початкову бета-версію у v1.30 (де він був типово вимкнений), і тепер має стати частиною v1.33, де функція буде типово доступна.&lt;/p&gt;
&lt;p&gt;Ця підтримка не вплине на наявні Podʼи, якщо ви вручну не вкажете &lt;code&gt;pod.spec.hostUsers&lt;/code&gt;, щоб увімкнути її. Як зазначено в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/03/12/kubernetes-1-30-upcoming-changes/&#34;&gt;дописі з попереднім оглядом v1.30&lt;/a&gt;, це важливий етап для усунення вразливостей.&lt;/p&gt;
&lt;p&gt;Детальніше дивіться в &lt;a href=&#34;https://kep.k8s.io/127&#34;&gt;KEP-127: Support User Namespaces in pods&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;selected-other-kubernetes-v1-33-improvements&#34;&gt;Вибрані інші покращення Kubernetes v1.33&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#selected-other-kubernetes-v1-33-improvements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Наведений нижче список удосконалень, ймовірно, буде включений до наступного випуску v1.33. Це не є зобовʼязанням, і вміст випуску може змінитися.&lt;/p&gt;
&lt;h3 id=&#34;in-place-resource-resize-for-vertical-scaling-of-pods&#34;&gt;Зміна розміру ресурсів на місці для вертикального масштабування Podʼів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#in-place-resource-resize-for-vertical-scaling-of-pods&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Під час створення Podʼа ви можете використовувати різні ресурси, такі як Deployment, StatefulSet тощо. Вимоги до масштабованості можуть вимагати горизонтального масштабування шляхом оновлення кількості реплік Podʼів або вертикального масштабування шляхом оновлення ресурсів, виділених контейнерам Podʼа. До цього удосконалення ресурси контейнера, визначені в &lt;code&gt;spec&lt;/code&gt; Podʼа, були незмінними, і оновлення будь-яких із цих деталей у шаблоні Podʼа призводило до заміни Podʼа.&lt;/p&gt;
&lt;p&gt;Але що, якби ви могли динамічно оновлювати конфігурацію ресурсів для ваших наявних Podʼів без їх перезапуску?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP-1287&lt;/a&gt; створено саме для того, щоб дозволити такі оновлення Podʼів на місці. Це відкриває різні можливості вертикального збільшення масштабу для процесів зі станом без простоїв, безперебійного зменшення масштабу, коли трафік низький, і навіть виділення більших ресурсів під час запуску, які згодом зменшуються після завершення початкового налаштування. Це було випущено як альфа у v1.27 і очікується, що стане бета-версією у v1.33.&lt;/p&gt;
&lt;p&gt;Детальніше дивіться в &lt;a href=&#34;https://kep.k8s.io/1287&#34;&gt;KEP-1287: In-Place Update of Pod Resources&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;dra-s-resourceclaim-device-status-graduates-to-beta&#34;&gt;Статус пристрою ResourceClaim у DRA переходить до бета-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-s-resourceclaim-device-status-graduates-to-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Поле &lt;code&gt;devices&lt;/code&gt; у &lt;code&gt;status&lt;/code&gt; ResourceClaim, яке було вперше введено у випуску v1.32, ймовірно, перейде до бета-версії у v1.33. Це поле дозволяє драйверам повідомляти дані про статус пристрою, покращуючи як можливості спостереження, так і усунення несправностей.&lt;/p&gt;
&lt;p&gt;Наприклад, повідомлення імені інтерфейсу, MAC-адреси та IP-адрес мережевих інтерфейсів у статусі ResourceClaim може значно допомогти в налаштуванні та керуванні мережевими службами, а також у налагодженні мережевих проблем. Ви можете прочитати більше про статус пристрою ResourceClaim у документі &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/dynamic-resource-allocation/dra-observability/#resourceclaim-device-status&#34;&gt;Динамічне виділення ресурсів: статус пристрою ResourceClaim&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Також ви можете дізнатися більше про заплановане удосконалення в &lt;a href=&#34;https://kep.k8s.io/4817&#34;&gt;KEP-4817: DRA: Resource Claim Status with possible standardized network interface data&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;ordered-namespace-deletion&#34;&gt;Впорядковане видалення просторів імен&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#ordered-namespace-deletion&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Цей KEP запроваджує більш структурований процес видалення просторів імен Kubernetes для забезпечення безпечного та детермінованого видалення ресурсів. Поточний напіввипадковий порядок видалення може створювати прогалини в безпеці або непередбачену поведінку, наприклад, Podʼи, що залишаються після видалення повʼязаних із ними NetworkPolicies. Запроваджуючи структуровану послідовність видалення, яка враховує логічні та безпекові залежності, цей підхід забезпечує видалення Podʼів перед іншими ресурсами. Дизайн покращує безпеку та надійність Kubernetes, зменшуючи ризики, повʼязані з недетермінованими видаленнями.&lt;/p&gt;
&lt;p&gt;Детальніше дивіться в &lt;a href=&#34;https://kep.k8s.io/5080&#34;&gt;KEP-5080: Ordered namespace deletion&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;enhancements-for-indexed-job-management&#34;&gt;Удосконалення керування індексованими завданнями&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#enhancements-for-indexed-job-management&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ці два KEP мають перейти до GA, щоб забезпечити кращу надійність обробки Job, зокрема для Indexed Job. &lt;a href=&#34;https://kep.k8s.io/3850&#34;&gt;KEP-3850&lt;/a&gt; забезпечує обмеження кількості повторних спроб для кожного індексу для Indexed Job, що дозволяє кожному індексу бути повністю незалежним від інших індексів. Також &lt;a href=&#34;https://kep.k8s.io/3998&#34;&gt;KEP-3998&lt;/a&gt; розширює Job API, щоб визначити умови для позначення Indexed Job як успішно завершеного, коли не всі індекси було успішно виконано.&lt;/p&gt;
&lt;p&gt;Детальніше дивіться в &lt;a href=&#34;https://kep.k8s.io/3850&#34;&gt;KEP-3850: Backoff Limit Per Index For Indexed Jobs&lt;/a&gt; та &lt;a href=&#34;https://kep.k8s.io/3998&#34;&gt;KEP-3998: Job success/completion policy&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;want-to-know-more&#34;&gt;Хочете дізнатися більше?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#want-to-know-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.33.md&#34;&gt;Kubernetes v1.33&lt;/a&gt; як частину CHANGELOG для цього випуску.&lt;/p&gt;
&lt;p&gt;Випуск Kubernetes v1.33 заплановано на &lt;strong&gt;середу, 23 квітня 2025 року&lt;/strong&gt;. Слідкуйте за оновленнями!&lt;/p&gt;
&lt;p&gt;Ви також можете побачити оголошення про зміни в примітках до випуску для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.32.md&#34;&gt;Kubernetes v1.32&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md&#34;&gt;Kubernetes v1.31&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.30.md&#34;&gt;Kubernetes v1.30&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;спеціальних груп за інтересами&lt;/a&gt; (SIG), які відповідають вашим інтересам. Хочете щось повідомити спільноті Kubernetes? Поділіться своєю думкою на нашій щотижневій &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зустрічі спільноти&lt;/a&gt; та через канали нижче. Дякуємо за ваші постійні відгуки та підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами на Bluesky &lt;a href=&#34;https://bsky.app/profile/kubernetes.io&#34;&gt;@kubernetes.io&lt;/a&gt; для останніх оновлень&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до обговорення спільноти на &lt;a href=&#34;https://discuss.kubernetes.io/&#34;&gt;Discuss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Приєднуйтесь до спільноти у &lt;a href=&#34;http://slack.k8s.io/&#34;&gt;Slack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Публікуйте запитання (або відповідайте на запитання) на &lt;a href=&#34;https://serverfault.com/questions/tagged/kubernetes&#34;&gt;Server Fault&lt;/a&gt; або &lt;a href=&#34;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Читайте більше про те, що відбувається з Kubernetes в &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Kubernetes v1.32: Penelope</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/12/11/kubernetes-v1-32-release/</link>
      <pubDate>Wed, 11 Dec 2024 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/12/11/kubernetes-v1-32-release/</guid>
      <description>
        
        
        &lt;p&gt;&lt;strong&gt;Редактори:&lt;/strong&gt; Matteo Bianchi, Edith Puclla, William Rizzo, Ryota Sawada, Rashan Smith&lt;/p&gt;
&lt;p&gt;Анонсуємо випуск Kubernetes v1.32: Penelope!&lt;/p&gt;
&lt;p&gt;Як і попередні випуски, Kubernetes v1.32 представляє нові стабільні, бета- та альфа-функції. Послідовне постачання високоякісних випусків підкреслює силу нашого циклу розробки та активну підтримку нашої спільноти. Загалом цей випуск містить 44 удосконалення. З них 13 перейшли до стабільної версії, 12 — до бета-версії, а 19 зʼявилися в альфа-версії.&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-59115--kubernetes-io-main-staging.netlify.app/blog/2024/12/11/kubernetes-v1-32-release/k8s-1.32.png&#34;
         alt=&#34;Логотип Kubernetes v1.32: Пенелопа з «Одіссеї», штурвал і фіолетовий геометричний фон&#34;/&gt; 
&lt;/figure&gt;
&lt;p&gt;Темою випуску Kubernetes v1.32 є «Penelope».&lt;/p&gt;
&lt;p&gt;Якщо Kubernetes з давньогрецької означає «лоцман», то в цьому випуску ми відштовхуємося від цього походження і розмірковуємо про останні 10 років Kubernetes і наші досягнення: кожен цикл випуску — це подорож, і так само як Пенелопа в «Одіссеї» ткала 10 років, щоночі розпускаючи частину того, що зробила за день, кожен випуск додає нові функції та вилучає інші, хоча в нашому випадку з набагато чіткішою метою — постійно покращувати Kubernetes. Оскільки v1.32 є останнім випуском у році, коли Kubernetes відзначає своє перше десятиріччя, ми хотіли вшанувати всіх тих, хто був частиною глобального екіпажу Kubernetes, що мандрує хмарними (cloud-native) морями, долаючи небезпеки та виклики: тож продовжуймо разом ткати майбутнє Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;updates-to-recent-key-features&#34;&gt;Оновлення останніх ключових функцій&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#updates-to-recent-key-features&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;a-note-on-dra-enhancements&#34;&gt;Примітка щодо удосконалень DRA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#a-note-on-dra-enhancements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У цьому випуску, як і в попередньому, проєкт Kubernetes продовжує пропонувати низку удосконалень динамічного виділення ресурсів (Dynamic Resource Allocation, DRA), ключового компонента системи керування ресурсами Kubernetes. Ці удосконалення спрямовані на підвищення гнучкості та ефективності виділення ресурсів для робочих навантажень, які потребують спеціалізованого обладнання, такого як графічні процесори (GPU), FPGA та мережеві адаптери. Ці функції особливо корисні для таких сценаріїв використання, як машинне навчання або застосунки високопродуктивних обчислень. Основна частина, що забезпечує підтримку структурованих параметрів DRA, &lt;a href=&#34;#structured-parameter-support&#34;&gt;перейшла до бета-версії&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;quality-of-life-improvements-on-nodes-and-sidecar-containers-update&#34;&gt;Покращення якості життя на вузлах та оновлення sidecar-контейнерів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#quality-of-life-improvements-on-nodes-and-sidecar-containers-update&#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/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt; має такі основні новини, що виходять за межі KEP:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Можливість сторожового таймера (watchdog) systemd тепер використовується для перезапуску kubelet, коли його перевірка стану не вдається, одночасно обмежуючи максимальну кількість перезапусків протягом певного періоду часу. Це підвищує надійність роботи kubelet. Докладніше дивіться pull request &lt;a href=&#34;https://github.com/kubernetes/kubernetes/pull/127566&#34;&gt;#127566&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;У випадках, коли виникає помилка відстрочки витягування образу (image pull back-off), повідомлення, що відображається у статусі Podʼа, покращено, щоб зробити його зрозумілішим для людини і вказати подробиці про те, чому Pod перебуває у такому стані. Коли виникає відстрочка витягування образу, помилка додається до поля &lt;code&gt;status.containerStatuses[*].state.waiting.message&lt;/code&gt; у специфікації Podʼа зі значенням &lt;code&gt;ImagePullBackOff&lt;/code&gt; у полі &lt;code&gt;reason&lt;/code&gt;. Ця зміна надає вам більше контексту і допомагає визначити першопричину проблеми. Докладніше дивіться pull request &lt;a href=&#34;https://github.com/kubernetes/kubernetes/pull/127918&#34;&gt;#127918&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Функція sidecar-контейнерів має перейти до стабільної версії у v1.33. Щоб переглянути решту робочих завдань та відгуки користувачів, дивіться коментарі в тікеті &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/753#issuecomment-2350136594&#34;&gt;#753&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;highlights-of-features-graduating-to-stable&#34;&gt;Ключові функції, що переходять до стабільної версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#highlights-of-features-graduating-to-stable&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Це добірка деяких покращень, які стали стабільними після випуску v1.32.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;custom-resource-field-selectors&#34;&gt;Селектори полів для Custom Resource&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#custom-resource-field-selectors&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Селектор полів власних ресурсів дозволяє розробникам додавати селектори полів до власних ресурсів, аналогічно до функціональності, доступної для вбудованих обʼєктів Kubernetes. Це дозволяє ефективніше і точніше фільтрувати власні ресурси, сприяючи кращим практикам проєктування API.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4358&#34;&gt;KEP #4358&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-api-machinery&#34;&gt;SIG API Machinery&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;support-to-size-memory-backed-volumes&#34;&gt;Підтримка визначення розміру томів у памʼяті&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#support-to-size-memory-backed-volumes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція дозволяє динамічно визначати розмір томів, що зберігаються в памʼяті, на основі обмежень ресурсів Podʼа, покращуючи переносність робочого навантаження та загальне використання ресурсів вузла.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1967&#34;&gt;KEP #1967&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;bound-service-account-token-improvement&#34;&gt;Покращення токена привʼязаного службового облікового запису&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#bound-service-account-token-improvement&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Включення імені вузла до тверджень (claims) токенів службових облікових записів дозволяє користувачам використовувати цю інформацію під час авторизації та допуску (ValidatingAdmissionPolicy). Крім того, це покращення не дає обліковим даним службових облікових записів стати шляхом для підвищення привілеїв для вузлів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4193&#34;&gt;KEP #4193&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-auth&#34;&gt;SIG Auth&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;structured-authorization-configuration&#34;&gt;Структурована конфігурація авторизації&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#structured-authorization-configuration&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;В API-сервері можна налаштувати декілька авторизаторів, щоб забезпечити структуровані рішення щодо авторизації, з підтримкою умов відповідності CEL у вебхуках. Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3221&#34;&gt;KEP #3221&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-auth&#34;&gt;SIG Auth&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;auto-remove-pvcs-created-by-statefulset&#34;&gt;Автоматичне видалення PVC, створених StatefulSet&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#auto-remove-pvcs-created-by-statefulset&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;PersistentVolumeClaims (PVC), створені StatefulSet, автоматично видаляються, коли вони більше не потрібні, забезпечуючи при цьому збереження даних під час оновлень StatefulSet і обслуговування вузлів. Ця функція спрощує керування сховищем для StatefulSet і зменшує ризик появи «осиротілих» PVC.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1847&#34;&gt;KEP #1847&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-apps&#34;&gt;SIG Apps&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;highlights-of-features-graduating-to-beta&#34;&gt;Ключові функції, що переходять до бета-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#highlights-of-features-graduating-to-beta&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Це добірка деяких покращень, які стали бета-версією після випуску v1.32.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;job-api-managed-by-mechanism&#34;&gt;Механізм managed-by в Job API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#job-api-managed-by-mechanism&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Поле &lt;code&gt;managedBy&lt;/code&gt; для Job перейшло до бета-версії у випуску v1.32. Ця функція дозволяє зовнішнім контролерам (наприклад, &lt;a href=&#34;https://kueue.sigs.k8s.io/&#34;&gt;Kueue&lt;/a&gt;) керувати синхронізацією Job, пропонуючи більшу гнучкість та інтеграцію з розвиненими системами керування робочими навантаженнями.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4368&#34;&gt;KEP #4368&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-apps&#34;&gt;SIG Apps&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;only-allow-anonymous-auth-for-configured-endpoints&#34;&gt;Дозвіл анонімної автентифікації лише для налаштованих точок доступу&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#only-allow-anonymous-auth-for-configured-endpoints&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція дозволяє адміністраторам вказати, які точки доступу дозволено використовувати для анонімних запитів. Наприклад, адміністратор може дозволити анонімний доступ лише до таких точок контролю справності, як &lt;code&gt;/healthz&lt;/code&gt;, &lt;code&gt;/livez&lt;/code&gt; і &lt;code&gt;/readyz&lt;/code&gt;, при цьому не допускаючи анонімного доступу до інших точок доступу або ресурсів кластера, навіть якщо користувач неправильно налаштував RBAC.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4633&#34;&gt;KEP #4633&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-auth&#34;&gt;SIG Auth&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;per-plugin-callback-functions-for-accurate-requeueing-in-kube-scheduler-enhancements&#34;&gt;Функції зворотного виклику для кожного втулка для точного повторного додавання в чергу в удосконаленнях kube-scheduler&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#per-plugin-callback-functions-for-accurate-requeueing-in-kube-scheduler-enhancements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція підвищує пропускну здатність планування завдяки ефективнішим рішенням щодо повторних спроб планування за допомогою функцій зворотного виклику для кожного втулка (QueueingHint). Тепер усі втулки мають QueueingHints.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4247&#34;&gt;KEP #4247&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-scheduling&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;recover-from-volume-expansion-failure&#34;&gt;Відновлення після збою розширення тому&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#recover-from-volume-expansion-failure&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція дозволяє користувачам відновитися після невдалої спроби розширення тому, повторивши спробу з меншим розміром. Це удосконалення гарантує, що розширення тому буде більш стійким і надійним, зменшуючи ризик втрати або пошкодження даних під час цього процесу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1790&#34;&gt;KEP #1790&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;SIG Storage&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;volume-group-snapshot&#34;&gt;Знімок групи томів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#volume-group-snapshot&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція представляє API VolumeGroupSnapshot, який дозволяє користувачам робити знімок кількох томів разом, забезпечуючи узгодженість даних у всіх томах.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3476&#34;&gt;KEP #3476&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-storage&#34;&gt;SIG Storage&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;structured-parameter-support&#34;&gt;Підтримка структурованих параметрів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#structured-parameter-support&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Основна частина динамічного виділення ресурсів (Dynamic Resource Allocation, DRA), підтримка структурованих параметрів, перейшла до бета-версії. Це дозволяє kube-scheduler та Cluster Autoscaler моделювати виділення заявок безпосередньо, без потреби у сторонньому драйвері. Тепер ці компоненти можуть передбачати, чи можуть запити на ресурси бути виконані на основі поточного стану кластера, без фактичної фіксації виділення. Усуваючи потребу в сторонньому драйвері для перевірки або тестування виділень, ця функція покращує планування і прийняття рішень щодо розподілу ресурсів, роблячи процеси планування і масштабування ефективнішими.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4381&#34;&gt;KEP #4381&lt;/a&gt;, силами WG Device Management (міжфункціональної команди, що складається з &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt;, &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-scheduling&#34;&gt;SIG Scheduling&lt;/a&gt; та &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-autoscaling&#34;&gt;SIG Autoscaling&lt;/a&gt;).&lt;/p&gt;
&lt;h3 id=&#34;label-and-field-selector-authorization&#34;&gt;Авторизація за селекторами міток і полів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#label-and-field-selector-authorization&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Селектори міток і полів можна використовувати у рішеннях щодо авторизації. Авторизатор вузлів автоматично використовує це, щоб дозволити вузлам отримувати перелік (list) або відстежувати (watch) лише їхні Podʼи. Авторизатори вебхуків можна оновити, щоб обмежувати запити на основі використаного селектора міток або полів.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4601&#34;&gt;KEP #4601&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-auth&#34;&gt;SIG Auth&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;highlights-of-new-features-in-alpha&#34;&gt;Ключові нові функції в альфа-версії&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#highlights-of-new-features-in-alpha&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Це добірка ключових покращень, представлених як альфа-функції у випуску v1.32.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;asynchronous-preemption-in-the-kubernetes-scheduler&#34;&gt;Асинхронне витіснення у планувальнику Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#asynchronous-preemption-in-the-kubernetes-scheduler&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Планувальник Kubernetes було вдосконалено за допомогою функції асинхронного витіснення, яка покращує пропускну здатність планування, обробляючи операції витіснення асинхронно. Витіснення гарантує, що Podʼи з вищим пріоритетом отримують необхідні їм ресурси шляхом виселення Podʼів з нижчим пріоритетом, але раніше цей процес включав важкі операції, такі як виклики API для видалення Podʼів, що сповільнювало роботу планувальника. Завдяки цьому удосконаленню такі завдання тепер обробляються паралельно, що дозволяє планувальнику без затримок продовжувати планувати інші Podʼи. Це покращення особливо корисне для кластерів з високим рівнем плинності Podʼів або частими збоями планування, забезпечуючи ефективніший та стійкіший процес планування.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках KEP &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4832&#34;&gt;#4832&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-scheduling&#34;&gt;SIG Scheduling&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;mutating-admission-policies-using-cel-expressions&#34;&gt;Мутаційні політики допуску з використанням виразів CEL&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#mutating-admission-policies-using-cel-expressions&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ця функція використовує створення обʼєктів у CEL та стратегії JSON Patch у поєднанні з алгоритмами злиття Server Side Apply. Це спрощує визначення політик, зменшує конфлікти мутацій і підвищує продуктивність контролю допуску, закладаючи основу для більш надійних, розширюваних фреймворків політик у Kubernetes.&lt;/p&gt;
&lt;p&gt;API-сервер Kubernetes тепер підтримує мутаційні політики допуску (Mutating Admission Policies) на основі Common Expression Language (CEL), що забезпечує легку та ефективну альтернативу мутаційним вебхукам допуску. Завдяки цьому удосконаленню адміністратори можуть використовувати CEL для оголошення мутацій, таких як встановлення міток, встановлення типових значень полів або додавання sidecar-контейнерів, за допомогою простих декларативних виразів. Такий підхід зменшує операційну складність, усуває потребу у вебхуках та інтегрується безпосередньо з kube-apiserver, пропонуючи швидшу та надійнішу обробку мутацій в межах процесу.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3962&#34;&gt;KEP #3962&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-api-machinery&#34;&gt;SIG API Machinery&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;pod-level-resource-specifications&#34;&gt;Специфікації ресурсів на рівні Podʼа&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pod-level-resource-specifications&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це удосконалення спрощує керування ресурсами в Kubernetes, надаючи можливість встановлювати запити на ресурси та обмеження на рівні Podʼа, створюючи спільний пул, який можуть динамічно використовувати всі контейнери в Podʼі. Це особливо цінно для робочих навантажень з контейнерами, які мають мінливі або пікові потреби в ресурсах, оскільки це мінімізує надлишкове резервування і покращує загальну ефективність використання ресурсів.&lt;/p&gt;
&lt;p&gt;Використовуючи налаштування Linux cgroup на рівні Podʼа, Kubernetes гарантує дотримання цих обмежень ресурсів, дозволяючи тісно повʼязаним контейнерам ефективніше співпрацювати без штучних обмежень. Важливо, що ця функція зберігає зворотну сумісність з наявними налаштуваннями ресурсів на рівні контейнерів, дозволяючи користувачам впроваджувати її поступово, не порушуючи поточні робочі процеси або наявні конфігурації.&lt;/p&gt;
&lt;p&gt;Це значне покращення для багатоконтейнерних Podʼів, оскільки воно зменшує операційну складність керування виділенням ресурсів між контейнерами. Це також забезпечує приріст продуктивності для тісно інтегрованих застосунків, таких як архітектури sidecar, де контейнери спільно виконують робочі навантаження або залежать від доступності один одного для оптимальної роботи.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/2837&#34;&gt;KEP #2837&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;allow-zero-value-for-sleep-action-of-prestop-hook&#34;&gt;Дозвіл нульового значення для дії sleep хука PreStop&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#allow-zero-value-for-sleep-action-of-prestop-hook&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це удосконалення надає можливість встановити нульову тривалість sleep для хука життєвого циклу PreStop у Kubernetes, пропонуючи гнучкіший варіант без операцій (no-op) для перевірки та налаштування ресурсів. Раніше спроба визначити нульове значення для дії sleep призводила до помилок валідації, що обмежувало її використання. З цим оновленням користувачі можуть налаштувати нульову тривалість як допустиме значення sleep, що дозволяє негайне виконання та завершення там, де це потрібно.&lt;/p&gt;
&lt;p&gt;Це удосконалення є зворотно сумісним, його впроваджено як функцію, яку вмикають за бажанням (opt-in) і якою керує функціональна можливість &lt;code&gt;PodLifecycleSleepActionAllowZero&lt;/code&gt;. Ця зміна особливо корисна для сценаріїв, що вимагають використання хуків PreStop для перевірки або обробки вебхуків допуску, не вимагаючи фактичної тривалості sleep. Завдяки узгодженню з можливостями функції Go &lt;code&gt;time.After&lt;/code&gt; це оновлення спрощує конфігурацію і розширює можливості використання для робочих навантажень Kubernetes.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4818&#34;&gt;KEP #4818&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-node&#34;&gt;SIG Node&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;dra-standardized-network-interface-data-for-resource-claim-status&#34;&gt;DRA: Стандартизовані дані мережевого інтерфейсу для статусу заявки на ресурс&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#dra-standardized-network-interface-data-for-resource-claim-status&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це удосконалення додає нове поле, яке дозволяє драйверам повідомляти конкретні дані про стан пристрою для кожного виділеного обʼєкта в ResourceClaim. Воно також встановлює стандартизований спосіб представлення інформації про мережеві пристрої.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4817&#34;&gt;KEP #4817&lt;/a&gt;, силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-network&#34;&gt;SIG Network&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;new-statusz-and-flagz-endpoints-for-core-components&#34;&gt;Нові точки доступу statusz та flagz для основних компонентів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#new-statusz-and-flagz-endpoints-for-core-components&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ви можете ввімкнути дві нові HTTP-точки доступу, &lt;code&gt;/statusz&lt;/code&gt; і &lt;code&gt;/flagz&lt;/code&gt;, для основних компонентів. Вони покращують можливості налагодження кластера, надаючи інформацію про те, з якою версією (наприклад, версією Golang) працює компонент, а також про час його роботи і з якими прапорцями командного рядка його було запущено; це полегшує діагностику як проблем виконання, так і проблем конфігурації.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4827&#34;&gt;KEP #4827&lt;/a&gt; та &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4828&#34;&gt;KEP #4828&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-instrumentation&#34;&gt;SIG Instrumentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;windows-strikes-back&#34;&gt;Windows дає відсіч!&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#windows-strikes-back&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Додано підтримку належного завершення роботи Windows-вузлів у кластерах Kubernetes. До цього випуску Kubernetes надавав функціональність належного завершення роботи для вузлів Linux, але не мав еквівалентної підтримки для Windows. Це удосконалення дозволяє kubelet на Windows-вузлах правильно обробляти події вимкнення системи. Завдяки цьому Podʼи, запущені на Windows-вузлах, належно завершуються, що дозволяє перепланувати робочі навантаження без порушень. Це покращення підвищує надійність і стабільність кластерів, що включають вузли Windows, особливо під час планового обслуговування або будь-яких оновлень системи.&lt;/p&gt;
&lt;p&gt;Крім того, додано підтримку спорідненості процесорів і памʼяті для вузлів Windows з вузлами, з поліпшеннями в диспетчері процесорів, диспетчері памʼяті і диспетчері топології.&lt;/p&gt;
&lt;p&gt;Ця робота була виконана відповідно в рамках &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4802&#34;&gt;KEP #4802&lt;/a&gt; та &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4885&#34;&gt;KEP #4885&lt;/a&gt; силами &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-windows&#34;&gt;SIG Windows&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;graduations-deprecations-and-removals-in-1-32&#34;&gt;Переходи, застарівання та вилучення у 1.32&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#graduations-deprecations-and-removals-in-1-32&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&#34;graduations-to-stable&#34;&gt;Переходи до стабільної версії&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;Тут перелічено всі функції, які перейшли до стабільної версії (також відомої як &lt;em&gt;загальна доступність&lt;/em&gt;). Повний список оновлень, включно з новими функціями та переходами з альфа-версії до бета-версії, наведено у примітках до випуску.&lt;/p&gt;
&lt;p&gt;Цей випуск містить загалом 13 удосконалень, що перейшли до стабільної версії:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3221&#34;&gt;Structured Authorization Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4193&#34;&gt;Bound service account token improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4358&#34;&gt;Custom Resource Field Selectors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4420&#34;&gt;Retry Generate Name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1860&#34;&gt;Make Kubernetes aware of the LoadBalancer behaviour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/2681&#34;&gt;Field &lt;code&gt;status.hostIPs&lt;/code&gt; added for Pod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4292&#34;&gt;Custom profile in kubectl debug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1769&#34;&gt;Memory Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1967&#34;&gt;Support to size memory backed volumes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3545&#34;&gt;Improved multi-numa alignment in Topology Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4026&#34;&gt;Add job creation timestamp to job annotations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4017&#34;&gt;Add Pod Index Label for StatefulSets and Indexed Jobs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1847&#34;&gt;Auto remove PVCs created by StatefulSet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;deprecations-and-removals&#34;&gt;Застарівання та вилучення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#deprecations-and-removals&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У міру розвитку та зрілості Kubernetes функції можуть бути визнані застарілими, вилучені або замінені кращими для покращення загального стану проєкту. Докладніше про цей процес дивіться у &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політиці застарівання та вилучення&lt;/a&gt; Kubernetes.&lt;/p&gt;
&lt;h4 id=&#34;withdrawal-of-the-old-dra-implementation&#34;&gt;Відмова від старої реалізації DRA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#withdrawal-of-the-old-dra-implementation&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Удосконалення &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3063&#34;&gt;#3063&lt;/a&gt; запровадило динамічне виділення ресурсів (DRA) у Kubernetes 1.26.&lt;/p&gt;
&lt;p&gt;Однак у Kubernetes v1.32 цей підхід до DRA буде суттєво змінено. Код, повʼязаний з оригінальною реалізацією, буде вилучено, залишивши KEP &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4381&#34;&gt;#4381&lt;/a&gt; як «нову» базову функціональність.&lt;/p&gt;
&lt;p&gt;Рішення про зміну наявного підходу виникло через його несумісність з автомасштабуванням кластера, оскільки доступність ресурсів була непрозорою, що ускладнювало прийняття рішень як для Cluster Autoscaler, так і для контролерів. Нещодавно додана модель структурованих параметрів замінює цю функціональність.&lt;/p&gt;
&lt;p&gt;Це вилучення дозволить Kubernetes більш передбачувано обробляти нові вимоги до апаратного забезпечення та заявки на ресурси, оминаючи складнощі численних викликів API до kube-apiserver і назад.&lt;/p&gt;
&lt;p&gt;Щоб дізнатися більше, дивіться тікет удосконалення &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3063&#34;&gt;#3063&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;api-removals&#34;&gt;Вилучення API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#api-removals&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;У &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-guide/#v1-32&#34;&gt;Kubernetes v1.32&lt;/a&gt; вилучено один API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вилучено версію API &lt;code&gt;flowcontrol.apiserver.k8s.io/v1beta3&lt;/code&gt; для FlowSchema та PriorityLevelConfiguration. Щоб підготуватися до цього, ви можете відредагувати наявні маніфести та переписати клієнтське програмне забезпечення для використання версії &lt;code&gt;flowcontrol.apiserver.k8s.io/v1 API&lt;/code&gt;, доступної починаючи з v1.29. Усі наявні збережені обʼєкти доступні через новий API. Серед помітних змін у flowcontrol.apiserver.k8s.io/v1beta3 — поле PriorityLevelConfiguration &lt;code&gt;spec.limited.nominalConcurrencyShares&lt;/code&gt; типово отримує значення 30 лише тоді, коли його не вказано, а явне значення 0 не змінюється на 30.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для отримання додаткової інформації зверніться до &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-guide/#v1-32&#34;&gt;посібника із застарівання API&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;release-notes-and-upgrade-actions-required&#34;&gt;Примітки до випуску та необхідні дії для оновлення&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#release-notes-and-upgrade-actions-required&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ознайомтеся з повною інформацією про випуск Kubernetes v1.32 у наших &lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.32.md&#34;&gt;примітках до випуску&lt;/a&gt;.&lt;/p&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Kubernetes v1.32 доступний для завантаження на &lt;a href=&#34;https://github.com/kubernetes/kubernetes/releases/tag/v1.32.0&#34;&gt;GitHub&lt;/a&gt; або на &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/releases/download/&#34;&gt;сторінці завантаження Kubernetes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Щоб розпочати роботу з Kubernetes, перегляньте ці &lt;a href=&#34;https://deploy-preview-59115--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.32 за допомогою &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/setup/independent/create-cluster-kubeadm/&#34;&gt;kubeadm&lt;/a&gt;.&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;Kubernetes можливий лише завдяки підтримці, відданості та наполегливій праці його спільноти. Кожна команда випуску складається з відданих волонтерів спільноти, які працюють разом над створенням багатьох частин, що складають випуски Kubernetes, на які ви покладаєтесь.
Це вимагає спеціалізованих навичок людей з усіх куточків нашої спільноти, від самого коду до його документації та управління проєктом.&lt;/p&gt;
&lt;p&gt;Ми хотіли б подякувати всій &lt;a href=&#34;https://github.com/kubernetes/sig-release/blob/master/releases/release-1.32/release-team.md&#34;&gt;команді випуску&lt;/a&gt; за години напруженої роботи над тим, щоб випуск Kubernetes v1.32 дійшов до нашої спільноти. Склад команди випуску варіюється від тих, хто вперше став помічником (shadow), до керівників команд, які повертаються з досвідом, здобутим протягом кількох циклів випуску. Особлива подяка нашому керівнику випуску, Frederico Muñoz, за те, що він так витончено керував командою випуску і вирішував будь-які питання з максимальною ретельністю, забезпечуючи гладке та ефективне проведення цього випуску. І останнє, але не менш важливе: велика подяка всім учасникам випуску — як керівникам, так і помічникам — а також наступним SIG за приголомшливу роботу і результати, досягнуті за ці 14 тижнів роботи над випуском:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-docs&#34;&gt;SIG Docs&lt;/a&gt; — за фундаментальну підтримку в рецензуванні документації та блогів, а також за постійну співпрацю з командами комунікацій (Comms) і документації (Docs) випуску;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-k8s-infra&#34;&gt;SIG k8s Infra&lt;/a&gt; та &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-testing&#34;&gt;SIG Testing&lt;/a&gt; — за видатну роботу з підтримки фреймворку тестування в належному стані, а також усіх необхідних компонентів інфраструктури;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kubernetes/community/tree/master/sig-release&#34;&gt;SIG Release&lt;/a&gt; та всім менеджерам випуску — за неймовірну підтримку, надану протягом усього процесу оркестрування випуску, та вирішення навіть найскладніших питань витончено і своєчасно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;CNCF K8s &lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;var-period=m&amp;var-repogroup_name=All&#34;&gt;проєкт DevStats&lt;/a&gt; обʼєднує низку цікавих даних, повʼязаних зі швидкістю розвитку Kubernetes та різних підпроєктів. Це включає в себе все, від індивідуальних внесків до кількості компаній, які беруть участь, і є ілюстрацією глибини і широти зусиль, які докладаються для розвитку цієї екосистеми.&lt;/p&gt;
&lt;p&gt;У циклі випуску v1.32, який тривав 14 тижнів (з 9 вересня по 11 грудня), ми бачили внески в Kubernetes від 125 різних компаній і 559 окремих осіб на момент написання цієї статті.&lt;/p&gt;
&lt;p&gt;У всій екосистемі Cloud Native ця цифра зростає до 433 компаній із загальною кількістю учасників 2441. Це на 7% більше загального внеску порівняно з циклом &lt;a href=&#34;https://kubernetes.io/blog/2024/08/13/kubernetes-v1-31-release/#project-velocity&#34;&gt;попереднього випуску&lt;/a&gt;, а кількість залучених компаній зросла на 14%, що свідчить про значний інтерес до проєктів Cloud Native і сильну спільноту, яка стоїть за ними.&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=1725832800000&amp;to=1733961599000&amp;var-period=d28&amp;var-repogroup_name=Kubernetes&amp;var-repo_name=kubernetes%2Fkubernetes&#34;&gt;Компанії, що роблять внесок у Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&amp;from=1725832800000&amp;to=1733961599000&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;p&gt;&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;h2 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;/h2&gt;&lt;p&gt;Ознайомтеся з майбутніми подіями Kubernetes та cloud-native з березня по червень 2025 року, зокрема з KubeCon та KCD. Залишайтеся в курсі подій та долучайтеся до спільноти Kubernetes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Березень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Beijing, China&lt;/strong&gt;&lt;/a&gt;: У березні | Пекін, Китай&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Guadalajara, Mexico&lt;/strong&gt;&lt;/a&gt;: 16 березня 2025 року | Гвадалахара, Мексика&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Rio de Janeiro, Brazil&lt;/strong&gt;&lt;/a&gt;: 22 березня 2025 року | Ріо-де-Жанейро, Бразилія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Квітень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-europe&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Europe 2025&lt;/strong&gt;&lt;/a&gt;: 1-4 квітня 2025 року | Лондон, Велика Британія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Budapest, Hungary&lt;/strong&gt;&lt;/a&gt;: 23 квітня 2025 року | Будапешт, Угорщина&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Chennai, India&lt;/strong&gt;&lt;/a&gt;: 26 квітня 2025 року | Ченнаї, Індія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Auckland, New Zealand&lt;/strong&gt;&lt;/a&gt;: 28 квітня 2025 року | Окленд, Нова Зеландія&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Травень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Helsinki, Finland&lt;/strong&gt;&lt;/a&gt;: 6 травня 2025 року | Гельсінкі, Фінляндія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: San Francisco, USA&lt;/strong&gt;&lt;/a&gt;: 8 травня 2025 року | Сан-Франциско, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://community.cncf.io/events/details/cncf-kcd-texas-presents-kcd-texas-austin-2025/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Austin, USA&lt;/strong&gt;&lt;/a&gt;: 15 травня 2025 року | Остін, США&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Seoul, South Korea&lt;/strong&gt;&lt;/a&gt;: 22 травня 2025 року | Сеул, Південна Корея&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Istanbul, Turkey&lt;/strong&gt;&lt;/a&gt;: 23 травня 2025 року | Стамбул, Туреччина&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Heredia, Costa Rica&lt;/strong&gt;&lt;/a&gt;: 31 травня 2025 року | Ередія, Коста-Ріка&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: New York, USA&lt;/strong&gt;&lt;/a&gt;: У травні | Нью-Йорк, США&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Червень 2025&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Bratislava, Slovakia&lt;/strong&gt;&lt;/a&gt;: 5 червня 2025 року | Братислава, Словаччина&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Bangalore, India&lt;/strong&gt;&lt;/a&gt;: 6 червня 2025 року | Бангалор, Індія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-china/&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon China 2025&lt;/strong&gt;&lt;/a&gt;: 10-11 червня 2025 року | Гонконг&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Antigua Guatemala, Guatemala&lt;/strong&gt;&lt;/a&gt;: 14 червня 2025 року | Антигуа-Гватемала, Гватемала&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-japan&#34;&gt;&lt;strong&gt;KubeCon + CloudNativeCon Japan 2025&lt;/strong&gt;&lt;/a&gt;: 16-17 червня 2025 року | Токіо, Японія&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/kcds/&#34;&gt;&lt;strong&gt;KCD - Kubernetes Community Days: Nigeria, Africa&lt;/strong&gt;&lt;/a&gt;: 19 червня 2025 року | Нігерія, Африка&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 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;/h2&gt;&lt;p&gt;Приєднуйтесь до учасників команди випуску Kubernetes v1.32 у &lt;strong&gt;четвер, 9 січня 2025 року о 17:00 (UTC)&lt;/strong&gt;, щоб дізнатися про основні моменти цього випуску, а також про застарівання та вилучення, що допоможе спланувати оновлення. Для отримання додаткової інформації та реєстрації відвідайте &lt;a href=&#34;https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cncf-live-webinar-kubernetes-132-release/&#34;&gt;сторінку події&lt;/a&gt; на сайті CNCF Online Programs.&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://www.kubernetes.dev/community/community-groups/#special-interest-groups&#34;&gt;груп за інтересами (Special Interest Groups)&lt;/a&gt; (SIG), які відповідають вашим інтересам. Маєте щось, про що хотіли б розповісти спільноті Kubernetes? Поділіться своєю думкою на нашій щотижневій &lt;a href=&#34;https://github.com/kubernetes/community/tree/master/communication&#34;&gt;зустрічі спільноти&lt;/a&gt;, а також за допомогою каналів нижче. Дякуємо за ваші постійні відгуки та підтримку.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Слідкуйте за нами у Bluesky &lt;a href=&#34;https://bsky.app/profile/did:plc:kyg4uikmq7lzpb76ugvxa6ul&#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;http://stackoverflow.com/questions/tagged/kubernetes&#34;&gt;Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Поділіться своєю &lt;a href=&#34;https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform&#34;&gt;історією&lt;/a&gt; про Kubernetes&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про те, що відбувається з Kubernetes, у &lt;a href=&#34;https://kubernetes.io/blog/&#34;&gt;блозі&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Дізнайтеся більше про &lt;a href=&#34;https://github.com/kubernetes/sig-release/tree/master/release-team&#34;&gt;команду випуску Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Попередній огляд Kubernetes v1.32</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/11/08/kubernetes-1-32-upcoming-changes/</link>
      <pubDate>Fri, 08 Nov 2024 00:00:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/11/08/kubernetes-1-32-upcoming-changes/</guid>
      <description>
        
        
        &lt;p&gt;З наближенням дати випуску Kubernetes v1.32 проєкт розвивається та вдосконалюється. Функції можуть бути визнані застарілими, вилучені або замінені на кращі для загального покращення проєкту.&lt;/p&gt;
&lt;p&gt;Тут описані деякі заплановані зміни для випуску Kubernetes v1.32, які, на думку команди випуску, вам слід знати для продовження обслуговування вашого середовища Kubernetes та підтримки в актуальному стані з останніми змінами. Інформація, наведена нижче, базується на поточному стані випуску v1.32 і може змінитися до фактичної дати випуску.&lt;/p&gt;
&lt;h2 id=&#34;the-kubernetes-api-removal-and-deprecation-process&#34;&gt;Процес вилучення та застарівання API Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#the-kubernetes-api-removal-and-deprecation-process&#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-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-policy/&#34;&gt;політику застарівання&lt;/a&gt; для функцій. Ця політика зазначає, що стабільні API можуть бути визнані застарілими лише тоді, коли доступна новіша, стабільна версія цього API, і що API мають мінімальний термін служби для кожного рівня стабільності. Застарілий API, який був позначений для вилучення в майбутньому випуску Kubernetes, продовжуватиме функціонувати до вилучення (щонайменше один рік з моменту застарівання). Його використання призведе до показу попередження. Вилучені API більше недоступні в поточній версії, тому вам потрібно перейти на використання заміни.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Загальнодоступні (GA) або стабільні версії API можуть бути позначені як застарілі, але не повинні бути вилучені в межах основної версії Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Бета або попередні версії API повинні підтримуватися протягом 3 випусків після застарівання.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Альфа або експериментальні версії API можуть бути вилучені в будь-якому випуску без попереднього повідомлення про застарівання; цей процес може стати відкликанням у випадках, коли вже існує інша реалізація для тієї ж функції.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Незалежно від того, чи вилучається API через перехід функції з бета-версії до стабільної, чи через те, що цей API не досяг успіху, всі вилучення відповідають цій політиці застарівання. Коли API вилучається, варіанти міграції повідомляються в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-guide/&#34;&gt;керівництві із застарівання&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;note-on-the-withdrawal-of-the-old-dra-implementation&#34;&gt;Примітка щодо відкликання старої реалізації DRA&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#note-on-the-withdrawal-of-the-old-dra-implementation&#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/enhancements/issues/3063&#34;&gt;#3063&lt;/a&gt; запровадило динамічне виділення ресурсів (DRA — Dynamic Resource Allocation) в Kubernetes 1.26.&lt;/p&gt;
&lt;p&gt;Однак у Kubernetes v1.32 цей підхід до DRA буде значно змінено. Код, повʼязаний з початковою реалізацією, буде вилучено, залишаючи KEP &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4381&#34;&gt;#4381&lt;/a&gt; як &amp;quot;нову&amp;quot; базову функціональність.&lt;/p&gt;
&lt;p&gt;Рішення змінити поточний підхід виникло через його несумісність з автоматичним масштабуванням кластера, оскільки доступність ресурсів була непрозорою, ускладнюючи прийняття рішень як для Cluster Autoscaler, так і для контролерів. Нещодавно додана модель структурованих параметрів (Structured Parameters) замінює цю функціональність.&lt;/p&gt;
&lt;p&gt;Це вилучення дозволить Kubernetes обробляти нові апаратні вимоги та заявки на ресурси більш передбачувано, оминаючи складнощі постійного обміну викликами API з kube-apiserver.&lt;/p&gt;
&lt;p&gt;Будь ласка, також перегляньте тікет удосконалення &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/3063&#34;&gt;#3063&lt;/a&gt;, щоб дізнатися більше.&lt;/p&gt;
&lt;h2 id=&#34;api-removal&#34;&gt;Вилучення API&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#api-removal&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Заплановано лише одне вилучення API для &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-guide/#v1-32&#34;&gt;Kubernetes v1.32&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Версія API &lt;code&gt;flowcontrol.apiserver.k8s.io/v1beta3&lt;/code&gt; для FlowSchema та PriorityLevelConfiguration була вилучена. Щоб підготуватися до цього, ви можете відредагувати свої поточні маніфести та переписати клієнтське програмне забезпечення для використання версії &lt;code&gt;flowcontrol.apiserver.k8s.io/v1 API&lt;/code&gt;, доступної з v1.29. Всі поточні збережені обʼєкти доступні через новий API. Помітні зміни в &lt;code&gt;flowcontrol.apiserver.k8s.io/v1beta3&lt;/code&gt; включають те, що поле &lt;code&gt;spec.limited.nominalConcurrencyShares&lt;/code&gt; у PriorityLevelConfiguration типово встановлюється на 30 лише тоді, коли його не вказано, а явно вказане значення 0 не змінюється на 30.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для отримання додаткової інформації, будь ласка, зверніться до &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/docs/reference/using-api/deprecation-guide/#v1-32&#34;&gt;керівництва із застарівання API&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;sneak-peek-of-kubernetes-v1-32&#34;&gt;Попередній огляд Kubernetes v1.32&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#sneak-peek-of-kubernetes-v1-32&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Наступний список удосконалень, ймовірно, буде включений у випуск v1.32.
Це не є зобовʼязанням, і вміст випуску може змінитися.&lt;/p&gt;
&lt;h3 id=&#34;even-more-dra-enhancements&#34;&gt;Ще більше удосконалень DRA!&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#even-more-dra-enhancements&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;У цьому випуску, як і в попередньому, проєкт Kubernetes продовжує пропонувати низку удосконалень для динамічного виділення ресурсів (DRA), ключового компонента системи управління ресурсами Kubernetes. Ці удосконалення спрямовані на підвищення гнучкості та ефективності виділення ресурсів для робочих навантажень, які потребують спеціалізованого обладнання, такого як GPU, FPGA та мережеві адаптери. Цей випуск вводить покращення, включаючи додавання статусу справності ресурсів до статусу Podʼа, як описано в KEP &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4680&#34;&gt;#4680&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;add-resource-health-status-to-the-pod-status&#34;&gt;Додавання статусу справності ресурсів до статусу Podʼа&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#add-resource-health-status-to-the-pod-status&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Важко дізнатися, коли Pod використовує пристрій, який вийшов з ладу або тимчасово несправний. KEP &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4680&#34;&gt;#4680&lt;/a&gt; пропонує показувати справність пристрою через &lt;code&gt;status&lt;/code&gt; Podʼа, що полегшує усунення несправностей у разі аварійного завершення Podʼів.&lt;/p&gt;
&lt;h3 id=&#34;windows-strikes-back&#34;&gt;Windows повертається!&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#windows-strikes-back&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;KEP &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/4802&#34;&gt;#4802&lt;/a&gt; додає підтримку для належного завершення роботи вузлів Windows у кластерах Kubernetes. До цього випуску Kubernetes надавав функціональність належного завершення роботи вузлів для вузлів Linux, але не мав еквівалентної підтримки для Windows. Це удосконалення дозволяє kubelet на вузлах Windows правильно обробляти події завершення роботи системи. Таким чином, забезпечується належне завершення роботи Podʼів на вузлах Windows, що дозволяє повторно запланувати робочі навантаження без порушень. Це покращення підвищує надійність та стабільність кластерів, які включають вузли Windows, особливо під час планового обслуговування або будь-яких оновлень системи.&lt;/p&gt;
&lt;h3 id=&#34;allow-special-characters-in-environment-variables&#34;&gt;Дозвіл на використання спеціальних символів у змінних середовища&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#allow-special-characters-in-environment-variables&#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/enhancements/issues/4369&#34;&gt;удосконалення&lt;/a&gt; у стан бета-версії, Kubernetes тепер дозволяє використовувати майже всі друковані символи ASCII (за винятком &amp;quot;=&amp;quot;) в іменах змінних середовища. Ця зміна усуває обмеження, які раніше накладалися на імена змінних, сприяючи ширшому прийняттю Kubernetes, задовольняючи різні потреби застосунків. Послаблена перевірка буде типово увімкнена через функціональну можливість &lt;code&gt;RelaxedEnvironmentVariableValidation&lt;/code&gt;, що дозволить користувачам легко використовувати змінні середовища без суворих обмежень і підвищить гнучкість для розробників, які працюють із застосунками на кшталт .NET Core, що потребують спеціальних символів у своїх конфігураціях.&lt;/p&gt;
&lt;h3 id=&#34;make-kubernetes-aware-of-the-loadbalancer-behavior&#34;&gt;Kubernetes буде обізнаним про поведінку LoadBalancer&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#make-kubernetes-aware-of-the-loadbalancer-behavior&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;KEP &lt;a href=&#34;https://github.com/kubernetes/enhancements/issues/1860&#34;&gt;#1860&lt;/a&gt; переходить до GA, вводячи поле &lt;code&gt;ipMode&lt;/code&gt; для Service з &lt;code&gt;type: LoadBalancer&lt;/code&gt;, яке може бути встановлено на &lt;code&gt;&amp;quot;VIP&amp;quot;&lt;/code&gt; або &lt;code&gt;&amp;quot;Proxy&amp;quot;&lt;/code&gt;. Це удосконалення спрямоване на покращення взаємодії балансувальників навантаження хмарних провайдерів з kube-proxy і є зміною, прозорою для кінцевого користувача. Поточна поведінка kube-proxy зберігається при використанні &lt;code&gt;&amp;quot;VIP&amp;quot;&lt;/code&gt;, де kube-proxy обробляє балансування навантаження. Використання &lt;code&gt;&amp;quot;Proxy&amp;quot;&lt;/code&gt; призводить до того, що трафік надсилається безпосередньо до балансувальника навантаження, надаючи хмарним провайдерам більший контроль над залежністю від kube-proxy; це означає, що ви можете побачити покращення продуктивності вашого балансувальника навантаження для деяких хмарних провайдерів.&lt;/p&gt;
&lt;h3 id=&#34;retry-generate-name-for-resources&#34;&gt;Повторна генерація імен для ресурсів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#retry-generate-name-for-resources&#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/enhancements/issues/4420&#34;&gt;удосконалення&lt;/a&gt; покращує обробку конфліктів імен для ресурсів Kubernetes, створених з полем &lt;code&gt;generateName&lt;/code&gt;. Раніше, якщо виникав конфлікт імен, API-сервер повертав помилку 409 HTTP Conflict, і клієнти мали вручну повторювати запит. З цим оновленням API-сервер автоматично повторює генерацію нового імені до семи разів у разі конфлікту. Це значно знижує ймовірність зіткнення, забезпечуючи безперебійну генерацію до 1 мільйона імен з ймовірністю конфлікту менше 0,1%, що забезпечує більшу стійкість для великих робочих навантажень.&lt;/p&gt;
&lt;h2 id=&#34;want-to-know-more&#34;&gt;Хочете дізнатися більше?&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#want-to-know-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.32.md&#34;&gt;Kubernetes v1.32&lt;/a&gt; як частину CHANGELOG для цього випуску.&lt;/p&gt;
&lt;p&gt;Ви можете побачити оголошення про зміни в примітках до випуску для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md&#34;&gt;Kubernetes v1.31&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.30.md&#34;&gt;Kubernetes v1.30&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.29.md&#34;&gt;Kubernetes v1.29&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.28.md&#34;&gt;Kubernetes v1.28&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>DIY: Створіть власну хмару з Kubernetes (Частина 2)</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/</link>
      <pubDate>Fri, 05 Apr 2024 07:35:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/</guid>
      <description>
        
        
        &lt;p&gt;Продовжуємо нашу серію публікацій про те, як побудувати власну хмару, використовуючи лише екосистему Kubernetes. У &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/&#34;&gt;попередній статті&lt;/a&gt; ми пояснили, як підготувати базовий дистрибутив Kubernetes на основі Talos Linux та Flux CD. У цій статті ми покажемо вам кілька різних технологій віртуалізації в Kubernetes та підготуємо все необхідне для запуску віртуальних машин у Kubernetes, зокрема сховища і мережі.&lt;/p&gt;
&lt;p&gt;Ми будемо говорити про такі технології, як KubeVirt, LINSTOR і Kube-OVN.&lt;/p&gt;
&lt;p&gt;Але спочатку пояснімо, навіщо потрібні віртуальні машини та чому не можна просто використовувати docker-контейнери для побудови хмари? Причина в тому, що контейнери не забезпечують достатнього рівня ізоляції. Хоча ситуація з кожним роком покращується, ми часто стикаємося з вразливостями, які дозволяють вийти з пісочниці контейнера і підвищити привілеї в системі.&lt;/p&gt;
&lt;p&gt;З іншого боку, Kubernetes спочатку не був задуманий як багатокористувацька система, тобто базовий шаблон використання передбачає створення окремого кластера Kubernetes для кожного незалежного проєкту та команди розробників.&lt;/p&gt;
&lt;p&gt;Віртуальні машини є основним засобом ізоляції орендарів один від одного в хмарному середовищі. У віртуальних машинах користувачі можуть виконувати код і програми з адміністративними привілеями, але це не впливає на інших орендарів або саме середовище. Іншими словами, віртуальні машини дозволяють досягти &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/security/multi-tenancy/#isolation&#34;&gt;жорсткої ізоляції орендарів&lt;/a&gt; та запуску в середовищах, де орендарі не довіряють один одному.&lt;/p&gt;
&lt;h2 id=&#34;virtualization-technologies-in-kubernetes&#34;&gt;Технології віртуалізації в Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#virtualization-technologies-in-kubernetes&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Існує кілька різних технологій, які приносять віртуалізацію у світ Kubernetes: &lt;a href=&#34;https://kubevirt.io/&#34;&gt;KubeVirt&lt;/a&gt; та &lt;a href=&#34;https://katacontainers.io/&#34;&gt;Kata Containers&lt;/a&gt; є найпопулярнішими з них. Але варто знати, що вони працюють по-різному.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kata Containers&lt;/strong&gt; реалізує CRI (Container Runtime Interface) та забезпечує додатковий рівень ізоляції для стандартних контейнерів, запускаючи їх у віртуальних машинах. Але вони працюють в одному кластері Kubernetes.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/kata-containers.svg&#34;
         alt=&#34;Схема, що показує, як забезпечується ізоляція контейнерів шляхом запуску контейнерів у віртуальних машинах за допомогою Kata Containers&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Схема, що показує, як забезпечується ізоляція контейнерів шляхом запуску контейнерів у віртуальних машинах за допомогою Kata Containers&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;KubeVirt&lt;/strong&gt; дозволяє запускати традиційні віртуальні машини за допомогою API Kubernetes. Віртуальні машини KubeVirt запускаються як звичайні процеси Linux у контейнерах. Іншими словами, у KubeVirt контейнер використовується як пісочниця для запуску процесів віртуальної машини (QEMU). Це чітко видно на малюнку нижче, якщо подивитися, як реалізовано живу міграцію віртуальних машин у KubeVirt. Коли міграція потрібна, віртуальна машина переміщується з одного контейнера до іншого.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/kubevirt-migration.svg&#34;
         alt=&#34;Схема, що показує живу міграцію віртуальної машини з одного контейнера до іншого у KubeVirt&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Схема, що показує живу міграцію віртуальної машини з одного контейнера до іншого у KubeVirt&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Існує також альтернативний проєкт — &lt;a href=&#34;https://github.com/smartxworks/virtink&#34;&gt;Virtink&lt;/a&gt;, який реалізує легку віртуалізацію за допомогою &lt;a href=&#34;https://github.com/cloud-hypervisor/cloud-hypervisor&#34;&gt;Cloud-Hypervisor&lt;/a&gt; і спочатку орієнтований на запуск віртуальних кластерів Kubernetes за допомогою Cluster API.&lt;/p&gt;
&lt;p&gt;Враховуючи наші цілі, ми вирішили використати KubeVirt як найпопулярніший проєкт у цій галузі. Крім того, ми маємо великий досвід і вже зробили чималий внесок у KubeVirt.&lt;/p&gt;
&lt;p&gt;KubeVirt &lt;a href=&#34;https://kubevirt.io/user-guide/operations/installation/&#34;&gt;легко встановлюється&lt;/a&gt; і дозволяє запускати віртуальні машини безпосередньо з коробки, використовуючи &lt;a href=&#34;https://kubevirt.io/user-guide/virtual_machines/disks_and_volumes/#containerdisk&#34;&gt;containerDisk&lt;/a&gt; — ця можливість дозволяє зберігати та розповсюджувати образи VM безпосередньо як образи OCI з реєстру образів контейнерів. Віртуальні машини з containerDisk добре підходять для створення робочих вузлів Kubernetes та інших віртуальних машин, які не потребують збереження стану.&lt;/p&gt;
&lt;p&gt;Для керування постійними даними KubeVirt пропонує окремий інструмент, Containerized Data Importer (CDI). Він дозволяє клонувати PVC і наповнювати їх даними з базових образів. CDI необхідний, якщо ви хочете автоматично виділяти постійні томи для ваших віртуальних машин, і він також потрібен для драйвера KubeVirt CSI, який використовується для обробки запитів на постійні томи з кластерів Kubernetes орендарів.&lt;/p&gt;
&lt;p&gt;Але спочатку вам потрібно вирішити, де і як ви будете зберігати ці дані.&lt;/p&gt;
&lt;h2 id=&#34;storage-for-kubernetes-vms&#34;&gt;Сховище для VM в Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#storage-for-kubernetes-vms&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;З впровадженням CSI (Container Storage Interface) став доступний широкий спектр технологій, які інтегруються з Kubernetes. Насправді KubeVirt повністю використовує інтерфейс CSI, узгоджуючи вибір сховища для віртуалізації з вибором сховища для самого Kubernetes. Однак є нюанси, які вам потрібно врахувати. На відміну від контейнерів, які зазвичай використовують стандартну файлову систему, блокові пристрої є більш ефективними для віртуальних машин.&lt;/p&gt;
&lt;p&gt;Хоча інтерфейс CSI в Kubernetes дозволяє запитувати обидва типи томів: файлові системи та блокові пристрої, важливо перевірити, чи підтримує це ваш бекенд сховища.&lt;/p&gt;
&lt;p&gt;Використання блокових пристроїв для віртуальних машин усуває необхідність в додатковому шарі абстракції, такому як файлова система, що робить його більш продуктивним і в більшості випадків дозволяє використовувати режим &lt;em&gt;ReadWriteMany&lt;/em&gt;. Цей режим дозволяє одночасно звертатися до тому з декількох вузлів, що є критично важливою можливістю для забезпечення живої міграції віртуальних машин у KubeVirt.&lt;/p&gt;
&lt;p&gt;Система зберігання може бути зовнішньою або внутрішньою (у випадку гіперконвергованої інфраструктури). Використання зовнішнього сховища в багатьох випадках робить всю систему більш стабільною, оскільки ваші дані зберігаються окремо від обчислювальних вузлів.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/storage-external.svg&#34;
         alt=&#34;Схема, що показує взаємодію зовнішнього сховища даних з обчислювальними вузлами&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Схема, що показує взаємодію зовнішнього сховища даних з обчислювальними вузлами&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Зовнішні рішення для зберігання даних часто є популярними в корпоративних системах, оскільки таке сховище часто надається зовнішнім постачальником, який займається його експлуатацією. Інтеграція з Kubernetes включає лише невеликий компонент, встановлений у кластері — драйвер CSI. Цей драйвер відповідає за виділення томів у цьому сховищі та підключення їх до Podʼів, які запускає Kubernetes. Втім, подібні рішення для зберігання даних можуть бути реалізовані й з використанням технологій з відкритим вихідним кодом. Одним з популярних рішень є &lt;a href=&#34;https://www.truenas.com/&#34;&gt;TrueNAS&lt;/a&gt; на основі драйвера &lt;a href=&#34;https://github.com/democratic-csi/democratic-csi&#34;&gt;democratic-csi&lt;/a&gt;.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/storage-local.svg&#34;
         alt=&#34;Діаграма, що показує локальне зберігання даних на обчислювальних вузлах&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує локальне зберігання даних на обчислювальних вузлах&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;З іншого боку, гіперконвергентні системи часто реалізуються з використанням локального сховища (коли не потрібна реплікація) та програмно визначених сховищ, які часто встановлюються безпосередньо в Kubernetes, таких як &lt;a href=&#34;https://rook.io/&#34;&gt;Rook/Ceph&lt;/a&gt;, &lt;a href=&#34;https://openebs.io/&#34;&gt;OpenEBS&lt;/a&gt;, &lt;a href=&#34;https://longhorn.io/&#34;&gt;Longhorn&lt;/a&gt;, &lt;a href=&#34;https://linbit.com/linstor/&#34;&gt;LINSTOR&lt;/a&gt; та інші.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/storage-clustered.svg&#34;
         alt=&#34;Діаграма, що показує кластеризоване зберігання даних на обчислювальних вузлах&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує кластеризоване зберігання даних на обчислювальних вузлах&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Гіперконвергентна система має свої переваги. Наприклад, локальність даних: коли ваші дані зберігаються локально, доступ до таких даних є швидшим. Але є і недоліки, оскільки така система зазвичай складніша в керуванні та обслуговуванні.&lt;/p&gt;
&lt;p&gt;В Ænix ми прагнули надати готове до використання рішення, яке можна було б використовувати без необхідності купувати та налаштовувати додаткове зовнішнє сховище, і яке було б оптимальним з погляду швидкості та використання ресурсів. LINSTOR став цим рішенням. Перевірені часом та популярні в промисловості технології, такі як LVM і ZFS, як бекенд, дають упевненість у тому, що дані надійно зберігаються. Реплікація на основі DRBD неймовірно швидка і споживає невелику кількість обчислювальних ресурсів.&lt;/p&gt;
&lt;p&gt;Для встановлення LINSTOR в Kubernetes існує проєкт Piraeus, який вже надає готове блокове сховище для використання з KubeVirt.&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;У випадку, якщо ви використовуєте Talos Linux, як ми описали в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/&#34;&gt;попередній статті&lt;/a&gt;, вам потрібно буде заздалегідь активувати необхідні модулі ядра і налаштувати piraeus, як описано в &lt;a href=&#34;https://github.com/piraeusdatastore/piraeus-operator/blob/v2/docs/how-to/talos.md&#34;&gt;інструкції&lt;/a&gt;.&lt;/div&gt;

&lt;h2 id=&#34;networking-for-kubernetes-vms&#34;&gt;Мережа для віртуальних машин Kubernetes&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#networking-for-kubernetes-vms&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Попри схожий інтерфейс — CNI, мережева архітектура в Kubernetes насправді є набагато складнішою та зазвичай складається з багатьох незалежних компонентів, які не повʼязані безпосередньо один з одним. Насправді ви можете розділити мережу Kubernetes на чотири рівні, які описані нижче.&lt;/p&gt;
&lt;h3 id=&#34;node-network-data-center-network&#34;&gt;Мережева інфраструктура вузлів (мережа дата-центру)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#node-network-data-center-network&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Мережа, якою вузли зʼєднуються один з одним. Ця мережа зазвичай не керується Kubernetes, але є важливою, оскільки без неї нічого не працюватиме. На практиці фізична інфраструктура зазвичай має більше ніж одну таку мережу, наприклад, одну для комунікації між вузлами, другу для реплікації сховища, третю для зовнішнього доступу тощо.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-nodes.svg&#34;
         alt=&#34;Діаграма, що показує роль мережі вузлів (мережі дата-центру) у схемі мережі Kubernetes&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує роль мережі вузлів (мережі дата-центру) у схемі мережі Kubernetes&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Налаштування фізичної мережевої взаємодії між вузлами виходить за межі цієї статті, оскільки в більшості ситуацій Kubernetes використовує вже наявну мережеву інфраструктуру.&lt;/p&gt;
&lt;h3 id=&#34;pod-network&#34;&gt;Мережа Podʼів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#pod-network&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Це мережа, яку забезпечує ваш CNI-втулок. Завдання CNI-втулка полягає в забезпеченні прозорого зʼєднання між усіма контейнерами та вузлами в кластері. Більшість CNI-втулків реалізують пласку мережу, з якої окремі блоки IP-адрес виділяються для використання на кожному вузлі.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-pods.svg&#34;
         alt=&#34;Діаграма, що показує роль мережі Podʼів (CNI-втулок) у схемі мережі Kubernetes&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує роль мережі Podʼів (CNI-втулок) у схемі мережі Kubernetes&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;На практиці ваш кластер може мати кілька CNI-втулків, керованих &lt;a href=&#34;https://github.com/k8snetworkplumbingwg/multus-cni&#34;&gt;Multus&lt;/a&gt;. Цей підхід часто використовується у рішеннях віртуалізації на основі KubeVirt — &lt;a href=&#34;https://www.rancher.com/&#34;&gt;Rancher&lt;/a&gt; та &lt;a href=&#34;https://www.redhat.com/en/technologies/cloud-computing/openshift/virtualization&#34;&gt;OpenShift&lt;/a&gt;. Основний CNI-втулок використовується для інтеграції з сервісами Kubernetes, тоді як додаткові CNI-втулки використовуються для реалізації приватних мереж (VPC) та інтеграції з фізичними мережами вашого дата-центру.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/containernetworking/plugins/tree/main/plugins&#34;&gt;Стандартні CNI-втулки&lt;/a&gt; можуть бути використані для підключення мостів (bridge) або фізичних інтерфейсів. Крім того, існують спеціалізовані втулки, такі як &lt;a href=&#34;https://github.com/kubevirt/macvtap-cni&#34;&gt;macvtap-cni&lt;/a&gt;, які розроблені для забезпечення більшої продуктивності.&lt;/p&gt;
&lt;p&gt;Ще одним аспектом, який слід враховувати при запуску віртуальних машин у Kubernetes, є потреба в керуванні IP-адресами (IPAM), особливо для вторинних інтерфейсів, які надає Multus. Це зазвичай керується DHCP-сервером, що працює у вашій інфраструктурі. Додатково, призначення MAC-адрес для віртуальних машин може керуватись за допомогою &lt;a href=&#34;https://github.com/k8snetworkplumbingwg/kubemacpool&#34;&gt;Kubemacpool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Проте на нашій платформі ми вирішили піти іншим шляхом і повністю покладаємося на &lt;a href=&#34;https://www.kube-ovn.io/&#34;&gt;Kube-OVN&lt;/a&gt;. Цей CNI-втулок базується на OVN (Open Virtual Network), який спочатку був розроблений для OpenStack і надає повне мережеве рішення для віртуальних машин у Kubernetes, з можливістю керування IP-адресами та MAC-адресами через Custom Resources, підтримує живу міграцію зі збереженням IP-адрес між вузлами, і дозволяє створювати VPC для фізичного розділення мереж між орендарями.&lt;/p&gt;
&lt;p&gt;У Kube-OVN ви можете призначати окремі підмережі всьому простору імен або підключати їх як додаткові мережеві інтерфейси за допомогою Multus.&lt;/p&gt;
&lt;h3 id=&#34;services-network&#34;&gt;Мережа сервісів (Services Network)&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#services-network&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Окрім CNI-втулка, Kubernetes також має мережу сервісів, яка в основному потрібна для виявлення сервісів. На відміну від традиційних віртуальних машин, Kubernetes спочатку розроблений для запуску Podʼів із випадковою адресою. І мережа сервісів забезпечує зручну абстракцію (стабільні IP-адреси та DNS-імена), яка завжди буде спрямовувати трафік до правильного Podʼа. Такий підхід також часто використовується з віртуальними машинами в хмарах, хоча їх IP-адреси зазвичай є статичними.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-services.svg&#34;
         alt=&#34;Діаграма, що показує роль мережі сервісів (втулок мережі сервісів) у схемі мережі Kubernetes&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує роль мережі сервісів (втулок мережі сервісів) у схемі мережі Kubernetes&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Реалізацію мережі сервісів у Kubernetes здійснює втулок мережі сервісів. Стандартною реалізацією є &lt;strong&gt;kube-proxy&lt;/strong&gt;, який використовується в більшості кластерів. Але наразі ця функціональність може бути забезпечена як частина CNI-втулка. Найбільш передову реалізацію пропонує проєкт &lt;a href=&#34;https://cilium.io/&#34;&gt;Cilium&lt;/a&gt;, який може працювати в режимі заміни kube-proxy.&lt;/p&gt;
&lt;p&gt;Cilium базується на технології eBPF, яка дозволяє ефективно розвантажувати мережевий стек Linux, що підвищує продуктивність і безпеку в порівнянні з традиційними методами на основі iptables.&lt;/p&gt;
&lt;p&gt;На практиці Cilium і Kube-OVN можуть бути легко &lt;a href=&#34;https://kube-ovn.readthedocs.io/zh-cn/stable/en/advance/with-cilium/&#34;&gt;інтегровані&lt;/a&gt; для забезпечення єдиного рішення, що пропонує безшовну багатокористувацьку мережу для віртуальних машин, а також досконалі мережеві політики та обʼєднану функціональність мережі сервісів.&lt;/p&gt;
&lt;h3 id=&#34;external-traffic-load-balancer&#34;&gt;Зовнішній балансувальник навантаження&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#external-traffic-load-balancer&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;На цьому етапі у вас вже є все необхідне для запуску віртуальних машин у Kubernetes. Але насправді є ще одна річ. Вам все ще потрібно отримати доступ до ваших сервісів із зовнішнього середовища, і зовнішній балансувальник навантаження допоможе вам з організацією цього.&lt;/p&gt;
&lt;p&gt;Для bare-metal кластерів Kubernetes доступні кілька балансувальників навантаження: &lt;a href=&#34;https://metallb.universe.tf/&#34;&gt;MetalLB&lt;/a&gt;, &lt;a href=&#34;https://kube-vip.io/&#34;&gt;kube-vip&lt;/a&gt;, &lt;a href=&#34;https://www.loxilb.io/&#34;&gt;LoxiLB&lt;/a&gt;, також &lt;a href=&#34;https://docs.cilium.io/en/latest/network/lb-ipam/&#34;&gt;Cilium&lt;/a&gt; та &lt;a href=&#34;https://kube-ovn.readthedocs.io/zh-cn/latest/en/guide/loadbalancer-service/&#34;&gt;Kube-OVN&lt;/a&gt; забезпечують вбудовану реалізацію.&lt;/p&gt;
&lt;p&gt;Роль зовнішнього балансувальника навантаження полягає в наданні стабільної адреси, доступної зовні, і спрямуванні зовнішнього трафіку до мережі сервісів. Втулок мережі сервісів направить його до ваших Podʼів та віртуальних машин, як зазвичай.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-loadbalancer.svg&#34;
         alt=&#34;Роль зовнішнього балансувальника навантаження у схемі мережі Kubernetes&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує роль зовнішнього балансувальника навантаження у схемі мережі Kubernetes&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;У більшості випадків налаштування балансувальника навантаження на bare-metal досягається шляхом створення плаваючої IP-адреси на вузлах у кластері та її оголошення назовні за допомогою протоколів ARP/NDP або BGP.&lt;/p&gt;
&lt;p&gt;Вивчивши різні варіанти, ми вирішили, що MetalLB є найпростішим і найнадійнішим рішенням, хоча ми не вимагаємо суворого використання лише його.&lt;/p&gt;
&lt;p&gt;Ще однією перевагою є те, що в режимі L2 speaker-и MetalLB постійно перевіряють стан сусідів, виконуючи перевірки життєздатності за допомогою протоколу memberlist. Це дозволяє реалізувати автоматичне перемикання у разі відмови, яке працює незалежно від панелі управління Kubernetes.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Висновок&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#conclusion&#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/aenix-io/cozystack&#34;&gt;Cozystack&lt;/a&gt;, де ви можете їх спробувати без обмежень.&lt;/p&gt;
&lt;p&gt;У &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/&#34;&gt;наступній статті&lt;/a&gt; я розповім, як на основі цього ви можете реалізувати створення повнофункціональних кластерів Kubernetes одним натисканням кнопки.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>DIY: Створіть власну хмару з Kubernetes (Частина 1)</title>
      <link>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/</link>
      <pubDate>Fri, 05 Apr 2024 07:30:00 +0000</pubDate>
      
      <guid>https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/uk/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/</guid>
      <description>
        
        
        &lt;p&gt;У Ænix ми дуже любимо Kubernetes і мріємо, що всі сучасні технології незабаром почнуть використовувати його чудові патерни.&lt;/p&gt;
&lt;p&gt;Чи думали ви коли-небудь про створення власної хмари? Я впевнений, що так. Але чи можливо це зробити, використовуючи лише сучасні технології та підходи, не виходячи за межі затишної екосистеми Kubernetes? Наш досвід у розробці Cozystack змусив нас глибоко заглибитись у це питання.&lt;/p&gt;
&lt;p&gt;Ви можете стверджувати, що Kubernetes не призначений для цього, і чому б просто не використовувати OpenStack на фізичних серверах та запускати Kubernetes всередині нього, як це задумано. Але в цьому випадку ви просто передаєте відповідальність зі своїх рук у руки адміністраторів OpenStack. Це додасть щонайменше ще одну велику та складну систему до вашої екосистеми.&lt;/p&gt;
&lt;p&gt;Навіщо ускладнювати речі? — адже Kubernetes вже має все необхідне для запуску кластерів Kubernetes для орендарів на цьому етапі.&lt;/p&gt;
&lt;p&gt;Я хочу поділитися з вами нашим досвідом у розробці хмарної платформи на основі Kubernetes, виділивши відкриті проєкти, які ми використовуємо самі та вважаємо, що вони заслуговують вашої уваги.&lt;/p&gt;
&lt;p&gt;У цій серії статей я розповім вам нашу історію про те, як ми готуємо керовані кластери Kubernetes на &amp;quot;голому&amp;quot; залізі, використовуючи лише відкриті технології. Починаючи з базового рівня підготовки дата-центру, запуску віртуальних машин, ізоляції мереж, налаштування відмовостійкого сховища до забезпечення повнофункціональних кластерів Kubernetes з динамічним наданням томів, балансувальниками навантаження та автомасштабуванням.&lt;/p&gt;
&lt;p&gt;Цією статтею я починаю серію, яка складатиметься з кількох частин:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Частина 1&lt;/strong&gt;: Підготовка основи для вашої хмари. Виклики, з якими стикаються під час підготовки та експлуатації Kubernetes на &amp;quot;голому&amp;quot; залізі, та готовий рецепт для забезпечення інфраструктури.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Частина 2&lt;/strong&gt;: Мережі, сховища та віртуалізація. Як перетворити Kubernetes на інструмент для запуску віртуальних машин і що для цього потрібно.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Частина 3&lt;/strong&gt;: Cluster API і як почати розгортання кластерів Kubernetes натисканням однієї кнопки. Як працює автомасштабування, динамічне надання томів і балансувальники навантаження.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Я спробую описати різні технології якнайбільше незалежно, але водночас поділюся нашим досвідом і поясню, чому ми прийшли до того чи іншого рішення.&lt;/p&gt;
&lt;p&gt;Почнемо з розуміння основної переваги Kubernetes та того, як він змінив підхід до використання хмарних ресурсів.&lt;/p&gt;
&lt;p&gt;Важливо розуміти, що використання Kubernetes у хмарі та на &amp;quot;голому&amp;quot; залізі відрізняється.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes-in-the-cloud&#34;&gt;Kubernetes у хмарі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#kubernetes-in-the-cloud&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Коли ви оперуєте Kubernetes у хмарі, ви не хвилюєтеся про постійні томи, хмарні балансувальники навантаження або процес виділення вузлів. Усе це робить ваш хмарний провайдер, який приймає ваші запити у вигляді обʼєктів Kubernetes. Іншими словами, серверна сторона повністю прихована від вас, і вам не дуже цікаво знати, як саме хмарний провайдер реалізує це, оскільки це не ваша зона відповідальності.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/cloud.svg&#34;
         alt=&#34;Діаграма, що показує Kubernetes у хмарі, де балансування навантаження та зберігання виконуються поза кластером&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує Kubernetes у хмарі, де балансування навантаження та зберігання виконуються поза кластером&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Kubernetes пропонує зручні абстракції, які працюють однаково всюди, дозволяючи розгортати ваші застосунки на будь-якому Kubernetes у будь-якій хмарі.&lt;/p&gt;
&lt;p&gt;У хмарі дуже часто є кілька окремих сутностей: панель управління Kubernetes, віртуальні машини, постійні томи та балансувальники навантаження як окремі сутності. Використовуючи ці сутності, ви можете створювати дуже динамічні середовища.&lt;/p&gt;
&lt;p&gt;Завдяки Kubernetes, віртуальні машини тепер розглядаються лише як інструмент для використання хмарних ресурсів. Ви більше не зберігаєте дані всередині віртуальних машин. Ви можете видалити всі ваші віртуальні машини в будь-який момент і відтворити їх без порушення роботи вашого застосунку. Панель управління Kubernetes продовжуватиме зберігати інформацію про те, що має працювати у вашому кластері. Балансувальник навантаження продовжить направляти трафік до вашого робочого навантаження, просто змінюючи точку доступу для передачі трафіку на новий вузол. А ваші дані будуть безпечно зберігатися у зовнішніх постійних томах, наданих хмарою.&lt;/p&gt;
&lt;p&gt;Такий підхід є базовим при використанні Kubernetes у хмарах. Причина цього досить очевидна: чим простіша система, тим вона стабільніша, і саме за цю простоту ви купуєте Kubernetes у хмарі.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes-on-bare-metal&#34;&gt;Kubernetes на &amp;quot;голому&amp;quot; залізі&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#kubernetes-on-bare-metal&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Використання Kubernetes у хмарах дійсно просте та зручне, чого не можна сказати про установки на &amp;quot;голому&amp;quot; залізі. У світі &amp;quot;голого&amp;quot; заліза Kubernetes, навпаки, стає нестерпно складним. По-перше, тому що вся мережа, сховище даних, балансувальники навантаження тощо зазвичай працюють не зовні, а всередині вашого кластера. У результаті така система набагато складніша для оновлення та підтримки.&lt;/p&gt;


&lt;figure&gt;
    &lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/baremetal.svg&#34;
         alt=&#34;Діаграма, що показує Kubernetes на &amp;#34;голому&amp;#34; залізі, де балансування навантаження та зберігання виконуються всередині кластера&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;Діаграма, що показує Kubernetes на &amp;quot;голому&amp;quot; залізі, де балансування навантаження та зберігання виконуються всередині кластера&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Судіть самі: у хмарі, щоб оновити вузол, ви зазвичай видаляєте віртуальну машину (або навіть використовуєте команду &lt;code&gt;kubectl delete node&lt;/code&gt;) і дозволяєте вашому інструменту керування вузлами створити новий на основі незмінного образу. Новий вузол приєднається до кластера і &amp;quot;просто працюватиме&amp;quot; як вузол; дотримуючись дуже простого та поширеного шаблону у світі Kubernetes. Багато кластерів замовляють нові віртуальні машини кожні кілька хвилин, просто тому, що вони можуть використовувати дешевші spot-екземпляри. Однак коли у вас є фізичний сервер, ви не можете просто видалити та відтворити його, по-перше, тому що він часто запускає деякі кластерні служби, зберігає дані, і процес його оновлення значно складніший.&lt;/p&gt;
&lt;p&gt;Існують різні підходи до розвʼязання цієї проблеми, починаючи від оновлень на місці, як це роблять kubeadm, kubespray та k3s, до повної автоматизації забезпечення фізичних вузлів за допомогою Cluster API та Metal3.&lt;/p&gt;
&lt;p&gt;Мені подобається гібридний підхід, який пропонує Talos Linux, де вся ваша система описується в одному конфігураційному файлі. Більшість параметрів цього файлу можна застосувати без перезавантаження або перестворення вузла, включаючи версію компонентів панелі управління Kubernetes. При цьому зберігається максимальна декларативність Kubernetes. Такий підхід мінімізує непотрібний вплив на кластерні сервіси при оновленні «голих» вузлів. У більшості випадків вам не потрібно буде мігрувати віртуальні машини та перебудовувати файлову систему кластера при незначних оновленнях.&lt;/p&gt;
&lt;h2 id=&#34;preparing-a-base-for-your-future-cloud&#34;&gt;Підготовка бази для майбутньої хмари&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#preparing-a-base-for-your-future-cloud&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Отже, ви вирішили створити власну хмару. Щоб почати, потрібно створити базовий шар. Вам слід подумати не лише про те, як ви встановите Kubernetes на свої сервери, а й про те, як ви будете його оновлювати та підтримувати. Врахуйте, що вам доведеться думати про такі речі, як оновлення ядра, встановлення необхідних модулів, а також пакунків і оновлень безпеки. Тепер вам потрібно подумати про набагато більше, ніж зазвичай при використанні готового Kubernetes у хмарі.&lt;/p&gt;
&lt;p&gt;Звісно, ви можете використовувати стандартні дистрибутиви, такі як Ubuntu або Debian, або ж розглянути спеціалізовані, як Flatcar Container Linux, Fedora Core і Talos Linux. Кожен з них має свої переваги та недоліки.&lt;/p&gt;
&lt;p&gt;Що стосується нас, в Ænix, ми використовуємо досить специфічні модулі ядра, такі як ZFS, DRBD і OpenvSwitch, тому вирішили піти шляхом створення системного образу з усіма необхідними модулями заздалегідь. У цьому випадку Talos Linux виявився найбільш зручним для нас. Наприклад, достатньо такої конфігурації, щоб створити системний образ з усіма необхідними модулями ядра:&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;arch&lt;/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;amd64&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;platform&lt;/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;metal&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;secureboot&lt;/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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;version&lt;/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.6.4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/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;kernel&lt;/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;/usr/install/amd64/vmlinuz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;initramfs&lt;/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;/usr/install/amd64/initramfs.xz&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;baseInstaller&lt;/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;imageRef&lt;/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;ghcr.io/siderolabs/installer:v1.6.4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;systemExtensions&lt;/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;imageRef&lt;/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;ghcr.io/siderolabs/amd-ucode:20240115&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/amdgpu-firmware:20240115&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/bnx2-bnx2x:20240115&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/i915-ucode:20240115&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/intel-ice-firmware:20240115&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/intel-ucode:20231114&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/qlogic-firmware:20240115&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/drbd:9.2.6-v1.6.4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;imageRef&lt;/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;ghcr.io/siderolabs/zfs:2.1.14-v1.6.4&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;output&lt;/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;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;installer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;outFormat&lt;/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;raw&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;docker&lt;/code&gt; для створення образу ОС:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cat config.yaml | docker run --rm -i -v /dev:/dev --privileged &amp;#34;ghcr.io/siderolabs/imager:v1.6.4&amp;#34; -
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;І в результаті ми отримуємо контейнерний образ Docker з усім необхідним, який можна використовувати для встановлення Talos Linux на наші сервери. Ви можете зробити те саме; цей образ міститиме всі необхідні прошивки та модулі ядра.&lt;/p&gt;
&lt;p&gt;Але виникає питання: як доставити свіжостворений образ на ваші вузли?&lt;/p&gt;
&lt;p&gt;Я давно розмірковував над ідеєю завантаження через PXE. Наприклад, проєкт &lt;strong&gt;Kubefarm&lt;/strong&gt;, про який я писав в &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2021/12/22/kubernetes-in-kubernetes-and-pxe-bootable-server-farm/&#34;&gt;статті&lt;/a&gt; два роки тому, був повністю побудований на цьому підході. Але, на жаль, він не допомагає розгорнути ваш перший батьківський кластер, який міститиме інші. Тож зараз у вас є рішення, яке допоможе зробити це саме за допомогою підходу PXE.&lt;/p&gt;
&lt;p&gt;По суті, все, що вам потрібно зробити, це &lt;a href=&#34;https://cozystack.io/docs/get-started/&#34;&gt;запустити тимчасово&lt;/a&gt; &lt;strong&gt;DHCP&lt;/strong&gt; і &lt;strong&gt;PXE&lt;/strong&gt; сервери всередині контейнерів. Тоді ваші вузли завантажаться з вашого образу, і ви можете використовувати простий скрипт у стилі Debian, щоб допомогти вам ініціалізувати вузли.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://asciinema.org/a/627123&#34;&gt;&lt;img src=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/asciicast.svg&#34; alt=&#34;asciicast&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/aenix-io/talos-bootstrap/&#34;&gt;Вихідний код&lt;/a&gt; для цього сценарію &lt;code&gt;talos-bootstrap&lt;/code&gt; доступний на GitHub.&lt;/p&gt;
&lt;p&gt;Цей сценарій дозволяє розгорнути Kubernetes на &amp;quot;голому&amp;quot; залізі за пʼять хвилин і отримати kubeconfig для доступу до нього. Однак попереду ще багато невирішених питань.&lt;/p&gt;
&lt;h2 id=&#34;delivering-system-components&#34;&gt;Доставка системних компонентів&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#delivering-system-components&#34; aria-label=&#34;Heading self-link&#34;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;На цьому етапі у вас вже є кластер Kubernetes, здатний запускати різні робочі навантаження. Однак він ще не повністю функціональний. Іншими словами, вам потрібно налаштувати мережу та зберігання, а також встановити необхідні розширення кластера, такі як KubeVirt для запуску віртуальних машин, а також стек моніторингу та інші системні компоненти.&lt;/p&gt;
&lt;p&gt;Традиційно це вирішується шляхом встановлення &lt;strong&gt;чартів Helm&lt;/strong&gt; у ваш кластер. Ви можете зробити це, виконуючи команди &lt;code&gt;helm install&lt;/code&gt; локально, але цей підхід стає незручним, коли ви хочете відстежувати оновлення, і якщо у вас кілька кластерів і ви хочете, щоб вони залишалися однорідними. Насправді існує багато способів зробити це декларативно. Для подолання цієї задачі я рекомендую використовувати найкращі практики GitOps. Я маю на увазі інструменти, такі як ArgoCD та FluxCD.&lt;/p&gt;
&lt;p&gt;Хоча ArgoCD зручніший для розробки завдяки графічному інтерфейсу та централізованій панелі управління, FluxCD, з іншого боку, краще підходить для створення дистрибутивів Kubernetes. За допомогою FluxCD ви можете вказати, які чарти з якими параметрами повинні бути запущені, і описати залежності. Після цього FluxCD подбає про все.&lt;/p&gt;
&lt;p&gt;Пропонується одноразово встановити FluxCD у ваш новостворений кластер і надати йому конфігурацію. Це дозволить встановити все необхідне, щоб привести кластер до очікуваного стану.&lt;/p&gt;
&lt;p&gt;Здійснивши одноразову інсталяцію FluxCD у вашому новому кластері та налаштувавши його відповідним чином, ви дозволяєте йому автоматично розгорнути всі необхідні компоненти. Це дозволить вашому кластеру оновити себе до потрібного стану. Наприклад, після встановлення нашої платформи ви побачите такі попередньо налаштовані Helm чарти з системними компонентами:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NAMESPACE                        NAME                        AGE    READY   STATUS
cozy-cert-manager                cert-manager                4m1s   True    Release reconciliation succeeded
cozy-cert-manager                cert-manager-issuers        4m1s   True    Release reconciliation succeeded
cozy-cilium                      cilium                      4m1s   True    Release reconciliation succeeded
cozy-cluster-api                 capi-operator               4m1s   True    Release reconciliation succeeded
cozy-cluster-api                 capi-providers              4m1s   True    Release reconciliation succeeded
cozy-dashboard                   dashboard                   4m1s   True    Release reconciliation succeeded
cozy-fluxcd                      cozy-fluxcd                 4m1s   True    Release reconciliation succeeded
cozy-grafana-operator            grafana-operator            4m1s   True    Release reconciliation succeeded
cozy-kamaji                      kamaji                      4m1s   True    Release reconciliation succeeded
cozy-kubeovn                     kubeovn                     4m1s   True    Release reconciliation succeeded
cozy-kubevirt-cdi                kubevirt-cdi                4m1s   True    Release reconciliation succeeded
cozy-kubevirt-cdi                kubevirt-cdi-operator       4m1s   True    Release reconciliation succeeded
cozy-kubevirt                    kubevirt                    4m1s   True    Release reconciliation succeeded
cozy-kubevirt                    kubevirt-operator           4m1s   True    Release reconciliation succeeded
cozy-linstor                     linstor                     4m1s   True    Release reconciliation succeeded
cozy-linstor                     piraeus-operator            4m1s   True    Release reconciliation succeeded
cozy-mariadb-operator            mariadb-operator            4m1s   True    Release reconciliation succeeded
cozy-metallb                     metallb                     4m1s   True    Release reconciliation succeeded
cozy-monitoring                  monitoring                  4m1s   True    Release reconciliation succeeded
cozy-postgres-operator           postgres-operator           4m1s   True    Release reconciliation succeeded
cozy-rabbitmq-operator           rabbitmq-operator           4m1s   True    Release reconciliation succeeded
cozy-redis-operator              redis-operator              4m1s   True    Release reconciliation succeeded
cozy-telepresence                telepresence                4m1s   True    Release reconciliation succeeded
cozy-victoria-metrics-operator   victoria-metrics-operator   4m1s   True    Release reconciliation succeeded
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Висновок&lt;a class=&#34;td-heading-self-link&#34; href=&#34;#conclusion&#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/aenix-io/cozystack&#34;&gt;Cozystack&lt;/a&gt;, який ви можете спробувати абсолютно безкоштовно.&lt;/p&gt;
&lt;p&gt;У наступних статтях я розповім про те &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/&#34;&gt;як підготувати Kubernetes для запуску віртуальних машин&lt;/a&gt; та &lt;a href=&#34;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/&#34;&gt;як запускати кластери Kubernetes натисканням кнопки&lt;/a&gt;. Залишайтеся з нами, буде цікаво!&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Огляд Kubernetes v1.30</title>
      <link>https://deploy-preview-59115--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-59115--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&#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&#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-59115--kubernetes-io-main-staging.netlify.app/uk/docs/concepts/resource-management/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&#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&#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-59115--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-59115--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&#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&#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-59115--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&#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&#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-59115--kubernetes-io-main-staging.netlify.app/uk/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-59115--kubernetes-io-main-staging.netlify.app/uk/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-59115--kubernetes-io-main-staging.netlify.app/uk/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-59115--kubernetes-io-main-staging.netlify.app/uk/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&#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&#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;https://deploy-preview-59115--kubernetes-io-main-staging.netlify.app/blog/2023/05/02/hpa-container-resource-metric/&#34;&gt;попередній статті&lt;/a&gt; або в &lt;a href=&#34;https://deploy-preview-59115--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&#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&#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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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-59115--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>
