我可以修改容器的环境变量而无需使用kubernetes重新启动pod

时间:2017-07-12 06:31:20

标签: kubernetes

我有一个正在运行的pod,我想更改其中一个容器的环境变量并使其立即运行。我能做到吗?如果我能,怎么做?

6 个答案:

答案 0 :(得分:4)

这对我有用

kubectl set env RESOURCE/NAME KEY_1=VAL_1 ... KEY_N=VAL_N

查看官方文档here

答案 1 :(得分:3)

简单地说,并且在kube术语中,你不能。

linux进程的环境是在进程启动时建立的,当然没有可以实现这一目标的kube工具。 例如,如果更改到您的部署(我假设您使用它来创建窗格)将滚动基础窗格。

现在,就是说,在Is there a way to change another process's environment variables?下报告了一个涉及使用GDB的真正hacky解决方案

另外,请记住,即使您可以这样做,仍然需要监视此类更改的应用程序逻辑,而不是像现在这样通常只是在启动期间评估envs的配置。

答案 2 :(得分:1)

我不知道有什么方法可以做到这一点,我无法想到真实世界的场景,这太有道理了。

通常你必须重新启动一个进程才能注意到已更改的环境变量,最简单的方法就是重启pod。

最接近似乎需要的解决方案是创建deployment,然后使用kubectl editkubectl 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更改环境变量。