﻿# Настройка параметров переносимых сервисов через ConfigMap

> [HTML Version](configmap.html)

Лимиты и параметры развёртывания микросервисов из [переносимых сервисов в модулях](portable-microservices.md) можно задавать с помощью ConfigMap — ресурса Kubernetes для работы с конфигурационными данными. Это позволяет:

- ограничить выделяемые ресурсы;

- определить количество экземпляров микросервисов, которые разворачиваются в Kubernetes;

- включить их автомасштабирование;

- настроить распределение подов микросервисов по узлам кластера;

- передать секреты Kubernetes в переносимые сервисы;

- настроить подключение к локальному реестру образов.

Вы можете задать глобальные настройки для переносимых сервисов, созданных во всех модулях системы, а также указать индивидуальные настройки для определённого сервиса.

ConfigMap используется:

- для тонкой настройки развёртывания микросервиса — можно задать значения параметров, недоступных при [редактировании переносимого сервиса в модуле](portable-services.md#docker-settings);

- для изменения настроек без редактирования модуля — полезно для платных модулей. Например, можно задать количество экземпляров микросервиса, поскольку параметр в ConfigMap приоритетнее, чем значение, установленное разработчиком при создании модуля.

Настройка ConfigMap состоит из двух этапов:

1. [Включить использование ConfigMap](#enable-configmap).

2. [Задать параметры в ConfigMap](#set-up-configmap).

## Шаг 1. Включить использование ConfigMap

Чтобы для настройки переносимых сервисов применялся ConfigMap, нужно включить переменную окружения \[OBJECT\] для сервиса **babysitter**. Для этого вносятся изменения в конфигурационный файл \[OBJECT\]:

1. Создайте резервную копию файла \[OBJECT\], заполненного при установке ELMA365. Это требуется перед редактированием, так как некорректная настройка параметров может привести к сбоям в работе приложения ELMA365.

2. В конфигурационном файле \[OBJECT\] включите параметры:

````
global:  
...  
\# Включение переносимых сервисов  
    managedServices:  
        enabled: true  
...  
\# Использование ConfigMap  
        watchableConfigMap:  
          enabled: true

3. ````
Обновите приложение ELMA365 с помощью команды:

````
helm upgrade elma365 ./elma365 -f values-elma365.yaml --timeout=30m

````
После этого автоматически создастся файл, в котором хранятся параметры ConfigMap. Он добавится в \[OBJECT\], где размещаются переносимые сервисы, по умолчанию — \[OBJECT\]. В файле преднастроен ConfigMap с именем \[OBJECT\]. Для корректной работы рекомендуем не изменять заданное имя.

Теперь вы можете задать параметры в ConfigMap. 

Чтобы вернуться к параметрам по умолчанию и начать настройку заново, удалите файл \[OBJECT\] и примените команду для его повторного создания:

````
kubectl apply -f cfg.yaml -n elma365-applets

````
Где \[OBJECT\] — \[OBJECT\] для размещения переносимых сервисов.



## Шаг 2. Задать параметры в ConfigMap

1. Откройте файл ConfigMap для редактирования, используя команду:

````
kubectl edit configmap elma365-babysitter-config -n elma365-applets

````
Где:

- \[OBJECT\] — название ConfigMap в файле \[OBJECT\];

- \[OBJECT\] — \[OBJECT\], в котором размещаются переносимые сервисы.

2. В открывшемся файле задайте:

	- глобальные параметры — применяются по умолчанию к переносимым сервисам во всех модулях. Задаются в блоке** **\[OBJECT\];

	- параметры для определённого сервиса — для их настройки добавьте блок с именем сервиса, сформированным по шаблону: \[OBJECT\], где:

		- \[OBJECT\] — код компании ELMA365. Можно получить из её URL‑адреса;

		- \[OBJECT\] — идентификатор модуля, в котором настроен переносимый сервис. Можно скопировать из URL‑адреса модуля в ELMA365;

		- \[OBJECT\] — уникальное имя переносимого сервиса из [настроек модуля](portable-services.md#add-portable-microservices).

Обратите внимание, значения параметров из блока определённого переносимого сервиса имеют приоритет над значениями глобальных параметров. Если параметр на уровне переносимого сервиса не задан, используется значение из блока `global`.

Пример содержания ConfigMap

````
apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: elma365-babysitter-config  
  annotations:  
    "helm.sh/resource-policy": keep  
data:  
  # Глобальные настройки  
  global:  
    replicaCount: 1  
    nodeSelector:   
      role: elma365   
    tolerations:  
      - effect: NoSchedule  
        key: dedicated  
        operator: Equal  
        value: elma365  
    autoscaling:  
      enabled: true  
      minReplicas: 1  
      maxReplicas: 9  
      targetMemoryUtilizationPercentage: 80  
      targetCPUUtilizationPercentage: 80  
    resources:  
      requests:  
        memory: "384Mi"  
        cpu: "250m"  
      limits:  
        memory: "1024Mi"  
        cpu: "1000m"  
  
  # Настройки для конкретного сервиса  
  abcd12345efgh.ext\_4a685c94-3dcd-433a-ac5f-6367aaf38950.portableservice:  
    resources:  
      requests:  
        memory: "512Mi"  
        cpu: "500m"  
      limits:  
        memory: "2048Mi"  
        cpu: "1000m"  
    image:  
      repository: registry.example.com  
      pullSecret:  
        - "my-registry-secret"
````

````
Доступные параметры:

1. **Ресурсы** (\[OBJECT\]):

	- \[OBJECT\] — ресурсы памяти и CPU, которые нужно выделить для микросервиса;

	- \[OBJECT\] — максимальные значения выделяемых ресурсов.

Подробнее о возможных значениях этих параметров читайте в [официальной документации Kubernetes](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#resource-units-in-kubernetes).

````
начало примера

````
**Пример**

````
resources:  
  requests:  
    memory: "512Mi"  
    cpu: "500m"  
  limits:  
    memory: "2048Mi"  
    cpu: "1000m"

конец примера

````


2. **Количество экземпляров** (\[OBJECT\]) — сколько подов запустить для микросервиса. Доступные значения: 0–32к.

````
начало примера

````
**Пример**

````
replicaCount: 4

конец примера

3. ````
**Автомасштабирование** (\[OBJECT\]):

	- \[OBJECT\] — включает автомасштабирование;

	- \[OBJECT\] — минимальное количество экземпляров микросервиса. Доступные значения: 0–32к;

	- \[OBJECT\] — максимальное количество экземпляров. Доступные значения: 0–32к;

	- \[OBJECT\] — желаемое использование памяти в процентах. Доступные значения: 0–100;

	- \[OBJECT\] — желаемое использование ресурсов CPU в процентах. Доступные значения: 0–100.

````
начало примера

````
**Пример**

````
autoscaling:  
  enabled: true  
  minReplicas: 1  
  maxReplicas: 9  
  targetMemoryUtilizationPercentage: 80  
  targetCPUUtilizationPercentage: 80

конец примера

4. ````
**Выбор узлов для размещения подов **(\[OBJECT\]) — настройте размещение подов микросервисов на определённых узлах кластера с помощью специальных меток. 

Подробнее об использовании параметра читайте в [официальной документации Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/).

````
начало примера

````
**Пример**

````
nodeSelector:  
  role: elma365  
  disk: ssd

конец примера

5. ````
**Разрешения для размещения подов **(\[OBJECT\]) — установите для подов микросервисов разрешения (tolerations), чтобы они могли размещаться на узлах с соответствующими ограничениями (taints).

Подробнее об инструментах taints и tolerations читайте в [официальной документации Kubernetes](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/).

````
начало примера

````
**Пример**

````
tolerations:  
  - effect: NoSchedule  
    key: dedicated  
    operator: Equal  
    value: monitoring

конец примера

6. ````
**Получение секретов Kubernetes** (`secretMappings`) — если в переносимый сервис требуется передать чувствительную информацию, например строку подключения к базе данных, сначала сохраните такую информацию в секрете Kubernetes, а затем в параметре `secretMappings` задайте правило его получения. Подробнее читайте в статье [«Передать секреты Kubernetes в переносимые сервисы через ConfigMap»](configmap-secrets.md).

7. **Путь и секреты для локального реестра образов** (`image`) — для работы переносимого сервиса в закрытом контуре без доступа в интернет требуется предварительно скачать и сохранить его Docker‑образ в ваш локальный реестр образов. После этого укажите: 

- `repository` — адрес локального реестра образов. Позволяет заменить доменную часть [адреса образа](portable-services.md#image-address), указанного в модуле на вкладке **Сервисы **в блоке **Docker контейнер**;

- `pullSecret` — наименование секрета с ключами доступа к локальному реестру образов, если для их скачивания требуется аутентификация.

````
Начало примера

````
**Пример**

В модуле на вкладке **Сервисы** указан публичный адрес Docker Hub — **chialab/math-api**. В ConfigMap вы задали следующие параметры:

````
image:  
  repository: registry.example.com  
  pullSecret:  
    - "my-registry-secret"

````
В результате, источником образа для развёртывания микросервиса является локальный репозиторий **registry.example.com/chialab/math-api**.

````
Конец примера

````


3. После внесения изменений примените их с помощью команды с указанием \[OBJECT\], в котором размещаются переносимые сервисы:

````
kubectl apply -f cfg.yaml -n elma365-applets

````
Параметры применятся автоматически, так как сервис **babysitter** отслеживает изменения в ConfigMap. Все микросервисы, для которых изменились настройки, перезапустятся. 