k8s kustomize 使用指南:名字前缀

kustomize是sig-cli的一个子项目,它的设计目的是为kubernetes提供一种可以重复使用配置的声明式应用管理,从而在配置工作中用户只需要管理和维护kubernetes的原生API对象,不需要使用复杂的模版。详细介绍请见 kustomize 初体验.

kustomize支持对它所管理的API对象设置共同的名字前缀。基于不同的名字前缀,用户可以很容易地确定API对象所在的应用,区分API对象所处的环境。名字前缀使用起来修改简单,效果直观,同时也极大地方便了其他的查找替换工具。这篇文章将通过一个MySQL实例来详细介绍和展示名字前缀的使用。


可以通过如下两种不同方式来安装kustomize

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

    https://github.com/kubernetes-sigs/kustomize/releases

  • 如果本地机器 go 的版本在 1.10.1 以上,可以通过 go get 来直接安装

    go get github.com/kubernetes-sigs/kustomize
    

首先来创建一个MySQL的base。base包含了若干 yaml 文件,这些文件声明了部署一个MySQL数据库所需要的全部API对象。

BASE=$(mktemp -d)

CONTENT="https://raw.githubusercontent.com\
/Liujingfang1/mysql\
/master"

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

将这些文件下载到本地之后,我们可以看到 $BASE/kustomization.yaml 文件包含如下内容

resources:
- configmap.yaml
- deployment.yaml
- service.yaml

运行kustomize build $BASE,将得到如下输出

apiVersion: v1
data:
  password: admin
kind: ConfigMap
metadata:
  name: mysql-pass-6k8k9b6fdh
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mysql
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    app: mysql
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            configMapKeyRef:
              key: password
              name: mysql-pass-6k8k9b6fdh
        image: mysql:5.6
        name: mysql
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-persistent-storage
      volumes:
      - emptyDir: {}
        name: mysql-persistent-storage

可以看到这个MySQL应用由三个kubernetes API对象所组成:

  • ConfigMap: mysql-pass-6k8k9b6fdh
  • Deployment: mysql
  • Service: mysql

其中Deployment对象通过configMapKeyRef来读取 ConfigMap 中的定义的 password,然后将环境变量MYSQL_ROOT_PASSWORD 设为这个 password。


打开$BASE/kustomization.yaml文件, 添加如下一行从而为MySQL 的 base 设置一个名字前缀

namePrefix: my-

运行customize build $BASE, 将得到如下输出

apiVersion: v1
data:
  password: admin
kind: ConfigMap
metadata:
  name: my-mysql-pass-ft95hb7hbb
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mysql
  name: my-mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    app: mysql
  name: my-mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            configMapKeyRef:
              key: password
              name: my-mysql-pass-ft95hb7hbb
        image: mysql:5.6
        name: mysql
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-persistent-storage
      volumes:
      - emptyDir: {}
        name: mysql-persistent-storage

通过设置名字前缀,该 MySQL 应用中的三个对象的名字都添加了同样的前缀。

  • configmap: my-mysql-pass-ft95hb7hbb
  • deployment: my-mysql
  • service: my-mysql

值得注意的是,在 Deployment 对象中,引用 ConfigMap 的地方也添加了同样的前缀。假如kustomize在更改 ConfigMap 名字的时候,没有相应地更改此处的引用,就会导致下面的情况发生。我们声明了一个名字是 my-mysql-pass-ft95hb7hbb 的 ConfigMap,而Deployment对象却需要一个名字是 mysql-pass-6k8k9b6fdh 的 ConfigMap。 mysql-pass-6k8k9b6fdh 并没有被声明,就会导致在部署该应用的时候出现错误。kustomize通过更新所有 ConfigMap 被引用的地方,从而避免了这样的错误发生。


【总结】kustomize支持设置名字前缀,这个前缀会被加在每一个它所管理的API对象上,kustomize 还会相应更新这些对象的每一个引用,从而避免了在部署的时候发生名字不匹配的错误。在实践中,针对不同的环境或应用场景,用户可以设置不同的前缀,比如在开发环境下使用 dev前缀,在生产环境下使用 prod 前缀。

参考资料

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

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

推荐阅读更多精彩内容