如何使Kubernetes中同一部署的两个Pod之间的环境变量不同?

时间:2018-10-03 13:44:38

标签: deployment kubernetes environment-variables containers kubernetes-helm

基于this,可以在您定义的部署的所有Pod中创建相同的环境变量。

是否可以指示Kubernetes部署来创建具有不同环境变量的Pod?

用例:

比方说,我有一个监视容器,我想为其创建4个副本。如果环境变量定义此容器,则该容器具有正在邮寄的服务。例如,如果env var IS_MASTER为true,则该服务将继续发送那些电子邮件。

apiVersion: v1
kind: Deployment
metadata:
  ...
spec:
  ...
  replicas: 4
  ...
  template:
    ...
    spec:
      containers:
      -env: 
        -name: IS_MASTER
         value: <------------- True only in one of the replicas

(在我的情况下,我正在使用头盔,但是同样的事情也可以不使用头盔)

4 个答案:

答案 0 :(得分:3)

据我所知,您正在寻找的更像是一种反模式,而不是不可能的事情。

据我了解,您似乎打算部署一个可扩展的/ HA监视平台,该平台不会在警报上发送X次,因此您可以制作一个可以与同级交谈的sidecar容器并“选出” master-mailer(在这种情况下,使用StatefulSet将使它更容易),或者只是将邮件与监视分开,并使其通过Service相互通信。这样一来,您就可以分别平衡监视和邮件的负载。

monitoring-1 \                 / mailer-1
monitoring-2 --- > mailer.svc -- mailer-2
monitoring-3 /                 \ mailer-3

任何邮寄请求都将由池中的一名邮递员处理,但这是假设您的Monitoring Pod并没有同时在警报中触发...如果不是这种情况,那么无论您是“主”选举对于邮件,您将必须首先解决。

首先,我要解决的意思是在监视平台中添加主选举逻辑,以安排事件的主故障转移,有几种方法可以做到这一点,但这实际上取决于监视平台是什么,并且可以做...

尽管,如果您的副本在那里以某种方式扩展了计算能力,并且您的主数据库预计是静态的,则只需使用StatefulSet,并在运行时添加if hostname == $statefulset-name-0 then MASTER来添加一个liner,但我觉得它是不是最好的主意。

答案 1 :(得分:2)

根据定义,部署中的每个Pod与其其他副本相同。在yaml定义中这是不可能的。

一个可选的解决方案是覆盖容器byte[],使其处理并计算变量的值,设置变量(command)并触发容器的默认入口点。

这意味着您必须找出实现该逻辑的逻辑(即,窗格如何知道它应该为IS_MASTER = true?)。这是一个实现细节,可以使用用作标志或信号量的数据库或其他共享公共资源来完成。

答案 2 :(得分:1)

部署中的所有Pod副本将具有相同的环境变量,并且没有唯一的值来标识特定的Pod。创建多个部署是更好的解决方案。

不知道为什么,该OP仅用于一次部署。一种解决方案是使用StatefulSets。节点名称将类似于web-0,web1,web-2等。在代码中检查主机名(如果它是web-0),然后发送电子邮件或执行其他操作。

这是一个肮脏的解决方案,但是我认为没有比创建多个部署更好的解决方案了。

答案 3 :(得分:0)

另一种解决方案是在两种情况下都使用相同的Helm Chart,并为每种情况运行一次helm部署。您可以使用掌舵来覆盖env变量(使用INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19 --set .Values.foo.deployment.isFirst="0"

请注意,Helm / K8不允许您发布完全相同的配置twice

因此,您将仅在第一次部署时有条件地应用一些特定于Kubernetes的配置(秘密,ConfigMap,秘密等)。

"1"