kubernetes-helm - 使用多个 Helm 图表管理 ConfigMap、PVC 和 Secret 的最佳方式
问题描述
我致力于一个完整的数字解决方案,该解决方案具有多个后端、前端和微服务,在 IaaS 模型上运行。我们使用基于 CaaS 的基础架构,使用 Kubernetes 和 Helm 进行部署。
许多应用程序共享可以在 ConfigMap 和 Secrets 中找到的信息,并且它们共享相同的数据或 tmp PVC。
实际上,我在每个应用程序中创建了一个图表,每个环境都有一个 values-env.yaml,但我不知道将 configmap、pvc 和 secrets 文件放在哪里。
创建一个包含每个图表的项目是否正确,例如“子图表”,根目录有单个 configmap.yaml、pvc.yaml 和 secrets.yaml 文件?
对你来说最好的方法是什么?
解决方案
实际上有两种方法可以工作:将实际值传递到每个图表中,或为这些事物创建共享对象(在 Helm 中,或使用kubectl apply
,或通过您的 CI/部署工具,或...)并将它们的名称传递给每个图表。
如果您有类似主数据库登录名之类的东西最终被共享,您可以创建一个保存这些凭据的 Secret(同样,手动或通过其他工具)。每个图表values.yaml
都会有一个参考
databaseSecretName: db-credentials
然后它会根据这个设置环境变量
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: {{ .Values.databaseSecretName }}
key: username
最突出的限制是 Secret 必须与引用它的 Pod 位于同一命名空间中。
另一种方法是直接将其传递给 Helm 值:
env:
- name: DB_USERNAME
value: {{ .Values.databaseUsername | required "databaseUsername is required" }}
部署时,您可以使用该helm install -f
参数来提供覆盖值的附加 YAML 文件,该文件提供每个环境的凭据。
这两种方法都适用于您描述的任何 Kubernetes 对象类型。在 Secrets 的情况下,任何可以访问 Helm 状态的人都可以轻松地检索它们。在 Helm 2 中,这是可以访问 Tiller pod 的任何人;在 Helm 3 中,保护普通 Secret 的相同 RBAC 控件也可以保护 Helm 内部使用的 Secret 对象。
一个标准的微服务规则是每个服务都应该有独立的数据;没有服务直接访问另一个服务的数据,所有通信都是通过 API 进行的。在您谈论共享 PVC 或我上面的示例谈论共享数据库凭据的地方,这通常不是最佳实践。
Helm 的依赖机制以图表的方式不能很好地工作。假设您有依赖于 Redis 的服务 A 和也依赖于 Redis 的服务 B,并且这两个服务都希望各自拥有自己的 Redis。如果你尝试拥有一个同时依赖 A 和 B 的顶层图表,Helm 只会安装一个 Redis 并共享它。这可能是麻烦的根源。
推荐阅读
- c# - 将 AdWords XML 文件转换为 C# 列表
- javascript - 如何在javascript中总结两个对象的属性
- java - 如何使用路径(不是文件)在 c:\ 创建文件夹?
- reactjs - 具有多阶段 dockerfile 的多个 gitlab-ci 阶段
- javascript - yadcf custom_filter - 如何找到非空值和非空值?
- javascript - 我在控制台中收到错误 Uncaught TypeError: $ (...)。AaDropdownMenu 不是函数
- python - 使用 python 将 JSON 转换为 CSV
- wordpress - 即使图像有自己的链接,如何在图像后附加链接
- spring - Spring:自定义语言环境解析器
- lua - 在 Lua 中使用相同名称重新声明变量是否合法?