云原生之旅 - 6)不能錯過的一款 Kubernetes 應用編排管理神器 Kustomize

前言相信經過前一篇文章的學習,大家已經對Helm有所了解,本篇文章介紹另一款工具 Kustomize,為什么Helm如此流行,還會出現 Kustomize?而且 Kustomize 自 kubectl 1.14以來早已內置到其中,說明官方對其很認可 。
我認為還是Helm 參數化模板方式來自定義配置需要學習復雜的DSL語法,難上手,易出錯,而 kustomize 是使用 Kubernetes 原生概念幫助用戶創作并復用聲明式配置 。
認識 Kustomizehttps://kustomize.io/ 根據官網的描述:kustomize 是 kubernetes 原生的配置管理,以無模板方式來定制應用的配置 。kustomize 使用 kubernetes 原生概念幫助創建并復用資源配置(YAML),允許用戶以一個應用描述文件為基?。˙ase YAML),然后通過 Overlay 的方式生成最終部署應用所需的描述文件 。 安裝參考官方文檔 。我本地MacOs 直接運行 brew install kustomizekubectl 1.14 以后可以不用下載單獨的kustomize,直接使用kubectl命令 。 示例解析文件結構:demo-manifests├── base│   ├── deployment.yaml│   ├── kustomization.yaml│   ├── service-account.yaml│   └── service.yaml└── services    ├── demo-app    │   ├── _common    │   │   ├── deployment-patch.yaml    │   │   ├── kustomization.yaml    │   │   └── namespace.yaml    │   ├── dev    │   │   ├── config.json    │   │   ├── deployment-patch.yaml    │   │   └── kustomization.yaml    │   ├── staging    │   │   ├── config.json    │   │   ├── deployment-patch.yaml    │   │   └── kustomization.yaml    │   └── prod    │   │   ├── config.json    │   │   ├── deployment-patch.yaml    │   │   └── kustomization.yaml    └── demo-app2        └── xxx先看base 目錄,有幾個常見的deployment/service/service-account YAML 資源文件
還有個 kustomization.yaml 配置文件
apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- deployment.yaml- service.yaml- service-account.yamlcommonLabels:  managed-by: Kustomize這里面包含了剛才的幾個resource文件以及要應用于它們的一些自定義,如添加一個通用的標簽Common Labels
這時候也可以通過 kustomize build 命令來生成完整的YAML進行查看
kustomize build demo-manifests/base > base.yaml

云原生之旅 - 6)不能錯過的一款 Kubernetes 應用編排管理神器 Kustomize

文章插圖
base.yamlbuild 出來的 YAML 每個資源對象上都會存在通用的標簽 managed-by: Kustomize
接下來看 Service目錄,此目錄存放所有的服務項目,比如demo-app,里面的YAML就是來覆蓋base 也就是官方說的 Overlays
只需要把不同的資源描述通過Patch方式覆蓋掉base中的就行了 。這邊我又將三個環境 dev/staging/prod 公共的部分抽取出來放入 common文件夾 。
云原生之旅 - 6)不能錯過的一款 Kubernetes 應用編排管理神器 Kustomize

文章插圖
_common/kustomization.yaml文件如下
apiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- ../../../base- namespace.yamlpatchesStrategicMerge:- deployment-patch.yaml我這個demo-app 需要configMap , 另外心跳接口也不一樣,所以 deployment-patch.yaml 需要寫出這些不一樣的 , 然后去覆蓋base中的 。
云原生之旅 - 6)不能錯過的一款 Kubernetes 應用編排管理神器 Kustomize

文章插圖
云原生之旅 - 6)不能錯過的一款 Kubernetes 應用編排管理神器 Kustomize

文章插圖
apiVersion: apps/v1kind: Deploymentmetadata:  name: NAME_PLACEHOLDERspec:  template:    spec:      serviceAccountName: NAME_PLACEHOLDER      containers:      - name: app        image: wadexu007/demo:IMG_TAG_PLACEHOLDER        livenessProbe:          failureThreshold: 5          httpGet:            path: /pizzas            port: 8080          initialDelaySeconds: 10          periodSeconds: 40          timeoutSeconds: 1        readinessProbe:          failureThreshold: 5          httpGet:            path: /pizzas            port: 8080          initialDelaySeconds: 10          periodSeconds: 20          timeoutSeconds: 1        volumeMounts:        - name: config-volume          mountPath: /app/conf/config.json          subPath: config.json      volumes:      - name: config-volume        configMap:          name: demo-app-config

推薦閱讀