# Версії у CustomResourceDefinitions

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->
Ця сторінка пояснює, як додати інформацію про версії до [CustomResourceDefinitions](/docs/reference/kubernetes-api/extend-resources/custom-resource-definition-v1/), щоб вказати рівень стабільності ваших CustomResourceDefinitions або перейти на нову версію з конвертацією між представленнями API. Також описується, як оновити обʼєкт з однієї версії до іншої.

## Перш ніж ви розпочнете

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>


Ви вже повинні розуміти що таке [власні ресурси](/docs/concepts/extend-kubernetes/api-extension/custom-resources/).



Версія вашого Kubernetes сервера має бути не старішою ніж v1.16.
 <p>Для перевірки версії введіть  <code>kubectl version</code>.</p>


<!-- steps -->

## Огляд {#overview}

API CustomResourceDefinition надає робочий процес для впровадження та оновлення нових версій CustomResourceDefinition.

Коли створюється CustomResourceDefinition, перша версія встановлюється в списку `spec.versions` CustomResourceDefinition на відповідний рівень стабільності та номер версії. Наприклад, `v1beta1` буде вказувати, що перша версія ще не стабільна. Всі обʼєкти власних ресурсів спочатку будуть зберігатися в цій версії.

Після створення CustomResourceDefinition, клієнти можуть почати використовувати API `v1beta1`.

Пізніше може знадобитися додати нову версію, наприклад `v1`.

Додавання нової версії:

1. Виберіть стратегію конвертації. Оскільки обʼєкти власних ресурсів повинні мати можливість обслуговуватися в обох версіях, це означає, що вони іноді будуть обслуговуватися у версії, відмінній від тієї, в якій зберігаються. Для цього іноді потрібно конвертувати обʼєкти власних ресурсів між версією, в якій вони зберігаються, та версією, в якій вони обслуговуються. Якщо конвертація передбачає зміни схеми та вимагає власної логіки, слід використовувати конвертаційний webhook. Якщо змін схеми немає, можна використовувати стратегію конвертації `None`, і при обслуговуванні різних версій буде змінено лише поле `apiVersion`.
1. Якщо використовуються конвертаційні webhook'и, створіть і розгорніть конвертаційний webhook. Див. [Конвертація через webhook](#webhook-conversion) для отримання більш детальної інформації.
1. Оновіть CustomResourceDefinition, включивши нову версію в список `spec.versions` з `served:true`. Також встановіть поле `spec.conversion` на вибрану стратегію конвертації. Якщо використовується конвертаційний webhook, налаштуйте поле `spec.conversion.webhookClientConfig` для виклику webhook.

Після додавання нової версії клієнти можуть поступово перейти на нову версію. Цілком безпечно для деяких клієнтів використовувати стару версію, тоді як інші використовують нову версію.

Міграція збережених обʼєктів до нової версії:

