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

使用 kyaml 实现 Kubernetes 配置校验函数:kustomize 的 validator-resource-requests 实战指南

发布时间:2026/9/23 13:27:03 来源:云帆数科 栏目:资讯中心
使用 kyaml 实现 Kubernetes 配置校验函数:kustomize 的 validator-resource-requests 实战指南
使用 kyaml 实现 Kubernetes 配置校验函数kustomize 的 validator-resource-requests 实战指南【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址: https://gitcode.com/gh_mirrors/ku/kustomize导读本文基于 kustomize 仓库中的 validator-resource-requests 示例完整讲解如何用 Go 语言基于kyaml库实现一个 Kubernetes 配置校验函数validation function它读取一批资源清单检查其中每个容器的resources.requests.cpu与resources.requests.memory是否缺失缺失即返回非零退出码。读完本文你将掌握kustomize fn run的调用机制、config.kubernetes.io/function注解的写法、kyaml的kio.Pipeline与yaml.RNode编程模型并能举一反三实现自己的校验类 KRM 函数。示例整体结构本示例位于 functions/examples/validator-resource-requests目录结构如下validator-resource-requests/ ├── README.md # 示例说明文档 ├── Makefile # make image 构建并推送函数镜像 ├── image/ # 函数镜像构建目录 │ ├── Dockerfile # 多阶段构建镜像 │ ├── Makefile # lint/test/build 等开发辅助 │ ├── go.mod # 依赖 kyaml 的 Go 模块 │ ├── go.sum │ └── main.go # 校验函数核心实现 └── local-resource/ # 被校验的本地资源目录 └── example-use.yaml # 声明函数注解 待校验资源其中 image/main.go 是校验逻辑的实现local-resource/example-use.yaml 是可直接运行的输入样例。示例的go.mod仅声明对sigs.k8s.io/kustomize/kyaml v0.13.7的依赖说明这个校验函数不依赖完整的 kustomize 核心只复用 kyaml 这一层 YAML 处理与函数运行时能力。函数实现一个基于 kyaml 的 Go 程序文档明确指出这个示例用 Go 编写并使用kyaml库来解析输入、写出输出但用 Go 编写并非硬性要求——KRM 函数本身通过标准输入/输出与容器运行时交互任何能读写 stdin/stdout 的语言都可以实现同样的函数。程序入口kio.Pipeline 三件套在 image/main.go 中main函数搭建了一个标准的 kyaml 数据流func main() { rw : kio.ByteReadWriter{Reader: os.Stdin, Writer: os.Stdout, KeepReaderAnnotations: true} p : kio.Pipeline{ Inputs: []kio.Reader{rw}, // read the inputs into a slice Filters: []kio.Filter{filter{}}, // run the filter against the inputs Outputs: []kio.Writer{rw}, // copy the inputs to the output } if err : p.Execute(); err ! nil { fmt.Fprintf(os.Stderr, %v\n, err) os.Exit(1) } }kio.ByteReadWriter同时充当kio.Reader与kio.Writer从os.Stdin读取资源、向os.Stdout写出结果kio.Pipeline按输入 → 过滤 → 输出三段式串起整个处理链kio.Filter是函数逻辑的挂载点KeepReaderAnnotations: true保留读取注解如来源路径、序号注解便于在错误信息中定位具体资源一旦校验失败错误写入os.Stderr并以os.Exit(1)结束进程——这正是文档所述出错时进程以非零退出的实现来源。校验过滤器实现 kio.Filter 接口filter结构体实现了 kio.Filter 接口func (filter) Filter(in []*yaml.RNode) ([]*yaml.RNode, error) { // validate each Resource for _, r : range in { if err : validate(r); err ! nil { return nil, err } } return in, nil }接口签名Filter(in []*yaml.RNode) ([]*yaml.RNode, error)是 kyaml 过滤器filter的通用约定输入一批*yaml.RNode要么原样返回并附带error要么修改后返回。校验函数属于只读校验型过滤器因此原样返回in仅通过错误来中断执行。校验逻辑yaml.Lookup 路径查询validate函数image/main.go体现了 kyaml 的核心编程模型——用yaml.Lookup做路径化字段查询读取元数据r.GetMeta()获取资源的Kind、Name以及注解含kioutil.PathAnnotation与kioutil.IndexAnnotation用于生成带定位信息的错误消息定位容器列表r.Pipe(yaml.Lookup(spec, template, spec, containers))只对 Deployment 这类带spec.template.spec.containers的资源生效若该路径不存在containers nil说明该资源不含容器直接跳过——这是保证校验器能宽容处理非工作负载资源的关键设计遍历容器containers.VisitElements对列表每个元素执行回调逐项检查对每个容器执行node.Pipe(yaml.Lookup(resources, requests, cpu))与node.Pipe(yaml.Lookup(resources, requests, memory))任一字段为空即返回对应错误。错误消息示例源码中实际格式化字符串cpu-requests missing for a container in Deployment nginx (deployment.yaml [0]) memory-requests missing for a container in Deployment nginx (deployment.yaml [0])其中[0]来自kioutil.IndexAnnotation列表内序号括号内的路径来自kioutil.PathAnnotation二者组合能精确定位哪个文件的哪个资源。yaml.Lookup与Pipe的具体实现在 kyaml/yamlkio.Pipeline与kio.ByteReadWriter位于 kyaml/kio可进一步深入阅读。构建函数镜像Dockerfile 与 make image文档说明函数以镜像形式实现通过make image构建。顶层 Makefile 中image: docker build image -t gcr.io/kustomize-functions/example-validator:v0.1.0 docker push gcr.io/kustomize-functions/example-validator:v0.1.0即在image/目录构建 Docker 镜像并推送到镜像仓库镜像名gcr.io/kustomize-functions/example-validator:v0.1.0与示例 YAML 中注解声明的镜像完全对应。image/Dockerfile 采用标准多阶段构建FROM public.ecr.aws/docker/library/golang:1.26.5 ENV CGO_ENABLED0 WORKDIR /go/src/ COPY go.mod . COPY go.sum . RUN go mod download COPY main.go . RUN go build -v -o /usr/local/bin/config-function ./ FROM alpine:latest COPY --from0 /usr/local/bin/config-function /usr/local/bin/config-function CMD [config-function]第一阶段在golang:1.26.5中编译出静态二进制CGO_ENABLED0便于在精简镜像中运行第二阶段仅基于alpine复制二进制最终镜像体积小、无多余构建依赖CMD [config-function]表明容器启动即运行函数等待 stdin 输入。本地开发时也可不构建镜像直接通过 image/Makefile 与 Makefile-examples-base.mk 中的go build、go test、go vet、go fmt、golangci-lint等目标完成编译与质量检查。函数调用config.kubernetes.io/function 注解与 kustomize fn run文档给出的调用方式是编写一个带metadata.annotations.[config.kubernetes.io/function]注解的本地资源然后执行kustomize fn run local-resource/注解如何声明函数打开 local-resource/example-use.yaml第一段即函数声明资源apiVersion: examples.config.kubernetes.io/v1beta1 kind: Validator metadata: annotations: config.kubernetes.io/function: | container: image: gcr.io/kustomize-functions/example-validator:v0.1.0 --- apiVersion: apps/v1 # this should fail validation kind: Deployment metadata: name: nginx labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx # uncomment these to pass validation # resources: # requests: # cpu: 100m # memory: 300MiB关键点函数声明本身也是一个标准 KRM 资源apiVersionkind任意取值真正起作用的是config.kubernetes.io/function注解——其值声明运行函数的container.image多个 YAML 文档以---分隔fn run会一次性把目录内所有资源喂给函数kustomize fn run在 kyaml/runfn/runfn.go 中实现RunFns.Execute负责读取输入、从注解中解析出函数容器/可执行文件形式把资源集合送入函数进程的 stdin再读取 stdout 作为结果kyaml/runfn/runfn.go#L106-L123 起为相关调用链容器型函数的运行基于 kyaml/fn/runtime/runtimeutil/functiontypes.go 中定义的FunctionSpec等类型——注解中的container.image正是其中container字段的序列化形式函数进程的退出码即整个fn run的结果非零表示校验失败零表示通过。运行示例从失败到通过按照文档的步骤完整复现第 1 步直接运行当前 Deployment 未声明资源请求kustomize fn run local-resource/输出错误cpu-requests missing for container nginxkustomize fn run因为函数返回非零而报错退出。第 2 步解除资源声明后再次运行编辑 local-resource/example-use.yaml把被注释掉的resources段取消注释使 Deployment 变为spec: containers: - name: nginx image: nginx resources: requests: cpu: 100m memory: 300MiB再次运行kustomize fn run local-resource/此时校验通过无输出、退出码为 0表示函数执行成功。注示例注释中memory: 300MiB的MiB写法仅为演示占位实际 Kubernetes 资源量语法中 memory 通常写作300Mi校验函数只检查字段是否存在不负责值格式的合法性。与同仓库其他校验示例的对照kustomize 仓库还提供另一份校验函数示例 validator-kubeval它把输入逐个交给 kubeval 做 schema 校验且支持通过函数spec配置参数参数结构定义见其 image/main.go 中的 API 结构体。两个示例共享同一套调用范式——注解声明镜像 kustomize fn run 非零退出码表示失败——区别仅在于校验逻辑本示例是手写路径查询的规则校验kubeval 示例是基于 OpenAPI schema 的外部工具集成。对照阅读两份示例可以清晰看到 KRM 函数输入输出协议固定、业务逻辑自由的设计思想。小结实现一个校验函数的四步模板基于本示例实现自定义校验函数的固定套路可以总结为写一个读写 stdin/stdout 的程序用kio.ByteReadWriterkio.Pipeline搭建输入输出骨架核心逻辑实现为kio.Filter用yaml.Lookup按路径检查目标字段不匹配的资源直接忽略匹配但字段缺失时返回带Kind、Name、来源路径与序号定位的错误打成镜像多阶段 Dockerfile 构建静态二进制make image完成 build push用注解驱动运行在资源目录中写入config.kubernetes.io/function注解声明镜像执行kustomize fn run dir/完成校验以退出码判定结果。本文涉及的全部文件均可直接查看示例说明、函数实现、输入样例、构建脚本、运行框架 与 kyaml 核心库。【免费下载链接】kustomizeCustomization of kubernetes YAML configurations项目地址: https://gitcode.com/gh_mirrors/ku/kustomize创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

