Kustomize学习笔记
Kustomize是一个定制化K8S资源定义(YAML)的工具,它不使用Helm那样的模板,比较简单。定制化之后,原始的资源定义保持不变。
从1.14版本开始Kustomize作为Kubectl的一部分进行分发。
术语 | 说明 |
Base |
指会被其它定制(kustomization)引用的定制 包括Overlay在内的任何定制,都可以作为其它定制的Base Base 和 Overlay 可以作为 Git 仓库中的唯一内容,用于简单的 GitOps 管理。对仓库的变更可以触发构建、测试以及部署过程 两个kustomization不能形成依赖环 |
Kustomization |
可以指 kustomization.yaml 这个文件,或者是包含了 kustomization.yaml 及其所有直接引用文件的相对路径 一个定制可以是:
kustomization.yaml文件的字段,分为四类:
|
Kustomization Root | 直接包含kustomization.yaml文件的目录 |
Overlay |
依赖于其它 Kustomization 的 Kustomization,被它依赖的叫Base Overlay通常包括多个变体,这些变体可能针对不同的运行环境,例如development、QA、production。变体使用的资源基本是一致的,只有一些简单的差异,例如 Deployment 的实例数量、特定 Pod 的 CPU 资源、ConfigMap 中的数据源定义等 |
Patch |
资源补丁,支持两种风格: |
Variant | 将Overlay应用到Base后的产物 |
1 2 3 4 5 6 |
cd $GOPATH/src/sigs.k8s.io git clone https://github.com/kubernetes-sigs/kustomize.git unset GO111MODULES cd kustomize/kustomize go install |
拷贝官方HelloWorld示例:
1 2 |
mkdir -p /tmp/hello cp -r $GOPATH/src/sigs.k8s.io/kustomize/examples/helloWorld /tmp/hello/base |
此示例包含以下K8S资源:
1 2 3 4 5 6 7 |
apiVersion: v1 kind: ConfigMap metadata: name: the-map data: altGreeting: "Good Morning!" enableRisky: "false" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
apiVersion: apps/v1 kind: Deployment metadata: name: the-deployment spec: replicas: 3 template: metadata: labels: deployment: hello spec: containers: - name: the-container image: monopole/hello:1 command: ["/hello", "--port=8080", "--enableRiskyFeature=$(ENABLE_RISKY)"] ports: - containerPort: 8080 env: - name: ALT_GREETING valueFrom: configMapKeyRef: name: the-map key: altGreeting - name: ENABLE_RISKY valueFrom: configMapKeyRef: name: the-map key: enableRisky |
1 2 3 4 5 6 7 8 9 10 11 12 |
kind: Service apiVersion: v1 metadata: name: the-service spec: selector: deployment: hello type: LoadBalancer ports: - protocol: TCP port: 8666 targetPort: 8080 |
以及一个kustomization文件文件。
你需要在包含了一系列(未定制化的原始版本的)K8S资源定义文件所在目录,创建一个 kustomization.yaml文件,并在文件中声明:
- 此定制化包含的资源文件列表
- 需要执行的定制化动作,例如添加标签
HelloWorld示例的kustomization.yaml文件如下:
1 2 3 4 5 6 7 |
commonLabels: app: hello resources: - deployment.yaml - service.yaml - configMap.yaml |
此例子声明了,这个定制化里面有三个原始资源,需要为它们统一加上app: hello标签。
使用命令 kustomize build /tmp/hello/base即可生成定制化后的资源清单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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 spec: ports: - port: 8666 protocol: TCP targetPort: 8080 selector: # 添加标签,Kustomize理解K8S资源语义 app: hello deployment: hello type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: labels: # 添加标签 app: hello name: the-deployment spec: replicas: 3 selector: matchLabels: # 添加标签 app: hello template: metadata: labels: # 添加标签 app: hello deployment: hello spec: containers: - command: - /hello - --port=8080 - --enableRiskyFeature=$(ENABLE_RISKY) env: - name: ALT_GREETING valueFrom: configMapKeyRef: key: altGreeting name: the-map - name: ENABLE_RISKY valueFrom: configMapKeyRef: key: enableRisky name: the-map image: monopole/hello:1 name: the-container ports: - containerPort: 8080 |
可以看到Kustomize在相关的位置都添加了标签。
下面我们创建分别基于Staging环境、Production环境的Overlay:
- Staging环境启用一个不安全特性
- Production增加副本数量
- 两个环境下altGreeting取值不一样
首先为变体创建子目录:
1 2 3 4 |
cd /tmp/hello mkdir -p overlays/staging mkdir -p overlays/production |
对于Staging变体,我们创建如下kustomization文件,在base的基础上进一步定制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 资源名前缀 namePrefix: staging- # 添加标签 commonLabels: variant: staging org: acmeCorporation # 添加注解 commonAnnotations: note: Hello, I am staging! # 资源列表 resources: - ../../base # 将下面文件中的内容Patch到对应资源中 patchesStrategicMerge: - map.yaml |
需要Patch的ConfigMap内容:
1 2 3 4 5 6 7 |
apiVersion: v1 kind: ConfigMap metadata: name: the-map data: altGreeting: "Have a pineapple!" enableRisky: "true" |
Production变体类似,这里就不写了。
执行 kustomize build overlays/staging,可以看到ConfigMap内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: v1 data: # Patch的字段 altGreeting: Have a pineapple! enableRisky: "true" kind: ConfigMap metadata: annotations: note: Hello, I am staging! labels: # base定制会首先apply app: hello org: acmeCorporation variant: staging # 资源名字加了前缀 name: staging-the-map |
所有字段的详细说明请参见:https://github.com/kubernetes-sigs/kustomize/blob/master/docs/zh/fields.md
Leave a Reply