如何使跨在kubernetes同一部署两个吊舱不同变量的环境中?

问题描述 投票:3回答:4

基于this就可以创建环境变量是跨您定义的所有部署豆荚一样的。

有没有一种方法来指示Kubernetes部署创建具有不同的环境变量荚?

使用案例:

比方说,我有一个监测容器,我想创建4个副本吧。这个容器如果一个环境变量的定义使得邮寄服务。例如,如果在的环境变量IS_MASTER是真实的,那么该服务继续发送这些电子邮件。

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

(在我来说,我使用的头盔,但同样的事情可以不掌舵以及)

deployment kubernetes environment-variables containers kubernetes-helm
4个回答
3
投票

你所寻找的是,据我所知,更像是一个反模式不是不可能的。

据我所知,你似乎是希望部署一个可扩展/ HA监控平台,不会对警报邮件X倍,所以你可以做一个跨斗容器会跟其兄弟姐妹和“选举”的主邮件(一StatefulSet将使它在这种情况下更容易),或者只是从监控分开邮件,让他们通过服务相互交谈。这将允许您负载平衡两者的监控和单独邮寄。

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

任何邮件请求将被一个从池中只有一个邮件进行处理,但这是假设你监控的豆荚,并不是所有的一起触发的警报......无论你的“主人”选举如果不是的话,那么邮件程序,你必须先解决这一点。

并通过解决,首先我的意思是添加一个主选逻辑在监控平台,来协调对事件的主失效接管,有几个方法可以做到这一点,但它确实取决于你的监控平台,可以做。 ..

虽然,如果你的副本就在那里以某种方式扩展计算能力和你的主人,预计是静态的,则只需使用StatefulSet,并在运行时做if hostname == $statefulset-name-0 then MASTER添加一个衬垫,但我觉得这是不是最好的主意。


2
投票

根据定义,在部署中的每个荚相同于其其它复制品。这是不可能的YAML定义。

可选的解决方案将是,以覆盖荚command并将它处理和计算所述变量的值,设置变量(export IS_MASTER=${resolved_value})和触发容器的默认入口点。

这意味着你必须找出逻辑来实现这一点(即如何做荚知道它应该是IS_MASTER =真的吗?)。这是一个实现细节可以与DB或用作标记或信号执行其他共享公共资源来完成。


1
投票

在所有部署的波德副本都会有相同的环境变量并没有独特的价值,以确定特定吊舱。创建多个部署是一个更好的解决方案。

不知道为什么,在OP是唯一一个部署。一个解决方案是使用StatefulSets。节点的名称会像网络-0,WEB1,网页-2,依此类推。在主机名的代码检查,如果是网络的0,然后发送电子邮件或者做别的事情。

这是一个肮脏的解决方案,但我想不出比创建多个部署一个更好的解决方案。


0
投票

另一种解决方案是使用相同的头盔图表病例和运行各一个掌舵的部署。您可以(使用--set .Values.foo.deployment.isFirst= "0""1")覆盖ENV变量与掌舵

请注意,头盔/ K8S不会允许您发布非常相同的配置twice

所以,你将不得不只在首次部署有条件应用一些Kubernetes具体配置(秘密,ConfigMaps,秘密等)。

{{- if eq .Values.foo.deployment.isFirst "1" }}
...
...
{{- end }}
© www.soinside.com 2019 - 2024. All rights reserved.