乐趣区

kustomizeyaml渲染利器

简介

kustomize 是基于目录,使用 Base + Overlay 的方式对应用的原始 YAML 进行派生,功能简单清晰,kubectl 直接支持。

helm

Helm 使用 Go Template 对应用部署所需的 YAML 进行抽象,形成应用部署模板,在需要进行部署时,可以编写 yaml 为模板中的变量进行赋值,也可以在 Helm CLI 的命令行中使用 –set name=value 的方式来对简单变量进行赋值,完成赋值之后,可以选择使用 helm template 指令将 Chart + Value 的组合渲染成为 YAML 供 kubectl 使用,也可以使用 helm install 直接通过 Tiller 进行安装

对比

对比 kustomize 简洁,helm 则提供更多的功能,如:

  1. chart 包的管理,类似应用市场的概念。
  2. 直接和 k8s apiserver 交互,提供应用生命周期管理

但同时也带来了更复杂的架构,比如服务端进程 tiller 提供和 k8s 的交互,Repository 存储 Helm Chart 的仓库。给我们的感觉是对标于类似 yum,apt 和 brew 之类的管理系统。

因此如果用户的目的只是做 yaml 文件的渲染,不想为此花费更多的时间和精力,比较适合使用 kustomize。如果是管理严谨的大型公开项目,可能 helm 更合适。

部署

部署比较简单,下载对应的 release 版本,授权运行即可。
https://github.com/kubernetes…

使用

kustomize 是基于目录进行 yaml 文件管理和派生的。

应用的多环境部署

应用部署在不同环境配置是有不同的,查看 kustomize 目录结构:

[root@master01 kustomize]# tree  helloWorld/
helloWorld/
├── base
│   ├── configMap.yaml
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── production
    │   └── staging
    │       ├── kustomization.yaml
    │       └── deplyment.yaml
    └── staging
        ├── kustomization.yaml
        └── map.yaml

5 directories, 8 files

base 目录是项目的基础 yaml 文件,overlay 中的目录 staging,production 在 base 的基础上,生成不同环境的应用部署 yaml 文件。

base

渲染出 yaml 文件

[root@master01 helloWorld]# kustomize  build base/
apiVersion: v1
data:
  altGreeting: Good Morning!
  enableRisky: "false"
kind: ConfigMap
metadata:
  labels:
    app: hello
  name: the-map
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: hello
  name: the-service

部署

kustomize build base/ | kubectl apply -f –

staging

staging 环境在 base 的基础上,做一些修改

kustomization.yaml

[root@master01 staging]# cat kustomization.yaml 
namePrefix: staging-
commonLabels:
  variant: staging
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am staging!
resources:
- ../../base
patchesStrategicMerge: # 这里意思是我们要把 base 里的 configmap 用下面的 configmap overlay 一下
- map.yaml

map.yaml

[root@master01 staging]# cat map.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: the-map
data:
  altGreeting: "Have a pineapple!"
  enableRisky: "true"

渲染后的 staging 环境功能 yaml 文件如下:

[root@master01 helloWorld]# kustomize  build overlays/staging/
apiVersion: v1
data:
  altGreeting: Have a pineapple!   # 对 base 中 configmap 进行了覆盖
  enableRisky: "true"
kind: ConfigMap
metadata:
  annotations:                     # kustomize 中定义的 commonAnnotations
    note: Hello, I am staging!  
  labels:                          # kustomize 中定义的 commonLabels
    app: hello
    org: acmeCorporation
    variant: staging
  name: staging-the-map            # kustomize 中定义的 namePrefix
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    note: Hello, I am staging!
  labels:
    app: hello
    org: acmeCorporation
    variant: staging
  name: staging-the-service
spec:
···

ci/cd

另一个常见的使用场景是在 ci/cd 中,需要根据项目的 tag,修改应用部署的镜像。

此时可以通过 kustomize 提供的命令 kustomize edit set image,来方便的修改。

kustomize edit set image alpine=quay.io/datawire/ambassador:0.85.0

[root@master01 staging]# cat kustomization.yaml 
namePrefix: staging-
commonLabels:
  org: acmeCorporation
  variant: staging
commonAnnotations:
  note: Hello, I am staging!
resources:
- ../../base
patchesStrategicMerge:
- map.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:          # 此处为增加的 image 设置
- name: alpine
  newName: quay.io/datawire/ambassador
  newTag: 0.85.0

渲染后的文件

[root@master01 overlays]# kustomize build staging/
···
        env:
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              key: enableRisky
              name: staging-the-map
        image: quay.io/datawire/ambassador:0.85.0  # image 已修改
        name: the-container
        ports:
        - containerPort: 8080
退出移动版