3 回答
TA贡献1808条经验 获得超4个赞
作为一般的 Un*x 语句,您无法在进程启动后更改进程中的环境变量。(你可以setenv (3)你自己的环境,并且你可以在execve (2)它时指定一个新进程的环境,但是一旦启动,你就不能再改变它。)
此限制适用于更高级别。如果您有docker run
一个容器,那么它-e
设置环境变量的选项是您必须删除并重新创建容器才能更改的内容之一。这env:
是 Kubernetes Pod 规范的众多不可变部分之一;如果不删除并重新创建 Pod,您也无法更改它。
如果您已通过 Deployment 部署了 pod(您确实应该这样做),则可以更改 Deployment 规范中的环境变量设置(在源代码管理中编辑 YAML 文件及其,或直接编辑kubectl apply -f
)kubectl edit
。这将导致 Kubernetes 使用新的日志值启动新的 pod,并按顺序关闭旧的 pod,从而进行零停机更新。 像这样删除和重新创建 Pod 是完全正常的,并且每当您想要更改部署内的映像以获得今天的构建时都会发生。
如果您的应用程序能够注意到其加载的配置文件的更改(并且必须对其进行专门编码才能做到这一点),那么另一种适合您的路径是将 ConfigMap 挂载到容器中;如果更改 ConfigMap 内容,容器看到的文件将会更改,但不会重新启动。
TA贡献1818条经验 获得超3个赞
您可以运行该命令kubectl exec -it <container_name> bash
并使用容器内的命令行来更改环境变量。您可以通过运行命令export LOG_LEVEL=debug
或export LOG_LEVEL=error
在容器内来完成。
TA贡献1995条经验 获得超2个赞
首先,了解这应该发生在应用程序级别。也就是说,这不是 Kubernetes 应该为你做的事情。
话虽这么说,您可以让应用程序检查环境变量的值(您已经在这样做),并且根据该值是什么,它可以设置应用程序的日志级别。换句话说,让应用程序代码轮询环境变量以查看它是否已更改。
您可以像 Shahaf 建议的那样注入环境变量,但这需要您exec
进入 pod,这可能并不总是可行或良好的做法。
我建议你跑kubectl set env rs [REPLICASET_NAME] SOME_ENVIRONMENT_VAR=1
。
话虽如此,您需要考虑为什么这很重要。Kubernetes 的构建原则是“ Pod 应该像牛一样对待,而不是宠物”。这意味着当一个 Pod 不再有用或不同步时,它应该被终止,并且应该启动一个代表代码当前状态的新 Pod 来代替它。
不管你如何去做你需要做的事情,你真的不应该在生产中这样做,甚至不应该在登台中这样做。
相反,让您的应用程序的基础环境变量设置适合该环境的日志级别。
- 3 回答
- 0 关注
- 183 浏览
添加回答
举报