# Керування Secret за допомогою конфігураційного файлу

> Створення обʼєктів Secret за допомогою конфігураційного файлу ресурсів.

---

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

---

<!-- overview -->

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

<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>


<!-- steps -->

## Створення Secret {#create-the-config-file}

Ви можете спочатку визначити обʼєкт `Secret` у форматі JSON або YAML у маніфесті, а потім створити цей обʼєкт. Ресурс [Secret](/docs/reference/generated/kubernetes-api/v1.36/#secret-v1-core) містить два словники: `data` та `stringData`. Поле `data` використовується для зберігання довільних даних, закодованих за допомогою base64. Поле `stringData` надається для зручності, і воно дозволяє вам надавати ті самі дані у вигляді незакодованих рядків. Ключі `data` та `stringData` повинні складатися з буквено-цифрових символів, `-`, `_` або `.`.

Наведений нижче приклад зберігає два рядки у Secret, використовуючи поле `data`.

1. Конвертуйте рядки в base64:

   ```shell
   echo -n 'admin' | base64
   echo -n '1f2d1e2e67df' | base64
   ```

   
<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Серіалізовані значення JSON та YAML даних Secret кодуються як рядки base64. Переходи на новий рядок не дійсні у цих рядках та повинні бути вилучені. При використанні утиліти <code>base64</code> у Darwin/macOS користувачі повинні уникати використання опції <code>-b</code> для розбиття довгих рядків. Навпаки, користувачам Linux <em>слід</em> додавати опцію <code>-w 0</code> до команд <code>base64</code> або конвеєру <code>base64 | tr -d '\n'</code>, якщо опція <code>-w</code> недоступна.</div>


   Вивід буде подібний до:

   ```none
   YWRtaW4=
   MWYyZDFlMmU2N2Rm
   ```

1. Створіть маніфест:

   ```yaml
   apiVersion: v1
   kind: Secret
   metadata:
     name: mysecret
   type: Opaque
   data:
     username: YWRtaW4=
     password: MWYyZDFlMmU2N2Rm
   ```

   Зверніть увагу, що імʼя обʼєкта Secret повинно бути дійсним [піддоменом DNS](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names).

1. Створіть Secret, використовуючи [`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands#apply):

   ```shell
   kubectl apply -f ./secret.yaml
   ```

   Вивід буде подібний до:

   ```none
   secret/mysecret created
   ```

Щоб перевірити, що Secret був створений та щоб розкодувати дані Secret, див. [Керування Secret за допомогою kubectl](/docs/tasks/configmap-secret/managing-secret-using-kubectl/#verify-the-secret).

### Вказання незакодованих даних під час створення Secret {#specify-unencoded-data-when-creating-a-secret}

Для певних сценаріїв можливо вам захочеться використовувати поле `stringData`. Це поле дозволяє вам розміщувати незакодований рядок безпосередньо у Secret, і цей рядок буде закодований за вас при створенні або оновленні Secret.

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

Наприклад, якщо ваш застосунок використовує такий файл конфігурації:

```yaml
apiUrl: "https://my.api.com/api/v1"
username: "<user>"
password: "<password>"
```

Ви можете зберегти це в Secret, використовуючи таке визначення:

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
stringData:
  config.yaml: |
    apiUrl: "https://my.api.com/api/v1"
    username: <user>
    password: <password>
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Поле <code>stringData</code> для Secret погано працює із застосуванням на стороні сервера.</div>


При отриманні даних Secret, команда повертає закодовані значення, а не текстові значення, які ви вказали у `stringData`.

Наприклад, якщо ви виконаєте наступну команду:

```shell
kubectl get secret mysecret -o yaml
```

Вивід буде подібний до:

```yaml
apiVersion: v1
data:
  config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
kind: Secret
metadata:
  creationTimestamp: 2018-11-15T20:40:59Z
  name: mysecret
  namespace: default
  resourceVersion: "7225"
  uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque
```

### Вказання як `data`, так і `stringData` {#specify-both-data-and-stringdata}

Якщо ви вказали поле як у `data`, так і у `stringData`, буде використано значення з `stringData`.

Наприклад, якщо ви визначите наступний секрет:

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
stringData:
  username: administrator
```


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Поле <code>stringData</code> для Secret погано працює із застосуванням на стороні сервера.</div>


Обʼєкт `Secret` буде створено так:

```yaml
apiVersion: v1
data:
  username: YWRtaW5pc3RyYXRvcg==
kind: Secret
metadata:
  creationTimestamp: 2018-11-15T20:46:46Z
  name: mysecret
  namespace: default
  resourceVersion: "7579"
  uid: 91460ecb-e917-11e8-98f2-025000000001
type: Opaque
```

`YWRtaW5pc3RyYXRvcg==` декодується у `administrator`.

## Редагування Secret {#edit-secret}

Щоб редагувати дані у Secret, створеному за допомогою маніфесту, змініть поле `data` або `stringData` у вашому маніфесті та застосуйте файл у вашому кластері. Ви можете редагувати наявний обʼєкт `Secret`, за винятком випадку, коли він є [незмінним](/docs/concepts/configuration/secret/#secret-immutable).

Наприклад, якщо ви хочете змінити пароль з попереднього прикладу на `birdsarentreal`, виконайте наступне:

1. Закодуйте новий рядок пароля:

   ```shell
   echo -n 'birdsarentreal' | base64
   ```

   Вивід буде подібний до:

   ```none
   YmlyZHNhcmVudHJlYWw=
   ```

1. Оновіть поле `data` із вашим новим рядком пароля:

   ```yaml
   apiVersion: v1
   kind: Secret
   metadata:
     name: mysecret
   type: Opaque
   data:
     username: YWRtaW4=
     password: YmlyZHNhcmVudHJlYWw=
   ```

1. Застосуйте маніфест у вашому кластері:

   ```shell
   kubectl apply -f ./secret.yaml
   ```

   Вивід буде подібний до:

   ```none
   secret/mysecret configured
   ```

Kubernetes оновлює наявний обʼєкт `Secret`. Докладно, інструмент `kubectl` помічає, що є обʼєкт `Secret` з тим самим імʼям. `kubectl` отримує поточний обʼєкт, планує зміни в ньому і надсилає змінений обʼєкт `Secret` до панелі управління кластера.

Якщо ви вказали `kubectl apply --server-side`, `kubectl` використовує [застосування на боці сервера](/docs/reference/using-api/server-side-apply/) замість цього.

## Прибирання {#clean-up}

Щоб видалити створений вами Secret:

```shell
kubectl delete secret mysecret
```

## Що далі

- Дізнайтеся більше про [концепцію Secret](/docs/concepts/configuration/secret/)
- Дізнайтесь, як [керувати Secret за допомогою kubectl](/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
- Дізнайтесь, як [керувати Secret за допомогою kustomize](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
