- CLI
- 开发工具
- 云原生
【免费下载链接】kustomize
Customization of kubernetes YAML configurations
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: fifo,base 中设置order: legacy,最终输出按 overlay 的 fifo 顺序排列。 - 官方推荐方式:该字段是排序资源的官方认可方式,应取代已弃用的
--reorderCLI 标志使用。
配置优先级:kustomization 文件优先于 CLI 标志
在 api/krusty/kustomizer.go 的runTransformers相关逻辑中,排序策略的优先级被明确实现为三条分支:
- Case 1(kustomization 文件优先):如果 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.go:legacy、none、unspecified。
FIFO 排序:保持加载顺序
在fifo顺序下,kustomize不改变资源的顺序。资源按照它们在resources字段中被加载的顺序原样输出。
kind: Kustomization sortOptions: order: fifo从实现角度看,在 api/internal/builtins/SortOrderTransformer.go 的Transform方法中,只有legacy顺序会执行实际的排序逻辑;fifo顺序下排序逻辑被跳过,资源维持原顺序。测试用例 TestFIFOOrdering 验证了这一点:一组乱序资源在fifo配置下输出与输入完全一致。
参数校验:fifo 与 legacySortOptions 不能共存
如果你在fifo顺序下仍然设置了legacySortOptions,kustomize 会报错。这一点由 SortOrderTransformer.go 的validate方法保证,并在测试 TestInvalidLegacySortOptionsWithFIFOOrder 中验证,错误信息为:
the field 'sortOptions.legacySortOptions' is set but the selected sort order is 'fifo', not 'legacy'同理,如果设置了legacySortOptions却没有指定order,也会报错(见 TestInvalidLegacySortOptionsWithoutOrderKey):
the 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)先按 GVK(Group/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: legacy+legacySortOptions.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
- 开发工具
- 云原生
【免费下载链接】kustomize
Customization of kubernetes YAML configurations
相关推荐
Erduo Skills:为AI Agent赋能的终极技能库,一站式解决信息获取与内容处理难题
Erduo Skills:为AI Agent赋能的终极技能库,一站式解决信息获取与内容处理难题 Erduo Skills(耳朵技能库)是一个为AI Agent打
CLI开发工具云原生Kustomize `resources` 字段完全指南:声明资源文件、Kustomization 目录与远程引用
Kustomize resources 字段完全指南:声明资源文件、Kustomization 目录与远程引用 resources 是 Kustomizatio
CLI开发工具云原生使用 Checkov 扫描 Kustomize kustomization 的完整指南
使用 Checkov 扫描 Kustomize kustomization 的完整指南 Checkov 内置的 Kustomize 框架能够在构建阶段自动检测仓
应用安全静态分析供应链安全云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考