CLI开发工具云原生【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址https://gitcode.com/gh_mirrors/ku/kustomize点击查看免费下载导读Kustomize 的generatorOptions字段允许你全局调整configMapGenerator与secretGenerator的生成行为——包括是否禁用名称后的内容哈希后缀、是否批量注入 labels 与 annotations以及设置immutable属性。本文以仓库中的 generatorOptions.md 演示为主线结合 kustomize 源码与测试用例为你拆解每个选项的底层实现、合并优先级规则和实战验证方法。1. 什么是 Generator Options在 kustomize 的声明式配置体系中configMapGenerator与secretGenerator负责把literals、files、envs等键值对来源转译为 Kubernetes 的 ConfigMap 与 Secret 对象。默认情况下kustomize 会在生成资源的名称后面追加一个基于资源内容计算的哈希后缀例如my-configmap-bh645k7tmg并支持为生成资源统一附加 labels 与 annotations。generatorOptions正是用来修改这些默认行为的一组全局选项它定义在 api/types/generatoroptions.go字段包括字段类型说明disableNameSuffixHashbool设为true时禁用默认的在生成资源名称后追加内容哈希后缀行为labelsmap[string]string为所有生成资源添加的标签annotationsmap[string]string为所有生成资源添加的注解immutablebool设为true时为所有生成资源设置immutable: true与 kustomization 中其他配置一样这些选项对kustomize build输出的最终资源生效并且遵循全局选项 局部覆盖的合并模型详见第 5 节。2. 官方示例从零体验 generatorOptions仓库中的演示文档 examples/zh/generatorOptions.md英文原版见 examples/generatorOptions.md给出了一个完整可运行的示例。我们将其整理为可直接复制的脚本说明如何创建 kustomization、配置生成器选项并逐一验证效果。2.1 创建工作空间DEMO_HOME$(mktemp -d)2.2 创建带 ConfigMapGenerator 的 kustomizationcat $DEMO_HOME/kustomization.yaml EOF configMapGenerator: - name: my-configmap literals: - foobar - bazqux EOF这里configMapGenerator声明了一个名为my-configmap的 ConfigMap数据来自两条literalsfoobar与bazqux。2.3 添加 generatorOptionscat $DEMO_HOME/kustomization.yaml EOF generatorOptions: disableNameSuffixHash: true labels: kustomize.generated.resource: somevalue annotations: annotations.only.for.generated: othervalue EOF三个选项分别对应本文要讲解的三类行为不追加哈希后缀、添加 label、添加 annotation。2.4 运行 build 并验证结果运行kustomize build生成最终资源然后用三组断言逐一验证验证一名称没有哈希后缀test 1 \ $(kustomize build $DEMO_HOME | grep name: my-configmap$ | wc -l); \ echo $?如果没有配置disableNameSuffixHash: true生成的名称通常是my-configmap-hash形式例如my-configmap-bh645k7tmggrep name: my-configmap$将匹配不到任何行而禁用后缀后名称恰好为my-configmap因此匹配行数为 1test命令成功。验证二labelkustomize.generated.resource: somevalue存在test 1 \ $(kustomize build $DEMO_HOME | grep -A 1 labels | grep kustomize.generated.resource | wc -l); \ echo $?验证三annotationannotations.only.for.generated: othervalue存在test 1 \ $(kustomize build $DEMO_HOME | grep -A 1 annotations | grep annotations.only.for.generated | wc -l); \ echo $?最终生成的 ConfigMap 形态如下预期输出apiVersion: v1 data: baz: qux foo: bar kind: ConfigMap metadata: annotations: annotations.only.for.generated: othervalue labels: kustomize.generated.resource: somevalue name: my-configmap注意这三组验证脚本在文档中被标记为test/testAgainstLatestRelease是 kustomize 持续集成中实际运行的测试片段因此这套流程在不同版本的 kustomize 上都能复现。3. 选项一disableNameSuffixHash——控制内容哈希后缀3.1 为什么默认会有哈希后缀kustomize 对生成的 ConfigMap / Secret 默认启用名称哈希后缀目的是在资源内容发生变化时让资源名称随之变化从而强制触发 Deployment 等控制器的滚动更新。该机制从 Kubernetes 官方kubectl的 hash 工具移植而来实现在 api/hasher/hasher.go先对资源内容序列化后的字符串数组做排序与 JSON 序列化计算 SHA-256 摘要见hex256api/hasher/hasher.go取十六进制摘要的前 10 个字符再做一次字母化替换0→g、1→h、3→k、a→m、e→t得到最终后缀见encodeapi/hasher/hasher.go。这就是my-configmap-bh645k7tmg这类名称中后缀的来源。3.2 选项如何生效哈希后缀是否附加由生成资源的 factory 决定。在 api/resource/factory.go 的makeOne中if o.Options nil || !o.Options.DisableNameSuffixHash { resource.EnableHashSuffix() }也就是说只要没有显式声明disableNameSuffixHash: true生成资源就会被标记为需要哈希后缀。EnableHashSuffix/NeedHashSuffix的实现见 api/resource/resource.go它通过一个内部注解BuildAnnotationsGenAddHashSuffix标记该资源下游的HashTransformer见 api/internal/builtins/HashTransformer.go再据此为资源名称追加哈希。3.3 为什么需要禁用哈希后缀虽然能保证内容变更时名称变化但也带来两个常见问题名称稳定性需求某些场景如被其他资源按固定名称引用、或与外部系统约定名称要求 ConfigMap / Secret 名称恒定避免无谓的滚动更新如果每次构建仅因元数据差异导致哈希变化可能触发不必要的 Pod 重建。当disableNameSuffixHash: true时名称稳定为声明值内容变更不再通过改名来触发更新。需要留意的是此时若 ConfigMap 内容变化依赖它的 Deployment 不会自动感知需要自行处理版本控制或滚动更新策略。4. 选项二与三labels 与 annotations——为生成资源批量注入元数据generatorOptions.labels与generatorOptions.annotations会在生成 ConfigMap / Secret 的底层创建阶段被直接写入资源。生成器内部通过copyLabelsAndAnnotations实现见 api/internal/generators/utils.go遍历选项中的键值对调用yaml.SetLabel/yaml.SetAnnotation写入metadata.labels/metadata.annotations。该函数被MakeConfigMapapi/internal/generators/configmap.go与MakeSecretapi/internal/generators/secret.go同时调用因此这两个选项对 ConfigMap 和 Secret一视同仁。典型用途包括标记由 kustomize 生成的资源便于运维排查与清理如示例中的kustomize.generated.resource: somevalue注入审计、归属、成本归属等元数据为生成资源统一补充注解以对接外部工具链。5. 进阶选项四 immutable 与全局/局部合并规则5.1 immutable 选项除文档演示的三个选项外源码中还定义了第四个选项immutableapi/types/generatoroptions.go。当其为true时setImmutable会为生成资源写入immutable: true见 api/internal/generators/utils.go使 ConfigMap / Secret 不可变从 Kubernetes 侧禁止运行中修改进一步提升安全性。5.2 合并规则局部与全局、base 与 overlaygeneratorOptions是全局选项但同时允许在单个 generator 条目中通过options字段做局部覆盖。两者的合并逻辑在MergeGlobalOptionsIntoLocalapi/types/generatoroptions.go中实现规则如下labels / annotationsmap以局部local为准——局部已有的键不会被全局覆盖局部缺失的键才从全局补充overrideMap见 api/types/generatoroptions.godisableNameSuffixHash / immutablebool采用true 优先规则——只要全局为true即使局部显式写了false也无法覆盖反之全局为false时局部可以自行置true。源码注释解释得很直白对于布尔值无法区分有意的 false与默认的 false因此局部的 false 永远无法覆盖全局的 true。这些规则均有对应的单元测试验证api/types/generatoroptions_test.go 中的TestMergeGlobalOptionsIntoLocal以及 base/overlay 场景的集成测试api/krusty/generatoroptions_test.go 中的TestGeneratorOptionsWithBases与TestGeneratorOptionsOverlayDisableNameSuffixHash。其中TestGeneratorOptionsWithBases展示了一个非常典型的覆盖场景base 中声明disableNameSuffixHash: true并带 labelfoo: baroverlay 中声明disableNameSuffixHash: false并带 labelfruit: apple。最终结果里base 的 ConfigMap 名称没有哈希shouldNotHaveHash而 overlay 新声明的 ConfigMap 名称带哈希shouldHaveHash-c9867f8446并且两者的 label 互不影响——印证了全局 true 优先 map 键级合并的行为# base 中的生成结果 kind: ConfigMap metadata: labels: foo: bar name: shouldNotHaveHash --- # overlay 中的生成结果 kind: ConfigMap metadata: labels: fruit: apple name: shouldHaveHash-c9867f84466. 在 Secret 生成器上的应用由于generatorOptions同时作用于 ConfigMap 与 Secret 生成器你可以用同一份选项同时管理两类资源。例如generatorOptions: disableNameSuffixHash: true labels: kustomize.generated.resource: true secretGenerator: - name: app-secret literals: - PASSWORDxxxx生成结果中 Secret 的 metadata 同样携带 label且名称不带哈希。相关行为可参考 api/krusty/generatoroptions_test.go 中TestSecretGenerator的测试数据该用例默认保留了哈希后缀与disableNameSuffixHash的效果形成对照。7. 小结与最佳实践围绕generatorOptions可以沉淀出以下实践要点按需禁用哈希后缀只有当资源名称必须稳定时才设置disableNameSuffixHash: true同时要为内容变更设计替代的更新触发机制善用 labels / annotations 标记生成资源配合kubectl get cm -l kustomize.generated.resourcesomevalue等命令可以快速筛选出由 kustomize 生成的资源理解布尔合并规则在 base/overlay 或多层 kustomization 场景下局部 false 无法覆盖全局 true是容易踩坑的点务必通过kustomize build实际验证输出用测试片段做回归验证仓库中的示例验证脚本grep test 断言可直接移植到 CI 中确保生成结果符合预期保持配置最小化优先在 overlay 中声明与覆盖选项避免在 base 中写入过强的全局约束。完整的可运行示例位于 examples/zh/generatorOptions.md 与 examples/generatorOptions.md选项类型的完整定义可查阅 api/types/generatoroptions.go生成器实现与测试分别位于 api/internal/generators/utils.go、api/krusty/generatoroptions_test.go 与 api/types/generatoroptions_test.go供你在实际项目中按需深入。赞分享CLI开发工具云原生【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址https://gitcode.com/gh_mirrors/ku/kustomize点击查看免费下载相关推荐Kustomize 标签与注解完整指南commonLabels、labels 与 includeSelectors 正确用法Kustomize 标签与注解完整指南commonLabels、labels 与 includeSelectors 正确用法 Kustomize 是 KubeCLI开发工具云原生Faker::University 数据生成器完全指南高校名称、前缀后缀与希腊字母组织的源码级解析Faker::University 数据生成器完全指南高校名称、前缀后缀与希腊字母组织的源码级解析 Faker::University 是 faker 库A测试开发工具External Secrets Operator 生成器Generator完全指南通过 DataFrom 与 ClusterGenerator 动态生成 Kubernetes Secret 值External Secrets Operator 生成器Generator完全指南通过 DataFrom 与 ClusterGenerator 动态生成云原生运维上一篇Fleet 条件访问Conditional Access基于策略状态控制 macOS 与 Windows 主机登录准入的实现解析下一篇TaskScheduler 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
ps字体免费下载入门到精通 3步搞定PS字体下载卡壳问题 手写脚本实现自动配置 刚接手项目,想给设计稿换个高级字体,结果PS打开就卡半天。下载字体文件解压安装,重启软件还是显示“未找到字体”,系统属性里字体文件夹里明明有文件。这种配置环境就卡半天的情况,90%的新手都… · 2026/9/23 11:21:30
hister:用时间线低成本记录操作历史,让复盘不再靠猜 1. 为什么会有 hister:一次“改完就忘”给我的教训1.1 复盘时最痛苦的不是不会写,而是想不起当时发生了什么hister 是我给自己写的一个小工具,名字读起来像 history 和 er 的合体,说白了就是“帮你记录历史的人”。最早有这个念头… · 2026/9/23 11:21:30
从手机刷机到机器狗开发:开放生态的技术演进与挑战 1. 从刷机到机器狗:商业模式相似性背后的本质差异十年前给安卓手机刷第三方ROM的风潮,和今天小米机器狗开放SDK给开发者编程,表面看都是"硬件开放生态"的玩法。但当年我们熬夜刷MIUI是为了获得更好的手机体验,而现在给机… · 2026/9/23 11:21:23
仓储机器人源码解析:3步搞定路径规划,别再死磕语法 仓储机器人源码解析:3步搞定路径规划,别再死磕语法 你是不是也这样:啃完了Python或Go的语法书,API文档也背得滚瓜烂熟,结果一动手做仓储机器人项目,脑子直接死机。看着那些传感器数据、电机驱动、SLAM建图,完全不知道从哪下手。其实问… · 2026/9/23 12:01:29
量子态是什么?从叠加态到退相干的完整入门指南 量子态这三个字,可能是量子物理里被滥用得最厉害、又最容易被误解的概念。我当年刚接触量子力学时,课本上写着"量子态是系统状态的完备描述",我盯着这句话半天没缓过来:这不就是"状态"换个马甲吗?… · 2026/9/23 12:01:22
黄金太阳1攻略:一文搞懂版本升级后API全变了的底层逻辑 黄金太阳1攻略:一文搞懂版本升级后API全变了的底层逻辑 版本升级后 API 全变了,是不是让你瞬间崩溃?别慌,这其实是很多开发者在接手旧项目或升级框架时最常见的噩梦。 今天这篇 黄金太阳1攻略 ,不聊虚的,直接带你钻进代码底层。我们要… · 2026/9/23 12:01:16
U盘设计代码深度解析:从USB协议栈到FTL磨损均衡的工程实践 简介:这份资源是一套U盘固件开发的部分源代码,面向嵌入式系统、USB协议与存储设备方向的开发者及学习者,适合作为理解U盘底层工作原理的参考素材。代码尚不完善,处于早期开发阶段,作者希望专业人士提供优化建议&#x… · 2026/9/23 12:01:16
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29