【发布时间】:2018-08-02 21:19:15
【问题描述】:
(大约 2 年前提出了一个非常相似的问题,虽然它专门关于秘密,但我怀疑配置映射的故事有什么不同......但至少,我可以介绍用例以及为什么现有的解决方法对我们来说是不可行的。)
给定一个简单的、精简的deployment.yaml:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: example
spec:
template:
spec:
containers:
- name: example
volumeMounts:
- name: vol
mountPath: /app/Configuration
volumes:
- name: vol
configMap:
name: configs
和匹配的configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: configs
labels:
k8s-app: example
data:
example1.json: |-
{
"key1": "value1"
}
example2.json: |-
{
"key2": "value2"
}
configmap.yaml 中的键,无论它们是什么,都只是简单地创建为文件,无需修改 deployment.yaml 或具有除 mountPath 之外的任何细节。
问题在于实际结构有子文件夹来处理覆盖根目录的特定于区域的值:
Configuration \ example1.json
Configuration \ example2.json
Configuration \ us \ example1.json
Configuration \ us \ ca \ example2.json
对于可以想象到的许多不同国家和地区以及每个单独配置的模块,它们的数量和性质显然会有所不同。目的是为最终用户提供一个工具,允许他们设置和管理这些配置,这将在幕后自动生成 configmap.yaml 并在 kubernetes 中更新。
但是,除非有我还没有找到的技巧,否则这似乎超出了 kubernetes 的能力范围,在某些方面。
首先,没有语法允许指定作为目录的 configmap 键,也不能在键中包含子目录路径:
data:
# one possible approach (currently complains that it doesn't validate '[-._a-zA-Z0-9]+')
/us/example1.json: |-
{
"key1": "value1"
}
# another idea; this obviously results in 'invalid type for io.k8s.api.core.v1.ConfigMap.data: got "map", expected "string"'
us:
example2.json: |-
{
"key2": "value2"
}
那么我们有哪些选择来实现这一目标?
好吧,我们可以使用 deployment.yaml 的 volumes: -configMap: 节点中的 items: -key: path: 方法将键映射到特定位置,
和/或在deployment.yaml的volumeMounts:节点中生成多个节点,
使用subPath:中的任何一个(这与在volumes: configMap:中使用items: -key: -path:基本相同),
或为每个子目录设置单独的配置映射,并将它们全部安装为不同的 volumes 在 deployment.yaml 中。
所有这些方法都需要对 deployment.yaml 进行大量且极其冗长的更改,泄露它不应该有任何理由知道的知识,使其可变并不断重新生成而不是静态的,从而使部署设置复杂化更新已部署的 Pod 等。等等。这只是不好。而这一切只是为了映射一个目录,仅仅因为它包含子目录......
这肯定不是它应该工作的方式吗?我错过了什么?我应该如何进行?
【问题讨论】:
标签: kubernetes yaml subdirectory