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

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

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

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

Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

Створення Secret

Ви можете спочатку визначити обʼєкт Secret у маніфесті у форматі JSON або YAML, а потім створити цей обʼєкт. Ресурс Secret містить два словники: data і stringData. Поле data використовується для зберігання довільних даних, закодованих у base64. Поле stringData надається для зручності й дозволяє вказувати ті самі дані у вигляді незакодованих рядків. Ключі data і stringData мають складатися з буквено-цифрових символів, -, _ або ..

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

  1. Перетворіть рядки на base64:

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

    Примітка:

    Серіалізовані значення JSON і YAML даних Secret кодуються як рядки base64. Символи нового рядка в цих рядках неприпустимі й мають бути вилучені. Під час використання утиліти base64 у Darwin/macOS користувачам слід уникати параметра -b для розбиття довгих рядків. Натомість користувачам Linux слід додавати параметр -w 0 до команд base64 або використовувати конвеєр base64 | tr -d '\n', якщо параметр -w недоступний.

    Вивід подібний до такого:

    YWRtaW4=
    MWYyZDFlMmU2N2Rm
    
  2. Створіть маніфест:

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

    Зверніть увагу, що назва обʼєкта Secret має бути дійсною назвою піддомену DNS.

  3. Створіть Secret за допомогою kubectl apply:

    kubectl apply -f ./secret.yaml
    

    Вивід подібний до такого:

    secret/mysecret created
    

Щоб перевірити, що Secret створено, і розкодувати дані Secret, дивіться Керування Secrets за допомогою kubectl.

Вказання незакодованих даних під час створення Secret

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

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

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

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

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

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

Примітка:

Поле stringData у Secret погано працює із застосуванням на боці сервера (server-side apply).

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

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

kubectl get secret mysecret -o 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

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

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

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

Примітка:

Поле stringData у Secret погано працює із застосуванням на боці сервера (server-side apply).

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

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

Щоб відредагувати дані в Secret, створеному за допомогою маніфесту, змініть поле data або stringData у маніфесті й застосуйте файл до кластера. Ви можете редагувати наявний обʼєкт Secret, якщо він не є незмінним.

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

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

    echo -n 'birdsarentreal' | base64
    

    Вивід подібний до такого:

    YmlyZHNhcmVudHJlYWw=
    
  2. Оновіть поле data, вказавши новий рядок пароля:

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: YmlyZHNhcmVudHJlYWw=
    
  3. Застосуйте маніфест до кластера:

    kubectl apply -f ./secret.yaml
    

    Вивід подібний до такого:

    secret/mysecret configured
    

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

Якщо натомість ви вказали kubectl apply --server-side, kubectl використовує застосування на боці сервера.

Очищення

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

kubectl delete secret mysecret

Що далі