【前置文章】
【环境】
- MacOS
- minikube version: v1.25.2
1. kustomize是什么?
官网:https://kustomize.io/
如果了解Helm的话,两者在工作上有相似的地方,都是为了更好的管理yaml配置文件,kustomize也是用一种template模板的来更好的生成kubernetes配置文件。
- 它可以单独安装,比如MacOS系统中可以使用
brew install kustomize
来安装。 - 在kubectl 1.14后也内置支持了kustomize。
可以在官网上查看相关介绍:https://kubernetes.io/docs/tasks/manage-kubernetes-objects/kustomization/
2. 示例
网上找的一个很好的demo:https://github.com/gbaeke/realtimeapp-infra
![](https://img.haomeiwen.com/i15522532/44a0f29dd891a685.png)
2.1 可以看到在bases目录下面,有诸多yaml文件:
-
namespace.yaml
:定义了namespace=myns -
realtime.yaml
:定义了image为gbaeke/flux-rt
的Deployment资源,其中有一些env动态传入,如:$(REDISSERVICE).$(REDISNAMESPACE):6379
,还定义了类型为LoadBalancer的Service。 -
redis.yaml
:定义了image为redis:4-32bit
的Deployment资源,还定义了一个默认type的Service(即ClusterIP类型)。 -
kustomization.yaml
文件。
以下是kustomization.yaml文件的定义:
可以看出resources为上述列的两个,即:realtime.yaml
, redis.yaml
,除此之前还定义了变量:REDISSERVICE
, REDISNAMESPACE
:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- realtime.yaml
- redis.yaml
vars:
- name: REDISSERVICE
objref:
kind: Service
name: redis
apiVersion: v1
- name: REDISNAMESPACE
objref:
kind: Service
name: redis
apiVersion: v1
fieldref:
fieldpath: metadata.namespace
2.2 overlays目录
除了bases目录,还有另外一个目录,叫overlays,里面有两个文件夹,从名字上也能看出来,是区分了不同的环境,这也是为什么要用kustomize的主要原因,不然我们针对不同环境的配置,很难通过传统的简单的几个deployment.yaml, service.yaml来管理:
![](https://img.haomeiwen.com/i15522532/98b4f57212dae752.png)
![](https://img.haomeiwen.com/i15522532/380475252a3737e7.png)
![](https://img.haomeiwen.com/i15522532/6f367009aeb4bedc.png)
overlays/dev目录下的kustomization.yaml文件:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: realtime-dev
nameSuffix: -dev
resources:
- ../../bases/realtimeapp
- namespace.yaml
transformers:
- labels.yaml
replicas:
- count: 1
name: realtime
images:
- name: gbaeke/flux-rt
newTag: sha-11e921f
2.3 clone到本地,开始部署
转到【overlays/dev目录】下,运行:
可以看到输出了kubernetes yaml模版,labels也加上了,name也加上了环境:kubectl kustomize
![](https://img.haomeiwen.com/i15522532/88939dc159195f1c.png)
![](https://img.haomeiwen.com/i15522532/ba3a133179dc2940.png)
【那么它是如何映射的呢?】
首先,我们运行的是dev目录下的kustomization.yaml文件,它的resources是bases/realtimeapp下(会自动找kustomization.yaml文件),即会把bases下的定义都给load进来:
![](https://img.haomeiwen.com/i15522532/bbc81925ff725a22.png)
【相当于bases目录下的kustomization.yaml是基础模版,然后overlays的dev下的文件,会重写】
而nameSuffix定义的是后缀名,所以我们看到通过kubectl kustomize
输出的最终模板里,加了-dev的后缀名。
在dev中我们重写了replica的数量,所以在最终输出的时候,realtime replica并不是bases中定义的2,而是overlays中的1。
整个过程如下:
![](https://img.haomeiwen.com/i15522532/16596a2a2fde8527.png)
网友评论