云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize
前言
相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubectl 1.14以来早已内置到其中,说明官方对其很认可。
我认为还是Helm 参数化模板方式来自定义配置需要学习复杂的DSL语法,难上手,易出错,而 kustomize 是使用 Kubernetes 原生概念帮助用户创作并复用声明式配置。
认识 Kustomize
安装
brew install kustomize示例解析
demo-manifests
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ ├── service-account.yaml
│ └── service.yaml
└── services
├── demo-app
│ ├── _common
│ │ ├── deployment-patch.yaml
│ │ ├── kustomization.yaml
│ │ └── namespace.yaml
│ ├── dev
│ │ ├── config.json
│ │ ├── deployment-patch.yaml
│ │ └── kustomization.yaml
│ ├── staging
│ │ ├── config.json
│ │ ├── deployment-patch.yaml
│ │ └── kustomization.yaml
│ └── prod
│ │ ├── config.json
│ │ ├── deployment-patch.yaml
│ │ └── kustomization.yaml
└── demo-app2
└── xxx
先看base 目录,有几个常见的deployment/service/service-account YAML 资源文件
还有个 kustomization.yaml 配置文件
这里面包含了刚才的几个resource文件以及要应用于它们的一些自定义,如添加一个通用的标签Common Labels
这时候也可以通过 kustomize build 命令来生成完整的YAML进行查看
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文件如下
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../../base
- namespace.yaml
patchesStrategicMerge:
- deployment-patch.yaml
我这个demo-app 需要configMap,另外心跳接口也不一样, 所以 deployment-patch.yaml 需要写出这些不一样的,然后去覆盖base中的。

apiVersion: apps/v1
kind: Deployment
metadata:
name: NAME_PLACEHOLDER
spec:
template:
spec:
serviceAccountName: NAME_PLACEHOLDER
containers:
- name: app
image: wadexu007/demo:IMG_TAG_PLACEHOLDER
livenessProbe:
failureThreshold: 5
httpGet:
path: /pizzas
port: 8080
initialDelaySeconds: 10
periodSeconds: 40
timeoutSeconds: 1
readinessProbe:
failureThreshold: 5
httpGet:
path: /pizzas
port: 8080
initialDelaySeconds: 10
periodSeconds: 20
timeoutSeconds: 1
volumeMounts:
- name: config-volume
mountPath: /app/conf/config.json
subPath: config.json
volumes:
- name: config-volume
configMap:
name: demo-app-config
deployment-patch.yaml

---
apiVersion: v1
kind: Namespace
metadata:
name: demo
namespace.yaml
### 文章首发于博客园 https://www.cnblogs.com/wade-xu/p/16839829.html
最后我们看 dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../_common
namespace: demo
commonLabels:
app: demo-app
replicas:
- count: 1
name: demo-app
configMapGenerator:
- files:
- config.json
name: demo-app-config
patches:
- patch: |-
- op: replace
path: /metadata/name
value: demo-app
target:
name: NAME_PLACEHOLDER
patchesStrategicMerge:
- deployment-patch.yaml
images:
- name: wadexu007/demo
newTag: 1.0.0
dev env 里面将replicas设置成1, 用config.json 生成 configMap

{
"SOME_CONFIG": "/demo/path"
}
config.json
deployment-patch.yaml 里面也将container resource request/limit 配置设置小一点, 采用 patchesStrategicMerge 与 common 和 base里面的deployment资源合并。

apiVersion: apps/v1
kind: Deployment
metadata:
name: NAME_PLACEHOLDER
spec:
template:
spec:
containers:
- name: app
resources:
limits:
cpu: 1
memory: 1Gi
requests:
cpu: 200m
memory: 256Mi
deployment-patch.yaml
另外还采用了 patch 的方式,改了每个资源的name --> demo-app
以及images 替换了原来的 image name and tag.
kustomize 命令如下
kustomize build demo-manifests/services/demo-app/dev > demo-app.yaml
如果用 kubectl 命令的话,示例如下
kubectl kustomize services/demo-app/dev/ > demo-app.yaml
最终结果

