我有一个正在运行的pod,我想更改其中一个容器的环境变量并使其立即运行。我能做到吗?如果我能,怎么做?
答案 0 :(得分:4)
答案 1 :(得分:3)
简单地说,并且在kube术语中,你不能。
linux进程的环境是在进程启动时建立的,当然没有可以实现这一目标的kube工具。 例如,如果更改到您的部署(我假设您使用它来创建窗格)将滚动基础窗格。
现在,就是说,在Is there a way to change another process's environment variables?下报告了一个涉及使用GDB的真正hacky解决方案
另外,请记住,即使您可以这样做,仍然需要监视此类更改的应用程序逻辑,而不是像现在这样通常只是在启动期间评估envs的配置。
答案 2 :(得分:1)
我不知道有什么方法可以做到这一点,我无法想到真实世界的场景,这太有道理了。
通常你必须重新启动一个进程才能注意到已更改的环境变量,最简单的方法就是重启pod。
最接近似乎需要的解决方案是创建deployment,然后使用kubectl edit(kubectl edit deploy/name
)来修改它的环境变量。保存后会启动一个新的pod,旧的pod将被终止。
答案 3 :(得分:0)
Kubernetes的设计方式应该通过配置重新部署对pod的任何更改。如果你搞乱已经部署过的pod,你最终可能会遇到难以调试的怪异集群。
如果您真的想要,可以使用kubectl exec
在运行的pod中运行其他命令,但这仅建议用于调试目的。
kubectl exec -it <pod_name> export VARIABLENAME=<thing>
答案 4 :(得分:0)
如果您根据documentation使用头盔3>:
自动滚动部署
通常ConfigMap或Secrets是 作为配置文件注入到容器中或其他 外部依赖项更改需要滚动Pod。取决于 如果使用以下命令更新应用程序,则可能需要重新启动 随后的头盔升级,但是如果部署规范本身没有 更改应用程序以旧配置继续运行 导致部署不一致。
sha256sum函数可用于确保部署的注释 如果另一个文件更改,则更新此部分:
kind: Deployment spec: template: metadata: annotations: checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} [...]
如果您一直想要 要展开部署,可以使用类似的注释步骤 上面的内容,而不是替换为随机字符串,因此它总是会变化, 导致部署失败:
kind: Deployment spec: template: metadata: annotations: rollme: {{ randAlphaNum 5 | quote }} [...]
这两种方法均允许您的部署利用内置的更新策略 避免停机的逻辑。
注意:过去,我们建议使用--recreate-pods标志作为 另外的选择。在Helm 3中,此标志已被标记为已弃用 支持上面的更具声明性的方法。
答案 5 :(得分:0)
很难从外面改变。但是很容易从内部进行更改。您在Pod中运行的应用可以对其进行更改。只是反对使用Api更改环境变量。