当前位置:网站首页>Kubernetes资源编排系列之三: Kustomize篇 作者 艄公(杨京华) 雪尧(郭耀星)
Kubernetes资源编排系列之三: Kustomize篇 作者 艄公(杨京华) 雪尧(郭耀星)
2022-08-03 19:57:00 【阿里云大数据AI技术】
作者 艄公(杨京华) 雪尧(郭耀星)
这是我们的《Kubernetes资源编排系列》的第三篇——Kustomize篇,在上篇(《Kubernetes资源编排系列之二: Helm篇》,可从文末链接直达)我们见识到了Helm强大的管理能力,但是Helm对于服务的定制仅限于预置变量,那么如果需要更多更灵活的的YAML定制,有什么办法吗?于是本篇我们来介绍一下Kustomize。
Kustomize是什么
Kustomize是一套采用合并思想,对Kubernetes原生配置进行管理的工具,使用无模板的方案定义应用配置。允许用户使用一系列的描述文件为基础,然后通过overlay的方式生成最终部署应用所需的描述文件。
Kustomize通过Base&Overlays方式维护不同环境的应用配置,在Overlay中描述差异来实现资源复用,管理的是Kubernetes原生YAML文件,不需要学习额外的 DSL 语法。
Kustomize是怎么做的
Kustomize的文件结构如下:
app├── base│ ├── deployment.yaml│ ├── service.yaml│ └── kustomization.yaml└── overlays ├── production │ └── kustomization.yaml ├── staging │ └── kustomization.yaml └── production-large └── kustomization.yaml
app/base/kustomization.yaml声明资源及要应用于它们的一些自定义,如添加一个通用的标签,其内容如下。kustomization 还提供了namePrefix、commonAnnoations、images 等配置项。
commonLabels: name: appresources:- deployment.yaml- service.yaml
可以通过 kustomize build 命令来看完整的配置,build出来的每个资源对象上都会存在通用的标签name: app。
kustomize build app/base # 构建kustomize build app/base | kubectl apply -f - # 构建并部署kubectl apply -k app/base # 1.14及更新的版本可以使用该命令直接部署
app/overlays/staging/kustomization.yaml中可以为演示环境定义不同的名称前辍、标签,通过patch的方案将副本数设置为1
bases:- ../../basecommonLabels: env: stagingnamePrefix: staging-patches: - target: kind: Deployment name: app patch: | [ {"op":"replace","path":"/spec/replicas","value":1} ]app/overlays/production/kustomization.yaml中可以为生产环境定义不同的名称前辍、标签,通过patch的方案将副本数设置为2
bases:- ../../basecommonLabels: env: productionnamePrefix: production-patches: - target: kind: Deployment name: app patch: | [ {"op":"replace","path":"/spec/replicas","value":2} ]app/overlays/production-large/kustomization.yaml中可以继承生产环境的定义,同时将副本数设置为10支撑大规模场景需求。
bases:- ../productionpatches: - target: kind: Deployment name: app patch: | [ {"op":"replace","path":"/spec/replicas","value":10} ]通过不同的部署路径,指定不同的环境部署
kustomize build app/overlays/production | kubectl apply -f -kustomize build app/overlays/staging | kubectl apply -f -kustomize build app/overlays/production-large | kubectl apply -f -
通过上面的例子我们可以看出,通过kustomization.yaml来声明继承和patch,可以为各种场景构造不同的YAML输出,同时保持底座YAML不变化。
Kustomize的特点
Kustomize 的 Overlay 可以在 Base 的基础上,通过对 resource / generator / transformer 等的定义,形成新的应用定义,不管是 Base 还是 Overlay,都可以通过 kustomize build 生成有效的 YAML。
- 功能简单清晰,kubectl 直接内部支持
- 不考虑派生,仅仅作为组件的 YAML组织方式也很有帮助
- 也有自己的插件系统,例如可以用简单的 YAML 定义,使用文件生成 ConfigMap / Secret 等
- 允许注入 K8S 运行时数据
Kustomize和Helm的对比
Kustomize 相对于 Helm 而言,更加的轻量,只有一个 CLI 工具。也集成到了 kubectl 自身,使用及配置成本接近于 0。Kustomize 放弃了对模板的要求,改为参考 Docker 镜像的形式,通过 Base + Overlay 的方式对应用的原始 YAML 进行派生。
- Base YAML 管控:Helm 最大的特点是定制仅限于预先存在的配置选项。不仅如此,Chart 作者还必须用有点麻烦的模板化方式实现这些定制选项。这个时候 Kustomize 不受限制的 Overlay 会更加灵活,想怎么覆盖就怎么覆盖。所以 Helm 对 Base YAML 强管控;而Kustomize 虽然也有 Base,但 Overlay 的存在让这个限制几乎不存在。
- 模板语法层面:Kustomize 相较于 Helm 去掉了模板语法,入门门槛更低,更易使用。当然如果玩的高阶,两者都要学习很多东西。
- 部署层面:虽然 Kustomize 最为轻量,但因为 Helm3 取消了 Tiller 依赖,所以差别也不是很大,两者都是二进制命令工具生成YAML后直接下发。
- 工作流程上:
- Helm: 定义 Chart -> 填充 -> 运行。在 Chart 中没有定义的内容是无法更改的
- Kustomize: Base 和 Overlay 都是可以独立运作的,增加新对象,或者对编写 Base 时未预料到的内容进行变更,都非常简单
基于上述工作流程的对比,如果是要公开发布一个复杂的组件,编写一个复杂而设计良好的 Helm Chart 可以给用户很大帮助。用户在缺失了自由性之下,仅仅通过 values.yaml 的阅读和配置就可以对这种复杂的部署产生一个较为深入的认知。
如果是常见的业务应用,虽然不同的部署之间差异不大(比如日常预发生产),但是因为快速迭代及需求变化,未必可以一开始就做好相关的变化限制,用 Kustomize 是更好的选择。
对于承载应用 (Application) 这个概念而言,Kustomize 和 Helm 的短板是一致的,都没有进一步提供包之间的依赖处理、外部资源申请及维护、变量间传递等能力。
对于承载组件 (Component) 这个概念而言,Kustomize 和 Helm 类似,都是合适的工具。虽然 Helm 和 Kustomize 在自身的能力和流程上有着很多区别,但最终流程都是:开发者(一堆 YAML) -> 合适的参数映射及渲染方式 -> 使用者(填参/覆盖) -> apply 到目标 K8S 中。萝卜青菜,各有所爱。
SREWorks的Kustomize组件实践
在SREWorks的appmanager中,将Kustomize与Helm并列放在一起成为一种组件类型,当前这种组件类型还未内置到出厂组件中,后续会上架到云端市场,供用户插拔安装。
- revisionName: "CHART|[email protected]@1.0|_" parameterValues: - name: Map value: clusterId: "{{ Global.clusterId }}" product: es userID: "{{ Global.uid }}" vpcID: "{{ Global.vpcID }}" vswitchID: "{{ Global.vswitchID }}" namespaceRegexes: "^(essen|es)$"- revisionName: KUSTOMIZE|[email protected]@test|_ parameterValues: - name: kubeconfig value: "{{ Global.kubeconfig }}" toFieldPaths: - spec.base64Kubeconfig - name: path value: "./" toFieldPaths: - spec.path dependencies: - component: "CHART|[email protected]@1.0"- revisionName: "STATUS|[email protected]|_" dependencies: - component: KUSTOMIZE|[email protected]@test parameterValues: - name: kubeconfig value: "{{ Global.kubeconfig }}" toFieldPaths: - spec.base64Kubeconfig - name: options value: groups: - namespace: sreworks-system labels: app: sreworks resources: - v1/pods toFieldPaths: - spec.options
如上面所示,在appmanager中的OAM YAML中,插入Helm和Kustomize两种组件,并且设置依赖关系,在Helm组件下发完成后,再进行Kustomize组件的下发;在Kustomize组件下发完成后,对核心Pod进行状态探测,待Pod正常之后才算作部署完成。
总结
Kustomize 是一个通用工具,它的作用是对Kubernetes 资源进行定制后产生新的 YAML 文件,并保持原始的 YAML 文件不变。从这个意义上来说,你可以把 Kustomize 看成是 Kubernetes YAML 文件的转换工具,类似 XML 和 XSLT 的关系。
Kustomize 的一个重要特征是不使用模板,而是直接工作在原始的 YAML 文件上。这一点与 Helm 是不同的。不使用模板好处在于简单易懂,不需要掌握复杂的模板语法,而Helm的YAML文件基本都被预置变量抠得毫无可读性。
Kustomize 的另外一个优势是集成在 kubectl 中,这就意味着不需要安装额外的工具就可以进行定制。需要注意的是,由于实现上的原因,kubectl 自带的 kustomize 的版本比较低,目前仍然需要安装单独的 Kustomize 工具。这个问题要到 1.20 版本才会解决。
后续文章我们会分享更多的Kubernetes组件和应用管理工具,均会发布在我们的公众号“阿里智能运维”上,请大家持续关注~也欢迎大家在公众号后台留言想了解的内容和感兴趣的相关话题,与SREWorks团队进行交流。
边栏推荐
- 1161 最大层内元素和——Leetcode天天刷【BFS】(2022.7.31)
- Auto.js实现朋友圈自动点赞
- 华为设备配置VRRP负载分担
- ESP8266-Arduino编程实例-WS2812驱动
- 622 设计循环队列——Leetcode天天刷【循环队列,数组模拟,双指针】(2022.8.2)
- 高效目标检测:动态候选较大程度提升检测精度(附论文下载)
- Detailed demonstration pytorch framework implementations old photo repair (GPU)
- Hinton2022年RobotBrains访谈记录
- 简易电子琴设计(c语言)
- Interview Blitz: What Are Sticky Packs and Half Packs?How to deal with it?
猜你喜欢
![【微信小程序2】事件传参与数据同步[03]](/img/d9/73004e6edf800c583231a94dfbd878.png)
【微信小程序2】事件传参与数据同步[03]

