当前位置: 首页 > 科技观察

kustomize简明教程

时间:2023-03-15 08:17:44 科技观察

上一篇我们了解了kubebuilder的基本用法,通过kubebuilder实现了一个简单的operator并开始运行。整个程序虽然在运行,但是还是有一些疑点。除了上篇提到??的controller-gen,makefile中还有kustomize等大量命令。kustomize是什么,有什么用,怎么用?今天就来一起学习一下吧。在后续的文章中,我们也会使用一些kustomize的特性来部署不同的环境。介绍kustomize是一个通过kustomization文件自定义kubernetes对象的工具。它可以通过一些资源生成一些新的资源,也可以自定义不同资源的集合。一个典型的场景是我们有一个应用程序。在生产环境和测试环境等不同环境中,其yaml配置大部分是相同的,只有少数字段不同。这时候我们可以使用kustomize来解决。kustomize也比较适合gitops工作流。bespokeconfigworkflowimage如上图所示,有一个ldap应用,/base目录存放基础配置,不同环境的配置放在/overlays,比如/dev,/staging,/prod这些是不同环境的配置,/base等文件夹都有一个kustomization.yml文件进行配置。执行kustomizebuilddir生成我们最终用于部署的yaml文件,也就是我们已经到了上图中的第四步,接下来通过kubectlapply-f命令进行部署。安装使用kubebuilder我们不需要额外安装,因为在执行相关make命令时,会自动下载可执行文件到bin/目录下。如果本地有go环境,可以执行如下命令安装GOBIN=$(pwd)/GO111MODULE=ongogetsigs.k8s.io/kustomize/kustomize/v3另外,也可以使用对应运行的包管理器系统安装,例如mac可以使用brew来安装除了直接使用kustomize命令外,从v1.14开始也安装了kubernetes可以使用kubectlkustomize执行kustomizelayout├──base│├──deployment.yaml│├──kustomization.yaml│└──service.yaml└──叠加层├──dev│├──kustomization.yaml│└──patch.yaml├──prod│├──kustomization.yaml│└──patch.yaml└──staging├──kustomization.yaml└──patch.yaml常见项目kustomize项目布局如上图,可以看到每个环境文件夹下都有一个kustomization.yaml文件,其中类似于一个配置文件,指定了源文件和一些对应的转换文件,比如patch等kustomization.yml一个常见的kustomization.yml如下如图所示,一般包含两个固定字段,apiVsersion和kind。此外,您还可以自定义插件。下面将简要列出各个字段的含义。当我们需要使用它的时候,我们知道我们有这样的能力,然后去Kustomize官方文档找到对应的API文档。资源指示k8s资源的位置。这可以是文件或指向文件夹。阅读时,将按顺序阅读。该路径可以是相对路径或绝对路径。如果是相对路径,就是相对于kustomization。yml的路径crds和resources类似,只不过crds是我们自定义的资源命名空间。为所有资源添加命名空间镜像,修改镜像的名称、标签或镜像摘要,无需使用patchesreplicas修改资源副本数。namePrefix是所有资源和引用的名称添加前缀nameSuffix为所有资源和引用的名称添加后缀可解析为kubernetes对象和JSON补丁。patchesStrategicMerge使用战略合并补丁标准补丁资源。vars类似于指定变量commonAnnotations为所有资源添加注解如果对应的key已经有值,这个值会被覆盖allresources注意:这个操作会有危险secretGenerator是用来生成secret资源的generatorOptions是用来控制configMapGenerator和secretGenerator行为的总结看到Kustomize,我的第一反应是这个东西和helm有什么区别。Kustomize没有模板语法,只需要一条二进制命令就可以生成对应的yaml文件,非常轻量级,而helm支持GoTemplate,组件较多,通过chart包发布helm比较重量级。个人认为Kustomize更适合gitops,helm更适合应用包的分发。参考文献[^1]:Kustomize官方文档https://kubectl.docs.kubernetes.io/zh/guides/[^2]:使用Kustomize以声明方式管理Kubernetes对象https://kubernetes.io/zh/docs/tasks/管理-kubernetes-对象/kustomization/