Могу ли я создать файл или заменить его содержимое с помощью Kubernetes? - PullRequest
0 голосов
/ 10 января 2020

У меня есть приложение реагирования, которое размещено в контейнере nginx с использованием файлов stati c, подготовленных на этапе сборки. Проблема, с которой я сталкиваюсь, заключается в том, что URL-адрес API жестко запрограммирован в файлах js, и у меня возникает проблема, когда я хочу развернуть приложение в различных средах.

Так что в основном я поставил конфигурацию . js файл с переменной URL localhost API в каталоге publi c, который затем загружается в приложение в разделе индекса. html файл. Это работает для местной среды. Проблема возникает, когда я хочу развернуть ее в тестовой или производственной среде.

Я обнаружил, что возможно использовать configMap с монтируемыми томами, но для этого требуется подготовить один файл для каждой среды в продвигаться как я понимаю. Я хочу использовать переменные, которые я установил в своей библиотеке Azure DevOps, для заполнения значения URL API.

Поэтому мой вопрос заключается в том, есть ли способ заменить значения в конфигурации. * Файл 1023 * в контейнере nginx с использованием Kuberentes / Helm или, если я могу использовать задачу конвейера DevOps Azure, чтобы заменить содержимое предварительно подготовленного файла конфигурации. js и смонтировать его с помощью Kubernetes?

Не уверен, что понятно, что я хочу сделать, но, надеюсь, вы понимаете это ...

config. js

window.env = {
    API_URL: 'http://localhost:8080'
};

index. html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <title>My application</title>
    <!--
      config.js provides all environment specific configuration used in the client
    -->
    <script src="%PUBLIC_URL%/config.js"></script>
  </head>
  ...

Ответы [ 3 ]

1 голос
/ 13 января 2020

В дополнение к предоставленному методу @BinaryBullet, вы можете попробовать другим способом использовать одну задачу Azure DevOps для замены содержимого конфигурации. js файл перед этим .js применяется с kubernetes.

Замена токенов


Использование этого задания очень просто.

Шаг 1 :

Настройте себя Token prefix:

enter image description here

Step2:

Затем примените это Token prefix к вашему config.js файлу, где вы хотите заменить его различными значениями динамически :

enter image description here

Шаг 3:

Не забудьте указать значение, которое вы хотите передать config.js в Вкладка переменных :

enter image description here

Примечание: variable name должно совпадать с тем, которое вы настроили в config.js. Во время выполнения задачи она вставит соответствующее значение переменной в файл config.js на основе формата замены #{}# и same variable name.

Например, я использую apiurl на своих вторых снимках экрана, поэтому здесь я добавляю одну переменную apiurl и присваиваю ей значение, которое я хочу, чтобы это значение можно было заменить в этот файл config.js в время сборки.


Результат сборки:

enter image description here

This Replace Маркер Задача не имеет ограничений. Может использоваться в различных типах файлов. Смотрите мой другой аналогичный ответ: # 1 .

Надеюсь, что это тот, который может помочь вам достичь ваших ожиданий.

1 голос
/ 16 января 2020

В итоге я настроил его так:

Сначала я добавил configmap.yaml для создания конфигурации. js file

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-frontend
data:
  config.js: |-
    window.env = {
      API_URL: "{{ .Values.service.apiUrl }}"
    }

Values.service.apiUrl исходит из аргументов, представленных в задаче «Пакет и развертывание диаграмм Helm» --set service.apiUrl=$(backend.apiUrl)

Затем я добавил монтирование тома в deploy.yaml для замены конфигурации . js файл в контейнере nginx

...
containers:
  ...
  volumeMounts:
    - name: config-frontend-volume
      readOnly: true
      mountPath: "/usr/share/nginx/html/config.js"
      subPath: "config.js"
volumes:
  - name: config-frontend-volume
    configMap:
      name: config-frontend

Это помогло, и теперь я могу управлять переменной из конвейера DevOps Azure в зависимости от среды, в которой я развертываюсь.

1 голос
/ 10 января 2020

Вы можете достичь этого несколькими способами. Ниже приведены некоторые из них.

1.ConfigMap

Самый эффективный и лучший способ добиться этого, например, один из добавленных комментариев. Вы можете сделать что-то подобное с одной картой конфигурации.

Пример ConfigMap может выглядеть примерно так

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Values.definitionName }}-{{ .Values.envName }}-configmap
  namespace: {{ .Values.Namespace }}
data:
  API_URL: '{{ pluck .Values.envName .Values.API_URL | first }}'

Пример файла значений в диаграммах рулевого управления будет выглядеть следующим образом

API_URL:
  dev: dev.mycompany.io
  staging: staging.mycompany.io
  test: test.mycompany.io
  prod: mycompany.io

И перед запуском установки helm или обновления helm добавьте шаг в Azure devOps для запуска команды bash в вашем конвейере CI / CD, но убедитесь, что у вас установлен инструмент yq для этого. Или вы можете использовать любой инструмент, чтобы сделать то же самое.

yq w -i values.yaml envName dev

Весь этот процесс заменяет ваш файл конфигурации с API_URL на dev.mycompany.io, как я дал dev в yq инструмент.

Но если вас смущает использование инструмента yq или чего-то еще, вы можете иметь несколько файлов значений для каждой среды отдельно и внести изменения в шаг установки helm в своем развертывании.

helm install ./path --values ./dev-values.yaml

Но ваш файл конфигурации должен выглядеть что-то вроде этого, если у вас есть несколько файлов значений и оперируете, какие значения выбрать из helm install

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Values.definitionName }}-{{ .Values.envName }}-configmap
  namespace: {{ .Values.Namespace }}
data:
  API_URL: '{{ .Values.API_URL }}'

Ну, это один из способов сделать вещи.

2. Управление Dockerfile

Вы также можете сделать это с помощью dockerfile, что-то вроде этого шага в вашем dockerfile заменит значение файла.

RUN sed -i "s/env/dev.mycompany.io/" /app/config.js

Но так как URL уникален для каждого env, вы можете принимать значения, используя ARG

ARG url

RUN sed -i "s/env/${url}" /app/config.js

И во время сборки вы должны иметь задачу для docker построить и при этом передать значение url в качестве аргумента, вы можете видеть, что столбец аргументов в вашей задаче добавляет это --build-arg url=dev.mycompany.io

Это еще один способ добавить значения в ваш файл config.js, но это также добавляет четыре (на основе четырех envs) docker сборок. И поэтому ваши агенты будут заняты созданием четырех разных изображений для каждого git коммита и помещением в очередь других сборок. Если вы чувствуете, что команда не работает в Dockerfile надстройкой RUN cat /app/config.js в вашем docker файл, и вы можете отлаживать, что происходит, и проверить, если значения обновляются по мере изменения.

1051 * Опять это спорно, который хорошо и плохо, но я лично предпочитаю первый из-за количества коммитов, которые я делаю за час, но если URL-адрес не меняется, вам не нужно менять свою кодовую базу, вам просто нужно обновить сборку docker в вашем конвейере. Так что своего рода дискуссионным. 1053 * Есть и другие способы сделать это, а также. Но эти два проще всего достичь.

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...