原文链接:https://www.cpweb.top/2504

官方文档:

https://kubernetes.io/zh-cn/docs/tasks/manage-kubernetes-objects/kustomization/ https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/
https://github.com/kubernetes-sigs/kustomize

一、基础概念

  Kustomize 是一个独立的工具,用来通过 kustomization 文件定制 Kubernetes 资源对象配置。它提供了一种无需模板和 DSL(领域特定语言) 即可自定义 Kubernetes 资源对象配置的解决方案。
  它提供以下功能特性来管理应用配置文件:

  • 从其他来源生成资源,可以基于文件或字面值来生成 Secret 和 ConfigMap。
  • 为资源设置贯穿性(Cross-Cutting)字段,如为所有资源对象设置相同的名字空间、前缀后缀、标签集合、注解集合。
  • 组织和定制资源集合。一种常见的做法是在项目中构造资源集合并将其放到同一个文件或目录中管理,基于不同文件来组织资源并向其应用补丁或者其他定制的能力。

二、结构

  Kustomize 中有基准(bases)和覆盖(overlays)的概念区分。
  基准是包含 kustomization.yaml 文件的一个目录,其中包含一组资源及其相关的定制。 基准可以是本地目录或者来自远程仓库的目录,只要其中存在 kustomization.yaml 文件即可。 覆盖也是一个目录,其中包含将其他 kustomization 目录当做 bases 来引用的 kustomization.yaml 文件。
  基准不了解覆盖的存在,且可被多个覆盖所使用。 覆盖则可以有多个基准,且可针对所有基准中的资源执行组织操作,还可以在其上执行定制。
  所以我们通常使用 base + overlays 的结构来管理 yaml 文件。base 中包含基准 yaml 文件,overlays 中则是继承 base 的 yaml 并向其中加入定制元素进行修改,已适应于不同的环境。
  结构如下:

nginx-kustomize
├── base                             # 基准文件
│   ├── kustomization.yaml
│   └── nginx-deploy.yaml
└── overlays├── development                  # 开发环境│   ├── kustomization.yaml│   ├── ns.yaml│   ├── path_env.yaml│   └── path_nginx-ing.yaml└── production                   # 生产环境├── kustomization.yaml├── ns.yaml├── path_env.yaml└── path_nginx-ing.yaml

三、示例

以上述结构做为示例,简单演示下。

1、base

定义 kustomization.yaml,指定要包含那些文件做为基准 yaml 文件。

[root@cp nginx-kustomize]# cat base/kustomization.yaml
resources:
- nginx-deploy.yaml注:
resources:要包括的资源,资源可以是文件、目录、URL。
资源将按深度优先顺序读取和处理。
文件应包含 YAML 形式的 k8s 资源,一个文件可能包含由文档标记分隔的多个资源---。
目录规范可以是相对的、绝对的或 URL 的一部分,目录必须包含一个 kustomization.yaml 文件。
URL 规范应遵循 hashcorp URL 格式。

nginx 部署文件,包含 svc、ing、deploy:

[root@cp nginx-kustomize]# cat base/nginx-deploy.yaml
apiVersion: v1
kind: Service
metadata:labels:k8s-app: nginxname: nginx
spec:type: ClusterIPselector:k8s-app: nginxports:- port: 80targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx
spec:rules:- host: dev.nginx.examplehttp:paths:- path: /pathType: Prefixbackend:service:name: nginxport:number: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.18ports:- containerPort: 80env:- name: ENVvalue: "dev"

2、overlays

以 production 为例,要在生产环境部署,我们要在基准文件上定制如下:

  • 所有资源对象全部处于 nginx-prod 命名空间下。
  • Ingess 的 host 字段改为 prod.nginx.example。
  • Deployment 的 replicas 从 1 增加至 2,镜像版本改为1.20,ENV 变量值改为 prod。

创建 kustomization.yml 文件以定义生产环境:

[root@cp nginx-kustomize]# cat overlays/production/kustomization.yaml
resources:      # 包含的资源
- ../../base
- ns.yamlpatchesStrategicMerge:      # 策略合并补丁
- patch_nginx-ing.yaml
- patch_env.yamlnamespace: nginx-prod       # 为所有资源设置命名空间
replicas:                   # 配置资源副本数
- name: nginxcount: 2images:                     # 设置镜像
- name: nginxnewName: nginxnewTag: 1.20

