【问题标题】:2 Helm Charts with shared Redis dependency2 个共享 Redis 依赖的 Helm Charts
【发布时间】:2019-11-30 02:31:30
【问题描述】:

目前,我有 2 个 Helm 图表 - 图表 A 和图表 B。图表 A 和图表 B 对 Redis 实例具有相同的依赖关系,如 Chart.yaml 文件中所定义:

dependencies:
- name: redis
  version: 1.1.21
  repository: https://kubernetes-charts.storage.googleapis.com/

我还覆盖了 Redis 的名称,因为连续应用 2 个图表会导致 2 个 Redis 实例,因此:

redis:
  fullnameOverride: "redis"

当我尝试安装 Chart A 和 Chart B 时,出现以下错误:

Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict: kind: PersistentVolumeClaim, namespace: default, name: redis

我的印象是,如果两个图表具有相同的依赖关系,如果它已经存在,它会使用相同的实例?

【问题讨论】:

    标签: kubernetes charts redis dependencies kubernetes-helm


    【解决方案1】:

    当您使用 Helm 安装图表时,它通常希望每个 版本 都有自己的一组独立的 Kubernetes 对象。在您展示的基本示例中,我希望看到 Kubernetes Service 对象的名称类似于

    release-a-application-a
    release-a-redis
    release-b-application-b
    release-b-redis
    

    有一个通用约定,对象以{{ .Release.Name }} 开头命名,因此两个Redis 是分开的。

    这实际上是预期的设置。构建微服务的一个典型规则是每个服务都包含自己的隔离存储,并且服务从不相互共享存储。这个 Helm 模式支持这一点,而且这种设置并没有真正的缺点。

    如果您真的希望两个图表共享一个 Redis 安装,您可以编写一个“伞形”图表,它本身不做任何事情,但依赖于两个应用程序图表。该图表将有一个 Chart.yaml 文件和(在 Helm 2 中)一个引用其他两个图表的 requirements.yaml 文件,但没有自己的 templates 目录。这将导致 Helm 得出结论,单个 Redis 可以支持这两个应用程序,并且您最终会得到类似

    umbrella-application-a
    umbrella-application-b
    umbrella-redis
    

    (根据我的经验,你通常想要这个——你确实希望每个应用程序有一个单独的 Redis——因此尝试使用伞形图表管理多个安装并没有不是特别好。)

    【讨论】:

    • 每个共享 redis 子图的 values.yaml 是如何处理的?
    【解决方案2】:

    不幸的是,Helm 无法处理同名的多个资源,或者换句话说,没有任何共享资源的能力。 你可以关注This issue

    我认为你可以使用kustomize模板来使用共享资源。有一篇非常好的kustomize vs helm 文章。

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 2019-09-30
      • 2016-02-18
      • 2012-01-21
      • 1970-01-01
      • 2011-10-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多