多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

kustomize sortOptions 字段完全指南:掌控 Kustomization 构建输出的资源排序

kustomize sortOptions 字段完全指南:掌控 Kustomization 构建输出的资源排序 CLI开发工具云原生【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址https://gitcode.com/gh_mirrors/ku/kustomize点击查看免费下载sortOptions是 kustomize v5.0.0 提供的 Kustomization 顶层字段用于控制kustomize build最终输出资源Resources的排列顺序。它取代了已弃用的--reorder命令行标志是官方认可的排序方式。读完本文你将掌握fifo与legacy两种排序策略的完整配置语法、优先级规则、内置默认顺序表以及如何在 base/overlay 场景中正确使用它。sortOptions 字段概述sortOptions字段用于对 kustomize 输出的资源进行排序位于kustomization.yaml的顶层。它在 api/types/kustomization.go 中被定义为Kustomization结构体的一个可选指针字段// SortOptions change the order that kustomize outputs resources. SortOptions *SortOptions json:sortOptions,omitempty yaml:sortOptions,omitempty对应的数据结构定义在 api/types/sortoptions.go 中// SortOptions defines the order that kustomize outputs resources. type SortOptions struct { // Order selects the ordering strategy. Order SortOrder json:order,omitempty yaml:order,omitempty // LegacySortOptions tweaks the sorting for the legacy sort ordering // strategy. LegacySortOptions *LegacySortOptions json:legacySortOptions,omitempty yaml:legacySortOptions,omitempty } // SortOrder defines different ordering strategies. type SortOrder string const LegacySortOrder SortOrder legacy const FIFOSortOrder SortOrder fifo // LegacySortOptions define various options for tweaking the legacy ordering // strategy. type LegacySortOptions struct { // OrderFirst selects the resource kinds to order first. OrderFirst []string json:orderFirst yaml:orderFirst // OrderLast selects the resource kinds to order last. OrderLast []string json:orderLast yaml:orderLast }基础语法如下kind: Kustomization sortOptions: order: legacy | fifo # legacy 是默认值目前支持两种排序策略legacy与fifo。使用注意事项IMPORTANT仅顶层 Kustomization 生效目前该字段只在顶层 Kustomization即kustomize build直接作用的那个目录中被尊重。位于构建链下游的 Kustomization例如通过resources字段引入的 base 中的sortOptions中的同名字段会被忽略。这一点由测试用例 TestChildKustomizationSortOrder 验证overlay 中设置order: fifobase 中设置order: legacy最终输出按 overlay 的 fifo 顺序排列。官方推荐方式该字段是排序资源的官方认可方式应取代已弃用的--reorderCLI 标志使用。配置优先级kustomization 文件优先于 CLI 标志在 api/krusty/kustomizer.go 的runTransformers相关逻辑中排序策略的优先级被明确实现为三条分支Case 1kustomization 文件优先如果 Kustomization 中设置了SortOptions则直接使用它构建builtins.SortOrderTransformerPlugin并执行Transform。若 CLI 同时传入了--reorder会打印警告Warning: Sorting order is set both in kustomization.yaml (sortOptions) and in a CLI flag (--reorder). Using the kustomization file over the CLI flag.Case 2回退到 CLI 或默认值如果文件中未设置sortOptions且--reorder为legacy或未指定则使用LegacySortOrder的默认排序。若--reorder为none且文件中未设置则不进行重排。--reorderCLI 标志在 kustomize/commands/build/build.go 中被标记为弃用err : cmd.Flags().MarkDeprecated(flagReorderOutputName, use the new sortOptions field in kustomization.yaml instead.)其合法值定义在 api/krusty/options.golegacy、none、unspecified。FIFO 排序保持加载顺序在fifo顺序下kustomize不改变资源的顺序。资源按照它们在resources字段中被加载的顺序原样输出。kind: Kustomization sortOptions: order: fifo从实现角度看在 api/internal/builtins/SortOrderTransformer.go 的Transform方法中只有legacy顺序会执行实际的排序逻辑fifo顺序下排序逻辑被跳过资源维持原顺序。测试用例 TestFIFOOrdering 验证了这一点一组乱序资源在fifo配置下输出与输入完全一致。参数校验fifo 与 legacySortOptions 不能共存如果你在fifo顺序下仍然设置了legacySortOptionskustomize 会报错。这一点由 SortOrderTransformer.go 的validate方法保证并在测试 TestInvalidLegacySortOptionsWithFIFOOrder 中验证错误信息为the field sortOptions.legacySortOptions is set but the selected sort order is fifo, not legacy同理如果设置了legacySortOptions却没有指定order也会报错见 TestInvalidLegacySortOptionsWithoutOrderKeythe field sortOptions.order must be one of [fifo, legacy]Legacy 排序基于优先级列表的确定性排序legacy排序是 kustomize 的默认顺序当sortOptions.order字段未指定时即使用该策略。legacy排序使用两张优先级列表orderFirst列表应最先出现在输出中的资源类型。orderLast列表应最后出现在输出中的资源类型。不在列表中的资源位于中间按它们的apiVersion和kind字段排序。核心实现原理在 api/internal/builtins/SortOrderTransformer.go 的newLegacyIDSorter中两张列表被换算为每个 Kind 的整数权重var typeOrders func() map[string]int { m : map[string]int{} for i, n : range options.OrderFirst { m[n] -len(options.OrderFirst) i } for i, n : range options.OrderLast { m[n] 1 i } return m }()orderFirst中的资源权重为负数-len(orderFirst) i因此必定排在最前且列表内部的先后顺序也被保留i 越大权重越大。orderLast中的资源权重为正数1 i因此必定排在最后同样保留列表内部顺序。未出现在任何列表中的 Kind 权重为 0落在中间区域。随后Less方法SortOrderTransformer.go先按 GVKGroup/Version/Kind比较权重权重相同时再通过legacyGVKSortString与legacyResIDSortString的字符串拼接做稳定排序缺失的 Group/Version/Kind 分别用~G/~V/~K占位缺失的 Namespace/Name 用~X/~N占位分隔符为_与|。排序完成后通过m.Clear()与m.Append(r)按新顺序重建资源映射。示例 1使用 orderFirst / orderLast 自定义顺序下面的配置让Namespace对象最先输出、Deployment对象最后输出kind: Kustomization sortOptions: order: legacy legacySortOptions: orderFirst: - Namespace orderLast: - Deployment该行为由测试 TestCustomOrdering 验证将ValidatingWebhookConfiguration放入orderFirst、Namespace与Deployment放入orderLast后输出顺序完全遵循自定义列表。示例 2默认 Legacy 排序如果指定legacy顺序但不提供任何列表参数kustomize 会回退到引入该功能之前一直使用的内置列表定义在 SortOrderTransformer.go注释明确标注 DO NOT CHANGE!即不得修改。由于legacy本身就是默认顺序以下两种配置完全等价kind: Kustomization sortOptions: order: legacy等价于kind: Kustomization sortOptions: order: legacy legacySortOptions: orderFirst: - Namespace - ResourceQuota - StorageClass - CustomResourceDefinition - ServiceAccount - PodSecurityPolicy - Role - ClusterRole - RoleBinding - ClusterRoleBinding - ConfigMap - Secret - Endpoints - Service - LimitRange - PriorityClass - PersistentVolume - PersistentVolumeClaim - Deployment - StatefulSet - CronJob - PodDisruptionBudget orderLast: - MutatingWebhookConfiguration - ValidatingWebhookConfiguration内置默认顺序的逻辑依据在 SortOrderTransformer.go 的注释中有说明默认顺序基于 GVK 结构体的排列——把无依赖的集群级基础资源如 Namespace、StorageClass 等放在前面把依赖数量较多的资源如 ValidatingWebhookConfiguration放在最后。源码注释同时坦承并引用 kubernetes-sigs/kustomize 的 issue #3913这最初是尝试按资源应用顺序输出但由于并非所有类型都能预先知晓这一目标后来被证明不可行因此该列表仅作为向后兼容的固定顺序保留。这一默认行为由测试 TestDefaultLegacyOrdering 与 TestKustomizationSortOrderNotSet 验证即使完全不设置sortOptions或--reorder输出也会按默认 legacy 顺序排列。实战建议与完整验证结合 api/krusty/sortordertransformer_test.go 中的测试矩阵可以总结出以下实战要点场景配置方式结果保持资源原始加载顺序sortOptions.order: fifo输出与输入顺序一致使用 kustomize 默认排序不设置sortOptions或order: legacy按内置 orderFirst/orderLast 默认表排序自定义优先/置后类型order: legacylegacySortOptions.orderFirst/orderLast按自定义列表排序未列出的类型按 apiVersion/kind 排在中间overlay 与 base 都设置了 sortOptions顶层overlay生效子 Kustomization 中的设置被忽略TestChildKustomizationSortOrder文件与 CLI 同时设置文件中设置 --reorder文件优先并输出弃用警告TestCLIAndKustomizationSet此外需注意SortOrderTransformer目前不能通过transformers字段以独立 transformer 配置的方式加载——测试 TestSortOrderGivenAsTransformer 验证了这样做会报错unable to load builtin SortOrderTransformer.builtin.[noGrp]。它只能通过 Kustomization 顶层的sortOptions字段启用。如果需要查看该功能的完整参考实现可依次阅读字段定义api/types/sortoptions.go结构体接入api/types/kustomization.go排序算法与默认列表api/internal/builtins/SortOrderTransformer.go构建管线接线与优先级逻辑api/krusty/kustomizer.go行为验证测试api/krusty/sortordertransformer_test.go弃用的 CLI 标志kustomize/commands/build/build.go赞分享CLI开发工具云原生【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址https://gitcode.com/gh_mirrors/ku/kustomize点击查看免费下载相关推荐Erduo Skills为AI Agent赋能的终极技能库一站式解决信息获取与内容处理难题Erduo Skills为AI Agent赋能的终极技能库一站式解决信息获取与内容处理难题 Erduo Skills耳朵技能库是一个为AI Agent打CLI开发工具云原生Kustomize resources 字段完全指南声明资源文件、Kustomization 目录与远程引用Kustomize resources 字段完全指南声明资源文件、Kustomization 目录与远程引用 resources 是 KustomizatioCLI开发工具云原生使用 Checkov 扫描 Kustomize kustomization 的完整指南使用 Checkov 扫描 Kustomize kustomization 的完整指南 Checkov 内置的 Kustomize 框架能够在构建阶段自动检测仓应用安全静态分析供应链安全云原生上一篇Barba.js 页面切换性能优化终极指南7个关键指标与最佳实践下一篇如何将VNote笔记转化为Anki记忆卡片完整导出与使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表