使用 Kustomize 配置 Kubernetes 应用
如果你经常使用 Kubernetes,那么你肯定就有定制资源清单文件的需求,但是貌似现在大家都比较喜欢使用 Helm,Helm 很好用,但也有很多缺点,比如需要一个 tiller 服务端,需要超高的权限,最重要的是如果你要想自己做一个 Helm Chart 包的话,则不是那么容易的,需要你了解一些 go template 的相关知识,它抛弃了我们在 Docker 和 Kubernetes 上面学到的一些逻辑,今天我们将为大家介绍另外一种名为Kustomize❤️的替代工具。
实际上 Kustomize
并不是一个新的工具,而且现在已经被集成在了 kubectl 1.14 版本的子命令中了,是不是非常方便了,免去了安装第三方工具的麻烦,因为 kubectl 工具基本上是我们天天都在使用的,所以……你可以把 Helm 命令扔掉了😉。
Kustomize 和 Kubernetes
一样,它完全就是声明式的,你说你想要什么,系统就提供给你什么,不需要遵循命令方式来描述你希望构建的对象。
其次,它和 Docker 比较类似,有很多层组成,每个层都是修改以前的层,正因为有这个理念存在,所以我们可以不断在其他人至上写东西,而不会增加配置的复杂性,构建的最终结果由基础部分和你在上面配置的其他层组成。
最后,和 Git 一样,你可以使用一个远程的基础配置作为最原始的配置,然后在该基础上添加一些自定义的配置。
安装
对于 🍎Mac 用户来说,你可以使用 brew 工具来直接安装
$ brew install kustomize
当然如果你使用的是其他操作系统,那么就可以直接从 Release 页面上面下载二进制文件然后添到 PATH 路径下面即可。当然如果你愿意也可以从源码中直接构建,代码仓库:https://github.com/Kubernetes-sigs/kustomize
基础模板
要使用 Kustomize,你需要有一个原始的 yaml 文件来描述你想要部署到集群中的任何资源,我们这里将这些 base 文件存储在./k8s/base/
文件夹下面。
这些文件我们永远不会直接访问,我们将在它们上面添加一些自定义的配置来创建新的资源定义。
你可以在任何时间点使用kubectl apply -f ./k8s/base/
命令来构建基础模板。
下面例子中,我们将使用 Service 和 Deployment
资源对象为例进行说明。下面定义两个资源清单文件: service.yaml 定义如下:
apiVersion: v1
kind: Service
metadata:
name: sl-demo-app
spec:
ports:
- name: http
port: 8080
selector:
app: sl-demo-app
deployment.yaml 定义如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sl-demo-app
spec:
selector:
matchLabels:
app: sl-demo-app
template:
metadata:
labels:
app: sl-demo-app
spec:
containers:
- name: app
image: foo/bar:latest
ports:
- name: http
containerPort: 8080
protocol: TCP
然后在当前文件夹下面添加一个名为kustomization.yaml的文件:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- service.yaml
- deployment.yaml
这个文件将是你的基础配置文件,它描述了你使用的资源文件。
当你运行kubectl apply -f ./k8s/base/
命令时,该kustomization.yaml
文件可能会出现一些错误,你可以添加参数--validate=false
进行校验,当然也可以不针对整个文件夹运行该命令。
要将基础模板中的资源安装到你的集群中,只需要执行以下命令即可:
$ kubectl apply -k k8s/base
service/sl-demo-app created
deployment.apps/sl-demo-app created
为了了解将安装什么资源到集群中,我们在本文中主要使用kustomize build
命令来代替kubectl apply -k
命令。当然使用kubectl kustomize命令
也是可以的,因为我们说了 kubectl 1.14 版本以后就已经集成了kustomize
。
使用kustomize build
命令运行后的结果如下所示,我们会看到两个文件连接在一起:
$ kustomize build k8s/base
apiVersion: v1
kind: Service
metadata:
name: sl-demo-app
spec:
ports:
- name: http
port: 8080
selector:
app: sl-demo-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sl-demo-app
spec:
selector:
matchLabels:
app: sl-demo-app
template:
metadata:
labels:
app: sl-demo-app
spec:
containers:
- image: foo/bar:latest
name: app
ports:
- containerPort: 8080
name: http
protocol: TCP
定制
现在我们想要针对一些特定场景进行定制,比如,针对生产环境和测试环境需要由不同的配置。我们这里并不会涵盖 Kustomize
的整个功能集,而是作为一个标准示例,向你展示这个工具背后的哲学。
首先我们创建一个新的文件夹,其中包含一个名为kustomzization.yaml
的文件,文件内容如下:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
当前文件夹下面的目录结构如下所示:
$ tree
.
└── k8s
├── base
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
└── prod
└── kustomization.yaml
如果现在我们构建这个文件,将会看到和之前构建 base 目录一样的结果:
$ kustomzie build k8s/overlays/prod
apiVersion: v1
kind