# Контроль допуску на основі маніфестів

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

---

<!-- overview -->








  <div class="feature-state-notice feature-alpha" title="Функціональна можливість: ManifestBasedAdmissionControlConfig">
              <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span> 
              <code>Kubernetes v1.36 [alpha]</code>(стандартно вимкнено)</div>


Цей розділ надає огляд конфігурації контролю допуску на основі маніфестів. Контроль допуску на основі маніфестів дозволяє завантажувати [вебхуки допуску](/docs/reference/access-authn-authz/extensible-admission-controllers/) та політики CEL із статичних файлів на диску, а не з API Kubernetes. Ці політики активні з моменту запуску API-сервера, працюють незалежно від <a class='glossary-tooltip' title='Надійне та високодоступне сховище ключ-значення, яке використовується як сховище Kubernetes для всіх даних кластера.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/tasks/administer-cluster/configure-upgrade-etcd/' target='_blank' aria-label='etcd'>etcd</a> і можуть захищати ресурси допуску на основі API від модифікацій.

Щоб використовувати цю функцію, увімкніть функціональну можливість [`ManifestBasedAdmissionControlConfig`](/docs/reference/command-line-tools-reference/feature-gates/#ManifestBasedAdmissionControlConfig)  і налаштуйте поле `staticManifestsDir` у файлі [AdmissionConfiguration](/docs/reference/config-api/apiserver-config.v1/#apiserver-k8s-io-v1-AdmissionConfiguration), переданому kube-apiserver через `--admission-control-config-file`.

<!-- body -->

## Для чого використовувати контроль допуску на основі маніфестів? {#why-use-manifest-based-admission-control}

Політики допуску та вебхуки, зареєстровані через API Kubernetes (такі як ValidatingAdmissionPolicy, MutatingAdmissionPolicy, ValidatingWebhookConfiguration та MutatingWebhookConfiguration), мають кілька вроджених обмежень:

- **Прогалина при завантаженні**: Застосування політик через REST вимагає створення та завантаження обʼєктів API динамічним контролером допуску. До цього моменту політики не застосовуються.
- **Прогалина самозахисту**: Ресурси конфігурації допуску (такі як ValidatingWebhookConfiguration) самі не підпадають під вебхук-допуск, щоб уникнути циклічних залежностей. Користувач з достатніми привілеями може видалити або змінити критичні політики допуску.
- **Залежність від etcd**: Конфігурації допуску через REST залежать від доступності etcd. Якщо etcd недоступний або пошкоджений, політики допуску можуть не завантажитися правильно.

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

- Активні з моменту готовності API-сервера обслуговувати запити
- Не видимі та не змінювані через API Kubernetes
- Незалежні від доступності etcd
- Можуть перехоплювати операції над ресурсами допуску на основі API самі по собі

## Підтримувані типи ресурсів {#supported-resource-types}

Ви можете включати наступні типи ресурсів у файли маніфестів. Підтримується лише версія API `admissionregistration.k8s.io/v1`.



 





<table><caption style="display: none;">Підтримувані типи ресурсів для контролю допуску на основі маніфестів</caption>
	<thead>
			<tr>
					<th style="text-align: left">Назва втулка</th>
					<th style="text-align: left">Підтримувані типи ресурсів</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><code>ValidatingAdmissionWebhook</code></td>
					<td style="text-align: left">ValidatingWebhookConfiguration</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>MutatingAdmissionWebhook</code></td>
					<td style="text-align: left">MutatingWebhookConfiguration</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>ValidatingAdmissionPolicy</code></td>
					<td style="text-align: left">ValidatingAdmissionPolicy, ValidatingAdmissionPolicyBinding</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>MutatingAdmissionPolicy</code></td>
					<td style="text-align: left">MutatingAdmissionPolicy, MutatingAdmissionPolicyBinding</td>
			</tr>
	</tbody>
</table>


Ви також можете використовувати `v1.List`, щоб обʼєднати кілька ресурсів одного типу втулка в одному документі.

Кожна тека, вказана у `staticManifestsDir` для певного втулка допуску, повинна містити лише типи ресурсів, дозволені для цього втулка. Наприклад, тека, налаштована для втулка `ValidatingAdmissionPolicy`, може містити лише ресурси ValidatingAdmissionPolicy та ValidatingAdmissionPolicyBinding.

## Налаштування контролю допуску на основі маніфестів {#configuration}

Щоб увімкнути контроль допуску на основі маніфестів, вам потрібно:

1. Увімкнути функціональну можливість `ManifestBasedAdmissionControlConfig` на kube-apiserver.
1. Файл `AdmissionConfiguration` з полями `staticManifestsDir`, що вказують на теки, які містять ваші файли маніфестів.
1. Самі файли маніфестів на диску, доступні для процесу kube-apiserver.

### AdmissionConfiguration

Додайте `staticManifestsDir` до конфігурації втулка для кожного втулка допуску, який повинен завантажувати маніфести з диска. Кожен втулок потребує власної теки.


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/access/manifest-admission-control/admission-configuration.yaml" download="access/manifest-admission-control/admission-configuration.yaml"><code>access/manifest-admission-control/admission-configuration.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('access-manifest-admission-control-admission-configuration-yaml')" title="Копіювати access/manifest-admission-control/admission-configuration.yaml до буферу обміну"></img></div>
    <div class="includecode" id="access-manifest-admission-control-admission-configuration-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Цей приклад AdmissionConfiguration налаштовує всі чотири втулка для</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># завантаження контролю допуску на основі маніфестів з статичних файлів на диску.</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">apiserver.config.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">AdmissionConfiguration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">plugins</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">ValidatingAdmissionWebhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">configuration</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiserver.config.k8s.io/v1</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">WebhookAdmissionConfiguration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubeConfigFile</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&lt;path-to-kubeconfig&gt;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">staticManifestsDir</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/etc/kubernetes/admission/validating-webhooks/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">MutatingAdmissionWebhook</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">configuration</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiserver.config.k8s.io/v1</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">WebhookAdmissionConfiguration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubeConfigFile</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&lt;path-to-kubeconfig&gt;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">staticManifestsDir</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/etc/kubernetes/admission/mutating-webhooks/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">ValidatingAdmissionPolicy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">configuration</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiserver.config.k8s.io/v1</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">ValidatingAdmissionPolicyConfiguration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">staticManifestsDir</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/etc/kubernetes/admission/validating-policies/&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">MutatingAdmissionPolicy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">configuration</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apiserver.config.k8s.io/v1</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">MutatingAdmissionPolicyConfiguration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">staticManifestsDir</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/etc/kubernetes/admission/mutating-policies/&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Поле `staticManifestsDir` приймає абсолютний шлях до теки. Всі файли безпосередніх нащадків з розширеннями `.yaml`, `.yml` або `.json` у теці завантажуються. Підтеки та файли з іншими розширеннями ігноруються. Шаблони glob та відносні шляхи не підтримуються.

Передайте цей файл kube-apiserver за допомогою прапорця `--admission-control-config-file`.

### Типи конфігурацій {#configuration-types}

Кожен втулок допуску використовує конкретний тип конфігурації:



 





<table><caption style="display: none;">Типи конфігурацій для кожного втулка допуску</caption>
	<thead>
			<tr>
					<th style="text-align: left">Втулок</th>
					<th style="text-align: left">apiVersion</th>
					<th style="text-align: left">kind</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><code>ValidatingAdmissionWebhook</code></td>
					<td style="text-align: left"><code>apiserver.config.k8s.io/v1</code></td>
					<td style="text-align: left"><code>WebhookAdmissionConfiguration</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>MutatingAdmissionWebhook</code></td>
					<td style="text-align: left"><code>apiserver.config.k8s.io/v1</code></td>
					<td style="text-align: left"><code>WebhookAdmissionConfiguration</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>ValidatingAdmissionPolicy</code></td>
					<td style="text-align: left"><code>apiserver.config.k8s.io/v1</code></td>
					<td style="text-align: left"><code>ValidatingAdmissionPolicyConfiguration</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>MutatingAdmissionPolicy</code></td>
					<td style="text-align: left"><code>apiserver.config.k8s.io/v1</code></td>
					<td style="text-align: left"><code>MutatingAdmissionPolicyConfiguration</code></td>
			</tr>
	</tbody>
</table>


## Створення файлів маніфестів {#manifest-files}

Файли маніфестів містять стандартні визначення ресурсів Kubernetes. Ви можете включати кілька ресурсів в один файл, використовуючи роздільники документів YAML (`---`).

### Правила найменування {#naming}

Всі обʼєкти у файлах маніфестів повинні мати імена, що закінчуються суфіксом `.static.k8s.io`. Наприклад: `deny-privileged.static.k8s.io`.

Коли функціональна можливість `ManifestBasedAdmissionControlConfig` увімкнена, створення обʼєктів допуску на основі API з іменами, що закінчуються на `.static.k8s.io`, блокується. Коли функціональна можливість вимкнена, повертається лише попередження.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Якщо два файли маніфестів визначають обʼєкти одного типу з однаковими іменами, API-сервер не запускається, показуючи відповідну помилку.</div>


### Обмеження {#restrictions}

Конфігурації допуску на основі маніфестів існують ізольовано і не можуть посилатися на ресурси API. Застосовуються наступні обмеження:

- **Webhooks**: Повинні використовувати `clientConfig.url`. Поле `clientConfig.service` не дозволяється, оскільки мережа сервісів може бути недоступною під час запуску API-сервера.
- **Policies**: Поле `spec.paramKind` не дозволяється. Політики не можуть посилатися на ConfigMaps або інші обʼєкти кластера для параметрів.
- **Bindings**: Поле `spec.paramRef` не дозволяється. Поле `spec.policyName` повинно посилатися на політику, визначену в тому ж наборі файлів маніфестів, і повинно закінчуватися на `.static.k8s.io`.

Файли маніфестів декодуються за допомогою строгого декодера, який відхиляє файли, що містять дубльовані або невідомі поля. Кожен обʼєкт проходить те саме автоматичне заповнення та перевірку, що й REST API.

## Приклади {#examples}

### Захист ресурсів допуску на основі API {#protecting-admission-resources}

Ключовою можливістю допуску на основі маніфестів є здатність перехоплювати операції над ресурсами конфігурації допуску (ValidatingAdmissionPolicy, MutatingAdmissionPolicy, ValidatingWebhookConfiguration, MutatingWebhookConfiguration та їхні привʼязки). REST-орієнтовані вебхуки та політики допуску не викликаються для цих типів ресурсів, щоб уникнути циклічних залежностей, але політики на основі маніфестів можуть застосовувати правила до них, оскільки вони не мають цієї циклічної залежності.

Наступний приклад дозволяє запобігати видаленню або модифікації ресурсів допуску, які мають мітку `platform.example.com/protected: "true"`:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/access/manifest-admission-control/protect-admission-resources.yaml" download="access/manifest-admission-control/protect-admission-resources.yaml"><code>access/manifest-admission-control/protect-admission-resources.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('access-manifest-admission-control-protect-admission-resources-yaml')" title="Копіювати access/manifest-admission-control/protect-admission-resources.yaml до буферу обміну"></img></div>
    <div class="includecode" id="access-manifest-admission-control-protect-admission-resources-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Це приклад ValidatingAdmissionPolicy, який запобігає видаленню або</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># зміні ресурсів доступу на основі API з міткою</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># &#34;platform.example.com/protected: true&#34;.</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">admissionregistration.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">ValidatingAdmissionPolicy</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="s2">&#34;example-protect-admission-resources.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Prevent modification or deletion of protected admission resources&#34;</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">failurePolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Fail</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">matchConstraints</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">resourceRules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;admissionregistration.k8s.io&#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">apiVersions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;*&#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">operations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;DELETE&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UPDATE&#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">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;validatingadmissionpolicies&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;validatingadmissionpolicybindings&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;mutatingadmissionpolicies&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;mutatingadmissionpolicybindings&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;validatingwebhookconfigurations&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;mutatingwebhookconfigurations&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">validations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="p">&gt;-</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">      !has(oldObject.metadata.labels) ||
</span></span></span><span class="line"><span class="cl"><span class="sd">      !(&#39;platform.example.com/protected&#39; in oldObject.metadata.labels) ||
</span></span></span><span class="line"><span class="cl"><span class="sd">      oldObject.metadata.labels[&#39;platform.example.com/protected&#39;] != &#39;true&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Protected admission resources cannot be modified or deleted&#34;</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">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">admissionregistration.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">ValidatingAdmissionPolicyBinding</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="s2">&#34;example-protect-admission-resources-binding.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Bind protect-admission-resources policy to all admission resources&#34;</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">policyName</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example-protect-admission-resources.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">validationActions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">Deny</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

### Застосування ValidatingAdmissionPolicy з диска {#enforcing-a-validatingadmissionpolicy-from-disk}

Наступний приклад визначає політику, яка забороняє привілейовані контейнери у всіх просторах імен, крім `kube-system`:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/access/manifest-admission-control/deny-privileged-policy.yaml" download="access/manifest-admission-control/deny-privileged-policy.yaml"><code>access/manifest-admission-control/deny-privileged-policy.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('access-manifest-admission-control-deny-privileged-policy-yaml')" title="Копіювати access/manifest-admission-control/deny-privileged-policy.yaml до буферу обміну"></img></div>
    <div class="includecode" id="access-manifest-admission-control-deny-privileged-policy-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Це приклад політики ValidatingAdmissionPolicy, яка забороняє запуск контейнерів із підвищеними правами</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># у всіх просторах імен, крім kube-system.</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">admissionregistration.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">ValidatingAdmissionPolicy</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="s2">&#34;example-deny-privileged.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Deny privileged containers outside kube-system&#34;</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">failurePolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Fail</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">matchConstraints</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">resourceRules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#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">apiVersions</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></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">operations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;CREATE&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UPDATE&#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">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;pods&#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">variables</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">allContainers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="p">&gt;-</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">      object.spec.containers +
</span></span></span><span class="line"><span class="cl"><span class="sd">      (has(object.spec.initContainers) ? object.spec.initContainers : []) +
</span></span></span><span class="line"><span class="cl"><span class="sd">      (has(object.spec.ephemeralContainers) ? object.spec.ephemeralContainers : [])</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">validations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="p">&gt;-</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">      !variables.allContainers.exists(c,
</span></span></span><span class="line"><span class="cl"><span class="sd">      has(c.securityContext) &amp;&amp; has(c.securityContext.privileged) &amp;&amp;
</span></span></span><span class="line"><span class="cl"><span class="sd">      c.securityContext.privileged == true)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Privileged containers are not allowed&#34;</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">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">admissionregistration.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">ValidatingAdmissionPolicyBinding</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="s2">&#34;example-deny-privileged-binding.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Bind deny-privileged policy to all namespaces except kube-system&#34;</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">policyName</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example-deny-privileged.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">validationActions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">Deny</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">matchResources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">namespaceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">matchExpressions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;kubernetes.io/metadata.name&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">operator</span><span class="p">:</span><span class="w"> </span><span class="l">NotIn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">values</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;kube-system&#34;</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

Помістіть цей файл у теку, налаштовану як `staticManifestsDir` для втулка `ValidatingAdmissionPolicy`. Політика та її привʼязка завантажуються разом атомарно.

### Налаштування ValidatingWebhookConfiguration з диска {#configuring-a-validatingwebhookconfiguration-from-disk}

Наступний приклад налаштовує вебхук перевірки, який викликає зовнішню URL-адресу:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/access/manifest-admission-control/validating-webhook.yaml" download="access/manifest-admission-control/validating-webhook.yaml"><code>access/manifest-admission-control/validating-webhook.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('access-manifest-admission-control-validating-webhook-yaml')" title="Копіювати access/manifest-admission-control/validating-webhook.yaml до буферу обміну"></img></div>
    <div class="includecode" id="access-manifest-admission-control-validating-webhook-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Це приклад конфігурації ValidatingWebhookConfiguration, яка викликає зовнішню</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># точку доступу веб-хука на основі URL-адреси для перевірки створення та оновлень подів.</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">admissionregistration.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">ValidatingWebhookConfiguration</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="s2">&#34;example-security-webhook.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Validate pod creation and updates via external webhook&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">webhooks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;security.platform.example.com&#34;</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://security-webhook.platform.example.com:443/validate&#34;</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;&lt;base64-encoded-CA-bundle&gt;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#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">apiVersions</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></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">operations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;CREATE&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UPDATE&#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">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;pods&#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">admissionReviewVersions</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></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">sideEffects</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="nt">failurePolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Fail</span><span class="w">
</span></span></span></code></pre></div></div>
</div>


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>URL-адреси вебхуків повинні бути доступними для kube-apiserver під час запуску. Підтримуються лише точки доступу на основі URL-адрес; посилання на сервіси не допускаються в конфігураціях вебхуків на основі маніфестів.</div>


### Використання формату List {#using-the-list-format}

Ви можете використовувати `v1.List`, щоб групувати повʼязані ресурси в одному документі:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/access/manifest-admission-control/list-format-policy.yaml" download="access/manifest-admission-control/list-format-policy.yaml"><code>access/manifest-admission-control/list-format-policy.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('access-manifest-admission-control-list-format-policy-yaml')" title="Копіювати access/manifest-admission-control/list-format-policy.yaml до буферу обміну"></img></div>
    <div class="includecode" id="access-manifest-admission-control-list-format-policy-yaml"><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.List для обʼєднання</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c"># ValidatingAdmissionPolicy та її привʼязки в одному документі.</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">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">List</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">items</span><span class="p">:</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">admissionregistration.k8s.io/v1</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">ValidatingAdmissionPolicy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><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="s2">&#34;example-require-labels.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Require app.kubernetes.io/name label on all pods&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><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">failurePolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Fail</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchConstraints</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">resourceRules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#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">apiVersions</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></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">operations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;CREATE&#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">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;pods&#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">validations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="p">&gt;-</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">        has(object.metadata.labels) &amp;&amp;
</span></span></span><span class="line"><span class="cl"><span class="sd">        &#39;app.kubernetes.io/name&#39; in object.metadata.labels</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;All pods must have the &#39;app.kubernetes.io/name&#39; label&#34;</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">admissionregistration.k8s.io/v1</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">ValidatingAdmissionPolicyBinding</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><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="s2">&#34;example-require-labels-binding.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Bind require-labels policy to all namespaces except kube-system&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><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">policyName</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example-require-labels.static.k8s.io&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">validationActions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">Deny</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchResources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">namespaceSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">matchExpressions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;kubernetes.io/metadata.name&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">operator</span><span class="p">:</span><span class="w"> </span><span class="l">NotIn</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">values</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;kube-system&#34;</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

## Порядок оцінки {#evaluation-order}

Конфігурації на основі маніфестів оцінюються до конфігурацій на основі API. Це забезпечує пріоритет політик на рівні платформи, які застосовуються через статичну конфігурацію, над політиками на основі API.

Для самих ресурсів конфігурації допуску (ValidatingAdmissionPolicy, MutatingAdmissionPolicy, ValidatingAdmissionPolicyBinding, MutatingAdmissionPolicyBinding, ValidatingWebhookConfiguration, MutatingWebhookConfiguration) оцінюються лише втулки допуску на основі маніфестів. Втулки на основі API пропускаються для цих типів ресурсів, щоб уникнути циклічних залежностей.

## Спостереження за файлами та динамічне перезавантаження {#dynamic-reloading}

kube-apiserver спостерігає за налаштованими теками на наявність змін:

1. **Початкове завантаження**: Під час запуску всі налаштовані шляхи читаються та перевіряються. API-сервер не стає готовим, поки всі маніфести не будуть успішно завантажені. Неправильні маніфести призводять до помилки запуску.

1. **Динамічне перезавантаження**: Зміни у файлах маніфестів запускають цикл перезавантаження:
   - Зміни файлів виявляються за допомогою [fsnotify](https://github.com/fsnotify/fsnotify) з резервним опитуванням (типовий інтервал 1 хвилина), подібно до іншого перезавантаження конфігураційних файлів у kube-apiserver.
   - Обчислюється хеш вмісту всіх файлів маніфестів при кожній перевірці. Якщо хеш не змінився, перезавантаження не відбувається.
   - Нові конфігурації перевіряються перед застосуванням.
   - Якщо перевірка не вдається, помилка реєструється, метрики оновлюються, а попередня дійсна конфігурація зберігається.
   - Успішні перезавантаження атомарно замінюють попередню конфігурацію.

<!-- -->

1. **Атомарне оновлення файлів**: Щоб уникнути часткових читань під час запису файлів, вносьте зміни атомарно (наприклад, записуйте у тимчасовий файл і перейменовуйте його). Це особливо важливо при оновленні змонтованих ConfigMaps або Secrets у контейнеризованих середовищах.

<div class="alert alert-caution" role="note"><h4 class="alert-heading">Увага:</h4>Якщо під час запуску присутній неправильний файл маніфесту, API-сервер не запускається. Під час роботи, якщо перезавантаження не вдається через помилки перевірки, попередня дійсна конфігурація зберігається, а помилка реєструється.</div>


## Спостережуваність {#observability}

### Метрики {#metrics}

Контроль допуску на основі маніфестів надає наступні метрики для моніторингу стану перезавантаження:



 





<table><caption style="display: none;">Метрики для контролю допуску на основі маніфестів</caption>
	<thead>
			<tr>
					<th style="text-align: left">Тип</th>
					<th style="text-align: left">Опис</th>
					<th style="text-align: left">Метрика</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">Counter</td>
					<td style="text-align: left">Загальна кількість спроб перезавантаження, з мітками <code>status</code> (<code>success</code> або <code>failure</code>), <code>plugin</code> та <code>apiserver_id_hash</code>.</td>
					<td style="text-align: left"><code>apiserver_manifest_admission_config_controller_automatic_reloads_total</code></td>
			</tr>
			<tr>
					<td style="text-align: left">Gauge</td>
					<td style="text-align: left">Час останньої спроби перезавантаження, з мітками <code>status</code>, <code>plugin</code> та <code>apiserver_id_hash</code>.</td>
					<td style="text-align: left"><code>apiserver_manifest_admission_config_controller_automatic_reload_last_timestamp_seconds</code></td>
			</tr>
			<tr>
					<td style="text-align: left">Gauge</td>
					<td style="text-align: left">Поточна інформація про конфігурацію (значення завжди 1), з мітками <code>plugin</code>, <code>apiserver_id_hash</code> та <code>hash</code>. Використовуйте мітку <code>hash</code> для виявлення розбіжностей конфігурації між API-серверами.</td>
					<td style="text-align: left"><code>apiserver_manifest_admission_config_controller_last_config_info</code></td>
			</tr>
	</tbody>
</table>


Мітка `plugin` визначає втулок допуску, до якого застосовується метрика: `ValidatingAdmissionWebhook`, `MutatingAdmissionWebhook`, `ValidatingAdmissionPolicy` або `MutatingAdmissionPolicy`.

Оскільки обʼєкти на основі маніфестів мають імена, що закінчуються на `.static.k8s.io`, наявні метрики допуску (такі як `apiserver_admission_webhook_rejection_count`) можуть визначати рішення на основі маніфестів, фільтруючи за міткою `name`.

### Анотації аудиту {#audit-annotations}

Наявні анотації аудиту (такі як `validation.policy.admission.k8s.io/validation_failure` та `mutation.webhook.admission.k8s.io/round_0_index_0`) включають імʼя обʼєкта. Ви можете визначити рішення на основі маніфестів, фільтруючи за іменами, що закінчуються на `.static.k8s.io`.

## Міркування стосовно високої доступності {#ha-considerations}

Кожен екземпляр kube-apiserver завантажує свої власні файли маніфестів незалежно. У налаштуваннях високої доступності з кількома екземплярами API-сервера:

- Кожен API-сервер повинен бути налаштований окремо. Немає синхронізації конфігурацій на основі маніфестів між API-серверами.
- Використовуйте зовнішні інструменти управління конфігурацією (такі як Ansible, Puppet або спільні точки монтування) для підтримки узгодженості файлів маніфестів між екземплярами.
- Метрика `apiserver_manifest_admission_config_controller_last_config_info` надає мітку `hash`, яку можна використовувати для виявлення розбіжностей конфігурації між екземплярами API-сервера.

Ця поведінка схожа на інші конфігурації kube-apiserver на основі файлів, такі як [шифрування даних у спокої](/docs/tasks/administer-cluster/encrypt-data/) та [автентифікація](/docs/reference/access-authn-authz/authentication/).

## Оновлення та пониження версії {#upgrade-downgrade}

**Оновлення**: Увімкнення функції та надання конфігурації маніфестів є опціональним. Наявні кластери без конфігурації маніфестів не зазнають змін у поведінці.

**Пониження версії**: Перед пониженням до версії без цієї функції:

1. Видаліть записи `staticManifestsDir` з файлу `AdmissionConfiguration`.
1. Якщо ви покладаєтесь на політики на основі маніфестів, відтворіть їх як обʼєкти API, де це можливо.
1. Перезапустіть kube-apiserver.

<div class="alert alert-danger" role="note"><h4 class="alert-heading">Попередження:</h4>Пониження версії без видалення конфігурації <code>staticManifestsDir</code> призведе до того, що API-сервер не зможе запуститися через невідомі поля конфігурації.</div>


## Усунення несправностей {#troubleshooting}



 





<table><caption style="display: none;">Поширені проблеми та їх вирішення</caption>
	<thead>
			<tr>
					<th style="text-align: left">Симптом</th>
					<th style="text-align: left">Можлива причина</th>
					<th style="text-align: left">Рішення</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">API-сервер не запускається</td>
					<td style="text-align: left">Неправильний файл маніфесту при запуску</td>
					<td style="text-align: left">Перевірте журнали API-сервера на наявність помилок валідації. Виправте файл маніфесту та перезапустіть сервер.</td>
			</tr>
			<tr>
					<td style="text-align: left">API-сервер не запускається</td>
					<td style="text-align: left">Дублювання імен обʼєктів у файлах маніфестів</td>
					<td style="text-align: left">Переконайтеся, що всі імена обʼєктів у втулка <code>staticManifestsDir</code> унікальні.</td>
			</tr>
			<tr>
					<td style="text-align: left">Політики не застосовуються після оновлення файлу</td>
					<td style="text-align: left">Помилка перезавантаження валідації</td>
					<td style="text-align: left">Перевірте метрику <code>automatic_reloads_total{status=&quot;failure&quot;}</code> та журнали API-сервера. Виправте маніфест і дочекайтеся наступного циклу перезавантаження.</td>
			</tr>
			<tr>
					<td style="text-align: left">Запити вебхуків не виконуються</td>
					<td style="text-align: left">URL вебхука недоступний</td>
					<td style="text-align: left">Перевірте, чи доступний URL, вказаний у <code>clientConfig.url</code>, з kube-apiserver.</td>
			</tr>
			<tr>
					<td style="text-align: left">Неможливо створити обʼєкти API з суфіксом <code>.static.k8s.io</code></td>
					<td style="text-align: left">Суфікс імені зарезервований для функції</td>
					<td style="text-align: left">Суфікс <code>.static.k8s.io</code> зарезервований для конфігурацій на основі маніфестів, коли функція увімкнена. Використовуйте інше імʼя для обʼєктів на основі API.</td>
			</tr>
	</tbody>
</table>


## Що далі

- Дізнайтеся про [ValidatingAdmissionPolicy](/docs/reference/access-authn-authz/validating-admission-policy/) для політик валідації на основі CEL.
- Дізнайтеся про [MutatingAdmissionPolicy](/docs/reference/access-authn-authz/mutating-admission-policy/) для політик мутації на основі CEL.
- Дізнайтеся про [Dynamic Admission Control](/docs/reference/access-authn-authz/extensible-admission-controllers/) для контролю доступу на основі вебхуків.
- Прочитайте документ про дизайн [KEP-5793](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/5793-manifest-based-admission-control-config).
