云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize ...

打印 上一主题 下一主题

主题 684|帖子 684|积分 2052

前言

相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubectl 1.14以来早已内置到其中,说明官方对其很认可。
我认为还是Helm 参数化模板方式来自定义配置需要学习复杂的DSL语法,难上手,易出错,而 kustomize 是使用 Kubernetes 原生概念帮助用户创作并复用声明式配置。
 
认识 Kustomize

https://kustomize.io/ 根据官网的描述:kustomize 是 kubernetes 原生的配置管理,以无模板方式来定制应用的配置。kustomize 使用 kubernetes 原生概念帮助创建并复用资源配置(YAML),允许用户以一个应用描述文件为基础(Base YAML),然后通过 Overlay 的方式生成最终部署应用所需的描述文件。 安装

参考官方文档。我本地MacOs 直接运行 brew install kustomizekubectl 1.14 以后可以不用下载单独的kustomize,直接使用kubectl命令。 示例解析

文件结构:
  1. demo-manifests
  2. ├── base
  3. │   ├── deployment.yaml
  4. │   ├── kustomization.yaml
  5. │   ├── service-account.yaml
  6. │   └── service.yaml
  7. └── services
  8.     ├── demo-app
  9.     │   ├── _common
  10.     │   │   ├── deployment-patch.yaml
  11.     │   │   ├── kustomization.yaml
  12.     │   │   └── namespace.yaml
  13.     │   ├── dev
  14.     │   │   ├── config.json
  15.     │   │   ├── deployment-patch.yaml
  16.     │   │   └── kustomization.yaml
  17.     │   ├── staging
  18.     │   │   ├── config.json
  19.     │   │   ├── deployment-patch.yaml
  20.     │   │   └── kustomization.yaml
  21.     │   └── prod
  22.     │   │   ├── config.json
  23.     │   │   ├── deployment-patch.yaml
  24.     │   │   └── kustomization.yaml
  25.     └── demo-app2
  26.         └── xxx
复制代码
先看base 目录,有几个常见的deployment/service/service-account YAML 资源文件
还有个 kustomization.yaml 配置文件
apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yaml- service.yaml- service-account.yaml
commonLabels:  managed-by: Kustomize这里面包含了刚才的几个resource文件以及要应用于它们的一些自定义,如添加一个通用的标签Common Labels
这时候也可以通过 kustomize build 命令来生成完整的YAML进行查看
  1. kustomize build demo-manifests/base > base.yaml
复制代码
base.yamlbuild 出来的 YAML 每个资源对象上都会存在通用的标签 managed-by: Kustomize
 
接下来看 Service目录,此目录存放所有的服务项目,比如demo-app , 里面的YAML就是来覆盖base 也就是官方说的 Overlays
只需要把不同的资源描述通过Patch方式覆盖掉base中的就行了。这边我又将三个环境 dev/staging/prod 公共的部分抽取出来放入 common文件夹。

_common/kustomization.yaml文件如下
  1. apiVersion: kustomize.config.k8s.io/v1beta1
  2. kind: Kustomization
  3. resources:
  4. - ../../../base
  5. - namespace.yaml
  6. patchesStrategicMerge:
  7. - deployment-patch.yaml
复制代码
我这个demo-app 需要configMap,另外心跳接口也不一样, 所以 deployment-patch.yaml 需要写出这些不一样的,然后去覆盖base中的。
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: NAME_PLACEHOLDER
  5. spec:
  6.   template:
  7.     spec:
  8.       serviceAccountName: NAME_PLACEHOLDER
  9.       containers:
  10.       - name: app
  11.         image: wadexu007/demo:IMG_TAG_PLACEHOLDER
  12.         livenessProbe:
  13.           failureThreshold: 5
  14.           httpGet:
  15.             path: /pizzas
  16.             port: 8080
  17.           initialDelaySeconds: 10
  18.           periodSeconds: 40
  19.           timeoutSeconds: 1
  20.         readinessProbe:
  21.           failureThreshold: 5
  22.           httpGet:
  23.             path: /pizzas
  24.             port: 8080
  25.           initialDelaySeconds: 10
  26.           periodSeconds: 20
  27.           timeoutSeconds: 1
  28.         volumeMounts:
  29.         - name: config-volume
  30.           mountPath: /app/conf/config.json
  31.           subPath: config.json
  32.       volumes:
  33.       - name: config-volume
  34.         configMap:
  35.           name: demo-app-config
复制代码
deployment-patch.yaml
  1. ---
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5.   name: demo
复制代码
namespace.yaml ### 文章首发于博客园 https://www.cnblogs.com/wade-xu/p/16839829.html
最后我们看 dev/kustomization.yaml
  1. apiVersion: kustomize.config.k8s.io/v1beta1
  2. kind: Kustomization
  3. resources:
  4. - ../_common<br>
  5. namespace: demo<br>
  6. commonLabels:
  7.   app: demo-app<br>
  8. replicas:
  9. - count: 1
  10.   name: demo-app
  11. configMapGenerator:
  12. - files:
  13.   - config.json
  14.   name: demo-app-config
  15. patches:
  16. - patch: |-
  17.     - op: replace
  18.       path: /metadata/name
  19.       value: demo-app
  20.   target:
  21.     name: NAME_PLACEHOLDER<br>
  22. patchesStrategicMerge:
  23. - deployment-patch.yaml<br>
  24. images:
  25. - name: wadexu007/demo
  26.   newTag: 1.0.0
