一,简介
kustomize是sig-cli的一个子项目,它的设计目的是给kubernetes的用户提供一种可以重复使用同一套配置的声明式应用管理,从而在配置工作中用户只需要管理和维护kubernetes的API对象,而不需要学习或安装其它的配置管理工具,也不需要通过复制粘贴来得到新的环境的配置。
当我们运行一个kubernetes环境的时候,我们需要一些含有API对象的YAML文件,这些文件中规定了要部署什么样的应用,需要多少份副本,开辟多大的存储空间,分配多少内存和CPU等信息。通过修改这些YAML文件的内容我们可以对这些信息进行相应的改动,比如我们需要增加一个副本,就需要修改对应YAML文件的replica数值;如果我们需要部署最新版本的docker镜像,就需要修改对应YAML文件中的docker镜像的版本或标签。我们可以把所有这些为了满足需求而进行的修改成为自定义kubernetes的配置。
在我们开发一个微服务架构的应用的过程中,我们会创建一些YAML文件来部署一个开发的环境,在这个环境下,我们需要进行各种测试。一旦所有的测试达到了我们的预期,我们就会把这个应用部署到生产环境。因为我们已经有了一套开发环境的配置,我们可以通过复制这些配置,再进行生产环境下的自定义,就可以得倒一套用于生产环境的配置。
然而这种方法的可扩展性并不好,当我们的微服务数量很多或者环境数量很多时,我们就有许多套的配置,这些配置只有细微的差别,而在很大程度上都一样。当我们对配置进行改动或者升级的时候,就非常容易漏掉一些改动或者实施了额外的甚至是错误的改动。我们来看两个简单的例子。
假如我们有一个应用,我们已经把它部署在十个不同的环境中,每一个环境的配置都是通过复制,粘贴和修改得到的。每个环境中所运行的应用版本号都是1.0,现在我们想把所有环境中的版本号升级到2.0。我们就需要修改对应每一个环境下该应用的版本号。这不是一个复杂的改动,我们可以对每一个环境依次进行修改,所有的改动很快就可以完成。但是在这个过程中我们很有可能只修改了其中的九个环境而漏掉了一个;我们也很有可能把其中一个版本号改成2,0。
我们再来看另外一个例子。在小王通过复制,粘贴和修改所得到的一个配置中,小李是没有办法区分哪些值是保持不变,而哪些值是被修改过的。当小李想要修改这个新的配置时,他不知道哪些可以安全地改动而那些可能会影响的当前环境的正确运行。
kustomize允许用户将不同环境所共享的配置放在一个文件目录下,而将其他不同的配置放在另外的目录下。这样用户就可以很容易的区分那些值是当前环境所特有的,从而在修改的时候会额外关注。kustomize可以非常好地解决这些问题。
二,安装
就是下载二进制文件,然后,加上可执行权限。方便点的话,就放入/usr/local/bin
opsys=linux # or darwin, or windows curl -s https://api.github.com/repos/kubernetes-sigs/kustomize/releases/latest |\ grep browser_download |\ grep $opsys |\ cut -d '"' -f 4 |\ xargs curl -O -L mv kustomize_*_${opsys}_amd64 kustomize chmod u+x kustomize |
我就放在了普通目录下
三,Demo
参考URL:https://github.com/kubernetes-sigs/kustomize
Kustom-nginx下面三个文件,kustomization.yaml,deployment.yaml,service.yaml
kustomization.yaml
commonLabels: app: mynginx resources: - deployment.yaml - service.yaml #configMapGenerator: #- name: nginx-map # files: # - env.startup.txt |
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx:stable imagePullPolicy: IfNotPresent ports: - containerPort: 80 |
service.yaml
apiVersion: v1 kind: Service metadata: name: nginx-service-nodeport spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: name: nginx |
运行命令
./kustomize build ./kustom-nginx/ |
输出合成后的yaml内容
apiVersion: v1 kind: Service metadata: labels: app: mynginx name: nginx-service-nodeport spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: mynginx name: nginx type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: mynginx name: nginx spec: replicas: 1 selector: matchLabels: app: mynginx name: nginx template: metadata: labels: app: mynginx name: nginx spec: containers: - image: nginx:stable imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 |
如果要将输出直接发送到k8s集群运行,则可使用Linux管道命令实现:
./kustomize build ./kustom-nginx | kubectl apply -f - |