# Імперативне керування обʼєктами Kubernetes за допомогою файлів конфігурації

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

---

<!-- overview -->
Обʼєкти Kubernetes можна створювати, оновлювати та видаляти за допомогою інструменту командного рядка `kubectl` разом із файлом конфігурації обʼєкта, написаним у форматі YAML або JSON. У цьому документі пояснюється, як визначати та керувати обʼєктами за допомогою файлів конфігурації.

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

Встановіть [`kubectl`](/docs/tasks/tools/).

<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>
 
  <p>Для перевірки версії введіть  <code>kubectl version</code>.</p>


<!-- steps -->

## Компроміси {#trade-offs}

Інструмент `kubectl` підтримує три види управління обʼєктами:

* Імперативні команди
* Імперативне конфігурування обʼєктів
* Декларативне конфігурування обʼєктів

Див. [Управління обʼєктами Kubernetes](/docs/concepts/overview/working-with-objects/object-management/) для обговорення переваг та недоліків кожного виду управління обʼєктами.

## Як створювати обʼєкти {#how-to-create-objects}

Ви можете використовувати `kubectl create -f` для створення обʼєкта з файлу конфігурації. Дивіться [Довідник API Kubernetes](/docs/reference/generated/kubernetes-api/v1.36/) для отримання деталей.

* `kubectl create -f <filename|url>`

## Як оновити обʼєкти {#how-to-update-objects}

<div class="alert alert-danger" role="note"><h4 class="alert-heading">Попередження:</h4>Оновлення обʼєктів за допомогою команди <code>replace</code> призводить до видалення всіх частин специфікації, які не вказані в файлі конфігурації. Це не слід використовувати з обʼєктами, чиї специфікації частково керуються кластером, наприклад, Service типу <code>LoadBalancer</code>, де поле <code>externalIPs</code> керується незалежно від файлу конфігурації. Поля, які керуються незалежно, повинні бути скопійовані в файл конфігурації, щоб уникнути їх втрати під час виконання <code>replace</code>.</div>


Ви можете використовувати `kubectl replace -f` для оновлення поточного обʼєкта згідно з файлом конфігурації.

* `kubectl replace -f <filename|url>`

## Як видалити обʼєкти {#how-to-delete-objects}

Ви можете використовувати `kubectl delete -f` для видалення обʼєкта, який описаний у файлі конфігурації.

* `kubectl delete -f <filename|url>`

<div class="alert alert-danger" role="note"><h4 class="alert-heading">Попередження:</h4><p>Якщо файл конфігурації вказує поле <code>generateName</code> в секції <code>metadata</code> замість поля <code>name</code>, ви не можете видалити обʼєкт, використовуючи <code>kubectl delete -f &lt;filename|url&gt;</code>. Вам доведеться використовувати інші прапорці для видалення обʼєкта. Наприклад:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl delete &lt;тип&gt; &lt;імʼя&gt;
</span></span><span class="line"><span class="cl">kubectl delete &lt;тип&gt; -l &lt;мітка&gt;
</span></span></code></pre></div></div>


## Як переглянути обʼєкт {#how-to-view-objects}

Ви можете використовувати `kubectl get -f`, щоб переглянути інформацію про обʼєкт, що описаний у файлі конфігурації.

* `kubectl get -f <filename|url> -o yaml`

Прапорець `-o yaml` вказує, що повна конфігурація обʼєкта виводиться. Використовуйте `kubectl get -h`, щоб побачити список опцій.

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

Команди `create`, `replace` та `delete` працюють добре, коли кожна конфігурація обʼєкта повністю визначена і записана у своєму файлі конфігурації. Однак, коли поточний обʼєкт оновлюється, і оновлення не обʼєднуються в його файл конфігурації, оновлення будуть втрачені після наступного виконання `replace`. Це може статися, якщо контролер, такий як HorizontalPodAutoscaler, вносить оновлення безпосередньо до поточного обʼєкта. Ось приклад:

1. Ви створюєте обʼєкт з файлу конфігурації.
1. Інше джерело оновлює обʼєкт, змінюючи якесь поле.
1. Ви замінюєте обʼєкт з файлу конфігурації. Зміни, внесені іншим джерелом на кроці 2, втрачені.

Якщо вам потрібна підтримка кількох записувачів для одного обʼєкта, ви можете використовувати `kubectl apply` для керування обʼєктом.

## Створення та редагування обʼєкта за URL без зберігання конфігурації {#creating-and-editing-an-object-from-a-url-without-saving-the-configuration}

Припустимо, що у вас є URL файлу конфігурації обʼєкта. Ви можете використовувати `kubectl create --edit` для внесення змін до конфігурації перед створенням обʼєкта. Це особливо корисно для підручників та завдань, які вказують на файл конфігурації, який може бути змінений читачем.

```shell
kubectl create -f <url> --edit
```

## Міграція від імперативних команд до імперативного конфігурування обʼєктів {#migrating-from-imperative-commands-to-imperative-object-configuration}

Міграція від імперативних команд до імперативної конфігурації обʼєктів включає декілька кроків, які потрібно виконати вручну.

1. Експортуйте поточний обʼєкт у локальний файл конфігурації обʼєкта:

    ```shell
    kubectl get <kind>/<name> -o yaml > <kind>_<name>.yaml
    ```

2. Ручне видалення поля стану з файлу конфігурації обʼєкта.

3. Для подальшого керування обʼєктом виключно використовуйте `replace`.

    ```shell
    kubectl replace -f <kind>_<name>.yaml
    ```

## Визначення селекторів контролерів та міток PodTemplate {#defining-controller-selectors-and-podtemplate-labels}

<div class="alert alert-danger" role="note"><h4 class="alert-heading">Попередження:</h4>Оновлення селекторів на контролерах наполегливо не рекомендується.</div>


Рекомендований підхід — визначити одну незмінну мітку PodTemplate, яка використовується тільки селектором контролера без іншого семантичного значення.

Приклад мітки:

```yaml
selector:
  matchLabels:
      controller-selector: "apps/v1/deployment/nginx"
template:
  metadata:
    labels:
      controller-selector: "apps/v1/deployment/nginx"
```

## Що далі

* [Управління обʼєктами Kubernetes за допомогою імперативних команд](/docs/tasks/manage-kubernetes-objects/imperative-command/)
* [Декларативне керування обʼєктами Kubernetes за допомогою файлів конфігурації](/docs/tasks/manage-kubernetes-objects/declarative-config/)
* [Довідник команд Kubectl](/docs/reference/generated/kubectl/kubectl-commands/)
* [Довідник API Kubernetes](/docs/reference/generated/kubernetes-api/v1.36/)