注:

1、patchesStrategicMerge
注意,只用于修改已知资源。
即此条目下的文件中的 name 必须和 resources 加载的 name 字段匹配,或者通过 bases 中的 name 字段匹配。2、namespace
为所有资源设置相同的名字空间。
如果在资源上设置了现有 namespace,则将覆盖现有 namespace。
如果在资源上未设置现有 namespace,则使用现有 namespace。3、replicas
修改资源的副本数。该字段内容为列表,所以可以同时修改许多资源。
只能作用于:Deployment、ReplicationController、ReplicaSet、StatefulSet4、images
修改镜像的名称、tag 或 image digest。
如果一个资源对象下面定义了多个镜像,则所有镜像都会被改变。

其它文件:

[root@cp nginx-kustomize]# cat overlays/production/ns.yaml
apiVersion: v1
kind: Namespace
metadata:name: nginx-prod
[root@cp nginx-kustomize]# cat overlays/production/path_env.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:template:spec:containers:- name: nginxenv:- name: ENVvalue: "prod"
[root@cp nginx-kustomize]# cat overlays/production/path_nginx-ing.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx
spec:rules:- host: prod.nginx.examplehttp:paths:- path: /pathType: Prefixbackend:service:name: nginxport:number: 80

3、部署

下面我们来部署生产环境:

# 检查,会定制化生成 yaml 到标准输出
kubectl kustomize overlays/production/# 部署
kubectl apply -k overlays/production/

验证:

[root@cp nginx-kustomize]# kubectl get deploy,svc,ing -n nginx-prod
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   2/2     2            2           41sNAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/nginx   ClusterIP   10.1.89.78   <none>        80/TCP    41sNAME                              CLASS    HOSTS                ADDRESS   PORTS   AGE
ingress.networking.k8s.io/nginx   <none>   prod.nginx.example             80      41s[root@cp nginx-kustomize]# kubectl describe deploy -n nginx-prod nginx  | grep ImageImage:      nginx:1.20[root@cp nginx-kustomize]# kubectl exec -n nginx-prod nginx-5cbc6c98f6-24r9h -- env | grep ENV
ENV=prod

四、扩展

官方给了不少示例:https://github.com/kubernetes-sigs/kustomize/tree/master/examples

1、patchesJson6902 语法

官方文档:https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/patchesjson6902/
target 字段通过对象的组、版本、种类、名称和命名空间来筛选需要 patch 的资源对象。
path 字段是 JSON 补丁文件的相对文件路径。此补丁文件中的内容可以是 JSON 格式

patchesJson6902:
- target:group: <Group>version: <Version>kind: <Kind>name: <Name>namespace: <Namespace>labelSelector: <LabelSelector>annotationSelector: <AnnotationSelector>path: <PatchFile>patch: -|

示例:

patches:
- target:group: appsversion: v1kind: Deploymentname: deploy.*labelSelector: "env=dev"annotationSelector: "zone=west"path: patch.yaml
- target:kind: MyKindlabelSelector: "env=dev"patch: |-- op: replacepath: /some/existing/pathvalue: new value

2、多容器镜像

  如果单个资源对象下有多个容器,对于不同容器镜像怎么在 kustomization.yaml 文件中设置,使用 images 肯定是不行的,它会修改所有镜像。这种情况下,我们可能会想到用 patchesStrategicMerge,但是我们需要额外定义文件。
  这种情况使用 patchesJson6902 可以达成我们想要的效果,如下示例将 nginx1 容器镜像版本改成 1.20,将 nginx2 容器镜像版本改成 1.18。
  示例 Deployment:

[root@cp test-kustomize]# cat nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginx1image: nginx:1.18- name: nginx2image: nginx:1.20

kustomization.yaml:

[root@cp test-kustomize]# cat kustomization.yaml
resources:
- nginx-deploy.yamlpatchesJson6902:
- target:              # 匹配名为 nginx 的 Deploymentkind: Deploymentname: nginxpatch: |-- op: replacepath: /spec/template/spec/containers/0/imagevalue: nginx:1.20   - op: replacepath: /spec/template/spec/containers/1/imagevalue: nginx:1.18

验证:

[root@cp test-kustomize]# kubectl kustomize .
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.20name: nginx1- image: nginx:1.18name: nginx2

