基于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
(在我的情况下,我正在使用头盔,但是同样的事情也可以不使用头盔)
答案 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"