﻿# Передать секреты Kubernetes в переносимые сервисы через ConfigMap

> [HTML Version](configmap-secrets.html)

В [переносимом сервисе](portable-microservices.md) пользовательского модуля можно настроить получение зашифрованных чувствительных данных. Для этого в файле `values‑elma365.yaml` [включается использование ConfigMap](configmap.md#enable-configmap) — ресурса Kubernetes для работы с конфигурационными данными. 

Если в переносимый сервис требуется передать конфиденциальную информацию, например строку подключения к базе данных:

1. [Сохраните чувствительные данные в секрет Kubernetes](#create-secret).

2. [Задайте правила передачи секрета с помощью ConfigMap](#create-rule).

## Шаг 1. Сохранить секрет в пространстве имён переносимых сервисов

В одном секрете Kubernetes может храниться несколько ключей, не все из которых используются в переносимом сервисе. Когда в ConfigMap вы настраиваете правило получения секрета Kubernetes, он передаётся со всеми ключами, которые в нём содержатся. Поэтому рекомендуется создать отдельный секрет и добавить в него только те ключи, которые требуются для работы переносимого сервиса. Такой подход предотвратит случайную передачу избыточных чувствительных данных. 

Секрет создаётся в пространстве имён переносимых сервисов — по умолчанию это `elma365‑applets`. Для этого:



1. Создайте манифест секрета в формате **.yaml**:



````
apiVersion: v1  
kind: Secret  
metadata:  
  name: mysecret # Имя секрета. Указывается по правилам формата DNS Subdomain Names. Подробнее читайте в [официальной документации Kubernetes](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names)  
type: Opaque # Используйте значение, установленное по умолчанию  
data:  
  key1: YmFy # Укажите значения ключей, зашифрованных в Base64  
  key2: Zm9v 

````


2. Создайте секрет:



````
kubectl apply -f ./mysecret.yaml -n elma365-applets 

````


Где:

- `mysecret.yaml` — манифест секрета;

- `elma365-applets` —  пространство имён, в котором размещаются переносимые сервисы.



## Шаг 2. Задать правила передачи секрета с помощью ConfigMap

1. Когда вы подготовили секрет, который нужно передать в переносимый сервис, откройте файл ConfigMap для редактирования, используя команду:

````
kubectl edit configmap elma365-babysitter-config -n elma365-applets

````


Где:

- `elma365‑babysitter‑config` — название ConfigMap;

- `elma365‑applets` — пространство имён, в котором размещаются переносимые сервисы.



2. В открывшемся файле в параметре `secretMappings` настройте правило передачи секрета в переносимый сервис. Вы можете задать этот параметр:

- в блоке `global` — секрет применится к переносимым сервисам во всех модулях, для которых не настроены отдельные правила передачи секрета;

- в отдельном блоке — создайте его с уникальным именем переносимого сервиса, чтобы передать секрет только в него. Название блока сформируйте по шаблону **\{company\}.ext\_\{id\}.\{uniquename\}**. Подробнее о составлении имени блока, в котором указываются параметры для определённого сервиса, читайте в [статье про настройку ConfigMap](configmap.md#service-block-name).  



Обратите внимание, значение параметра `secretMappings` из блока определённого переносимого сервиса имеет приоритет над значением из блока `global`. Если параметр на уровне переносимого сервиса не задан, используется значение из блока `global`.

3. В параметре `secretMappings` вы можете задать правила передачи для неограниченного количества секретов. Для каждого секрета укажите:

- `secretRef` — имя секрета, из которого передаются все содержащиеся в нём ключи;

- `type` — способ передачи секрета. Доступные варианты:

	- `env` — ключи из секрета передаются в переменные окружения переносимого сервиса;

	- `volume` — ключи из секрета передаются в файловую систему переносимого сервиса;

	- `mountPath` — если вы выбрали способ передачи секрета в файловую систему переносимого сервиса, укажите путь к каталогу, в котором сохранятся файлы с ключами из секрета.



**Важно**: для каждого секрета, который передаётся в переносимый сервис, значение параметра `mountPath` должно быть уникальным.



````
начало примечание

````
**Примечание**



Для хранения секретов рекомендуется использовать файловую систему, а не переменные окружения. Такой подход безопаснее и обеспечивает моментальное применение новых значений, если они изменяться в уже переданных в сервис секретах. Когда они хранятся в переменных окружения переносимого сервиса, требуется его перезапуск для использования обновлённых секретов.

````
конец примечание

````
 

4. После внесения изменений примените их с помощью команды с указанием пространства имён, в котором размещаются переносимые сервисы:

````
kubectl apply -f cfg.yaml -n elma365-applets

````
Настроенный параметр `secretMappings` применится автоматически, так как сервис **babysitter** отслеживает изменения в ConfigMap. Все микросервисы, для которых изменились настройки, перезапустятся.



## Пример настроенного параметра secretMappings

Рассмотрим на примере, как применяются настроенные правила передачи секретов. Допустим, в несколько переносимых сервисов нужно передать секреты следующим образом: 

| | |
|------|------|
| **Переносимый сервис** | **Передаваемые секреты** |
| **portableservice1** | Ключи секретов с именами `secret1` и `secret2` — в переменные окружения переносимого сервиса.<br> |
| **portableservice2** | Ключи секретов с именами `secret1` и `secret2` — в переменные окружения, а секрет с именем `secret3` — в файловую систему переносимого сервиса. |
| **portableservice3** и другие переносимые сервисы | Ключи секрета с именем `secret1` — в переменные окружения любых переносимых сервисов. |




Для этого:

1. В пространстве имён `elma365‑applets` [создайте секреты](#create-secret) со следующими именами:

- `secret1`;

- `secret2`;

- `secret3`.



2. В файле ConfigMap задайте правила передачи секретов:

1. В блоке `global` укажите секрет с именем `secret1`, т. к. он используется в переносимом сервисе `portableservice3`, а также в других переносимых сервисах.

2. Поскольку в переносимых сервисах `portableservice1` и `portableservice2` используются дополнительные секреты `secret2` и `secret3`, создайте для этих сервисов отдельные блоки и укажите в них индивидуальные правила передачи секретов.

В результате настройка ConfigMap может выглядеть следующим образом:



````
global:  
  secretMappings:   
    - secretRef: "secret1" # Имя секрета, из которого передаются все ключи   
      type: "env"  
\# Параметры для переносимого сервиса с уникальным именем portableservice1  
jilybhacnrpeu.ext\_4a685c94-3dcd-433a-ac5f-6367aaf38950.portableservice1:   
  secretMappings:  
  - secretRef: "secret1" # имя секрета, из которого передаются все ключи   
      type: "env"    
  - secretRef: "secret2" # имя секрета, из которого передаются все ключи  
      type: "env"  
\# Параметры для переносимого сервиса с уникальным именем portableservice2  
jilybhacnrpeu.ext\_4a685c94-3dcd-433a-ac5f-6367aaf38950.portableservice2:  
  secretMappings:  
    - secretRef: "secret1" # имя секрета, из которого передаются все ключи  
      type: "env"  
    - secretRef: "secret2" # имя секрета, из которого передаются все ключи  
      type: "env"  
    - secretRef: "secret3" # имя секрета, из которого передаются все ключи  
      type: "volume"  
      mountPath: '/etc/secrets'  
\# Параметры для переносимого сервиса с уникальным именем portableservice3  
jilybhacnrpeu.ext\_4a685c94-3dcd-433a-ac5f-6367aaf38950.portableservice3:  
  replicaCount: 1

````
