在系列上一篇文章 [用一个自己做的编程语言能做什么? (系列文章 1)] KCL - 让 Kubernetes 资源清单管理更容易 - 徐鹏飞Peefy的个人空间 - OSCHINA - 中文开源技术交流社区 中,我们介绍了如何使用 KCL 编写并管理 Kubernetes 配置并将配置下发到集群,这一篇我们通过 KCL 与其他 Kubernetes 配置管理工具的对比如 Kustomize 进一步介绍 KCL 在 Kubernetes 配置管理场景中的用法。

简介

KCL 是一个开源的基于约束的记录及函数语言。KCL 通过成熟的编程语言技术和实践来改进对大量繁杂配置的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更快的自动化集成和良好的生态延展性。

KCL 期望在 Kubernetes YAML 资源管理层面解决如下问题:

  1. 生产级高性能编程语言以编写代码的方式提升配置的灵活度,比如条件语句、循环、函数、包管理等特性提升配置重用的能力
  2. 在代码层面提升配置语义验证的能力,比如字段可选 / 必选、类型、范围等配置检查能力
  3. 提供配置分块编写、组合和抽象的能力,比如结构定义、结构继承、约束定义等能力

本篇文章是 KCL 可以做什么系列文章第二篇,重点讲述 KCL 语言一些进阶用法以及与 Kustomize 工具的区别,后续会持续更新和分享 KCL 的一系列特点、使用场景和其他 Kubernetes 配置管理工具的异同,大家敬请期待!

KCL 和 Kustomize 的区别

Kustomize 提供了一种无需模板和即可自定义 Kubernetes 资源基础配置和差异化配置的解决方案,通过文件级的 YAML 配置方式完成配置合并或覆盖。在 Kustomize 中用户需要更详细地了解将要发生更改的内容和位置,对于复杂递归过深的基础 YAML 可能不太容易通过选择器来匹配 Kustomize 文件。

而在 KCL 中,用户可以直接把对应代码需要修改的配置书写在对应的地方,免去了阅读基础 YAML 的成本,同时能够通过代码的方式复用配置片段,避免 YAML 配置的大量复制粘贴,信息密度更高,更不容易出错。

下面以一个经典的 Kustomize 多环境配置管理例子详细说明 Kustomize 和 KCL 在 Kubernetes 资源配置管理上的区别。

Kustomize

Kustomize 有 base 和 overlay 的概念,bases 和 overlays 一般是一个包含 kustomization.yaml 文件的目录,一个 base 可以被多个 overlay 使用

我们可以执行如下命令行获得一个典型的 Kustomize 工程

  • 创建 base 目录并新建一个 deployment 资源
 # Create a directory to hold the base
mkdir base
# Create a base/deployment.yaml
cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: ldaplabels:app: ldap
spec:replicas: 1selector:matchLabels:app: ldaptemplate:metadata:labels:app: ldapspec:containers:- name: ldapimage: osixia/openldap:1.1.11args: ["--copy-service"]volumeMounts:- name: ldap-datamountPath: /var/lib/ldapports:- containerPort: 389name: openldapvolumes:- name: ldap-dataemptyDir: {}
EOF
# Create a base/kustomization.yaml
cat <<EOF > base/kustomization.yaml
resources:
- deployment.yaml
EOF
  • 创建一个 prod 目录并放置生产环境的配置
 # Create a directory to hold the prod overlay
mkdir prod
# Create a prod/deployment.yaml
cat <<EOF > prod/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: ldap
spec:replicas: 6template:spec:volumes:- name: ldap-dataemptyDir: nullgcePersistentDisk:readOnly: truepdName: ldap-persistent-storage
EOF
cat <<EOF > prod/kustomization.yaml
resources:- ../base
patchesStrategicMerge:- deployment.yaml
EOF

此时我们可以得到一个基本的 Kustomize 目录

.
├── base
│   ├── deployment.yaml
│   └── kustomization.yaml
└── prod├── deployment.yaml└── kustomization.yaml

其中,base 目录存放的是基本的 deployment 配置,prod 环境存放的是需要覆盖的 deployment 配置,在其中指定了 metadata.name 等字段用于表示对哪个资源进行覆盖

我们可以通过如下命令行显示 prod 环境的真实 deployment 配置

$ kubectl kustomize ./prod
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: ldapname: ldap
spec:replicas: 6selector:matchLabels:app: ldaptemplate:metadata:labels:app: ldapspec:containers:- args:- --copy-serviceimage: osixia/openldap:1.1.11name: ldapports:- containerPort: 389name: openldapvolumeMounts:- mountPath: /var/lib/ldapname: ldap-datavolumes:- gcePersistentDisk:pdName: ldap-persistent-storagereadOnly: truename: ldap-data

也可以通过如下命令行直接将配置下发到集群当中

$ kubectl apply -k ./proddeployment.apps/ldap created

KCL

我们可以编写如下 KCL 代码并命名为 main.k ,KCL 受 Python 启发,基础语法十分接近 Python, 比较容易学习和上手

