一,简介

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 -

最新文章

  1. mybatis 使用经验小结
  2. Linux 命令积累
  3. deepin linux 安装 mysql
  4. 【自然框架】终于把源码弄到git上了。
  5. linux安装jdk 不成功,找不到版本问题
  6. apache安装错误error: APR not found解决办法
  7. 缺少索引导致的服务器和MYSQL故障。
  8. 使用注解方式定义和配置aop
  9. Android Studio安装genymotion模拟器
  10. 内存泄露(OOM)现象及举例
  11. Lists
  12. Sql传参含有单引号
  13. J2EE 读取文件路径
  14. Servlet上传文件
  15. 转:iOS程序main函数之前发生了什么
  16. hibernate:There is a cycle in the hierarchy! 造成死循环解决办法
  17. .NET 开源项目 Anet 介绍
  18. c/c++ 图的创建(二维数组法)
  19. 51nod 1232 完美数
  20. 【WordCount】实现(重做)

热门文章

  1. [LeetCode] 47. Permutations II 全排列之二
  2. java8之行为参数化
  3. python 编码(encode)解码(decode)问题
  4. Intellij插件之MavenHelper
  5. asp.net core 2.1 容器中使用 System.Drawing.Common 的问题
  6. Serverless 与容器决战在即?有了弹性伸缩就不一样了
  7. fiddler抓包-2-5分钟学会手机端抓包
  8. 机器学习之Artificial Neural Networks
  9. Prometheus 一条告警的触发流程、等待时间
  10. 【java】Java多线程总结之线程安全队列Queue【转载】