首页/新闻资讯/正文详情

kustomize 实战:用 configMapGenerator 实现 ConfigMap 生成与滚动更新

发布时间:2026/9/23 12:42:36 来源:云帆数科 栏目:资讯中心
kustomize 实战:用 configMapGenerator 实现 ConfigMap 生成与滚动更新
CLI开发工具云原生【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址https://gitcode.com/gh_mirrors/ku/kustomize点击查看免费下载本指南以 kustomize 仓库中的 examples/zh/configGeneration.md 为骨架结合api/与examples/helloWorld下的真实源码与示例完整讲解两种声明 ConfigMap 的方式、基于内容哈希的名称后缀机制以及如何通过换新 ConfigMap 名称而非改旧 ConfigMap 数据来触发 Deployment 的滚动更新。读完本文你将掌握configMapGenerator的literals/files/envs三种数据来源、behavior与disableNameSuffixHash等高级选项并能在 base/overlay 结构中独立搭建一套可自动滚动更新的配置管理方案。两种在 kustomization.yaml 中声明 ConfigMap 的方式kustomize 在一个kustomization中提供两种添加 ConfigMap 的方法将 ConfigMap 声明为 [resource]把它当作普通资源文件引入通过 configMapGenerator 声明让 kustomize 根据literals、files、envs等输入现场生成 ConfigMap。在kustomization.yaml中两种方法的格式分别如下# 将 ConfigMap 声明为 resource resources: - configmap.yaml # 在 ConfigMapGenerator 中声明 ConfigMap configMapGenerator: - name: a-configmap files: - configs/configfile - configs/another_configfile两种方式的行为差异是本文的核心声明为resource的 ConfigMap 与其他资源一视同仁kustomize不会在其名称上追加任何哈希后缀从configMapGenerator声明的 ConfigMap 则默认会被追加一个基于内容计算的哈希后缀ConfigMap 中的任何更改都会导致哈希值变化进而触发滚动更新。在仓库的 hello_world 示例原始文件位于 examples/helloWorld中官方演示了用 configMapGenerator 替换将 ConfigMap 声明为 resource的旧做法——这样生成的 ConfigMap 一旦内容变化哈希值和滚动更新就会自动发生。从源码上看configMapGenerator是Kustomization结构体的一个字段与resources、namePrefix、nameSuffix等并列定义在 api/types/kustomization.go 中其具体参数类型为ConfigMapArgs见 api/types/configmapargs.go内部内嵌了 ConfigMap 与 Secret 共用的GeneratorArgs。configMapGenerator 支持的参数GeneratorArgs定义在 api/types/generatorargs.go包含参数类型说明namestring生成资源的部分名称完整名称形如NamePrefix name 内容哈希namespacestring可选生成资源的命名空间behaviorstring生成行为取值create新建/replace替换/merge合并默认createliterals[]string字面量键值对列表形如keyvaluefiles[]string文件数据源形如[{key}]{path}省略key时以文件 basename 作为键值为文件内容也可直接指定目录envs[]string环境变量文件数据源每行一个keyvalue类似 Docker/npm 的.env文件optionsGeneratorOptions对全局generatorOptions的局部覆盖其中literals、files、envs三个数据源定义在 api/types/kvpairsources.go。files的完整语法还支持显式指定键名例如configMapGenerator: - name: a-configmap files: - configs/configfile # 键为 configfile - configkeyconfigs/another_configfile # 键为 configkeyMakeConfigMap见 api/internal/generators/configmap.go负责把上述输入组装成 ConfigMap 节点先创建带name/namespace的基础节点再通过makeValidatedDataMap校验并合并各数据源最后写入data字段并应用标签、注解与不可变选项。完整示例搭建 base 与 staging接下来按原文档的实操步骤从零搭建一个 hello-world 应用的 base 与 staging overlay。建立 base使用 configMapGeneratorDEMO_HOME$(mktemp -d) BASE$DEMO_HOME/base mkdir -p $BASE curl -s -o $BASE/#1.yaml https://raw.githubusercontent.com\ /kubernetes-sigs/kustomize\ /master/examples/helloWorld\ /{deployment,service}.yaml cat EOF $BASE/kustomization.yaml commonLabels: app: hello resources: - deployment.yaml - service.yaml configMapGenerator: - name: the-map literals: - altGreetingGood Morning! - enableRiskyfalse EOF这里configMapGenerator通过literals生成名为the-map的 ConfigMap包含altGreeting与enableRisky两个键。注意enableRiskyfalse中的引号是为了保留字符串形式的布尔值。建立 staging通过 ConfigMap patch 定制OVERLAYS$DEMO_HOME/overlays mkdir -p $OVERLAYS/staging cat EOF $OVERLAYS/staging/kustomization.yaml namePrefix: staging- nameSuffix: -v1 commonLabels: variant: staging org: acmeCorporation commonAnnotations: note: Hello, I am staging! resources: - ../../base patches: - path: map.yaml EOF cat EOF $OVERLAYS/staging/map.yaml apiVersion: v1 kind: ConfigMap metadata: name: the-map data: altGreeting: Have a pineapple! enableRisky: true EOFstaging 这个 [variant]对 base 的定制变体通过namePrefix: staging-和nameSuffix: -v1重命名所有资源并用patches中的map.yaml对名为the-map的 ConfigMap 打补丁把问候语改成Have a pineapple!、风险开关改成true。为什么改数据不如换名字滚动更新的原理集群中运行的hello-worldDeployment 配置了来自 ConfigMap 的数据它按名称引用这个 ConfigMapgrep -C 2 configMapKeyRef $BASE/deployment.yaml仓库中的 examples/helloWorld/deployment.yaml 展示了这种引用方式——容器通过env的valueFrom.configMapKeyRef指定name: the-map和对应的keyenv: - name: ALT_GREETING valueFrom: configMapKeyRef: name: the-map key: altGreeting - name: ENABLE_RISKY valueFrom: configMapKeyRef: name: the-map key: enableRisky直接修改集群中存活的 ConfigMap 数据通常不是好做法Deployment 无法感知它所引用的 ConfigMap 已经变化这类更新不会产生任何效果。推荐的做法是两步走使用新名称创建一个新的 ConfigMap为 deployment 添加 patch把对应configMapKeyRef字段中的名称值改成新名称。后一种更改会启动 deployment 中 pod 的滚动更新旧的 ConfigMap 在不再被任何资源引用后最终会被 Kubernetes 垃圾回收。哈希后缀是如何生成的源码级解析在这个示例中patch 要能生效metadata/name字段中的名称必须与目标资源匹配。但问题在于文件中写死的名称并不是集群中实际使用的名称——kustomize 设计上会修改从configMapGenerator声明的 ConfigMap 的名称。要查看最终集群中使用的名称只需运行kustomize build $OVERLAYS/staging |\ grep -B 8 -A 1 staging-the-map输出中可以看到最终名称由三部分组成前缀staging-来自$OVERLAYS/staging/kustomization.yaml的namePrefix字段核心名the-map来自configMapGenerator的name后缀-v1来自nameSuffix字段哈希-5276h4th55由 ConfigMap内容计算而来。kustomize build $OVERLAYS/staging | grep 5276h4th55这个哈希不是随机生成的。在 api/hasher/hasher.go 中可以看到完整算法该实现参考了 kubernetes 官方pkg/kubectl/util/hash对 ConfigMap参与哈希的字段是kind、metadata/name、data以及非空的binaryData见 encodeConfigMap拼接后经json.Marshal保证键序稳定对上述 JSON 字符串取sha256再截取前 10 个十六进制字符为避免十六进制字符与 DNS 名称规则冲突做一次字符替换0→g、1→h、3→k、a→m、e→t见 encode 函数。由此可知只要 ConfigMap 的data内容或名称发生变化哈希就会变化从而生成一个全新的名称。这正是滚动更新能被触发的根因——新名称意味着新的configMapKeyRef引用Deployment 的 pod 模板随之变化Kubernetes 便会滚动重建 pod。修改 patch 观察滚动更新完整实验现在修改 map patch更改服务将要使用的问候消息sed -i.bak s/pineapple/kiwi/ $OVERLAYS/staging/map.yaml查看新的问候消息kustomize build $OVERLAYS/staging |\ grep -B 2 -A 3 kiwi再次运行 kustomize 查看新的 ConfigMap 名称kustomize build $OVERLAYS/staging |\ grep -B 8 -A 1 staging-the-map确认 ConfigMap 内容的更改生成了以c2g8fcbf88结尾的三个新名称——一个出现在 ConfigMap 名称本身另外两个出现在使用该 ConfigMap 的 deployment即两处configMapKeyRef引用中test 3 \ $(kustomize build $OVERLAYS/staging | grep c2g8fcbf88 | wc -l); \ echo $?输出0表示断言通过共匹配到 3 处。将这些资源应用到集群会导致 deployment 的 pod 发生滚动更新把它们从引用5276h4th55map 重新指向c2g8fcbf88map旧 map 随后会被系统垃圾回收。这个一处修改、三处联动的现象背后是 kustomize 的引用自动更新机制所有指向the-map的configMapKeyRef都会在构建时被重写为最终的哈希名称。相关内容在 api/internal/accumulator/namereferencetransformer.go 等引用解析代码中实现并可由 api/krusty/configmaps_test.go 中的大量用例验证。回滚回滚非常简单撤消在源码配置中做的任何编辑然后在还原后的配置上重新运行 kustomize并将其应用于集群即可。由于滚动更新完全由配置内容 → 哈希名称这一确定性映射驱动只要源码回到旧状态构建出的名称就会回到旧哈希Kubernetes 会再次滚动更新 pod 以匹配。进阶控制behavior 与 disableNameSuffixHashbehaviorcreate / replace / merge当同一个 kustomization 中同时存在同名资源与configMapGenerator时可通过behavior控制生成行为默认createcreate新建若名称冲突可能报错replace用生成的 ConfigMap 替换同名资源merge将生成的键值合并进同名资源。例如 api/krusty/configmaps_test.go 中就大量使用了behavior: merge与behavior: create的组合来测试资源合并语义。disableNameSuffixHash关闭哈希后缀默认行为下哈希后缀一定会追加到 ConfigMap 名称上。如果你不希望滚动更新被触发例如 ConfigMap 由应用内动态读取可以在generatorOptions中关闭该行为generatorOptions: disableNameSuffixHash: true configMapGenerator: - name: the-map literals: - altGreetingGood Morning!该字段定义于 api/types/generatoroptions.go其注释明确说明如果为 true则禁用默认的追加名称哈希后缀行为。注意它是generatorOptions的全局选项也可以在每个 generator 的options中局部覆盖覆盖合并逻辑同样实现在 api/types/generatoroptions.go 中。小结ConfigMap 作为resource声明与通过configMapGenerator声明核心区别在于后者默认会追加内容哈希后缀并自动联动引用哈希由 api/hasher/hasher.go 基于 sha256 计算并做了字符映射任何内容变化都会产生新名称从而触发 Deployment 滚动更新修改线上配置的正确姿势是换新名字 更新configMapKeyRef引用而不是原地改写已挂载的 ConfigMap 数据behaviorcreate/replace/merge与disableNameSuffixHash提供了对生成与哈希行为的精细控制。想进一步动手验证可以直接查阅 examples/helloWorld 的原始资源kustomization.yaml、deployment.yaml、configMap.yaml或对照 api/krusty/configmaps_test.go 中的测试用例把上面的每一步用kustomize build亲手跑一遍。赞分享CLI开发工具云原生【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址https://gitcode.com/gh_mirrors/ku/kustomize点击查看免费下载相关推荐Kustomize 配置生成实战ConfigMapGenerator 与滚动更新机制解析Kustomize 配置生成实战ConfigMapGenerator 与滚动更新机制解析 本文围绕 kustomize 的 configMapGeneratoCLI开发工具云原生kustomize configMapGenerator 实战指南从文件、literals 与 env 文件生成 ConfigMapkustomize configMapGenerator 实战指南从文件、literals 与 env 文件生成 ConfigMap ConfigMap 是CLI开发工具云原生kustomize ConfigMapGenerator 完全指南参数解析、源码原理与滚动更新实践kustomize ConfigMapGenerator 完全指南参数解析、源码原理与滚动更新实践 导读 ConfigMapGenerator 是 kustoCLI开发工具云原生上一篇如何快速掌握Box2D打造真实2D游戏物理效果的终极指南 下一篇【亲测免费】 开源项目 spoof 使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

