美文网首页
k8s kustomize 使用指南:名字前缀

k8s kustomize 使用指南:名字前缀

作者: 米小帮帮 | 来源:发表于2018-06-23 14:24 被阅读0次

    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 使用指南:名字前缀

          本文链接:https://www.haomeiwen.com/subject/cobryftx.html