ConfigMaps в Kubernetes (K8s)

by moiseevrus

ConfigMaps — это объекты Kubernetes, которые позволяют отделить данные/файлы конфигурации от содержимого изображения, чтобы обеспечить переносимость контейнерных приложений.

ConfigMaps связывают файлы конфигурации, аргументы командной строки, переменные окружения, номера портов и альтернативные артефакты конфигурации с вашими контейнерами Pod и системными частями во время выполнения.

ConfigMaps полезны для хранения и обмена неконфиденциальными незашифрованными данными конфигурации. Как и в Secrets, вы сможете создавать карты конфигурации из файлов и с объявлением yaml.

мы можем использовать карты конфигурации, связав его имя и том.

Создайте карту конфигурации:

Вы можете создавать карты конфигурации из каталогов, файлов или литеральных значений, используя kubectl create configmap .

$ cat app.properties 
environment=production 
logging=INFO 
logs_path=$APP_HOME/logs/ 
parllel_jobs=3 
wait_time=30sec

а также

kubectl create configmap app-config \ 
  --from-file configs/app.properties 
configmap "app-config" создан

что то же самое, что

kubectl create configmap app-config \ 
  --from-file configs/

а также

kubectl create configmap app-config \ 
  --from-literal environment=production \ 
  --from-literal logging=INFO 
  .......

Список конфигмап:

kubectl get configmap/app-config 
ИМЯ ДАННЫЕ ВОЗРАСТ 
app-config 1 1m

Посмотреть конфигурационную карту:

kubectl описать configmap/app-config 
Имя: app-config 
Пространство имен: по умолчанию 
Ярлыки: < нет > 
Аннотации: < нет >Данные 
==== 
app.properties: 
---- 
environment=production 
logging=INFO 
logs_path=$APP_HOME/logs/ 
parllel_jobs=3 
wait_time=30secСобытия: <нет>

Использование объявления YAML:

Файл configmap YAML будет выглядеть следующим образом:

вид: ConfigMap 
apiVersion: v1 
метаданные: 
  имя: пространство имен app-config 
  : данные по умолчанию 
: 
  app.properties: | 
среда = производственное 
ведение журнала = ИНФОРМАЦИЯ 
logs_path = $APP_HOME/logs/ 
parllel_jobs = 3 
wait_time = 30 секунд

Вот базовая карта конфигурации nginx для приложения PHP.

--- 
apiVersion: v1 
data: 
  nginx.conf: |- 
      events { 
      } 
      http { 
        server { 
          listen 80 default_server; 
          слушать [::]:80 default_server; 
      
          индекс index.html index.htm index.php; 
      
          корень /var/www/html; 
          имя сервера _; 
          location / { 
            try_files $uri $uri/ =404; 
          } 
          location ~ \.php$ { 
            include fastcgi_params; 
            fastcgi_param REQUEST_METHOD $request_method; 
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
            fastcgi_pass 127.0.0.1:9000;
          } 
        } 
      } 
вид: метаданные ConfigMap 
: 
  имя: nginx-config

Использование карт конфигурации

ConfigMaps можно использовать для заполнения отдельных переменных среды, как показано ниже:

apiVersion: v1 
вид: 
метаданные модуля: имя: спецификация 
  моего приложения :   контейнеры:     - имя:       образ моего приложения: мое приложение: последняя       среда:         - имя: значение ОКРУЖАЮЩЕЙ           СРЕДЫ:             configMapKeyRef:               имя: ключ конфигурации приложения               : среда - имя : LOG_MODE           valueFrom:             configMapKeyRef:               имя: ключ app-config               : ведение журнала — имя: LOG_PATH           valueFrom:             configMapKeyRef:               имя: ключ app-config               : logs_path — имя: THREDS_CLOUNT





















          valueFrom: 
            configMapKeyRef: 
              имя: ключ конфигурации приложения 
              : parllel_jobs

ConfigMaps также можно использовать в томах.

Самый простой способ — заполнить том файлами, где ключ — это имя файла, а содержимое файла — значение ключа:

--- 
apiVersion: v1 type: 
Pod 
metadata: 
  name: nginx-web 
spec: 
  containers: 
    - 
      image: "nginx:1.7.9" 
      name: nginx 
      ports: 
        - 
          containerPort: 443 
          name: nginx-https 
        - 
          containerPort: 80 
          name: nginx-http 
      volumeMounts: 
        - 
          mountPath: /etc/nginx/nginx.conf 
          name: nginx-config 
          subPath: nginx.conf 
  volumes: 
    - 
      configMap: 
        name: nginx-config 
      name: nginx-config

