我正在使用 Zero to Jupyterhub Helm 包,以便将 Jupyterhub 部署到我们的 kubernetes 集群中。单个笔记本映像需要一些额外的环境变量(主要是数据库连接信息(,我希望它们从 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
根据 KubeSpawner 配置文档设置c.KubeSpawner.extra_container_config
,但如果你用它来设置env
它显然会覆盖现有的环境变量,这会破坏系统:
extraConfig: |
c.KubeSpawner.extra_container_config = {
"env": [
{
"name": "SECURE_ENVIRONMENT_VARIABLE",
"value": "test" # even a hardcoded value results in the container failing
}
]
}
作为记录,我可以通过helm upgrade --debug --dry-run
创建部署 .yaml 并在必要时手动编辑它,我只是无法弄清楚如何将这些信息放到动态生成的 pod 上。
这里 https://github.com/jupyterhub/kubespawner/issues/306#issuecomment-474934945 我提供了使用非字符串值设置环境变量的解决方案。
基本思想是使用 c.KubeSpawner.modify_pod_hook 将变量添加到 pod 规范中。
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