K8s中ConfigMap能否仅通过文件名引用外部文件内容避免配置过大
解决方案
完全可以实现需求,最终生成的ConfigMap在集群中的形态和硬编码内容的版本完全一致,不会对原有的挂载、读取逻辑产生任何影响,常用实现方案如下:
方案1:kubectl命令行直接从文件创建(适合快速部署场景)
直接使用kubectl create configmap的--from-file参数指定本地JSON文件,kubectl会自动读取文件内容填充到ConfigMap中,无需手动编写内嵌内容的YAML:
# 逐个创建三个ConfigMap kubectl create configmap a-data --from-file=a.json -n monitoring kubectl create configmap b-data --from-file=b.json -n monitoring kubectl create configmap c-data --from-file=c.json -n monitoring
如果需要导出为YAML文件留存,可追加-o yaml --dry-run=client参数,不过导出的文件会自动填充文件内容。
方案2:Kustomize 配置生成(适合GitOps/版本化管理场景,K8s原生支持)
Kustomize是kubectl内置的配置管理工具,你只需要维护文件名引用即可,无需硬编码JSON内容:
- 在a.json、b.json、c.json同级目录下创建
kustomization.yaml,内容如下:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: monitoring # 关闭自动名称后缀哈希,和你原来的ConfigMap名称保持一致 generatorOptions: disableNameSuffixHash: true configMapGenerator: - name: a-data files: - a.json - name: b-data files: - b.json - name: c-data files: - c.json
- 执行部署命令即可自动生成对应ConfigMap:
kubectl apply -k .
该方案下你只需要维护JSON源文件和kustomization.yaml中的文件名引用,不需要把JSON内容写到任何配置定义文件中,大幅降低配置文件臃肿度。
方案3:Helm模板读取(适合使用Helm做部署管理的场景)
如果你使用Helm部署应用,可以在ConfigMap模板中使用.Files.Get函数自动读取源文件内容:
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-a-data namespace: {{ .Release.Namespace }} data: a.json: {{ .Files.Get "configs/a.json" | toYaml | indent 2 }}
将JSON文件放到Helm Chart对应路径下,渲染部署时Helm会自动读取文件内容填充,模板文件不需要保留硬编码的JSON内容。
内容的提问来源于stack exchange,提问作者Rahul Agrawal
相关产品推荐
相关产品推荐