3、批量修改变量

目前有两个微服务,现在要上生产,需要批量修改相关变量:

  • JVM_OPTS 变量,将堆栈大小调整到 1024m。
  • JAVA_OPTS 变量,将 profiles 修改为 prod。
  • 添加 ENV 变量,值为 prod。

示例 Deployment:

[root@cp test-kustomize]# cat auth-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: authlabels:app: auth
spec:replicas: 1selector:matchLabels:app: authtemplate:metadata:labels:app: authspec:containers:- name: authimage: authenv: - name: JVM_OPTSvalue: -Xms512m -Xmx512m- name: JAVA_OPTSvalue: --spring.profiles.active=dev[root@cp test-kustomize]# cat admin-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: adminlabels:app: admin
spec:replicas: 1selector:matchLabels:app: admintemplate:metadata:labels:app: adminspec:containers:- name: adminimage: adminenv: - name: JVM_OPTSvalue: -Xms512m -Xmx512m- name: JAVA_OPTSvalue: --spring.profiles.active=dev

kustomization.yaml:

[root@cp test-kustomize]# cat kustomization.yaml
resources:
- auth-deploy.yaml
- admin-deploy.yamlpatchesJson6902:
- target:              # 匹配所有类型为 Deployment 的资源kind: Deploymentname: .*patch: |-- op: replacepath: /spec/template/spec/containers/0/env/0/valuevalue: -Xms1024m -Xmx1024m- op: replacepath: /spec/template/spec/containers/0/env/1/valuevalue: --spring.profiles.active=prod- op: addpath: /spec/template/spec/containers/0/env/-value: {"name":"ENV","value":"prod"}

验证:

[root@cp test-kustomize]# kubectl kustomize .
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: adminname: admin
spec:replicas: 1selector:matchLabels:app: admintemplate:metadata:labels:app: adminspec:containers:- env:- name: JVM_OPTSvalue: -Xms1024m -Xmx1024m- name: JAVA_OPTSvalue: --spring.profiles.active=prod- name: ENVvalue: prodimage: adminname: admin
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: authname: auth
spec:replicas: 1selector:matchLabels:app: authtemplate:metadata:labels:app: authspec:containers:- env:- name: JVM_OPTSvalue: -Xms1024m -Xmx1024m- name: JAVA_OPTSvalue: --spring.profiles.active=prod- name: ENVvalue: prodimage: authname: auth

4、添加容器

以上例的两个微服务为例,给它们添加一个 nginx 容器:
方式1:

[root@cp test-kustomize]# cat kustomization.yaml
resources:
- auth-deploy.yaml
- admin-deploy.yamlpatchesJson6902:
- target:kind: Deploymentname: .*patch: |-- op: addpath: /spec/template/spec/containers/-value: {"name":"nginx","image":"nginx:1.20"}[root@cp test-kustomize]# kubectl kustomize .
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: authname: auth
spec:replicas: 1selector:matchLabels:app: authtemplate:metadata:labels:app: authspec:containers:- env:- name: JVM_OPTSvalue: -Xms512m -Xmx512m- name: JAVA_OPTSvalue: --spring.profiles.active=devimage: authname: auth- image: nginx:1.20name: nginx
......

方式2,注意使用此方式添加容器,会将添加的容器排列在第一位:

[root@cp test-kustomize]# cat kustomization.yaml
resources:
- auth-deploy.yaml
- admin-deploy.yamlpatches:
- target:kind: Deploymentname: .*path: add_nginx_container.yaml
[root@cp test-kustomize]# cat add_nginx_container.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: add-nginx-container     # 这个名称无所谓,会作用到所有 Deployment
spec:template:spec:containers:- name: nginximage: nginx:1.20
[root@cp test-kustomize]# kubectl kustomize .
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: adminname: admin
spec:replicas: 1selector:matchLabels:app: admintemplate:metadata:labels:app: adminspec:containers:- image: nginx:1.20name: nginx- env:- name: JVM_OPTSvalue: -Xms512m -Xmx512m- name: JAVA_OPTSvalue: --spring.profiles.active=devimage: adminname: admin

