云原生之旅 - 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 ...
随机推荐
- 【Go实战基础】创建并完成第一个可执行的 go 程序
实战需求:创建并完成第一个可执行的 go 程序.项目目录:go-001具体实战步骤如下: 一.进入工程目录 cd go-001/ 二. 创建 g001.go 文件 /* * @Author: 菜鸟实战 ...
- 部署k8s的heapster监控
Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS heapster监控目前官网已经不更新,部署学习使用 heapster: 收集监控数据 influxdb:数 ...
- pod资源的健康检查-liveness探针的exec使用
使用探针的方式对pod资源健康检查 探针的种类 livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器 readinessProbe:可用性检查,周期性检查服务是否 ...
- MQ系列5:RocketMQ消息的发送模式
MQ系列1:消息中间件执行原理 MQ系列2:消息中间件的技术选型 MQ系列3:RocketMQ 架构分析 MQ系列4:NameServer 原理解析 在之前的篇章中,我们学习了RocketMQ的原理, ...
- 踩坑 Windows 服务来宿主 .NET 程序
本文所指的 .NET 程序为 .NET6 的程序.因为 .NET 的版本更新很快,所以方式.方法也有变化,所以网上搜到的方法有些也过时了.以下是最近我实践下来的一点心得(坑). 上一篇说到 不安装运行 ...
- 【android 逆向】破解crackme0502
1.首先将crackme0502 拖入模拟器.打开应用,随意输出字符串 2. 将APK 拖入AndroidKiller 反编译 3.先查看androidmanifest.xml <?xml ve ...
- vivo 全球商城:电商平台通用取货码设计
vivo官网商城开发团队 - Zhou Longjian 一.背景 随着O2O线上线下业务的不断扩展,电商平台也在逐步完善交易侧相关的产品功能.在最近的需求版本中,业务方为进一步提升用户的使用体验,规 ...
- 部署Netlify站点博客
Netlify站点部署静态博客 今天尝试把站点部署在Netlify上,因为部署在GitHub Pages上,国内访问速度太慢了,所以就尝试一下别的站点,部署成功之后发现速度还是不太行,后边继续找找原因 ...
- Python数据科学手册-Numpy数组的计算:广播
广播可以简单理解为用于不同大小数组的二元通用函数(加减乘等)的一组规则 二元运算符是对相应元素逐个计算 广播允许这些二元运算符可以用于不同大小的数组 更高维度的数组 更复杂的情况,对俩个数组的同时广播 ...
- Centos7.6内核升级
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483766&idx=1&sn=4750fd4e ...