apiVersion: v1
kind: Namespace
metadata:
labels:
app: demo-app
name: demo
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: demo-app
managed-by: Kustomize
name: demo-app
namespace: demo
---
apiVersion: v1
data:
config.json: |-
{
"SOME_CONFIG": "/demo/path"
}
kind: ConfigMap
metadata:
labels:
app: demo-app
name: demo-app-config-t7c64mbtt2
namespace: demo
---
apiVersion: v1
kind: Service
metadata:
labels:
app: demo-app
managed-by: Kustomize
name: demo-app
namespace: demo
spec:
ports:
- port: 8080
protocol: TCP
targetPort: http
selector:
app: demo-app
managed-by: Kustomize
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: demo-app
managed-by: Kustomize
name: demo-app
namespace: demo
spec:
replicas: 1
selector:
matchLabels:
app: demo-app
managed-by: Kustomize
template:
metadata:
labels:
app: demo-app
managed-by: Kustomize
spec:
containers:
- image: wadexu007/demo:1.0.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 5
httpGet:
path: /pizzas
port: 8080
initialDelaySeconds: 10
periodSeconds: 40
timeoutSeconds: 1
name: app
ports:
- containerPort: 8080
name: http
readinessProbe:
failureThreshold: 5
httpGet:
path: /pizzas
port: 8080
initialDelaySeconds: 10
periodSeconds: 20
timeoutSeconds: 1
resources:
limits:
cpu: 1
memory: 1Gi
requests:
cpu: 200m
memory: 256Mi
securityContext:
allowPrivilegeEscalation: false
volumeMounts:
- mountPath: /app/conf/config.json
name: config-volume
subPath: config.json
serviceAccountName: demo-app
volumes:
- configMap:
name: demo-app-config-t7c64mbtt2
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 有自己一套体系来管理应用,而 kustomize 更轻量级,也更灵活。另外,Kustomize也有 Terraform provider 通过TF来安装。
云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize的更多相关文章
- 云原生之旅 - 8)云原生时代的网关 Ingress Nginx
前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...
- 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents
前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...
- 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress
前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...
- 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm
前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...
- 云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis
前言 前面有几篇文章讲述了如何使用Terraform创建资源 (基础设施即代码 Terraform 快速入门, 使用 Terraform 创建 Kubernetes) 以及 Kubernetes时代的 ...
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...
- 云原生之旅 - 2)Docker 容器化你的应用
前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...
- 云原生之旅 - 4)基础设施即代码 使用 Terraform 创建 Kubernetes
前言 上一篇文章我们已经简单的入门Terraform, 本篇介绍如何使用Terraform在GCP和AWS 创建Kubernetes 资源. Kubernetes 在云原生时代的重要性不言而喻,等于这 ...
- 云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code
前言 工欲善其事,必先利其器.本篇文章我们介绍下 Terraform,为后续创建各种云资源做准备,比如Kubernetes 关键词:IaC, Infrastructure as Code, Terra ...
随机推荐
- Redis入门到实战
一.Redis基础 Redis所有的命令都可以去官方网站查看 1.基本命令 keys * 查找所有符合给定模式pattern(正则表达式)的 key .可以进行模糊匹配 del key1,key2,. ...
- SpringBoot 注解简介(持续更新)
虽然工作中交替会使用spring mvc 和spring boot 框架,但实际对spring中的很多注解并不是很了解,本篇将持续更新学习到的spring 注解. Spring 主入口类上的注解 Sp ...
- laravel框架(完整上传到数据库,不提交图片)(以提交员工信息为例)
第一步:使用PHP终端创建一个名为blog的框架 composer create-project --prefer-dist laravel/laravel blog 7.x 创建好之后,在框架中找到 ...
- idea中设置注释颜色
1. 打开idea,右上角File-->Settings 2.找到Language Defaults-->Comments里面Block comment和Line comment 3.Bl ...
- KingbaseES R6 集群repmgr.conf参数'recovery'测试案例(一)
KingbaseES R6集群repmgr.conf参数'recovery'测试案例(一) 案例说明: 在KingbaseES R6集群中,主库节点出现宕机(如重启或关机),会产生主备切换,但是当主库 ...
- 部署Zabbix4.0和Grafana
部署Zabbix4.0和Grafana 一.Zabbix 1.安装 rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-r ...
- SpringBoot使用libreoffice转换PDF
1.简介 有时候我们需要在程序中使用到office的转换和预览功能,本文就针对这个需求记录了较为简单的office转换和功能:jodconverter.当然也有aspose和其他开源第三方(kkfil ...
- 【java8新特性】02:常见的函数式接口
Jdk8提供的函数式接口都在java.util.function包下,Jdk8的函数式类型的接口都有@FunctionInterface注解所标注,但实际上即使没有该注解标注的有且只有一个抽象方法的接 ...
- Django 使用Pycharm 创建工程
一.Pycharm 创建Django 工程 事实上,我们一般不使用命令行,而是直接在Pycharm 中创建Django 项目. Pycharm 是进行Django 开发的最佳 IDE,请大家自行安装, ...
- 内网横向渗透 之 ATT&CK系列一 之 信息收集
前言 靶机下载地址:ATT&CK 拓扑图: 通过模拟真实环境搭建的漏洞靶场,完全模拟ATK&CK攻击链路进行搭建,形成完整个闭环.虚拟机默认密码为hongrisec@2019. 环境搭 ...