Объединение нескольких секретов k8s в переменную env - PullRequest
0 голосов
/ 14 января 2019

Мое пространство имен k8s содержит Secret, которое создается во время развертывания (svcat), поэтому значения заранее неизвестны.

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-database-credentials
data:
  hostname: ...
  port: ...
  database: ...
  username: ...
  password: ...

A Deployment необходимо ввести эти значения в несколько другом формате:

...

containers:
  env:
  - name: DATABASE_URL
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: jdbc:postgresql:<hostname>:<port>/<database> // ??

  - name: DATABASE_USERNAME
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: username

  - name: DATABASE_PASSWORD
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: password

DATABASE_URL должен состоять из hostname, port, 'database' из ранее определенного секрета.

Есть ли способ сделать эту композицию?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Вы можете сделать пару вещей, о которых я могу подумать:

  1. Используйте секретный том и создайте сценарий запуска, который считывает секретные данные из тома, а затем запускает приложение с переменной среды DATABASE_URL.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: your_db_container
        command: [ "yourscript.sh" ]
        volumeMounts:
        - name: mycreds
          mountPath: "/etc/credentials"
      volumes:
      - name: mycreds
        secret:
          secretName: my-database-credentials
          defaultMode: 256
    
  2. Передайте переменную env в ключе command спецификации контейнера:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
      - name: mypod
        image: your_db_container
        command: [ "/bin/sh", "-c", "DATABASE_URL=jdbc:postgresql:<hostname>:<port>/<database>/$(DATABASE_USERNAME):$(DATABASE_PASSWORD) /start/yourdb" ]
    
        env:
        - name: DATABASE_USERNAME
          valueFrom:
            secretKeyRef:
              name: my-database-credentials
              key: username
        - name: DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
            name: my-database-credentials
            key: password
    
0 голосов
/ 15 января 2019

Kubernetes позволяет использовать ранее определенные переменные среды как часть последующих переменных среды. Из справочных документов по API Kubernetes :

Ссылки на переменные $ (VAR_NAME) раскрываются с использованием ранее определенных переменных среды в контейнере и любых переменных среды службы.

Итак, вы можете сначала извлечь необходимые секретные значения в переменные окружения, а затем составить DATABASE_URL с этими переменными.

...

containers:
  env:
  - name: DB_URL_HOSTNAME               // part 1
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: hostname

  - name: DB_URL_PORT                   // part 2
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: port

  - name: DB_URL_DBNAME                 // part 3
    valueFrom:
      secretKeyRef:
        name: my-database-credentials
        key: database

  - name: DATABASE_URL                  // combine
    value: jdbc:postgresql:$(DB_URL_HOSTNAME):$(DB_URL_PORT)/$(DB_URL_DBNAME)

...

Обратите внимание на круглые скобки $(...), используемые для переменного расширения.

0 голосов
/ 14 января 2019

Есть несколько способов (в порядке возрастания сложности):

  1. Измените параметр перед тем, как поместить его в секрет (расширьте все, что вы используете, чтобы вставить туда информацию).

  2. Добавьте скрипт в ваш Pod / контейнер, чтобы распределить входящие параметры (переменные окружения или аргументы команды) в то, что нужно. Если вы не можете или не хотите иметь свой собственный образ контейнера, вы можете добавить свой дополнительный скрипт в качестве тома в контейнер и установить поле command Контейнера, чтобы переопределить команду запуска образа контейнера .

  3. Добавьте средство к вашим Kubernetes для автоматического искажения "за кулисами": вы можете добавить Dynamic Admission Controller , чтобы сделать ваше искажение, или вы можете создать Kubernetes Оператор и добавление Пользовательского определения ресурса (CRD сообщает оператору, какие секреты следует отслеживать изменения, а оператор считывает значения и генерирует любые другие записи, которые вы хотите).

...