Секреты Kubernetes против ConfigMaps

  1. Используйте секреты для вещей, которые на самом деле являются секретными, такими как ключи API, учетные данные и т. д.
  2. Используйте ConfigMaps для несекретных данных конфигурации

В будущем, вероятно, будут некоторые отличия для секретов, такие как ротация или поддержка поддержки секретного API с помощью HSM и т. д. В целом, нам нравятся API на основе намерений, и намерение определенно отличается для секретных данных от обычных. конфиги.

Одно заметное отличие в реализации заключается в том, что kubectl apply -f:

  • ConfigMaps считаются «неизменными», если данные не изменились.
  • Секреты всегда «настраиваются» — даже если файл не изменился

И ConfigMaps, и Secrets хранят данные в виде пары ключ-значение. Основное отличие заключается в том, что Secrets хранит данные в формате base64, тогда как ConfigMaps хранит данные в виде обычного текста .

Если у вас есть некоторые важные данные, такие как ключи, пароли, учетные данные сервисных учетных записей, строка подключения к БД и т. д., вам всегда следует использовать секреты , а не конфигурации.

И если вы хотите выполнить некоторую настройку приложения, используя переменные среды, которые вы не хотите хранить в секрете/скрывать, например, тему приложения, URL-адрес базовой платформы и т. д., тогда вы можете использовать ConfigMaps.

Каково расположение каталога ConfigMap в модуле Kubernetes?

Многие приложения требуют настройки с помощью некоторой комбинации файлов конфигурации, аргументов командной строки и переменных среды. Эти артефакты конфигурации должны быть отделены от содержимого образа, чтобы обеспечить переносимость контейнерных приложений. Ресурс ConfigMap API предоставляет механизмы для внедрения в контейнеры данных конфигурации, при этом контейнеры не зависят от Kubernetes. ConfigMap можно использовать для хранения подробной информации, такой как отдельные свойства, или общей информации, такой как целые файлы конфигурации или большие двоичные объекты JSON.

Я не могу найти, где сохраняются configmaps. Я знаю, что они созданы, однако я могу прочитать их только через панель управления minikube.

ConfigMaps в Kubernetes можно использовать по-разному, и монтирование в виде тома — один из таких способов.

Вы можете выбрать, где вы хотите смонтировать ConfigMap на вашем Pod. Пример из документации K8s:

Карта конфигурации:

apiVersion: v1 
вид: 
метаданные ConfigMap: 
  имя: пространство имен special-config 
  : данные по умолчанию 
: 
  special.how: очень 
  special.type: charm

Pod

apiVersion: v1 type 
: Pod 
metadata: 
  name: dapi-test-pod 
spec: 
  containers: 
    - name: test-container 
      image: gcr.io/google_containers/busybox 
      command: [ "/bin/sh", "-c", " cat /etc/config/special.how" ] 
      volumeMounts: 
      - name: config-volume 
        mountPath: /etc/config 
  volumes: 
    - name: config-volume 
      configMap: 
        name: special-config 
  restartPolicy: Never

Обратите внимание на определение тома и соответствующие монтирования тома.

Другие способы включают в себя:

  • Потребление через переменные окружения
  • Использование через аргументы командной строки

Полные примеры см. в документации .

Обновите k8s ConfigMap или Secret, не удаляя существующий

Вы можете получить YAML из kubectl create configmapкоманды и передать его в kubectl replace, например:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | кубектл заменить -f -

Для справки в будущем, kubectl replaceтеперь это очень удобный способ добиться этого

kubectl replace -f some_spec.yamlПозволяет обновить полную configMap (или другие объекты)

Смотрите документ и примеры прямо здесь

Скопировать/вставить из справки:

# Замените модуль, используя данные из pod.json. 
kubectl заменить -f ./pod.json# Замените модуль на основе JSON, переданного на стандартный ввод. 
кошка pod.json | кубектл заменить -f -# Обновите версию (тег) образа модуля с одним контейнером до v4 
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | кубектл заменить -f -# Принудительно заменить, удалить и заново создать ресурс 
kubectl replace --force -f ./pod.json

Для небольших изменений configMapиспользуйтеedit
kubectl edit configmap <cfg-name>

kubectl replaceтерпит неудачу, если configmap еще не существует:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | кубектл заменить -f -Ошибка с сервера (NotFound): ошибка при замене "STDIN": configmaps "falco-config" не найден

Лучшим решением является использование kubectl apply, которое создаст configmap, если оно отсутствует, иначе обновит configmap, если оно присутствует:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl применить -f -configmap/falco-config настроен

You may also like

Leave a Comment