apiVersion = "apps/v1"
kind = "Deployment"
metadata = {name = "ldap"labels.app = "ldap"
}
spec = {replicas = 1# When env is prod, override the `replicas` attribute with `6`if option("env") == "prod": replicas = 6# Assign `metadata.labels` to `selector.matchLabels`selector.matchLabels = metadata.labelstemplate.metadata.labels = metadata.labelstemplate.spec.containers = [{name = metadata.nameimage = "osixia/openldap:1.1.11"args = ["--copy-service"]volumeMounts = [{ name = "ldap-data", mountPath = "/var/lib/ldap" }]ports = [{ containerPort = 80, name = "openldap" }]}]template.spec.volumes = [{name = "ldap-data"emptyDir = {}# When env is prod# override the `emptyDir` attribute with `None`# patch a `gcePersistentDisk` attribute with the value `{readOnly = True, pdName = "ldap-persistent-storage"}`if option("env") == "prod":emptyDir = NonegcePersistentDisk = {readOnly = TruepdName = "ldap-persistent-storage"}}]
}

上述 KCL 代码中我们分别声明了一个 Kubernetes Deployment 资源的 apiVersionkindmetadata 和 spec 等变量,并分别赋值了相应的内容,特别地,我们将 metadata.labels 字段分别重用在 spec.selector.matchLabels 和 spec.template.metadata.labels 字段。可以看出,相比于 Kustomize 或者 YAML,KCL 定义的数据结构更加紧凑,而且可以通过定义局部变量实现配置重用。

在 KCL 中,我们可以通过条件语句和 option 函数动态地接收外部参数,为不同的环境需要设置不同的配置值生成不同环境的资源。比如对于如上代码,我们编写了一个条件语句并输入一个名为 env 的动态参数,当 env 为 prod 时,我们将 replicas 字段由 1 覆盖为 6,并且对名为 ldap-data 的 volume 配置进行一些调整,如将 emptyDir 字段修改为 None, 增加 gcePersistentDisk 的配置值等。

可以使用如下命令查看不同环境配置的 diff

diff \<(kcl main.k) \<(kcl main.k -D env=prod) |\more

输出如下:

8c8
<   replicas: 1
---
>   replicas: 6
30c30,33
<         emptyDir: {}
---
>         emptyDir: null
>         gcePersistentDisk:
>           readOnly: true
>           pdName: ldap-persistent-storage

可以看到生产环境的配置和基本配置的 diff 主要在于 replicas 和 emptyDir 等字段,与预期相符。

此外,我们可以使用 KCL 命令行工具的 -o 参数将编译产生的 YAML 输出到文件中,并查看文件之间的 diff。

 # Generate base deployment
kcl main.k -o deployment.yaml
# Generate prod deployment
kcl main.k -o prod-deployment.yaml -D env=prod
# Diff prod deployment and base deployment
diff prod-deployment.yaml deployment.yaml

当然我们也可以将 KCL 工具与 kubectl 等工具结合使用,将生产环境的配置下发到集群当中。

$ kcl main.k -D env=prod | kubectl apply -f -deployment.apps/ldap created

可以从命令行的结果看出看出与我们使用直接使用 Kustomize 配置和 kubectl apply 的一个 Deployment 体验完全一致,并且无更多的副作用。

最后,通过 kubectl 检查部署状态。

$ kubectl get deployNAME   READY   UP-TO-DATE   AVAILABLE   AGE
ldap   0/6     6            0           15s

小结

本期内容大概简单介绍了用 KCL 编写复杂多环境 Kubernetes 配置的快速入门和使用 Kustomize 工具进行 Kubernetes 多环境配置管理的对比,可以看出相比于 Kustomize, KCL 在实现配置复用和覆盖的基础上,通过代码化的方式减少了配置文件的个数和代码行数,提升了信息密度比,并且同 Kustomize 一样是一个纯客户端方案,可以将配置和策略的验证尽可能左移,并不会对集群有额外依赖或造成负担,甚至无需一个真实的 Kubernetes 集群。

除了 Kustomize, 目前阶段 Helm 也在 Kubernetes 配置定义和管理领域也十分流行,熟悉 Kubernetes 的小伙伴可能更喜欢显式配置编写方式。那么相较于 Helm,用 KCL 来写配置文件渲染,又有什么异同呢?考虑到有很多小伙伴已经在使用 Helm 这样的工具,下一期我将介绍用 KCL 的方式来写 Helm 对应的配置代码,敬请期待!!

如果您喜欢这篇文章,一定记得收藏 + 关注!!更多精彩内容请访问:

  • KCL 仓库地址:GitHub - KusionStack/KCLVM: A constraint-based record & functional language mainly used in configuration and policy scenarios.
  • Kusion 仓库地址:https://github.com/KusionStack/kusion
  • Konfig 仓库地址:GitHub - KusionStack/konfig

如果您喜欢这些项目,欢迎 Github Star 鼓励一下