1. Див. розділ [оновлення наявних обʼєктів до нової збереженої версії](#upgrade-existing-objects-to-a-new-stored-version).

Клієнти можуть безпечно використовувати як стару, так і нову версію до, під час і після оновлення обʼєктів до нової збереженої версії.

Видалення старої версії:

1. Переконайтеся, що всі клієнти повністю перейшли на нову версію. Логи kube-apiserver можна переглянути для виявлення клієнтів, які все ще використовують стару версію.
1. Встановіть `served` на `false` для старої версії в списку `spec.versions`. Якщо якісь клієнти все ще несподівано використовують стару версію, вони можуть почати повідомляти про помилки при спробі доступу до обʼєктів власних ресурсів у старій версії. У такому випадку поверніться до використання `served:true` на старій версії, мігруйте залишкових клієнтів на нову версію та повторіть цей крок.
1. Переконайтеся, що крок [оновлення поточних обʼєктів до нової збереженої версії](#upgrade-existing-objects-to-a-new-stored-version) завершено.
   1. Перевірте, що `storage` встановлено на `true` для нової версії в списку `spec.versions` в CustomResourceDefinition.
   1. Перевірте, що стара версія більше не згадується в `status.storedVersions` CustomResourceDefinition.
1. Видаліть стару версію зі списку `spec.versions` CustomResourceDefinition.
1. Припиніть підтримку конвертації для старої версії в конвертаційних webhook'ах.

## Зазначення кількох версій {#specify-multiple-versions}

Поле `versions` в CustomResourceDefinition API може бути використане для підтримки кількох версій розроблених вами власних ресурсів. Версії можуть мати різні схеми, а конвертаційні webhook'и можуть конвертувати власні ресурси між версіями. Конвертації через webhook повинні дотримуватися [конвенцій Kubernetes API](https://github.com/kubernetes/community/blob/main/contributors/devel/sig-architecture/api-conventions.md) в тих випадках, де це застосовується. Зокрема, дивіться [документацію по змінах API](https://github.com/kubernetes/community/blob/main/contributors/devel/sig-architecture/api_changes.md) для набору корисних порад та рекомендацій.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>У <code>apiextensions.k8s.io/v1beta1</code> було поле <code>version</code> замість <code>versions</code>. Поле <code>version</code> є застарілим і необовʼязковим, але якщо воно не пусте, воно повинно відповідати першому елементу у полі <code>versions</code>.</div>


У цьому прикладі показано CustomResourceDefinition з двома версіями. У першому прикладі припускається, що всі версії мають однакову схему без конвертації між ними. У YAML-файлах наведено коментарі, які надають додатковий контекст.

<ul class="nav nav-tabs" id="tabs-приклад-1-вибірки-версій-customresourcedefinition" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-%d0%bf%d1%80%d0%b8%d0%ba%d0%bb%d0%b0%d0%b4-1-%d0%b2%d0%b8%d0%b1%d1%96%d1%80%d0%ba%d0%b8-%d0%b2%d0%b5%d1%80%d1%81%d1%96%d0%b9-customresourcedefinition-0" role="tab" aria-controls="tabs-приклад-1-вибірки-версій-customresourcedefinition-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-%d0%bf%d1%80%d0%b8%d0%ba%d0%bb%d0%b0%d0%b4-1-%d0%b2%d0%b8%d0%b1%d1%96%d1%80%d0%ba%d0%b8-%d0%b2%d0%b5%d1%80%d1%81%d1%96%d0%b9-customresourcedefinition-1" role="tab" aria-controls="tabs-приклад-1-вибірки-версій-customresourcedefinition-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-приклад-1-вибірки-версій-customresourcedefinition-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-приклад-1-вибірки-версій-customresourcedefinition-0" role="tabpanel" aria-labelledby="tabs-приклад-1-вибірки-версій-customresourcedefinition-0-tab" tabindex="приклад-1-вибірки-версій-customresourcedefinition"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># назва повинна відповідати полям spec нижче, і бути у формі: &lt;plural&gt;.&lt;group&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># імʼя групи, яке буде використовуватися для REST API: /apis/&lt;group&gt;/&lt;version&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group</span><span class="p">:</span><span class="w"> </span><span class="l">example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># список версій, підтримуваних цим CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">versions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Кожна версія може бути увімкнена/вимкнена прапорцем Served.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Лише одна версія повинна бути позначена як версія зберігання.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Схема обовʼязкова</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">openAPIV3Schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">port</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">openAPIV3Schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">port</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Секція конвертації була введена в Kubernetes 1.13+ зі стандартним значенням</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># конвертації None (стратегію встановлено на None).</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Конвертація None передбачає ту ж саму схему для всіх версій, і лише встановлює apiVersion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># поле власних ресурсів у відповідне значення</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">None</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># або Namespaced або Cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">Namespaced</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">names</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># plural, назва ресрусу в що використовується в URL: /apis/&lt;group&gt;/&lt;version&gt;/&lt;plural&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plural</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># singular, назва ресурсу в що буде використовуватись як аліас в CLI та у виводі</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">singular</span><span class="p">:</span><span class="w"> </span><span class="l">crontab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># kind, зазвичай тип в однині в CamelCase. Ваші маніфести будуть використовувати це.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CronTab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># shortNames, дозволяють коротше звертатися до ресурсу в CLI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">shortNames</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">ct</span><span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-приклад-1-вибірки-версій-customresourcedefinition-1" role="tabpanel" aria-labelledby="tabs-приклад-1-вибірки-версій-customresourcedefinition-1-tab" tabindex="приклад-1-вибірки-версій-customresourcedefinition"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Застаріло у версії v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># імʼя має збігатися з полями spec нижче і бути у формі: &lt;plural&gt;.&lt;group&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># імʼя групи для використання в REST API: /apis/&lt;group&gt;/&lt;version&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group</span><span class="p">:</span><span class="w"> </span><span class="l">example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># список версій, які підтримуються цим CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">versions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Кожна версія може бути увімкненна/вимкнена за допомогою прапорця Served.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Лише одна версія повинна бути позначена як версія зберігання.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">validation</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">openAPIV3Schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">host</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">port</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Розділ конвертації введений у Kubernetes 1.13+ зі стандартним значенням конвертації</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># None (підполе strategy встановлено на None).</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># None конвертація передбачає однакову схему для всіх версій і лише встановлює поле apiVersion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># власних ресурсів у правильне значення</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">None</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># або Namespaced, або Cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">Namespaced</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">names</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># plural, назва ресрусу в що використовується в URL: /apis/&lt;group&gt;/&lt;version&gt;/&lt;plural&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plural</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># singular, назва ресурсу в що буде використовуватись як аліас в CLI та у виводі</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">singular</span><span class="p">:</span><span class="w"> </span><span class="l">crontab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># kind, зазвичай тип в однині в PascalCased. Ваші маніфести будуть використовувати це.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CronTab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># shortNames, дозволяють коротше звертатися до ресурсу в CLI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">shortNames</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">ct</span><span class="w">
</span></span></span></code></pre></div></div></div>


Ви можете зберегти CustomResourceDefinition у YAML-файлі, а потім використати `kubectl apply`, щоб створити його.

```shell
kubectl apply -f my-versioned-crontab.yaml
```

Після створення API-сервер починає обслуговувати кожну включену версію за HTTP REST-точкою доступу. У наведеному вище прикладі, версії API доступні за адресами `/apis/example.com/v1beta1` та `/apis/example.com/v1`.

### Пріоритет версії {#version-priority}

Незалежно від порядку, в якому версії визначені в CustomResourceDefinition, версія з найвищим пріоритетом використовується kubectl як стандартна версія для доступу до обʼєктів. Пріоритет визначається шляхом аналізу поля _name_ для визначення номера версії, стабільності (GA, Beta або Alpha) та послідовності в межах цього рівня стабільності.

Алгоритм, який використовується для сортування версій, розроблений для сортування версій таким же чином, як проєкт Kubernetes сортує версії Kubernetes. Версії починаються з `v`, за яким слідує число, опціональне позначення `beta` або `alpha`, та опціональна додаткова числова інформація про версію. В загальному вигляді рядок версії може виглядати як `v2` або `v2beta1`. Версії сортуються за таким алгоритмом:

- Записи, що відповідають шаблонам версій Kubernetes, сортуються перед тими, що не відповідають шаблонам.
- Для записів, що відповідають шаблонам версій Kubernetes, числові частини рядка версії сортуються від більшого до меншого.
- Якщо після першої числової частини йдуть рядки `beta` або `alpha`, вони сортуються в такому порядку після еквівалентного рядка без суфікса `beta` або `alpha` (який вважається GA версією).
- Якщо після `beta` або `alpha` йде ще одне число, ці числа також сортуються від більшого до меншого.
- Рядки, що не відповідають зазначеному формату, сортуються за алфавітом, і числові частини не мають спеціального порядку. Зауважте, що в наведеному нижче прикладі `foo1` сортується вище за `foo10`. Це відрізняється від сортування числових частин записів, що відповідають шаблонам версій Kubernetes.

Це може бути зрозуміло, якщо подивитися на наступний відсортований список версій:

```none
- v10
- v2
- v1
- v11beta2
- v10beta3
- v3beta1
- v12alpha1
- v11alpha2
- foo1
- foo10
```

Для прикладу у розділі [Зазначення кількох версій](#specify-multiple-versions), порядок сортування версій — `v1`, за яким слідує `v1beta1`. Це змушує команду kubectl використовувати `v1` як стандартну версію, якщо у наданому обʼєкті не вказано версію.

### Застарівання версій {#version-deprecation}








  <div class="feature-state-notice feature-stable">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.19 [stable]</code>
    </div>
  



Починаючи з версії v1.19, CustomResourceDefinition може вказувати, що певна версія ресурсу, який він визначає, є застарілою. Коли API-запити до застарілої версії цього ресурсу здійснюються, у відповідь API повертається попереджувальне повідомлення в заголовку. Попереджувальне повідомлення для кожної застарілої версії ресурсу можна налаштувати за бажанням.

Налаштоване попереджувальне повідомлення повинно вказувати застарілу API-групу, версію та тип (kind), і, якщо це можливо, вказувати, яку API-групу, версію та тип слід використовувати замість цього.

<ul class="nav nav-tabs" id="tabs-customresourcedefinition-versioning-deprecated" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-customresourcedefinition-versioning-deprecated-0" role="tab" aria-controls="tabs-customresourcedefinition-versioning-deprecated-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-customresourcedefinition-versioning-deprecated-1" role="tab" aria-controls="tabs-customresourcedefinition-versioning-deprecated-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-customresourcedefinition-versioning-deprecated-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-customresourcedefinition-versioning-deprecated-0" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-deprecated-0-tab" tabindex="customresourcedefinition-versioning-deprecated"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group</span><span class="p">:</span><span class="w"> </span><span class="l">example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">names</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plural</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">singular</span><span class="p">:</span><span class="w"> </span><span class="l">crontab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CronTab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">Namespaced</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">versions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1alpha1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Це вказує, що версія v1alpha1 власного ресурсу є застарілою.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># API-запити до цієї версії отримують попереджувальний заголовок у відповіді сервера.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deprecated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Це перевизначає стандартне попереджувальне повідомлення, яке повертається клієнтам API, що здійснюють запити до v1alpha1.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deprecationWarning</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/v1alpha1 CronTab застарілий; див. http://example.com/v1alpha1-v1 для інструкцій щодо переходу на example.com/v1 CronTab&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w"> </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Це вказує, що версія v1beta1 власного ресурсу є застарілою.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># API-запити до цієї версії отримують попереджувальний заголовок у відповіді сервера.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Стандартне попереджувальне повідомлення повертається для цієї версії.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deprecated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w"> </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w"> </span><span class="l">...</span><span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-customresourcedefinition-versioning-deprecated-1" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-deprecated-1-tab" tabindex="customresourcedefinition-versioning-deprecated"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Застаріло у v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group</span><span class="p">:</span><span class="w"> </span><span class="l">example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">names</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plural</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">singular</span><span class="p">:</span><span class="w"> </span><span class="l">crontab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CronTab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">Namespaced</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">validation</span><span class="p">:</span><span class="w"> </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">versions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1alpha1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Це вказує, що версія v1alpha1 власного ресурсу є застарілою.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># API-запити до цієї версії отримують попереджувальний заголовок у відповіді сервера.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deprecated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Це перевизначає стандартне попереджувальне повідомлення, яке повертається клієнтам API, що здійснюють запити до v1alpha1.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deprecationWarning</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/v1alpha1 CronTab застарілий; див. http://example.com/v1alpha1-v1 для інструкцій щодо переходу на example.com/v1 CronTab&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Це вказує, що версія v1beta1 власного ресурсу є застарілою.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># API-запити до цієї версії отримують попереджувальний заголовок у відповіді сервера.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Стандартне попереджувальне повідомлення повертається для цієї версії.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deprecated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div></div></div>


### Видалення версії {#version-removal}

Стара версія API не може бути видалена з маніфесту CustomResourceDefinition, доки наявні збережені дані не будуть мігровані до новішої версії API для всіх кластерів, які обслуговували стару версію власного ресурсу, та поки стара версія не буде видалена зі списку `status.storedVersions` у CustomResourceDefinition.

```yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: crontabs.example.com
spec:
  group: example.com
  names:
    plural: crontabs
    singular: crontab
    kind: CronTab
  scope: Namespaced
  versions:
  - name: v1beta1
    # Це вказує, що версія v1beta1 власного ресурсу більше не обслуговується.
    # API-запити до цієї версії отримують помилку "не знайдено" у відповіді сервера.
    served: false
    schema: ...
  - name: v1
    served: true
    # Нова версія, що обслуговується повинна бути встановлена як версія зберігання
    storage: true
    schema: ...
```

## Конвертація за допомогою вебхука {#webhook-conversion}








  <div class="feature-state-notice feature-stable">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.16 [stable]</code>
    </div>
  




<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Конвертація за допомогою вебхука доступна як бета-версія з версії 1.15, і як альфа-версія з Kubernetes 1.13. Функція <code>CustomResourceWebhookConversion</code> повинна бути увімкнена, що автоматично відбувається для багатьох кластерів з бета-функціями. Будь ласка, зверніться до документації <a href="/uk/docs/reference/command-line-tools-reference/feature-gates/">функціональні можливості</a> для отримання додаткової інформації.</div>


Наведений вище приклад має None-конвертацію між версіями, яка лише встановлює поле `apiVersion` під час конвертації та не змінює решту обʼєкта. API-сервер також підтримує конвертації за допомогою вебхука, які викликають зовнішній сервіс у випадку, коли потрібна конвертація. Наприклад, коли:

- власний ресурс запитується у версії, яка відрізняється від збереженої версії.
- створюється спостереження (Watch) в одній версії, але змінений обʼєкт зберігається в іншій версії.
- запит на PUT для власного ресурсу здійснюється в іншій версії, ніж версія зберігання.

Щоб охопити всі ці випадки та оптимізувати конвертацію за допомогою API-сервера, запити на конвертацію можуть містити кілька обʼєктів з метою мінімізації зовнішніх викликів. Вебхук повинен виконувати ці конвертації незалежно.

### Написання сервера для конвертації за допомогою вебхука {#write-a-webhook-conversion-server}

Будь ласка, зверніться до реалізації [сервера вебхука для конвертації власних ресурсів](https://github.com/kubernetes/kubernetes/tree/v1.25.3/test/images/agnhost/crd-conversion-webhook/main.go), який проходить перевірку в e2e тесті Kubernetes. Вебхук обробляє запити `ConversionReview`, що надсилаються API-серверами, і надсилає назад результати конвертації, загорнуті в `ConversionResponse`. Зверніть увагу, що запит містить список власних ресурсів, які потрібно конвертувати незалежно, не змінюючи порядок обʼєктів. Приклад сервера організований таким чином, щоб його можна було повторно використовувати для інших конвертацій. Більшість загального коду знаходиться у [файлі фреймворку](https://github.com/kubernetes/kubernetes/tree/v1.25.3/test/images/agnhost/crd-conversion-webhook/converter/framework.go), залишаючи лише [одну функцію](https://github.com/kubernetes/kubernetes/tree/v1.25.3/test/images/agnhost/crd-conversion-webhook/converter/example_converter.go#L29-L80) для реалізації різних конвертацій.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Приклад сервера вебхука для конвертації залишає поле <code>ClientAuth</code> <a href="https://github.com/kubernetes/kubernetes/tree/v1.25.3/test/images/agnhost/crd-conversion-webhook/config.go#L47-L48">порожнім</a>, що стандартно встановлюється в <code>NoClientCert</code>. Це означає, що сервер вебхука не автентифікує особу клієнтів, ймовірно API-серверів. Якщо вам потрібен взаємний TLS або інші способи автентифікації клієнтів, дивіться, як <a href="/uk/docs/reference/access-authn-authz/extensible-admission-controllers/#authenticate-apiservers">автентифікувати API-сервери</a>.</div>


#### Допустимі зміни {#permisible-changes}

Вебхук для конвертації не повинен змінювати нічого в полі `metadata` обʼєкта, окрім `labels` та `annotations`. Спроби змінити `name`, `UID` та `namespace` відхиляються і призводять до помилки запиту, що спричинив конвертацію. Усі інші зміни ігноруються.

### Розгортання сервера вебхука для конвертації {#deploy-webhook-conversion-server}

Документація для розгортання вебхука для конвертації аналогічна документації для [прикладу сервісу вебхука для допуску](/docs/reference/access-authn-authz/extensible-admission-controllers/#deploy-the-admission-webhook-service). Наступні секції передбачають, що сервер вебхука для конвертації розгорнутий як сервіс з іменем `example-conversion-webhook-server` у просторі імен `default` та обслуговує трафік за шляхом `/crdconvert`.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Коли сервер вебхука розгорнуто в кластер Kubernetes як сервіс, він має бути доступний через сервіс на порту 443 (сам сервер може використовувати довільний порт, але обʼєкт сервісу повинен зіставити його з портом 443). Комунікація між API-сервером і сервісом вебхука може не вдатися, якщо використовується інший порт для сервісу.</div>


### Налаштування CustomResourceDefinition для використання вебхуків конвертації {#configure-customeresourcedefinition-to-use-conversion-webhooks}

Приклад `None` конвертації можна розширити для використання вебхука конвертації, змінивши розділ `conversion` в розділі `spec`:

<ul class="nav nav-tabs" id="tabs-customresourcedefinition-versioning-example-2" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-customresourcedefinition-versioning-example-2-0" role="tab" aria-controls="tabs-customresourcedefinition-versioning-example-2-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-customresourcedefinition-versioning-example-2-1" role="tab" aria-controls="tabs-customresourcedefinition-versioning-example-2-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-customresourcedefinition-versioning-example-2-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-customresourcedefinition-versioning-example-2-0" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-example-2-0-tab" tabindex="customresourcedefinition-versioning-example-2"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># імʼя повинно відповідати полям spec нижче, і мати форму: &lt;plural&gt;.&lt;group&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># назва групи, яку використовувати для REST API: /apis/&lt;group&gt;/&lt;version&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group</span><span class="p">:</span><span class="w"> </span><span class="l">example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># список версій, які підтримуються цим CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">versions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Кожну версію можна увімкнути/вимкнути за допомогою прапорця Served.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Одна і тільки одна версія повинна бути позначена як версія для зберігання.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Кожна версія може визначити свою власну схему, коли немає визначеної схеми верхнього рівня.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">openAPIV3Schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">hostPort</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">openAPIV3Schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">port</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># стратегія Webhook інструктує сервер API викликати зовнішній вебхук для будь-якої конвертації між власними ресурсами.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># вебхук необхідний, коли стратегія - `Webhook`, і він налаштовує точку доступу вебхука для виклику сервером API.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhook</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># conversionReviewVersions вказує, які версії ConversionReview розуміються/надається  перевага вебхуком.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># Перша версія у списку, яку розуміє сервер API, надсилається до вебхуку.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># Вебхук повинен відповісти обʼєктом ConversionReview в тій самій версії, що й отримана.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">conversionReviewVersions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;v1&#34;</span><span class="p">,</span><span class="s2">&#34;v1beta1&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">clientConfig</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">service</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">example-conversion-webhook-server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/crdconvert</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">caBundle</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Ci0tLS0tQk...&lt;base64-encoded PEM bundle&gt;...tLS0K&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># або Namespaced, або Cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">Namespaced</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">names</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># plural, назва ресурсу в що використовується в URL: /apis/&lt;group&gt;/&lt;version&gt;/&lt;plural&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plural</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># singular, назва ресурсу в що буде використовуватись як аліас в CLI та у виводі</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">singular</span><span class="p">:</span><span class="w"> </span><span class="l">crontab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># kind, зазвичай тип в однині в CamelCased. Ваші маніфести будуть використовувати це.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CronTab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># shortNames, дозволяють коротше звертатися до ресурсу в CLI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">shortNames</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">ct</span><span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-customresourcedefinition-versioning-example-2-1" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-example-2-1-tab" tabindex="customresourcedefinition-versioning-example-2"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Застаріло у v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># імʼя повинно відповідати полям spec нижче, і мати форму: &lt;plural&gt;.&lt;group&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># назва групи, яку використовувати для REST API: /apis/&lt;group&gt;/&lt;version&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group</span><span class="p">:</span><span class="w"> </span><span class="l">example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># обрізає поля обʼєктів, які не вказані у схемах OpenAPI нижче.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">preserveUnknownFields</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># список версій, які підтримуються цим CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">versions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Кожну версію можна включити/вимкнути за допомогою прапорця Served.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Одна і тільки одна версія повинна бути позначена як версія зберігання.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Кожна версія може визначити свою власну схему, коли немає визначеної схеми верхнього рівня.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">openAPIV3Schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">hostPort</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">served</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">openAPIV3Schema</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">port</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># стратегія Webhook інструктує сервер API викликати зовнішній вебхук для будь-якої конвертації між власними ресурсами.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># webhookClientConfig необхідний, коли стратегія - `Webhook`, і він налаштовує точку доступу вебхука для виклику сервером API.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhookClientConfig</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">service</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">example-conversion-webhook-server</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/crdconvert</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">caBundle</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Ci0tLS0tQk...&lt;base64-encoded PEM bundle&gt;...tLS0K&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># або Namespaced, або Cluster</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">Namespaced</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">names</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># plural, назва ресурсу в що використовується в URL: /apis/&lt;group&gt;/&lt;version&gt;/&lt;plural&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plural</span><span class="p">:</span><span class="w"> </span><span class="l">crontabs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># singular, назва ресурсу в що буде використовуватись як аліас в CLI та у виводі</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">singular</span><span class="p">:</span><span class="w"> </span><span class="l">crontab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># kind, зазвичай тип в однині в CamelCased. Ваші маніфести будуть використовувати це.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CronTab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># shortNames, дозволяють коротше звертатися до ресурсу в CLI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">shortNames</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">ct</span><span class="w">
</span></span></span></code></pre></div></div></div>


Ви можете зберегти опис CustomResourceDefinition у файлі YAML, а потім використовувати
`kubectl apply`, щоб застосувати його.

```shell
kubectl apply -f мій-версійний-crontab-з-конвертацією.yaml
```

Переконайтеся, що сервіс конвертації працює, перш ніж застосовувати нові зміни.

### Звʼязок з вебхуком {#contacting-the-webhook}

Після того, як сервер API визначив, що запит потрібно надіслати до вебхуку конвертації, йому потрібно знати, як звʼязатися з вебхуком. Це вказується в розділі `webhookClientConfig` конфігурації вебхука.

Вебхуки конвертації можуть бути викликані або через URL, або через посилання на сервіс, і можуть додатково містити власний пакет CA для перевірки TLS-зʼєднання.

### URL

`url` вказує знаходження вебхука, у стандартній формі URL (`scheme://host:port/path`).

`host` не повинен посилатися на сервіс, що працює в кластері; використовуйте посилання на сервіс, вказавши замість цього поле `service`. Хост може бути вирішений через зовнішній DNS в деяких apiserver-ах (тобто `kube-apiserver` не може виконувати внутрішній DNS, оскільки це було б порушенням рівня). `host` також може бути IP-адресою.

Зверніть увагу, що використання `localhost` або `127.0.0.1` як `host` є ризикованим, якщо ви не приділяєте велику увагу тому, щоб запустити цей вебхук на всіх хостах, на яких працює apiserver, який може потребувати звернень до цього вебхука. Такі установки, швидше за все, не будуть переносними або не можуть бути легко запущені в новому кластері.

Схема повинна бути "https"; URL повинен починатися з "https://".

Спроба використання автентифікації користувача або базової автентифікації (наприклад, "user:password@") заборонена. Фрагменти ("#...") та параметри запиту ("?...") також не дозволені.

Ось приклад вебхука конвертації, налаштованого на виклик URL (і очікується, що сертифікат TLS буде перевірений за допомогою коренів довіри системи, тому не вказується `caBundle`):

<ul class="nav nav-tabs" id="tabs-customresourcedefinition-versioning-example-3" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-customresourcedefinition-versioning-example-3-0" role="tab" aria-controls="tabs-customresourcedefinition-versioning-example-3-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-customresourcedefinition-versioning-example-3-1" role="tab" aria-controls="tabs-customresourcedefinition-versioning-example-3-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-customresourcedefinition-versioning-example-3-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-customresourcedefinition-versioning-example-3-0" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-example-3-0-tab" tabindex="customresourcedefinition-versioning-example-3"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhook</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">clientConfig</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://my-webhook.example.com:9443/my-webhook-path&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-customresourcedefinition-versioning-example-3-1" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-example-3-1-tab" tabindex="customresourcedefinition-versioning-example-3"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Застаріло у v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhookClientConfig</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://my-webhook.example.com:9443/my-webhook-path&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span></code></pre></div></div></div>


### Посилання на сервіс {#service-reference}

Розділ `service` всередині `webhookClientConfig` є посиланням на сервіс для вебхука конвертації. Якщо вебхук працює всередині кластера, то ви повинні використовувати `service` замість `url`. Простір імен та імʼя сервісу є обовʼязковими. Порт є необовʼязковим і типово дорівнює 443. Шлях є необовʼязковим і типово дорівнює "/".

Ось приклад вебхука, який налаштований на виклик сервісу на порту "1234" з шляхом "/my-path", і для перевірки TLS-зʼєднання на ServerName `my-service-name.my-service-namespace.svc` з використанням власного пакету CA.

<ul class="nav nav-tabs" id="tabs-customresourcedefinition-versioning-example-4" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-customresourcedefinition-versioning-example-4-0" role="tab" aria-controls="tabs-customresourcedefinition-versioning-example-4-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-customresourcedefinition-versioning-example-4-1" role="tab" aria-controls="tabs-customresourcedefinition-versioning-example-4-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-customresourcedefinition-versioning-example-4-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-customresourcedefinition-versioning-example-4-0" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-example-4-0-tab" tabindex="customresourcedefinition-versioning-example-4"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhook</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">clientConfig</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">service</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">my-service-namespace</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">my-service-name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my-path</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">1234</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">caBundle</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Ci0tLS0tQk...&lt;base64-encoded PEM bundle&gt;...tLS0K&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-customresourcedefinition-versioning-example-4-1" role="tabpanel" aria-labelledby="tabs-customresourcedefinition-versioning-example-4-1-tab" tabindex="customresourcedefinition-versioning-example-4"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Застаріло у v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhookClientConfig</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">service</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">my-service-namespace</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">my-service-name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my-path</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">1234</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">caBundle</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Ci0tLS0tQk...&lt;base64-encoded PEM bundle&gt;...tLS0K&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span></code></pre></div></div></div>


## Запити та відповіді вебхуків {#webhook-requests-and-responses}

### Запит {#request}

Вебхуки надсилають POST-запит з `Content-Type: application/json`, з обʼєктом API `ConversionReview` з API-групи `apiextensions.k8s.io`, який серіалізується в JSON як тіло запиту.

Вебхуки можуть вказати, які версії обʼєктів `ConversionReview` вони приймають, за допомогою поля `conversionReviewVersions` у своїй CustomResourceDefinition:

<ul class="nav nav-tabs" id="tabs-conversionreviewversions" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-conversionreviewversions-0" role="tab" aria-controls="tabs-conversionreviewversions-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-conversionreviewversions-1" role="tab" aria-controls="tabs-conversionreviewversions-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-conversionreviewversions-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-conversionreviewversions-0" role="tabpanel" aria-labelledby="tabs-conversionreviewversions-0-tab" tabindex="conversionreviewversions"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhook</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">conversionReviewVersions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;v1&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;v1beta1&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="l">...</span><span class="w">
</span></span></span></code></pre></div><p>Поле <code>conversionReviewVersions</code> є обовʼязковим при створенні custom resource definitions <code>apiextensions.k8s.io/v1</code>. Вебхуки повинні підтримувати принаймні одну версію <code>ConversionReview</code>, яку розуміє поточний та попередній API сервер.</p>
</div><div class="tab-body tab-pane fade"
        id="tabs-conversionreviewversions-1" role="tabpanel" aria-labelledby="tabs-conversionreviewversions-1-tab" tabindex="conversionreviewversions"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Застаріло у v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiextensions.k8s.io/v1beta1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">CustomResourceDefinition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">conversion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">strategy</span><span class="p">:</span><span class="w"> </span><span class="l">Webhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">conversionReviewVersions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;v1&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;v1beta1&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="l">...</span><span class="w">
</span></span></span></code></pre></div><p>Якщо <code>conversionReviewVersions</code> не вказано, стандартно при створенні  custom resource definitions <code>apiextensions.k8s.io/v1beta1</code> використовується <code>v1beta1</code>.</p>
</div></div>


API сервери надсилають першу версію `ConversionReview` у списку `conversionReviewVersions`, яку вони підтримують. Якщо жодна з версій у списку не підтримується API сервером, створення custom resource definition не буде дозволено. Якщо API сервер зустрічає конфігурацію вебхука конвертації, яка була створена раніше і не підтримує жодної з версій `ConversionReview`, які сервер може надіслати, спроби виклику вебхука завершаться невдачею.

Цей приклад показує дані, що містяться в обʼєкті `ConversionReview` для запиту на конверсію обʼєктів `CronTab` до `example.com/v1`:

<ul class="nav nav-tabs" id="tabs-conversionreview-request" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-conversionreview-request-0" role="tab" aria-controls="tabs-conversionreview-request-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-conversionreview-request-1" role="tab" aria-controls="tabs-conversionreview-request-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-conversionreview-request-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-conversionreview-request-0" role="tabpanel" aria-labelledby="tabs-conversionreview-request-0-tab" tabindex="conversionreview-request"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;apiextensions.k8s.io/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;ConversionReview&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;request&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Випадковий uid, який унікально ідентифікує цей виклик конвертації</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;705ab4f5-6393-11e8-b7cc-42010a800002&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># API група та версія, до якої повинні бути конвертовані обʼєкти</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;desiredAPIVersion&#34;: </span><span class="s2">&#34;example.com/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Список обʼєктів для конвертації.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Може містити один або більше обʼєктів, у одній або більше версіях.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;objects&#34;: </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1beta1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-04T14:03:02Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;local-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;namespace&#34;: </span><span class="s2">&#34;default&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;143&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;3415a7fc-162b-4300-b5da-fd6083580d66&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;hostPort&#34;: </span><span class="s2">&#34;localhost:1234&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1beta1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-03T13:02:01Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;remote-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;12893&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;359a83ec-b575-460d-b553-d859cedde8a0&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;hostPort&#34;: </span><span class="s2">&#34;example.com:2345&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl">}<span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-conversionreview-request-1" role="tabpanel" aria-labelledby="tabs-conversionreview-request-1-tab" tabindex="conversionreview-request"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Застаріло у v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;apiextensions.k8s.io/v1beta1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;ConversionReview&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;request&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Випадковий uid, який унікально ідентифікує цей виклик конвертації</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;705ab4f5-6393-11e8-b7cc-42010a800002&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># API група та версія, до якої повинні бути конвертовані обʼєкти</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;desiredAPIVersion&#34;: </span><span class="s2">&#34;example.com/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Список обʼєктів для конвертації.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Може містити один або більше обʼєктів, у одній або більше версіях.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;objects&#34;: </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1beta1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-04T14:03:02Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;local-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;namespace&#34;: </span><span class="s2">&#34;default&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;143&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;3415a7fc-162b-4300-b5da-fd6083580d66&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;hostPort&#34;: </span><span class="s2">&#34;localhost:1234&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1beta1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-03T13:02:01Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;remote-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;12893&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;359a83ec-b575-460d-b553-d859cedde8a0&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;hostPort&#34;: </span><span class="s2">&#34;example.com:2345&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl">}<span class="w">
</span></span></span></code></pre></div></div></div>


### Відповідь {#response}

Вебхуки відповідають зі статусом HTTP 200, `Content-Type: application/json` та тілом, що містить обʼєкт `ConversionReview` (у тій самій версії, у якій вони були надіслані), з заповненим розділом `response`, серіалізованим у JSON.

Якщо конвертація успішна, вебхук має повернути розділ `response`, що містить наступні поля:

- `uid`, скопійований з `request.uid`, надісланого до вебхука
- `result`, встановлений на `{"status":"Success"}`
- `convertedObjects`, що містить всі обʼєкти з `request.objects`, конвертовані до `request.desiredAPIVersion`

Приклад мінімально успішної відповіді від вебхука:

<ul class="nav nav-tabs" id="tabs-conversionreview-response-success" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-conversionreview-response-success-0" role="tab" aria-controls="tabs-conversionreview-response-success-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-conversionreview-response-success-1" role="tab" aria-controls="tabs-conversionreview-response-success-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-conversionreview-response-success-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-conversionreview-response-success-0" role="tabpanel" aria-labelledby="tabs-conversionreview-response-success-0-tab" tabindex="conversionreview-response-success"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;apiextensions.k8s.io/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;ConversionReview&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;response&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># має збігатись з &lt;request.uid&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;705ab4f5-6393-11e8-b7cc-42010a800002&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;result&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">&#34;status&#34;: </span><span class="s2">&#34;Success&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Обʼєкти мають відповідати порядку request.objects та мати apiVersion, встановлений у &lt;request.desiredAPIVersion&gt;.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># поля kind, metadata.uid, metadata.name та metadata.namespace не повинні змінюватися вебхуком.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># поля metadata.labels та metadata.annotations можуть бути змінені вебхуком.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># всі інші зміни полів metadata, зроблені вебхуком, ігноруються.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;convertedObjects&#34;: </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-04T14:03:02Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;local-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;namespace&#34;: </span><span class="s2">&#34;default&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;143&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;3415a7fc-162b-4300-b5da-fd6083580d66&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;host&#34;: </span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;port&#34;: </span><span class="s2">&#34;1234&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-03T13:02:01Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;remote-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;12893&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;359a83ec-b575-460d-b553-d859cedde8a0&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;host&#34;: </span><span class="s2">&#34;example.com&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;port&#34;: </span><span class="s2">&#34;2345&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl">}<span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-conversionreview-response-success-1" role="tabpanel" aria-labelledby="tabs-conversionreview-response-success-1-tab" tabindex="conversionreview-response-success"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Застаріло у версії v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;apiextensions.k8s.io/v1beta1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;ConversionReview&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;response&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># має відповідати &lt;request.uid&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;705ab4f5-6393-11e8-b7cc-42010a800002&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;result&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">&#34;status&#34;: </span><span class="s2">&#34;Failed&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Обʼєкти мають відповідати порядку request.objects та мати apiVersion, встановлений у &lt;request.desiredAPIVersion&gt;.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># поля kind, metadata.uid, metadata.name та metadata.namespace не повинні змінюватися вебхуком.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># поля metadata.labels та metadata.annotations можуть бути змінені вебхуком.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># всі інші зміни полів metadata, зроблені вебхуком, ігноруються.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;convertedObjects&#34;: </span><span class="p">[</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-04T14:03:02Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;local-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;namespace&#34;: </span><span class="s2">&#34;default&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;143&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;3415a7fc-162b-4300-b5da-fd6083580d66&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;host&#34;: </span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;port&#34;: </span><span class="s2">&#34;1234&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;CronTab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;example.com/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;metadata&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;creationTimestamp&#34;: </span><span class="s2">&#34;2019-09-03T13:02:01Z&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;name&#34;: </span><span class="s2">&#34;remote-crontab&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;resourceVersion&#34;: </span><span class="s2">&#34;12893&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;359a83ec-b575-460d-b553-d859cedde8a0&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>}<span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;host&#34;: </span><span class="s2">&#34;example.com&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#34;port&#34;: </span><span class="s2">&#34;2345&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl">}<span class="w">
</span></span></span></code></pre></div></div></div>


Якщо конвертація не вдалася, вебхук має повернути розділ `response`, що містить наступні поля:

- `uid`, скопійований з `request.uid`, надісланого до вебхуку
- `result`, встановлений на `{"status":"Failed"}`

<div class="alert alert-danger" role="note"><h4 class="alert-heading">Попередження:</h4>Невдала конвертація може порушити доступ для читання та запису до власних ресурсів, включаючи можливість оновлення або видалення ресурсів. Збоїв у конвертації слід уникати за будь-якої можливості, і не слід використовувати їх для забезпечення дотримання обмежень на валідацію (використовуйте схеми валідації або admission webhook).</div>


Приклад відповіді від вебхуку, що вказує на невдачу запиту конвертації, з додатковим повідомленням:

<ul class="nav nav-tabs" id="tabs-conversionreview-response-failure" role="tablist"><li class="nav-item"><a data-bs-toggle="tab" class="nav-link active" href="#tabs-conversionreview-response-failure-0" role="tab" aria-controls="tabs-conversionreview-response-failure-0" aria-selected="true">apiextensions.k8s.io/v1</a></li>
	  
		<li class="nav-item"><a data-bs-toggle="tab" class="nav-link" href="#tabs-conversionreview-response-failure-1" role="tab" aria-controls="tabs-conversionreview-response-failure-1">apiextensions.k8s.io/v1beta1</a></li></ul>

<div class="tab-content" id="tabs-conversionreview-response-failure-content"><div class="tab-body tab-pane fadeshow active"
        id="tabs-conversionreview-response-failure-0" role="tabpanel" aria-labelledby="tabs-conversionreview-response-failure-0-tab" tabindex="conversionreview-response-failure"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;apiextensions.k8s.io/v1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;ConversionReview&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;response&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;&lt;значення з request.uid&gt;&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;result&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">&#34;status&#34;: </span><span class="s2">&#34;Failed&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">&#34;message&#34;: </span><span class="s2">&#34;hostPort не вдалося розділити на окремі host та port&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl">}<span class="w">
</span></span></span></code></pre></div></div><div class="tab-body tab-pane fade"
        id="tabs-conversionreview-response-failure-1" role="tabpanel" aria-labelledby="tabs-conversionreview-response-failure-1-tab" tabindex="conversionreview-response-failure"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Застаріло у версії v1.16 на користь apiextensions.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;apiVersion&#34;: </span><span class="s2">&#34;apiextensions.k8s.io/v1beta1&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;kind&#34;: </span><span class="s2">&#34;ConversionReview&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">&#34;response&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;uid&#34;: </span><span class="s2">&#34;&lt;значення з request.uid&gt;&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#34;result&#34;: </span>{<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">&#34;status&#34;: </span><span class="s2">&#34;Failed&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">&#34;message&#34;: </span><span class="s2">&#34;hostPort не вдалося розділити на окремі host та port&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl">}<span class="w">
</span></span></span></code></pre></div></div></div>


## Запис, читання та оновлення обʼєктів CustomResourceDefinition з версіями {#writing-reading-and-updating-versioned-customresourcedefinition-objects}

Коли обʼєкт записується, він зберігається у версії, визначеній як версія зберігання на момент запису. Якщо версія зберігання змінюється, наявні обʼєкти ніколи не конвертуються автоматично. Проте новостворені або оновлені обʼєкти записуються у новій версії зберігання. Можливо, що обʼєкт було записано у версії, яка більше не обслуговується.

Коли ви зчитуєте обʼєкт, ви вказуєте версію як частину шляху. Ви можете запитати обʼєкт у будь-якій версії, яка наразі обслуговується. Якщо ви вказуєте версію, яка відрізняється від версії, у якій зберігається обʼєкт, Kubernetes повертає вам обʼєкт у запитуваній версії, але збережений обʼєкт не змінюється на диску.

Що відбувається з обʼєктом, який повертається під час обслуговування запиту на читання, залежить від того, що вказано у `spec.conversion` CRD:

- Якщо вказано стандартне значення стратегії `None`, єдині зміни обʼєкта — це зміна рядка `apiVersion` і, можливо, [обрізання невідомих полів](/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#field-pruning) (залежно від конфігурації). Зазначимо, що це навряд чи призведе до хороших результатів, якщо схеми відрізняються між версіями зберігання та запитуваною версією. Зокрема, не слід використовувати цю стратегію, якщо ті самі дані представлені у різних полях між версіями.
- Якщо вказано [конвретацію за допомогою вебхуку](#webhook-conversion), тоді цей механізм контролює конверсію.

Якщо ви оновлюєте існуючий обʼєкт, він перезаписується у версії, яка наразі є версією зберігання. Це єдиний спосіб, за допомогою якого обʼєкти можуть змінюватися з однієї версії на іншу.

Щоб проілюструвати це, розглянемо наступну гіпотетичну послідовність подій:

1. Версія зберігання — `v1beta1`. Ви створюєте обʼєкт. Він зберігається у версії `v1beta1`.
2. Ви додаєте версію `v1` до вашого CustomResourceDefinition і призначаєте її версією зберігання. Схеми для `v1` та `v1beta1` є ідентичними, що зазвичай має місце під час підвищення API до стабільного стану в екосистемі Kubernetes.
3. Ви читаєте свій обʼєкт у версії `v1beta1`, потім читаєте обʼєкт знову у версії `v1`. Обидва отримані обʼєкти є ідентичними, за винятком поля apiVersion.
4. Ви створюєте новий обʼєкт. Він зберігається у версії `v1`. Тепер у вас є два обʼєкти: один у версії `v1beta1`, інший у версії `v1`.
5. Ви оновлюєте перший обʼєкт. Тепер він зберігається у версії `v1`, оскільки це поточна версія зберігання.

### Попередні версії зберігання {#previous-stored-versions}

API сервер записує кожну версію, яка коли-небудь була позначена як версія зберігання у полі статусу `storedVersions`. Обʼєкти можуть бути збережені у будь-якій версії, яка коли-небудь була визначена як версія зберігання. Ніякі обʼєкти не можуть існувати у зберіганні у версії, яка ніколи не була версією зберігання.

## Оновлення існуючих обʼєктів до нової збереженої версії {#upgrade-existing-objects-to-a-new-stored-version}

При застаріванні версій та припиненні підтримки виберіть процедуру оновлення зберігання.

_Варіант 1:_ Використання Storage Version Migrator

1. Запустіть [Storage Version Migrator](https://github.com/kubernetes-sigs/kube-storage-version-migrator).
2. Видаліть стару версію з поля `status.storedVersions` CustomResourceDefinition.

_Варіант 2:_ Ручне оновлення наявних обʼєктів до нової версії зберігання

Наведено приклад процедури оновлення з `v1beta1` до `v1`.

1. Встановіть `v1` як версію зберігання у файлі CustomResourceDefinition та застосуйте це за допомогою kubectl. Тепер `storedVersions` містить `v1beta1, v1`.
2. Напишіть процедуру оновлення для отримання всіх наявних обʼєктів і запишіть їх з тим самим вмістом. Це змушує бекенд записувати обʼєкти у поточній версії зберігання, якою є `v1`.
3. Видаліть `v1beta1` з поля `status.storedVersions` CustomResourceDefinition.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4><p>Ось приклад того, як накладати патч на субресурс <code>status</code> обʼєкта CRD за допомогою <code>kubectl</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl patch customresourcedefinitions &lt;CRD_Name&gt; --subresource<span class="o">=</span><span class="s1">&#39;status&#39;</span> --type<span class="o">=</span><span class="s1">&#39;merge&#39;</span> -p <span class="s1">&#39;{&#34;status&#34;:{&#34;storedVersions&#34;:[&#34;v1&#34;]}}&#39;</span>
</span></span></code></pre></div></div>