kubernetes Kustomize相关推荐

  1. 使用 Kustomize 帮你管理 kubernetes 应用(二): Kustomize 的使用方法

    本文介绍使用和维护 Kustomize 的方法步骤. 定制配置 在这个工作流方式中,所有的配置文件( YAML 资源)都是用户所有,存在于私有 repo 中.其他人是无法使用的. 使用 git 创建一 ...

  2. 2021 年 Kubernetes 的开发者工具:Helm、Kustomize 和 Skaffold

    在过去的几年里,我们已经看到在 Kubernetes 生态中出现了大量工具实现更简单的软件开发(这是非常难得的).正如经常发生在不断发展的生态系统中的那样,一些工具会不断发展并适应,而另一些工具则会被 ...

  3. 关于 Kubernetes 中通过 Kustomize 定制 Yaml资源文件的一些笔记

    写在前面 分享一些 Kustomize 的笔记 博文内容涉及: Kustomize 的简单介绍 Kustomize 安装 Kustomize 生成资源yaml 文件 Demo 理解不足小伙伴帮忙指正 ...

  4. 关于Kubernetes 中通过 Kustomize 实现YAML资源文件组合与继承的一些笔记

    写在前面 分享一些通过Kustomize 实现YAML资源文件组合与继承的笔记 官方文档里叫做组织和定制,这里这么叫方便理解 博文内容基本为官网文档内容 理解不足小伙伴帮忙指正 傍晚时分,你坐在屋檐下 ...

  5. Kubernetes 应用编排神器 Kustomize 入门教程

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! Kustomize 是一个管理 Kubernetes 配置的开源管理工具.本文通过详细的案例,介绍了如何通过 Ku ...

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

    在系列上一篇文章 [用一个自己做的编程语言能做什么? (系列文章 1)] KCL - 让 Kubernetes 资源清单管理更容易 - 徐鹏飞Peefy的个人空间 - OSCHINA - 中文开源技术 ...

  7. 云原生(三十九) | Kubernetes篇之kustomize入门了解

    文章目录 kustomize入门了解 一.kustomize是什么 二.用法 1.文件结构 2.文件内容

  8. Kubernetes 1.14 版本发布:正式支持Windows 节点,持久化本地卷进入GA

    3月26日,Kubernetes 1.14版本正式发布. 1.14版本中,Kubernetes有31个增强功能:10个步入稳定,12个进入测试版,还有7个全新的功能. 其中一些主要的变化如下: 对Wi ...

  9. Kubernetes 必备工具:2021

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

最新文章

  1. android项目打包成apk
  2. mysql pid_mysql pid文件是什么用途
  3. intellij IDEA--- 报inspects a maven model for resolution problems
  4. java实现18位校验
  5. 江西单招主计算机学校,2019年江西单招学校,江西单招信息技术试题,2019江西单招综合素质...
  6. mysql ocp 题库部分解析
  7. FishC笔记—29 讲 文件:一个任务
  8. 逆向分析-010Editor
  9. html字体加粗怎么设置,css怎么设置字体加粗?
  10. C/C++打印百分号 %
  11. 360屏保广告彻底关闭教程
  12. DataBinding的使用之双向绑定
  13. sql解析中参数MAXOPENCURSORS, HOLD_CURSOR, and RELEASE_CURSOR 的解释
  14. 火狐浏览器历史版本下载
  15. 微信支付:商家转账到零钱的开发
  16. JsonParser、JsonParserFactory、JsonLocation源码翻译
  17. NeoKylin文件移动和复制
  18. 使用clair镜像扫描
  19. win8经典开始菜单计算机,win8开始菜单,教您Win8系统如何恢复经典开始菜单
  20. 基于PHP+mysql的社区人口管理系统的设计与实现

热门文章

  1. JavaScript——运算符的全面解析
  2. c语言中abs()和fabs()的区别点整理
  3. 我在哈佛辅导过桑德伯格(facebook 二号人物): 她让我明白我们误解了美国的精英教育
  4. CAD二次开发C#01
  5. jar通用shell启停脚本
  6. 苹果手机android在哪里设置默认浏览器,ios14怎么设置默认浏览器?苹果在哪里设置默认浏览器...
  7. 从客户端(hidXML=FlexCell xml:space=...)中检测到有潜在危险的Request.Form值
  8. 使用React-Router时出现的错误
  9. 先有操作系统,还是先有汇编器?
  10. python 用*绘制菱形