KCL 与其他 Kubernetes 配置管理工具的异同 - Kustomize 篇 [一个自研编程语言能做什么?(系列 2)]相关推荐

  1. Kubernetes 必备工具:2021

    文档翻译自 Kubernetes Essential Tools: 2021[1],篇幅较长,做了部分增删. 介绍 在本文中,我将尝试总结我最喜欢的 Kubernetes[2] 工具,并特别强调最新的 ...

  2. 集中配置管理工具puppet安装使用

    Puppet是开源的基于Ruby的一种Linux.Unix平台的集中配置管理工具,puppet是一个C/S结构, 当然,这里的C可以有很多,因此,也可以说是一个星型结构. puppet使用自有的pup ...

  3. SpringCloud 应用在 Kubernetes 上的最佳实践 — 部署篇(工具部署)

    作者 | 孤弋  阿里云高级技术专家,负责 EDAS 的开发和用户体验优化工作. 导读:上一篇文章<SpringCloud 应用在 Kubernetes 上的最佳实践 - 部署篇(开发部署)&g ...

  4. ClearCase是全球领先的软件配置管理工具

    ClearCase是全球领先的软件配置管理工具,而Visual Studio 2005是微软推出的强大的.Net开发工具.微软的VSIP计划为Visual Studio提供了界面的可扩展性,通过VSI ...

  5. 你知道配置管理工具是什么吗_什么是配置管理工具?

    你知道配置管理工具是什么吗 对于大多数人而言,计算机并不会保持不变. 添加,删除和更新软件. 配置已更改. 考虑一下自第一次启动计算机以来对计算机所做的更改. 现在想象一下对10台,100台或1000 ...

  6. 快速接入阿里云应用配置管理工具 轻松开启企业效率新时代

    2019独角兽企业重金招聘Python工程师标准>>> 日前,阿里云正式推出了应用配置管理(Application Configuration Manangement,简称 ACM) ...

  7. 开源自动化配置管理工具Puppet入门教程

    Puppet是开源的基于Ruby的系统配置管理工具,依赖于C/S的部署架构.Puppet这样的自动化配置管理工具可以帮助系统管理员更加方便的完成升级软件包.管理配置文件.系统服务.cron任务.添加新 ...

  8. gohost -- go 开发的命令行hosts配置管理工具

    前几天在微博上看到有人推荐了lazygit这个工具,让人眼前一亮,什么时候命令行也可以这么抢到了,?,调研了下,发现它使用了gocui,使用它可以做出来很多很炫的命令行工具. 现有的hosts工具里面 ...

  9. JAVA前端修改密码,Java Web版SVN 配置管理工具 2.0 (远道建立仓库,修改密码,设置权限,支持apache等)...

    Java Web版SVN 配置管理工具 2.0 (远程建立仓库,修改密码,设置权限,支持apache等) 3.0开始,已经迁移到google code,这里停止下载.http://code.googl ...

最新文章

  1. vue项目构建实战基础知识:SPA理解/RESTful接口介绍/static目录配置/axios封装/打包时map文件去除...
  2. array DEMO
  3. cypress测试脚本_Cypress 自动化测试学习使用
  4. 情人节,请带走我给您的祝福
  5. java实现一个简单的打字游戏
  6. mysql 查询时间戳(TIMESTAMP)转成常用可读时间格式
  7. Raki的读paper小记:Dark Experience for General Continual Learning: a Strong, Simple Baseline
  8. draw什么计算机软件,[计算机软件及应用]化学绘图软件ChemDraw使用简介.ppt
  9. SNMP协议-SNMP TRAP
  10. 【bat】一个脚本文件,关闭IE,重置IE,配置IE,设置IE的ActionX等选项.并自动管理员身份运行
  11. Python 列表,for循环,元组的使用【修改、添加、删除、排序、切片】w
  12. 计算机网络期末复习(学会不挂科)
  13. Dragonfly 三维可视化数据分析处理软件-切片分析工具使用教程
  14. Mac打包dmg文件(更换背景图)
  15. C语言学习:一个函数可以有几个返回值?
  16. STM32F103 实例应用(2)——DAP仿真下载以及STVP下载
  17. vmware:end kernel panic not syncing
  18. 读书笔记-人品惠及一世
  19. java计算机毕业设计vue基层社区管理服务网MyBatis+系统+LW文档+源码+调试部署
  20. Python字符串连接

热门文章

  1. django 数据库 get_or_create函数返回值是tuple
  2. mysqlcheck约束,含面试题+答案
  3. 原来iPhone手机这么好用!点2下屏幕就能长截屏,实用又方便
  4. java8三次分组_Java8分组(groupingBy)
  5. React-Native 自定义TextInput样式
  6. GDKOI2021普及游记
  7. YYDS,马斯克:特斯拉机器人预计明年生产,取名:擎天柱
  8. js正则验证手机号,支持移动、电信、联通
  9. PMP考试结果查询网站
  10. pcm系统设计及matlab仿真实现,PCM系统设计及MATLAB仿真实现.doc