okbiye 助力毕业论文写作,解决应届生五大毕设痛点
okbiye 助力毕业论文写作,解决应届生五大毕设痛点

2026 毕业季,不少应届生在推进毕业论文的过程中,会遇到各式各样的难题。从选题方向难以确定,到文献研读效率低下;从论文撰写、图表制作耗时,到格式调整、论文风险自查,再到答辩材料准备,每一个环… · 2026/9/23 13:26:57

iOS签名证书迁移与团队协作最佳实践
iOS签名证书迁移与团队协作最佳实践

1. 问题背景与核心痛点每次换电脑都要重新搞iOS证书?团队协作时签名文件总对不上?这个问题困扰过几乎所有iOS开发者。Xcode的自动签名管理虽然方便,但当需要迁移开发环境或多人协作时,证书和描述文件的同步问题就会集中爆发。我经… · 2026/9/23 13:26:57

okbiye 五大核心功能解析,一站式搞定你的毕设
okbiye 五大核心功能解析,一站式搞定你的毕设

2026 年,AI 论文工具已经成为应届生做毕设的标配,但市面上 AI 论文工具五花八门,有的功能零散,有的只能单独做降重,有的缺少文献能力,还有的做不了学术图表。很多同学需要同时打开多个软件来回切换&#xf… · 2026/9/23 13:26:57