EasyCVR平台海康摄像头语音对讲功能配置的3个注意事项

告诉你0基础怎么学好游戏建模?

pytorch框架实现老照片修复功能详细演示(GPU版)

友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议

调用EasyCVR云台控制接口时,因网络延迟导致云台操作异常该如何解决?

Kettle 读取 Excel 数据输出到 Oracle 详解

1161 最大层内元素和——Leetcode天天刷【BFS】(2022.7.31)

使用 ReportLab 绘制 PDF

Network protocol-TCP, UDP difference and TCP three-way handshake, four wave
随机推荐
Handler source code analysis
Shell编程之循环语句
友宏医疗与Actxa签署Pre-M Diabetes TM 战略合作协议
2022 年值得尝试的 7 个 MQTT 客户端工具
不要再用if-else
CentOS 7 安装mysql
net-snmp编译报错:/usr/bin/ld: cannot find crti.o: No such file or directory
华为设备配置VRRP负载分担
微导纳米IPO过会:年营收4.28亿 君联与高瓴是股东
多模态 参考资料汇总
Internet Download Manager简介及下载安装包,IDM序列号注册问题解决方法
阿洛的反思
NNLM、RNNLM等语言模型 实现 下一单词预测(next-word prediction)
亚马逊云科技 Build On 2022 - AIot 第二季物联网专场实验心得
JMeter笔记5 |Badboy使用和录制
CS免杀姿势
高位套牢机构,用友网络的信任危机是如何产生的?
Jingdong cloud released a new generation of distributed database StarDB 5.0
极验深知v2分析
使用 ReportLab 绘制 PDF