В Kubernetes раскрывайте секреты в файле как переменные среды.

Как в Kubernetes вместо этого раскрыть секреты в файле (в томе Kubernetes) в качестве переменных среды?

История вопроса:
Я следил за демонстрацией GKE Vault для облачной платформы Google и в нем они показывают, как "непрерывно извлекать содержимое секрета в локальное расположение файла. Это позволяет приложению читать секреты из файла внутри модуля, как правило, без необходимости модификации для непосредственного взаимодействия с Vault. . "

Я хотел бы знать, как я могу раскрыть эти секреты как переменные среды (вместо файла) для использования другими контейнерами приложений.


person cryanbhu    schedule 03.05.2019    source источник
comment
Как насчет записи секретов в файл, его источника (и запуска приложения), а затем его удаления?   -  person Amityo    schedule 05.05.2019
comment
Вам нужно запустить коляску, такую ​​как Consul Template, чтобы получить секреты в модуле. Нет простого способа поделиться средами между модулями, поэтому вам нужно будет использовать файловую систему. Примеры: github.com/sethvargo/vault-kubernetes-workshop   -  person sethvargo    schedule 07.05.2019
comment
нет ли способа поделиться секретами как переменной среды, чтобы контейнер приложения в том же Pod мог использовать их как переменную среды? Я думал, что чтение секретов из переменных окружения лучше, чем из файлов.   -  person cryanbhu    schedule 14.05.2019
comment
я нашел кое-что, что читает из Vault и заполняет секреты Kubernetes: itnext.io/   -  person cryanbhu    schedule 14.05.2019


Ответы (2)


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

Во-первых, файл секретов должен иметь форму KEY="VALUE" в каждой строке.
Для тех, кто использует шаблон Consul для получения секретов из Vault, вы можете сделать это следующим образом:

- name: CT_LOCAL_CONFIG
      value: |
        vault {
          ssl {
            ca_cert = "/etc/vault/tls/ca.pem"
          }
          retry {
            backoff = "1s"
          }
        }
        template {
          contents = <<EOH
        {{- with secret "secret/myproject/dev/module1/mongo-readonly" }}
        MONGO_READ_HOSTNAME="{{ .Data.hostname }}"
        MONGO_READ_PORT="{{ .Data.port }}"
        MONGO_READ_USERNAME="{{ .Data.username }}"
        MONGO_READ_PASSWORD="{{ .Data.password }}"
        {{- end }}
        {{- with secret "secret/myproject/dev/module2/postgres-readonly" }}
        POSTGRES_READ_HOSTNAME="{{ .Data.hostname }}"
        POSTGRES_READ_PORT="{{ .Data.port }}"
        POSTGRES_READ_USERNAME="{{ .Data.username }}"
        POSTGRES_READ_PASSWORD="{{ .Data.password }}"
        {{- end }}
        EOH
          destination = "/etc/secrets/myproject/config"
        }  

Это приведет к созданию файла секретов в правильной KEY="VALUE" форме.

Из файла секретов, который передается контейнеру приложения через volumeMount, мы можем внедрить секреты как переменные среды следующим образом:

command: ["/bin/bash", "-c"]  # for Python image, /bin/sh doesn't work, /bin/bash has source
args:
  - source /etc/secrets/myproject/config;
    export MONGO_READ_HOSTNAME;
    export MONGO_READ_PORT;
    export MONGO_READ_USERNAME;
    export MONGO_READ_PASSWORD;
    export POSTGRES_READ_HOSTNAME;
    export POSTGRES_READ_PORT;
    export POSTGRES_READ_USERNAME;
    export POSTGRES_READ_PASSWORD;
    python3 my_app.py;  

Таким образом, нам не нужно изменять существующий код приложения, который ожидает секреты от переменных среды (используемых для использования секретов Kubernetes).

person cryanbhu    schedule 16.05.2019

Спасибо @cryanbhu, это действительно спасло меня.

Также можно экспортировать все переменные, не перечисляя их:

command: ["/bin/bash", "-c"]  # you can also just use sh for other images
args:
  - source /etc/secrets/myproject/config;
    export $(cut -d= -f1 /etc/secrets/myproject/config);
    python3 my_app.py;

подтвердил, что у меня работает :)

person wiherek    schedule 20.03.2020