Я использую kubectl для развертывания основных приложений ASP.Net в кластере K8S. В настоящий момент я жестко кодирую порты контейнера и ConnectionString для базы данных следующим образом:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mydeploy
  template:
    metadata:
      labels:
        app: mydeploy
    spec:
      containers:
        - name: mydeploy
          image: harbor.com/my_app:latest
          env:
          - name: MyApp__ConnectionString
            value: "Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password"
          ports:
            - containerPort: 5076

Но хорошее решение я думаю - использовать такие переменные из файла appsettings.json (файл конфигурации ASP.Net). Итак, мой вопрос: как загрузить эти переменные из файла JSON и использовать в файле yaml?

JSON-файл выглядит так:

{
  "MyApp": {
    "ConnectionString": "Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password"
  },
  "ClientBaseUrls": {
    "MyApp": "http://mydeploy-svc:5076/api",
  }
}
0
Mikhail_Sam 1 Фев 2022 в 12:56

2 ответа

Вы можете использовать следующую команду для создания configmap, а затем смонтировать ее в свой contianer

kubectl create configmap appsettings --from-file=appsettings.json --dry-run -o yaml

Для монтирования вы должны добавить том в свое развертывание или sts следующим образом:

  volumes:
    - name: config
      configMap:
        name: appsettings

А затем смонтируйте его в свой контейнер:

 volumeMounts:
        - mountPath: /appropriate/path/to/config/appsettings.json
          subPath: appsettings.json
          name: config

Также, если вы хотите, вы можете использовать карту конфигурации в качестве источника переменных среды, например:

envFrom:
      - configMapRef:
          name: config
0
HaH 1 Фев 2022 в 13:20
Спасибо за ответ! Я попробовал ваше решение - похоже, он просто создает одну env var, содержащую весь файл json. Я не могу понять, как его использовать. Если я запускаю printenv в контейнере, я вижу appsettings.json={ "MyApp": { "ConnectionString": "Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password" }, "ClientBaseUrls": { "MyApp": "http://mydeploy-svc:5076/api", } }, а мне нужно что-то вроде: "MyApp__ConnectionString":"..." и "ClientBaseUrls__MyApp":"..."
 – 
Mikhail_Sam
1 Фев 2022 в 15:39
Вместо этого вы должны создать карту конфигурации, используя параметр --from-env-file. Например: kubectl create configmap appsettings --from-env-file=appsettings.json --dry-run -o yaml И используйте envFrom, как указано в посте kubernetes.io/docs/tasks/configure-pod-container/…
 – 
HaH
1 Фев 2022 в 16:45
Похоже, что опция --from-env-file не работает с json: error: "{" is not a valid key name... :(
 – 
Mikhail_Sam
1 Фев 2022 в 17:23
1
Извините, единственный известный мне обходной путь — это либо вручную преобразовать json в ключевые значения, либо преобразовать json в файл свойств с помощью таких инструментов, как jq.
 – 
HaH
1 Фев 2022 в 18:20

Я размещаю все комментарии как ответ вики сообщества для удобства использования.

Если вы запустите printenv в контейнере и увидите:

appsettings.json={ "MyApp": { "ConnectionString": "Host=postgres-ap-svc;Port=5432;Database=db;Username=postgres;Password=password" }, "ClientBaseUrls": { "MyApp": "http://mydeploy-svc:5076/api", } }

Вместо чего-то вроде: "MyApp__ConnectionString":"..." и "ClientBaseUrls__MyApp":"..."

Вместо этого вы должны создать карту конфигурации, используя параметр --from-env-file.

Например: kubectl create configmap appsettings --from-env-file=appsettings.json --dry-run -o yaml И используйте envFrom, как указано в сообщении kubernetes.io/docs/tasks/configure-pod-container/.

0
Wojtek_B 3 Фев 2022 в 12:35
Привет! Спасибо за ответ, но это не ответ. kubectl create ConfigMap --from-env-file работает только с yaml и не может использоваться для файла JSON. Так что это не работает
 – 
Mikhail_Sam
3 Фев 2022 в 15:39