kubernetes kustomize 初体验

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可以非常好地解决这些问题。

重要概念

kustomization:kustomization.yaml文件,一个含有kustomization.yaml的目录可以运行 kustomize build。kustomization.yaml的一个例子如下

bases:
-  /config/myapp1/base
-  /config/myapp2/base
resources:
- service.yaml
- deployment.yaml
patches:
- patch.yaml
namePrefix: my-

base:含有一个kustomization.yaml文件的目录,可以被其他的kustomization.yaml来引用
resource:文件路径,指向一个声明了kubernetes API对象的YAML文件
patch: 文件路径,指向一个声明了kubernetes API patch的YAML文件
variant: 含有同一组bases的不同kustomization

安装

你可以通过如下两种不同方式来安装kustomize, kustomize只包含有一个二进制可执行文件,所以可以非常容易地安装和使用。

下载压缩包,kustomize提供Linux,Darwin,和windows三个版本的压缩包。

如果你的Go的版本在1.10.1以上,你可以通过 go get来直接安装

go get github.com/kubernetes-sigs/kustomize

使用

Kustomize 命令行包含build, diff, edit, version,help等子命令,其中最常使用的是build子命令。

kustomize --help
kustomize manages declarative configuration of Kubernetes.
See https://github.com/kubernetes-sigs/kustomize
Usage:
  kustomize [command]
Available Commands:
  build       Print current configuration per contents of kustomization.yaml
  diff        diff between customized resources and uncustomized resources
  edit        Edits a kustomization file
  help        Help about any command
  version     Prints the kustomize vers\

下面我们来用kustomize连建立一个LDAP的base和用于开发环境与生产环境的两个不同的variants。
首先我们来创建一个工作空间,用来存储base和两个不同的variants。

DEMO_HOME=$(mktemp -d)
BASE=$DEMO_HOME/base
mkdir -p $BASE
OVERLAYS=$DEMO_HOME/overlays
mkdir -p $OVERLAYS/dev
mkdir -p $OVERLAYS/production

创建base

我们从kustomize的repo中下载一些YAML文件到base目录

CONTENT="https://raw.githubusercontent.com\
/kubernetes-sigs/kustomize\
/master/examples/ldap"

curl -s -o "$BASE/#1" "$CONTENT/base\
/{deployment.yaml,kustomization.yaml,service.yaml,env.startup.txt}"

现在base目录包含如下的文件

/tmp/tmp.IyYQQlHaJP
└── base
    ├── deployment.yaml
    ├── env.startup.txt
    ├── kustomization.yaml
    └── service.yaml

其中的自定义文件kustomization.yaml包含如下内容

resources:
-deployment.yaml
-service.yaml
configmapGenerator:
-name: ldap-configmap
 files:
  -env.startup.txt

从这个内容上可以看出这个配置包含一个deployment的对象,一个service对象和一个configmap的对象,configmap的数据是从文件env.startup.txt中读取。我们可以运行如下kustomize命令来看完整的配置
Kustomize build $BASE
我们还可以通过如下命令来部署这个base环境到kubernertes集群上
Kustomize build $BASE | kubectl apply -f -
下面我们将两个适用于不同环境的自定义,这两个自定义都是基于同一个base。

创建开发环境的自定义

下载开发环境对应的布丁及文件

curl -s -o “$OVERLAYS/dev/#1” “$CONTENT/overlays/staging\
/{config.env,deployment.yaml,kustomization.yaml}”

开发环境的dev目录包含如下文件

/tmp/tmp.IyYQQlHaJP
└── overlays
    └── dev
        ├── config.env
        ├── deployment.yaml
        └── kustomization.yaml

这里的kustomization.yaml文件包含如下内容

bases:
- ../../base
patches:
- deployment.yaml
nameprefix: dev-
configmapGenerator:
- name: env-config
  files:
     config.env

这个自定义是在base的基础上添加一个名字前缀,添加了一个configmap,并且还通过补丁修改了deployment对象,这里进行的改动是将副本增加到2个

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: ldap
spec:
  replicas: 2

我们可以运行如下kustomize命令来看完整的开发环境的配置
kustomize build $OVERLAYS/dev
我们还可以通过如下命令来将这个开发环境部署到kubernertes集群上
kustomize build $OVERLAYS/dev | kubectl apply -f -

创建生产环境的自定义

下载生产环境对应的补丁及文件

curl -s -o "$OVERLAYS/production/#1" "$CONTENT/overlays/production\
/{deployment.yaml,kustomization.yaml}"

生产环境的production目录包含如下文件

/tmp/tmp.IyYQQlHaJP1
└── overlays
    ├── production
        ├── deployment.yaml
        └── kustomization.yaml

这里的kustomization.yaml文件包含如下内容

bases:
- ../../base
patches:
- deployment.yaml
namePrefix: production-

这里的自定义是在base的基础上添加一个名字前缀,并且通过补丁修改了deployment对象,所进行的改动有两个: 将副本增加到6个; 添加了一个持久存储

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: ldap
spec:
  replicas: 6
  template:
    spec:
      volumes:
        - name: ldap-data
          emptyDir: null
          gcePersistentDisk:
            pdName: ldap-persistent-storage

类似的,我们可以运行如下kustomize命令来看完整的生产环境的配置
kustomize build $OVERLAYS/production
我们还可以通过如下命令来将这个生产环境部署到kubernertes集群上
kustomize build $OVERLAYS/production | kubectl apply -f -

比较不同环境

我们还可以通过 kustomize build 来比较不同环境下的配置,命令如下

diff \ 
 <(kustomize build $OVERLAYS/dev) \ 
 <(kustomize build $OVERLAYS/production) |\ 
 more

我们将看到如下输出

(...truncated)
<   name: dev-ldap-configmap-kftftt474h
---
>   name: production-ldap-configmap-k27f7hkg4f
85c75
<   name: dev-ldap-service
---
>   name: production-ldap-service
97c87
<   name: dev-ldap
---
>   name: production-ldap
99c89
<   replicas: 2
---

参考资料

introducing-kustomize-template-free-configuration-customization-for-kubernetes
github.com/kubernetes-sigs/kustomize

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 前段时间双休和疯魔了一样,整天都是看布袋戏,所以进度推得也还算可以。 昨天晚上刚放下手机的时候一直在想我可以写一下...
    玩千机伞的散人阅读 1,069评论 6 1
  • 【镜】 醉朱颜,褪红妆,好似丹青屏障。 挂明镜,照面殇,叹息容颜凄凉。 偶尔涌上心头的话语,把它编制成美丽的彩...
    沈汏婠人阅读 369评论 0 1
  • 1、一所没有围墙和课程的学校 2、一群人按约定在同一时间同一地点做同一件事,不管是为了什么,我总觉得是可怕的。 3...
    好吗先生阅读 275评论 0 0
  • 这次芬兰之行最让我遗憾的就是没有穿一件红色的衣服和圣诞老人合影! 这能怪谁呢,还不是只能怪自己,因为没有仔细看行程...
    羡量版阅读 705评论 0 0