Це багатосторінковий друкований вигляд цього розділу. Натисність щоб друкувати.
Керування Secrets
- 1: Керування Secrets за допомогою kubectl
- 2: Керування Secrets за допомогою файлу конфігурації
- 3: Керування Secrets за допомогою Kustomize
1 - Керування Secrets за допомогою kubectl
На цій сторінці показано, як створювати й редагувати Secrets Kubernetes, керувати ними та видаляти їх за допомогою інструмента командного рядка kubectl.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Створення Secret
Обʼєкт Secret зберігає конфіденційні дані, такі як облікові дані, які Podʼи використовують для доступу до сервісів. Наприклад, Secret може знадобитися для зберігання імені користувача й пароля, потрібних для доступу до бази даних.
Ви можете створити Secret, передавши необроблені дані в команді або зберігши облікові дані у файлах, які ви передаєте в команді. Наведені нижче команди створюють Secret, який зберігає імʼя користувача admin і пароль S!B\*d$zDsb=.
Використання необроблених даних
Виконайте таку команду:
kubectl create secret generic db-user-pass \
--from-literal=username=admin \
--from-literal=password='S!B\*d$zDsb='
Щоб екранувати спеціальні символи, такі як $, \, *, = і !, у рядках, потрібно використовувати одинарні лапки ''. Інакше ваша оболонка інтерпретуватиме ці символи.
Примітка:
ПолеstringData у Secret погано працює із застосуванням на боці сервера (server-side apply).Використання вихідних файлів
-
Збережіть облікові дані у файлах:
echo -n 'admin' > ./username.txt echo -n 'S!B\*d$zDsb=' > ./password.txtПрапорець
-nгарантує, що згенеровані файли не матимуть зайвого символу нового рядка в кінці тексту. Це важливо, бо колиkubectlчитає файл і кодує вміст у рядок base64, зайвий символ нового рядка теж кодується. Спеціальні символи в рядках, які ви додаєте у файл, екранувати не потрібно. -
Передайте шляхи до файлів у команду
kubectl:kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txtСтандартно назвою ключа є назва файлу. За потреби ви можете задати назву ключа за допомогою
--from-file=[key=]source. Наприклад:kubectl create secret generic db-user-pass \ --from-file=username=./username.txt \ --from-file=password=./password.txt
За будь-якого способу вивід подібний до такого:
secret/db-user-pass created
Перевірка Secret
Перевірте, що Secret створено:
kubectl get secrets
Вивід подібний до такого:
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
Перегляньте подробиці Secret:
kubectl describe secret db-user-pass
Вивід подібний до такого:
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
Команди kubectl get і kubectl describe стандартно не показують вміст Secret. Це захищає Secret від випадкового розкриття або збереження в логах термінала.
Розкодування Secret
-
Перегляньте вміст створеного вами Secret:
kubectl get secret db-user-pass -o jsonpath='{.data}'Вивід подібний до такого:
{ "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" } -
Розкодуйте дані
password:echo 'UyFCXCpkJHpEc2I9' | base64 --decodeВивід подібний до такого:
S!B\*d$zDsb=Увага:
Це приклад для цілей документації. На практиці цей спосіб може призвести до збереження команди із закодованими даними в історії оболонки. Будь-хто з доступом до вашого компʼютера може знайти цю команду й розкодувати Secret. Кращий підхід — поєднати команди перегляду та розкодування.kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
Редагування Secret
Ви можете редагувати наявний обʼєкт Secret, якщо він не є незмінним. Щоб відредагувати Secret, виконайте таку команду:
kubectl edit secrets <secret-name>
Це відкриє ваш типовий редактор і дозволить оновити закодовані в base64 значення Secret у полі data, як у наведеному нижче прикладі:
# Будь ласка, відредагуйте наведений нижче обʼєкт. Рядки, що починаються з символу «#», ігноруватимуться,
# а порожній файл призведе до припинення редагування. Якщо під час збереження цього файлу виникне помилка, його
# буде знову відкрито з зазначенням відповідних помилок.
#
apiVersion: v1
data:
password: UyFCXCpkJHpEc2I9
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-06-28T17:44:13Z"
name: db-user-pass
namespace: default
resourceVersion: "12708504"
uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque
Очищення
Щоб видалити Secret, виконайте таку команду:
kubectl delete secret db-user-pass
Що далі
- Дізнайтеся більше про концепцію Secret
- Дізнайтеся, як керувати Secrets за допомогою файлу конфігурації
- Дізнайтеся, як керувати Secrets за допомогою kustomize
2 - Керування Secrets за допомогою файлу конфігурації
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Створення Secret
Ви можете спочатку визначити обʼєкт Secret у маніфесті у форматі JSON або YAML, а потім створити цей обʼєкт. Ресурс Secret містить два словники: data і stringData. Поле data використовується для зберігання довільних даних, закодованих у base64. Поле stringData надається для зручності й дозволяє вказувати ті самі дані у вигляді незакодованих рядків. Ключі data і stringData мають складатися з буквено-цифрових символів, -, _ або ..
Наведений нижче приклад зберігає два рядки в Secret за допомогою поля data.
-
Перетворіть рядки на 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 -
Створіть маніфест:
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2RmЗверніть увагу, що назва обʼєкта Secret має бути дійсною назвою піддомену DNS.
-
Створіть 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, зробіть таке:
-
Закодуйте новий рядок пароля:
echo -n 'birdsarentreal' | base64Вивід подібний до такого:
YmlyZHNhcmVudHJlYWw= -
Оновіть поле
data, вказавши новий рядок пароля:apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: YmlyZHNhcmVudHJlYWw= -
Застосуйте маніфест до кластера:
kubectl apply -f ./secret.yamlВивід подібний до такого:
secret/mysecret configured
Kubernetes оновлює наявний обʼєкт Secret. Докладніше: інструмент kubectl помічає, що вже існує обʼєкт Secret із такою самою назвою. kubectl отримує наявний обʼєкт, планує зміни в ньому й надсилає змінений обʼєкт Secret до панелі управління кластера.
Якщо натомість ви вказали kubectl apply --server-side, kubectl використовує застосування на боці сервера.
Очищення
Щоб видалити створений вами Secret:
kubectl delete secret mysecret
Що далі
- Дізнайтеся більше про концепцію Secret
- Дізнайтеся, як керувати Secrets за допомогою kubectl
- Дізнайтеся, як керувати Secrets за допомогою kustomize
3 - Керування Secrets за допомогою Kustomize
kubectl підтримує використання інструмента керування обʼєктами Kustomize для керування Secrets і ConfigMaps. За допомогою Kustomize ви створюєте генератор ресурсів, який генерує Secret, що його можна застосувати до API-сервера за допомогою kubectl.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Створення Secret
Ви можете згенерувати Secret, визначивши secretGenerator у файлі kustomization.yaml, який посилається на інші наявні файли, файли .env або літеральні значення. Наприклад, наведені нижче інструкції створюють файл kustomization для імені користувача admin і пароля 1f2d1e2e67df.
Примітка:
ПолеstringData у Secret погано працює із застосуванням на боці сервера (server-side apply).Створення файлу kustomization
secretGenerator:
- name: database-creds
literals:
- username=admin
- password=1f2d1e2e67df
-
Збережіть облікові дані у файлах. Назви файлів є ключами Secret:
echo -n 'admin' > ./username.txt echo -n '1f2d1e2e67df' > ./password.txtПрапорець
-nгарантує, що в кінці ваших файлів немає символу нового рядка. -
Створіть файл
kustomization.yaml:secretGenerator: - name: database-creds files: - username.txt - password.txt
Ви також можете визначити secretGenerator у файлі kustomization.yaml, надавши файли .env. Наприклад, наведений нижче файл kustomization.yaml отримує дані з файлу .env.secret:
secretGenerator:
- name: db-user-pass
envs:
- .env.secret
У всіх випадках значення не потрібно кодувати в base64. Назва файлу YAML має бути kustomization.yaml або kustomization.yml.
Застосування файлу kustomization
Щоб створити Secret, застосуйте теку, яка містить файл kustomization:
kubectl apply -k <directory-path>
Вивід подібний до такого:
secret/database-creds-5hdh7hhgfk created
Під час генерації Secret його назву створюють шляхом хешування даних Secret і додавання значення хешу до назви. Це гарантує, що під час кожної зміни даних генерується новий Secret.
Щоб перевірити, що Secret створено, і розкодувати дані Secret,
kubectl get -k <directory-path> -o jsonpath='{.data}'
Вивід подібний до такого:
{ "password": "MWYyZDFlMmU2N2Rm", "username": "YWRtaW4=" }
echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
Вивід подібний до такого:
1f2d1e2e67df
Докладніше дивіться Керування Secrets за допомогою kubectl і Декларативне керування обʼєктами Kubernetes за допомогою Kustomize.
Редагування Secret
-
У файлі
kustomization.yamlзмініть дані, наприкладpassword. -
Застосуйте теку, яка містить файл kustomization:
kubectl apply -k <directory-path>Вивід подібний до такого:
secret/db-user-pass-6f24b56cc8 created
Змінений Secret створюється як новий обʼєкт Secret, а не оновлює наявний обʼєкт Secret. Можливо, вам доведеться оновити посилання на Secret у ваших Podʼах.
Очищення
Щоб видалити Secret, використайте kubectl:
kubectl delete secret db-user-pass
Що далі
- Дізнайтеся більше про концепцію Secret
- Дізнайтеся, як керувати Secrets за допомогою kubectl
- Дізнайтеся, як керувати Secrets за допомогою файлу конфігурації