3步搞定好听的歌曲打包下载图解原理
3步搞定好听的歌曲打包下载图解原理

3步搞定好听的歌曲打包下载图解原理 面试被问原理答不上来,是不是瞬间脑子一片空白?别慌,这种尴尬我见得太多了。很多人以为只要会调API就行,结果面试官一追问底层机制,直接卡壳。今天咱们不整虚的,直接上干货,用图解原理的方式,把这块硬骨头啃下… · 2026/9/23 12:42:36

Relay Resolvers 局限性全解析:已知限制、底层成因与替代方案(Relay 客户端 Schema 实战指南)
Relay Resolvers 局限性全解析:已知限制、底层成因与替代方案(Relay 客户端 Schema 实战指南)

Relay Resolvers 局限性全解析:已知限制、底层成因与替代方案(Relay 客户端 Schema 实战指南) 【免费下载链接】relay Relay is a JavaScript framework for building data-driven React applications. 项目地址: https://gitcode.com/gh_m… · 2026/9/23 12:42:30

也只是怕错过 什么歌一文搞懂
也只是怕错过 什么歌一文搞懂

3个坑讲透也只是怕错过什么歌源码解析 复制来的代码跑不通,报错信息满屏飞,你盯着屏幕抓狂,不知道问题出在哪。这种“抄作业”式的开发体验,在 Python… · 2026/9/23 12:42:30

