Kubernetes configmaps中的自动子目录?

Kubernetes configmaps中的自动子目录?,kubernetes,yaml,subdirectory,Kubernetes,Yaml,Subdirectory,(大约2年前有人问过一个非常类似的问题,尽管它是专门关于机密的,但我怀疑configmaps的故事有什么不同……但至少,我可以介绍一下用例,以及为什么现有的解决方案对我们来说不可行。) 给出一个简单、精简的部署。yaml: apiVersion:apps/v1beta1 种类:部署 元数据: 名称:示例 规格: 模板: 规格: 容器: -名称:示例 体积数量: -名称:vol 装载路径:/app/配置 卷数: -名称:vol 配置映射: 名称:configs 以及匹配的configmap.ya

(大约2年前有人问过一个非常类似的问题,尽管它是专门关于机密的,但我怀疑configmaps的故事有什么不同……但至少,我可以介绍一下用例,以及为什么现有的解决方案对我们来说不可行。)

给出一个简单、精简的
部署。yaml

apiVersion:apps/v1beta1 种类:部署 元数据: 名称:示例 规格: 模板: 规格: 容器: -名称:示例 体积数量: -名称:vol 装载路径:/app/配置 卷数: -名称:vol 配置映射: 名称:configs 以及匹配的
configmap.yaml

apiVersion:v1 种类:配置地图 元数据: 名称:configs 标签: k8s应用程序:示例 数据: 示例1.json:|- { “键1”:“值1” } 示例2.json:|- { “键2”:“值2” }
configmap.yaml
中的键,无论它们是什么,都只是作为文件创建的,而不需要修改
deployment.yaml
,或者具有除mountPath之外的任何细节

问题在于,实际结构有子文件夹来处理覆盖根文件夹的区域特定值:

Configuration \ example1.json
Configuration \ example2.json
Configuration \ us \ example1.json
Configuration \ us \ ca \ example2.json
这些模块的数量和性质可能会明显不同,因为可以想象到许多不同的国家和地区以及每个单独配置的模块。其目的是为最终用户提供一个工具,允许他们设置和管理这些配置,这将在幕后自动生成
configmap.yaml
,并在kubernetes中更新

然而,除非有什么我还没有发现的把戏,这似乎超出了库伯内特斯的能力,在几个方面

首先,没有语法允许指定作为目录的configmap键,也不允许在键中包含子目录路径:

数据:
#一种可能的方法(目前抱怨它没有验证“[-.\U a-zA-Z0-9]+”)
/us/example1.json:|-
{
“键1”:“值1”
}
#另一个想法;这显然会导致“io.k8s.api.core.v1.ConfigMap.data的类型无效:获取“映射”,应为“字符串”
美国:
示例2.json:|-
{
“键2”:“值2”
}
那么我们实现这一目标的选择是什么

Wellll,我们可以使用部署中的
项:-键:路径:
方法将键映射到特定位置。yaml的
卷:-配置映射:
节点

和/或在部署中生成多个节点。yaml的
volumeMounts:
node

使用
子路径:
(基本上与使用
卷中的
项:-键:-路径:
)相同

或者为每个子目录单独配置映射,并将它们作为不同的
卷装载到deployment.yaml中

所有这些方法都需要对部署进行大量且极其详细的更改。yaml,泄漏它不应该有任何理由知道的知识,使其可变并不断重新生成,而不是静态的,使部署的POD的设置更新复杂化,等等。这不太好。所有这些只是为了映射一个目录,因为它包含子目录

这肯定不是应该的工作方式吗?我错过了什么?我应该如何继续?

从“容器本机”的角度来看,拥有一个大型文件系统配置文件树,应用程序在启动时处理这些文件以获得其规范配置是一种反模式。最好有一个生成单个文件的工作流,该文件可以存储在ConfigMap中,并以最终形式轻松检查。例如,请参阅nginx入口

但显然,并不是每个人都在重写自己的应用程序,以便更好地与库伯内特斯的方法保持一致。然后,在部署时将配置文件的完整目录树放入容器的最简单方法是使用initContainers和emptyDir挂载


将配置文件树打包到一个容器中(有时称为“仅数据”容器),让容器启动脚本将配置树复制到emptyDir装载中。然后,应用程序可以按预期使用该树

根据配置树的比例,另一个可行的选择可能是在configmap内的文件“路径”中使用下划线而不是斜杠来模拟子树。这会降低一般文件系统的性能(如果您只需要读取配置文件,这绝对不会成为问题),并迫使您重写一点应用程序代码(在访问配置文件时,文件模式遍历而不是目录遍历),但是应该以相当便宜的价格解决您的用例。

一些解决方法:

  • 创建一个仅包含数据的容器,其中包含数据
  • 然后将其添加为一个侧车,将卷安装在另一个容器上

  • 从配置创建tar球,将其转换为configmap,装载到容器中,并更改容器命令以在启动前卸载配置

  • 用一些特殊字符重命名文件,而不是像
    us@example.json
    并使用脚本像开头一样对它们进行
    mv

  • 所有这些都是非常令人讨厌的。。。最好的方案是重构它们以在平面文件夹中使用,并使用类似kustomize的东西创建它们:

    kustomize edit add configmap my-configmap --from-file='./*.json'
    
    kustomize edit add configmap my-configmap --from-file='./*.json'