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

你可能感兴趣的:(k8s kustomize 使用指南:名字前缀)