我有一个Kubernetes集群和一个应用程序,我试图使用Helm在它上面部署。我要修改的模板文件是_helpers.tpl
文件。
我的集群没有特定的ConfigMap值(假设是API_FLAG
),我的应用程序需要运行Values.yaml
文件中定义的可选作业(假设是publishapi
,默认设置为true
)。还有其他ConfigMap值需要出现才能使作业成功完成,然后我可以进一步将其添加到检查用例中。
我需要创建一个特定的工作流来检查:
- 如果
API_FLAG
在我们的集群中存在,那么其他ConfigMap值将被验证并且publishapi
继续作为默认值(true
),但是 - 如果
API_FLAG
不存在于我的集群中,那么整个publishapi
步骤必须不运行,即,像设置false
一样, - ,也不会抛出错误情况。
我知道如何使用和调用ConfigMap值,但我无法使用条件与ConfiMap值作为检查。一个简单的代码片段来解释这个问题和我正在尝试的可能是:
if (env.API_FLAG) {
// get other ConfigMap values/secrets from the environment
// set Values.publishapi -> true
} else {
// set Values.publishapi -> false
}
到目前为止,我看到的关于这个模板的唯一文档只考虑了从Values中获取变量。但是我无法从kubernetes集群本身获取ConfigMap值而不抛出任何错误的任何文档。
一些进一步阅读的链接:
- https://helm.sh/docs/chart_template_guide/named_templates/
- https://helm.sh/docs/howto/charts_tips_and_tricks/
- https://helm.sh/docs/chart_best_practices/templates/
- https://helm.sh/docs/chart_template_guide/control_structures/
Kubernetes没有任何"集群变量"的概念;或者"集群环境变量"。甚至像"这个集群的名字是什么?"必须通过在部署时注入它们的值来回答。
在Helm上下文中,我将通过在每个集群中使用单独的YAML值文件来解决这个问题。这与作为图表一部分的values.yaml
文件是分开的。然后你可以直接在那里指定你需要的变量:
# values.prod.yaml
apiFlag: true
publishapi: true
# values.qa.yaml
apiFlag: false
publishapi: false
这些可以与部署基础结构的其余部分一起签入源代码控制。如果你有多个类似的服务,有一个这些文件的中心副本是有意义的,或者在每个图表中复制它们是有意义的。
当您(或您的部署系统)去部署这些时,它需要传入带有helm install -f
选项的正确值文件。
kubectl config use-context qa
helm upgrade my-chart . -f values.qa.yaml
...
kubectl config use-context prod
helm upgrade my-chart . -f values.prod.yaml