K8s kustomize 使用指南: 标注和注释

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

在之前介绍中,我们学习到了 kustomize 可以为一组 k8s API 对象添加共同的名称前缀。 类似地,在 k8s 应用的管理和维护中,我们通常需要给一组互相关联的 API 对象添加共同的标注和注
释,以记录它所处的环境或应用。比如在一个应用中,包含两个 MySQL 的数据库,其中一个为微服务 foo 提供数据而另
一个为微服务 bar 提供数据。我们可以为这两组 MySQL 的 API 添加标注或注释,从而得到如下效果

foo所对应的MySQL

labels:
    app: foo
annotation:
   application: foo

bar所对应的MySQL

labels:
    app: bar
annotation:
   application: bar

当应用规模很小,仅有几个微服务时,我们可以手动给每一个API对象添加标注和注释。当应用规模扩大到几十甚至上百>个为服务时,依次为每一个 API 对象添加标注和注释就会变得繁杂和不易维护。我们需要一种能简单易行的方法来添加>和更改标注或注释。而 kustomize 恰恰提供了这种简单方便的标注使用。这篇文章将通过一个 MySQL 实例来详细介绍和
展示 kustomize 在标注和注释方面的功能。

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

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

如果本地机器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:
-deployment.yaml
-service.yaml
-configmap.yaml

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

apiVersion: v1
data:
  password: admin
kind: ConfigMap
metadata:
  name: mysql-pass
---
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
        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 应用由三个k8s API对象所组成:

  • ConfigMap
  • Deployment
  • Service

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

打开 $BASE/kustomization.yaml, 添加标注和注释

commonLabels:
  app: foo
  team: Beijing
commonAnnotations:
  application: foo
  owners: Xiaoming,Damao

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

apiVersion: v1
data:
  password: admin
kind: ConfigMap
metadata:
  annotations:
    application: foo
    owners: Xiaoming,Damao
  labels:
    app: foo
    team: Beijing
  name: mysql-pass
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    application: foo
    owners: Xiaoming,Damao
  labels:
    app: foo
    team: Beijing
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: foo
    team: Beijing
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  annotations:
    application: foo
    owners: Xiaoming,Damao
  labels:
    app: foo
    team: Beijing
  name: mysql
spec:
  selector:
    matchLabels:
      app: foo
      team: Beijing
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        application: foo
        owners: Xiaoming,Damao
      labels:
        app: foo
        team: Beijing
    spec:
      containers:
      - env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            configMapKeyRef:
              key: password
              name: mysql-pass
        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

通过在 kustomization.yaml 添加标注和注释,该 MySQL 应用中的三个对象都添加了同样的标注和注释。

【总结】kustomize支持添加标注和注释,这些标注和注释会加在每一个它所管理的API对象上。Kustomize还会相应地更>新API对象的matchLabels。在实践中,针对不同的环境或应用场景,用户可以设置不同的标注和注释。

参考资料

kubernetes-sigs/kustomize
Kustomize blogpost

你可能感兴趣的:(K8s kustomize 使用指南: 标注和注释)