Добавить переменную среды из секрета k8s в записную книжку в Jupyterhub

Я использую пакет Helm Zero to Jupyterhub по порядку для развертывания Jupyterhub в нашем кластере кубернетов. Для отдельных изображений записной книжки требуются некоторые дополнительные переменные среды (в основном информация о подключении к базе данных), и я хотел бы, чтобы они отображали значения из существующего секрета в пространстве имен k8s. Как мне это сделать?

Наивный подход с использованием следующей конфигурации не работает:

singleuser:
  extraEnv:
    SECURE_ENVIRONMENT_VARIABLE: 
      valueFrom:
        secretKeyRef:
          name: secret
          value: key

В результате SECURE_ENVIRONMENT_VARIABLE устанавливается на map[valueFrom:map[secretKeyRef:map[name:secret value:key]]].

Я также пробовал использовать singleuser.extraConfig для установки c.KubeSpawner.extra_container_config в соответствии с документами конфигурации KubeSpawner, но если вы используете это для установки env, он, по-видимому, перезаписывает существующие переменные среды, что нарушает работу системы:

extraConfig: |
    c.KubeSpawner.extra_container_config = {
      "env": [
        {
          "name": "SECURE_ENVIRONMENT_VARIABLE",
          "value": "test" # even a hardcoded value results in the container failing 
        }
      ]
    }

Для записи, я бы нормально создал развертывание .yaml через helm upgrade --debug --dry-run и при необходимости отредактировал его вручную, я просто не могу понять, как получить эту информацию в динамически порождаемых модулях.


person Astrid    schedule 05.09.2018    source источник


Ответы (1)


Здесь https://github.com/jupyterhub/kubespawner/issues/306#issuecomment-474934945 Я предоставил решение для установки переменных среды с нестроковыми значениями.

Основная идея - использовать c.KubeSpawner.modify_pod_hook для добавления переменной в спецификацию модуля.


hub:
  extraConfig:
    ipaddress: |
      from kubernetes import client

      def modify_pod_hook(spawner, pod):
          pod.spec.containers[0].env.append(client.V1EnvVar("MY_POD_IP", None, client.V1EnvVarSource(None, client.V1ObjectFieldSelector(None, "status.podIP"))))
          return pod
      c.KubeSpawner.modify_pod_hook = modify_pod_hook
person abinet    schedule 20.03.2019
comment
могли бы объяснить что-нибудь более подробное? Я не могу воспроизвести решение: / - person Joost Döbken; 12.05.2019
comment
Ты мой герой! - person Milan Baran; 27.08.2019