VA段码屏丝印颜色怎么选?从工艺、成本到配色方案全解析
VA段码屏丝印颜色怎么选?从工艺、成本到配色方案全解析

VA段码屏上的丝印颜色能怎么玩,这个话题我估计不少做产品、搞硬件的朋友一上来就懵。问的人多,但真正能把这个工艺细节讲透的其实很少。很多人以为段码屏上的那个Logo或者字符颜色是想要几个就给印几个,实则不然,背后牵扯到油墨、… · 2026/9/23 13:20:46

硬件测试从入门到实战:方法、工具与自动化测试全攻略
硬件测试从入门到实战:方法、工具与自动化测试全攻略

简介:这是一份硬件测试技术及方法的入门培训PPT,源自知名IT培训机构,由资深硬件测试工程师李睿讲师编写。内容定位于帮助刚进入测试岗位的工程师快速建立测试全局观,也适合研发、质量及管理人员了解硬件测试的价值与流程。全篇围绕… · 2026/9/23 13:20:40

MFC下拉框与列表控件联动实战:CComboBox驱动CListCtrl精准刷新
MFC下拉框与列表控件联动实战:CComboBox驱动CListCtrl精准刷新

简介:基于MFC对话框程序的一份可直接运行的示例工程,面向需要掌握CListCtrl与CComboBox联动操作的Windows桌面开发者,也适合C初学者入门控件事件处理。资源解决的是“通过下拉框选择来动态修改列表内容”这一典型交互需求,重点演示… · 2026/9/23 13:20:40