雾感知ViT:物理建模驱动的图像去雾编码器设计
雾感知ViT:物理建模驱动的图像去雾编码器设计

简介:本资源是一套基于Vision Transformer架构的图像去雾算法完整实现方案,面向计算机视觉方向的研究者、深度学习初学者及图像处理工程实践者,解决雾霾天气下图像对比度低、细节模糊等实际问题。压缩包共340个文件,涵盖204个Pyth… · 2026/9/23 14:52:24

FP-growth算法实战:Python购物篮分析、FP树可视化与避坑指南
FP-growth算法实战:Python购物篮分析、FP树可视化与避坑指南

简介:这份资源面向数据挖掘与机器学习初学者及需要落地关联规则分析的开发者,围绕FP-growth频繁模式增长算法提供Python实现与FP树可视化工具,可用于购物篮分析、频繁项集挖掘与大型数据库中的频繁模式发现。压缩包共11个文件、约480KB&#… · 2026/9/23 14:52:24

基于以太坊的电子合同DAPP:完整生命周期实现
基于以太坊的电子合同DAPP:完整生命周期实现

简介:本资源是一个基于区块链DApp的电子合同签署系统完整实现,面向区块链初学者、课程设计学生及毕业设计开发者,解决传统电子合同可信存证与多方协同签署难题。项目采用Truffle框架开发,集成Solidity智能合约、前端HTML/JS交互界… · 2026/9/23 14:52:24

重新模糊增强:隐式扩散模型Python实现与避坑指南
重新模糊增强:隐式扩散模型Python实现与避坑指南

简介:本资源面向计算机相关专业的毕业设计、期末大作业与课程实训场景,提供一套基于隐式扩散的重新模糊增强方法完整Python实现,帮助学习者理解扩散模型在图像去模糊与质量增强中的落地方式。压缩包共96个文件、约60.2MB,以59个Py… · 2026/9/23 14:52:24

智能停车场管理系统开发实战:SpringBoot+微信小程序
智能停车场管理系统开发实战:SpringBoot+微信小程序

1. 项目概述这个智能停车场管理系统是我去年带队开发的一个实际项目,已经在三个商业停车场落地运行。传统停车场最大的痛点就是信息不透明——你永远不知道里面还有没有车位,经常要兜好几圈才能找到位置。我们通过微信小程序SpringBoot的技术方案&#x… · 2026/9/23 14:52:17

Gel/EdgeDB `gel database create` 命令详解:创建数据库及向 `gel branch create` 的迁移指南
Gel/EdgeDB `gel database create` 命令详解:创建数据库及向 `gel branch create` 的迁移指南

数据库图数据库关系型数据库 【免费下载链接】edgedb Gel supercharges Postgres with a modern data model, graph queries, Auth & AI solutions, and much more. 项目地址: https://gitcode.com/gh_mirrors/ed/edgedb 点击查看 免费下载 gel database creat… · 2026/9/23 14:52:11

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

了解更多?预约专属演示

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

企业微信二维码