Kubernetes包管理神器Kustomize與Helm對比
K8s 是一個開源容器編排平臺,可自動執行容器化應用程序的部署、擴展和管理。近年來,K8s 已成為采用云原生架構和容器化技術的組織的標準。
但是由于K8s的復雜性,因此誕生很多工具來簡化使用的門檻。大多數公司使用的兩個工具是Kustomize (K8s 的配置管理器)和Helm (K8s 的包管理器)
在本文中,我們將討論 Helm 和 Kustomize、它們可以做什么、如何使用它們以及這些工具之間有什么區別。
Kustomize | Helm | |
操作方法 | overlays | templating |
使用成本 | 簡單 | 復雜 |
是否支持封裝 | 否 | 是 |
原生 kubectl 集成 | 是 | 否 |
聲明式/ 命令式 | 聲明式 | 命令式 |
什么是Kustomize?
Kustomize 是 k8s集群的配置定制工具。它允許管理員使用非模板文件進行聲明性更改,而不影響原始清單文件。
所有自定義規范都包含在 kustomization.yaml 文件中,該文件將規范疊加在現有清單之上以生成資源的自定義版本。
比如我們有一個應用,需要在生產環境和測試環境部署,并且它的 yaml 配置大部分是相同的,只有少數的字段不同,那么這時候就可以用kustomize 來解決
Kustomize結構
Kustomize 使用共享基礎資源和覆蓋來提供可重用性和配置生成。Kustomize 項目的典型目錄結構如下所示:
圖片
Kustomize 項目結構通常包含基本目錄和覆蓋目錄。在上面結構中,基本目錄包含一個名為kustomization.yaml的文件和共享資源的清單文件。
base/kustomization.yaml文件聲明文件,將包含在所有環境中
Overlays目錄也包含kustomization.yaml,此文件會引用base文件夾的yaml 文件并進行自定義修改來構建個性化資源。同時Overlays 目錄還包括單獨的yaml文件,Kustomize 使用這些文件來創建特定環境資源
自定義部署示例
下面通用示例演示如何使用 Kustomize 進行最小 K8s 部署,將資源部署到開發和生產環境。
前置依賴
- k8s 集群(1.14+)
- Kubectl 客戶端
使用以下命令克隆示例 Git 存儲庫并將所需的清單下載到您的工作環境中:
git clone https://github.com/dongweizhao/kustomize-demo.git
圖片
結構如下
圖片
此示例模擬在不同環境部署httpd 的dp和svc,其中dev會在名稱前增加dev-,prod 會在名稱前增加prod-,而 base會使用默認名稱 httpd
- base
resources:
- deployment.yaml
- service.yaml
- prod
bases:
- ../../base
namePrefix: prod-
- dev
bases:
- ../../base
namePrefix: dev-
部署
cd base && kubectl apply -k .
執行完成以后會輸出以下結果
圖片
注意: kubectl 使用 -k 或 --kustomize 標志來識別 Kustomize
和前面一樣,到“/overlays/dev”文件夾執行部署,如下所示:
cd overlays/dev && kubectl apply -k .
輸出結果
圖片
prod 部署
cd overlays/prod && kubectl apply -k .
輸出結果
圖片
結果驗證
kubectl get pods|grep http
圖片
kubectl get svc|grep http
圖片
根據以上結果,可以看到配置已經生效
什么是Helm?
Helm 是一個能夠在 K8s 上打包、部署和管理應用程序的工具,即使是最復雜的 K8s 應用程序它都可以幫助定義,安裝和升級,同時Helm 也是 CNCF 的畢業項目。
圖片
以下Helm中的概念
Helm Charts:預先配置yaml的模板,在這里叫Chart,用于描述 K8s 應用程序的yaml和配置
Helm Client:用于與 Helm 交互并管理這些Chart版本的命令行界面
Chart 倉庫:管理Chart的倉庫,跟Maven的Nexus一個意思,比如在公司環境構建上傳,在客戶的機房連接到這Chart 倉庫下載Chart,并部署到k8s中。
Helm 示例
前置依賴
- k8s 集群
- Kubectl 客戶端
- helm客戶端
Helm Charts 是預先配置的 K8s 資源包。Helm Chart 包含部署特定應用程序或服務所需的所有信息,包括 K8s 清單、環境變量和其他配置
目錄名稱是Chart的名稱,如Helm 文檔所示,我們通過helm create helm-demo命令創建一個Chart,執行完以后,默認會生成一個 nginx 的Chart,如下圖
圖片
Chart.yaml
定義了當前 chart版本,以及描述當前chart用途,其中 name 參數表示 chart 名稱,后期上傳下載都會用此名稱
apiVersion: v2
name: helm-demo
description: A Helm chart for K8s
# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "1.16.0"
values.yaml
可變參數,都是在此文件中定義,在yaml模板中引用,比如:image.repository,而引用則通過.Values+變量的名進行引用,如下圖
圖片
_helpers.tpl
定義通用代碼塊,然后yaml 文件會通過 include 引用
定義
{{- define "helm-demo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
引用
{{ include "helm-demo.fullname" . }}
templates
此目錄主要存放的是要部署的 yaml文件模板,同時也包含_helpers.tpl文件,模板會引用values.yaml、Chart.yaml定義的參數,以及_helpers.tpl定義的通用代碼塊
圖片
部署
helm package helm-demo
圖片
以下命令,通過 set指定部署 2 個副本pod,此參數在 values.yaml 中有定義
helm install helm-demo helm-demo-0.1.0.tgz --set replicaCount=2
圖片
結果驗證
可以看到部署了 2 個副本
kubectl get pods|grep helm
圖片
主要差異
操作方法
Kustomize 依賴特定于目錄的kustomization.yaml文件來構建各個資源并對其進行更改。這些文件將補丁和覆蓋應用到共享基文件夾中聲明的資源,以提供自動化的多環境配置。
Helm 通過引用value.yaml文件作為變量源,使用模板生成有效的 K8s 配置。模板目錄托管 Helm Chart在部署期間用于創建資源的文件。
便捷性
從K8s 版本 1.14 開始,Kustomize 與 kubectl CLI 捆綁在一起,因此不需要掌握任何其他工具。Kustomize 支持聲明式部署,并對每個文件使用純 YAML,從而更容易使用。
Helm 為K8s包管理任務添加了額外的抽象層,從而加快了希望簡化集群配置和發布自動化的團隊的學習曲線。Helm Chart 相對Kustomize復雜,不過功能更加強大。
打包
Kustomize 缺乏的打包功能,并且每個資源都必須在基本文件夾中聲明,并在覆蓋kustomization.yaml文件中單獨聲明變體。
而Helm將所有必需的K8s資源都打包到一個文件夾中,該文件夾可以根據需要重復使用。Helm 還允許設置應用程序默認值,并且使用values.yaml文件修改參數,從而注入引用的 yaml 文件中。
原生 kubectl 集成
從 K8s 1.14 版開始,Kustomize 就預裝了 kubectl,Helm 并未與 K8s 預先集成,因此必須手動安裝 Helm。
Kustomize 與 Helm - 何時使用
何時使用 Kustomize
Kustomize允許在不改變原始文件的情況下進行精確更改。因此可以有以下場景
- 應用配置的變體管理:當你需要管理多個環境(例如開發、測試、生產)中應用的變體時,Kustomize 是一個很好的選擇。它允許你為不同的環境創建不同的配置,并使用一套基礎配置來定義通用部分。
- 持續集成和持續部署(CI/CD)流水線:Kustomize 可以與 CI/CD 工具集成,幫助你實現自動化部署。通過在流水線中使用 Kustomize,你可以根據需要生成特定環境的配置,并將其應用到集群中。
何時使用 Helm
Helm 將所有 K8s 對象封裝到一個包中,減少了與各個yaml 文件的交互。除此之外,大多數第三方供應商還提供預構建的 Helm 圖表,以簡化將其產品部署到 K8s 中的過程。因此,Helm 通常是安裝現成解決方案(例如監控、數據庫和消息中間件等)的首選