简介
kustomize 是基于目录,使用 Base + Overlay 的方式对应用的原始 YAML 进行派生,功能简单清晰,kubectl 直接支持。
helm
Helm 使用 Go Template 对应用部署所需的 YAML 进行抽象,形成应用部署模板,在需要进行部署时,可以编写 yaml 为模板中的变量进行赋值,也可以在 Helm CLI 的命令行中使用 –set name=value 的方式来对简单变量进行赋值,完成赋值之后,可以选择使用 helm template 指令将 Chart + Value 的组合渲染成为 YAML 供 kubectl 使用,也可以使用 helm install 直接通过 Tiller 进行安装
对比
对比 kustomize 简洁,helm 则提供更多的功能,如:
- chart 包的管理,类似应用市场的概念。
- 直接和 k8s apiserver 交互,提供应用生命周期管理
但同时也带来了更复杂的架构,比如服务端进程 tiller 提供和 k8s 的交互,Repository 存储 Helm Chart 的仓库。给我们的感觉是对标于类似 yum,apt 和 brew 之类的管理系统。
因此如果用户的目的只是做 yaml 文件的渲染,不想为此花费更多的时间和精力,比较适合使用 kustomize。如果是管理严谨的大型公开项目,可能 helm 更合适。
部署
部署比较简单,下载对应的 release 版本,授权运行即可。
https://github.com/kubernetes…
使用
kustomize 是基于目录进行 yaml 文件管理和派生的。
应用的多环境部署
应用部署在不同环境配置是有不同的,查看 kustomize 目录结构:
[root@master01 kustomize]# tree helloWorld/
helloWorld/
├── base
│ ├── configMap.yaml
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── production
│ └── staging
│ ├── kustomization.yaml
│ └── deplyment.yaml
└── staging
├── kustomization.yaml
└── map.yaml
5 directories, 8 files
base 目录是项目的基础 yaml 文件,overlay 中的目录 staging,production 在 base 的基础上,生成不同环境的应用部署 yaml 文件。
base
渲染出 yaml 文件
[root@master01 helloWorld]# kustomize build base/
apiVersion: v1
data:
altGreeting: Good Morning!
enableRisky: "false"
kind: ConfigMap
metadata:
labels:
app: hello
name: the-map
---
apiVersion: v1
kind: Service
metadata:
labels:
app: hello
name: the-service
部署
kustomize build base/ | kubectl apply -f –
staging
staging 环境在 base 的基础上,做一些修改
kustomization.yaml
[root@master01 staging]# cat kustomization.yaml
namePrefix: staging-
commonLabels:
variant: staging
org: acmeCorporation
commonAnnotations:
note: Hello, I am staging!
resources:
- ../../base
patchesStrategicMerge: # 这里意思是我们要把 base 里的 configmap 用下面的 configmap overlay 一下
- map.yaml
map.yaml
[root@master01 staging]# cat map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: the-map
data:
altGreeting: "Have a pineapple!"
enableRisky: "true"
渲染后的 staging 环境功能 yaml 文件如下:
[root@master01 helloWorld]# kustomize build overlays/staging/
apiVersion: v1
data:
altGreeting: Have a pineapple! # 对 base 中 configmap 进行了覆盖
enableRisky: "true"
kind: ConfigMap
metadata:
annotations: # kustomize 中定义的 commonAnnotations
note: Hello, I am staging!
labels: # kustomize 中定义的 commonLabels
app: hello
org: acmeCorporation
variant: staging
name: staging-the-map # kustomize 中定义的 namePrefix
---
apiVersion: v1
kind: Service
metadata:
annotations:
note: Hello, I am staging!
labels:
app: hello
org: acmeCorporation
variant: staging
name: staging-the-service
spec:
···
ci/cd
另一个常见的使用场景是在 ci/cd 中,需要根据项目的 tag,修改应用部署的镜像。
此时可以通过 kustomize 提供的命令 kustomize edit set image
,来方便的修改。
kustomize edit set image alpine=quay.io/datawire/ambassador:0.85.0
[root@master01 staging]# cat kustomization.yaml
namePrefix: staging-
commonLabels:
org: acmeCorporation
variant: staging
commonAnnotations:
note: Hello, I am staging!
resources:
- ../../base
patchesStrategicMerge:
- map.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images: # 此处为增加的 image 设置
- name: alpine
newName: quay.io/datawire/ambassador
newTag: 0.85.0
渲染后的文件
[root@master01 overlays]# kustomize build staging/
···
env:
- name: ENABLE_RISKY
valueFrom:
configMapKeyRef:
key: enableRisky
name: staging-the-map
image: quay.io/datawire/ambassador:0.85.0 # image 已修改
name: the-container
ports:
- containerPort: 8080