策略模式实战:消除if-else,实现可扩展的折扣系统
策略模式实战:消除if-else,实现可扩展的折扣系统

1. 策略模式到底解决了什么问题第一次接触策略模式是在做一个电商促销模块的时候。当时产品提了一个需求:商品要支持多种折扣方式,包括满减、打折、会员价、限时秒杀价,而且后续还会不断增加新的促销类型。我一开始的做法很简单,写… · 2026/9/23 13:20:34

鱼香鸡蛋源码解析:从语法到项目的3个关键步骤
鱼香鸡蛋源码解析:从语法到项目的3个关键步骤

鱼香鸡蛋源码解析:从语法到项目的3个关键步骤 学会语法却不知怎么搭项目,这是多数开发者卡在初级阶段的死结。你背熟了 for 循环和 if 判断,打开 IDE 却对着空白文件发呆。别急, 源码解析… · 2026/9/23 13:20:34

Android加密从Blowfish迁移到AES-GCM:安全选型与实战改造指南
Android加密从Blowfish迁移到AES-GCM:安全选型与实战改造指南

接手过一个老项目,里面对用户手机号做加密存储用的就是Blowfish,当时第一反应是“这玩意儿还活着呢?”查了一圈资料发现,Blowfish确实是加密算法界的“老前辈”,1993年由Bruce Schneier设计的对称分组密码,… · 2026/9/23 13:20:34

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码