ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

使用 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),仅供参考
返回列表