将 k8s 机密中的环境变量添加到 Jupyterhub 中的笔记本中



我正在使用 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

最新更新