复制代码
dev env 里面将replicas设置成1, 用config.json 生成 configMap
  1. {
  2.     "SOME_CONFIG": "/demo/path"
  3. }
复制代码
config.jsondeployment-patch.yaml 里面也将container resource request/limit 配置设置小一点, 采用 patchesStrategicMerge 与 common 和 base里面的deployment资源合并。
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: NAME_PLACEHOLDER
  5. spec:
  6.   template:
  7.     spec:
  8.       containers:
  9.       - name: app
  10.         resources:
  11.           limits:
  12.             cpu: 1
  13.             memory: 1Gi
  14.           requests:
  15.             cpu: 200m
  16.             memory: 256Mi
复制代码
deployment-patch.yaml另外还采用了 patch 的方式,改了每个资源的name --> demo-app
以及images 替换了原来的 image name and tag.
kustomize 命令如下
  1. kustomize build demo-manifests/services/demo-app/dev > demo-app.yaml
复制代码
如果用 kubectl 命令的话,示例如下
  1. kubectl kustomize services/demo-app/dev/ > demo-app.yaml
复制代码
最终结果
  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4.   labels:
  5.     app: demo-app
  6.   name: demo
  7. ---
  8. apiVersion: v1
  9. kind: ServiceAccount
  10. metadata:
  11.   labels:
  12.     app: demo-app
  13.     managed-by: Kustomize
  14.   name: demo-app
  15.   namespace: demo
  16. ---
  17. apiVersion: v1
  18. data:
  19.   config.json: |-
  20.     {
  21.         "SOME_CONFIG": "/demo/path"
  22.     }
  23. kind: ConfigMap
  24. metadata:
  25.   labels:
  26.     app: demo-app
  27.   name: demo-app-config-t7c64mbtt2
  28.   namespace: demo
  29. ---
  30. apiVersion: v1
  31. kind: Service
  32. metadata:
  33.   labels:
  34.     app: demo-app
  35.     managed-by: Kustomize
  36.   name: demo-app
  37.   namespace: demo
  38. spec:
  39.   ports:
  40.   - port: 8080
  41.     protocol: TCP
  42.     targetPort: http
  43.   selector:
  44.     app: demo-app
  45.     managed-by: Kustomize
  46.   type: ClusterIP
  47. ---
  48. apiVersion: apps/v1
  49. kind: Deployment
  50. metadata:
  51.   labels:
  52.     app: demo-app
  53.     managed-by: Kustomize
  54.   name: demo-app
  55.   namespace: demo
  56. spec:
  57.   replicas: 1
  58.   selector:
  59.     matchLabels:
  60.       app: demo-app
  61.       managed-by: Kustomize
  62.   template:
  63.     metadata:
  64.       labels:
  65.         app: demo-app
  66.         managed-by: Kustomize
  67.     spec:
  68.       containers:
  69.       - image: wadexu007/demo:1.0.0
  70.         imagePullPolicy: IfNotPresent
  71.         livenessProbe:
  72.           failureThreshold: 5
  73.           httpGet:
  74.             path: /pizzas
  75.             port: 8080
  76.           initialDelaySeconds: 10
  77.           periodSeconds: 40
  78.           timeoutSeconds: 1
  79.         name: app
  80.         ports:
  81.         - containerPort: 8080
  82.           name: http
  83.         readinessProbe:
  84.           failureThreshold: 5
  85.           httpGet:
  86.             path: /pizzas
  87.             port: 8080
  88.           initialDelaySeconds: 10
  89.           periodSeconds: 20
  90.           timeoutSeconds: 1
  91.         resources:
  92.           limits:
  93.             cpu: 1
  94.             memory: 1Gi
  95.           requests:
  96.             cpu: 200m
  97.             memory: 256Mi
  98.         securityContext:
  99.           allowPrivilegeEscalation: false
  100.         volumeMounts:
  101.         - mountPath: /app/conf/config.json
  102.           name: config-volume
  103.           subPath: config.json
  104.       serviceAccountName: demo-app
  105.       volumes:
  106.       - configMap:
  107.           name: demo-app-config-t7c64mbtt2
  108.         name: config-volume
复制代码
demo-app.yaml ### https://www.cnblogs.com/wade-xu/p/16839829.html
staging/prod 文件夹也是类似dev的文件,环境不一样,config.json 以及资源配置,image tag 不一样,显示申明就行了。
完整代码请参考我的 Github
 
涵盖 Kustomize 知识点


  • commonLabels
  • patchesStrategicMerge
  • patches
  • configMapGenerator
  • replicas
  • images
 
总结

经过本篇文章的学习,以及上一篇 [云原生之旅 - 5)Kubernetes时代的包管理工具 Helm ]关于Helm的学习,您已经能体会到两款工具的不同之处。
Helm 通过将应用抽象成 Chart 来管理, 专注于应用的操作、生命周期管理(如 install、upgrade、rollback)等, 而 kustomize 关注于 k8s API 对象的管理。Helm 适合对外交付使用,使用的Chart 相对固定、稳定,相当于静态管理,而 kustomize 管理的是正在变更的应用,创建新的 overlay 将应用部署在新的环境,相当于动态管理,适合于 DevOps 流程。Helm 通过 Chart 方式打包并管理应用版本,kustomize 通过 overlay 方式管理应用不同的变体,通过 Git 来版本管理。总的来说,Helm 有自己一套体系来管理应用,而 kustomize 更轻量级,也更灵活。另外,Kustomize也有 Terraform provider 通过TF来安装。

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。  
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表