Kubernetes包管理神器Kustomize與Helm對(duì)比
K8s 是一個(gè)開源容器編排平臺(tái),可自動(dòng)執(zhí)行容器化應(yīng)用程序的部署、擴(kuò)展和管理。近年來(lái),K8s 已成為采用云原生架構(gòu)和容器化技術(shù)的組織的標(biāo)準(zhǔn)。
但是由于K8s的復(fù)雜性,因此誕生很多工具來(lái)簡(jiǎn)化使用的門檻。大多數(shù)公司使用的兩個(gè)工具是Kustomize (K8s 的配置管理器)和Helm (K8s 的包管理器)
在本文中,我們將討論 Helm 和 Kustomize、它們可以做什么、如何使用它們以及這些工具之間有什么區(qū)別。
Kustomize | Helm | |
操作方法 | overlays | templating |
使用成本 | 簡(jiǎn)單 | 復(fù)雜 |
是否支持封裝 | 否 | 是 |
原生 kubectl 集成 | 是 | 否 |
聲明式/ 命令式 | 聲明式 | 命令式 |
什么是Kustomize?
Kustomize 是 k8s集群的配置定制工具。它允許管理員使用非模板文件進(jìn)行聲明性更改,而不影響原始清單文件。
所有自定義規(guī)范都包含在 kustomization.yaml 文件中,該文件將規(guī)范疊加在現(xiàn)有清單之上以生成資源的自定義版本。
比如我們有一個(gè)應(yīng)用,需要在生產(chǎn)環(huán)境和測(cè)試環(huán)境部署,并且它的 yaml 配置大部分是相同的,只有少數(shù)的字段不同,那么這時(shí)候就可以用kustomize 來(lái)解決
Kustomize結(jié)構(gòu)
Kustomize 使用共享基礎(chǔ)資源和覆蓋來(lái)提供可重用性和配置生成。Kustomize 項(xiàng)目的典型目錄結(jié)構(gòu)如下所示:
圖片
Kustomize 項(xiàng)目結(jié)構(gòu)通常包含基本目錄和覆蓋目錄。在上面結(jié)構(gòu)中,基本目錄包含一個(gè)名為kustomization.yaml的文件和共享資源的清單文件。
base/kustomization.yaml文件聲明文件,將包含在所有環(huán)境中
Overlays目錄也包含kustomization.yaml,此文件會(huì)引用base文件夾的yaml 文件并進(jìn)行自定義修改來(lái)構(gòu)建個(gè)性化資源。同時(shí)Overlays 目錄還包括單獨(dú)的yaml文件,Kustomize 使用這些文件來(lái)創(chuàng)建特定環(huán)境資源
自定義部署示例
下面通用示例演示如何使用 Kustomize 進(jìn)行最小 K8s 部署,將資源部署到開發(fā)和生產(chǎn)環(huán)境。
前置依賴
- k8s 集群(1.14+)
- Kubectl 客戶端
使用以下命令克隆示例 Git 存儲(chǔ)庫(kù)并將所需的清單下載到您的工作環(huán)境中:
git clone https://github.com/dongweizhao/kustomize-demo.git
圖片
結(jié)構(gòu)如下
圖片
此示例模擬在不同環(huán)境部署httpd 的dp和svc,其中dev會(huì)在名稱前增加dev-,prod 會(huì)在名稱前增加prod-,而 base會(huì)使用默認(rèn)名稱 httpd
- base
resources:
- deployment.yaml
- service.yaml
- prod
bases:
- ../../base
namePrefix: prod-
- dev
bases:
- ../../base
namePrefix: dev-
部署
cd base && kubectl apply -k .
執(zhí)行完成以后會(huì)輸出以下結(jié)果
圖片
注意: kubectl 使用 -k 或 --kustomize 標(biāo)志來(lái)識(shí)別 Kustomize
和前面一樣,到“/overlays/dev”文件夾執(zhí)行部署,如下所示:
cd overlays/dev && kubectl apply -k .
輸出結(jié)果
圖片
prod 部署
cd overlays/prod && kubectl apply -k .
輸出結(jié)果
圖片
結(jié)果驗(yàn)證
kubectl get pods|grep http
圖片
kubectl get svc|grep http
圖片
根據(jù)以上結(jié)果,可以看到配置已經(jīng)生效
什么是Helm?
Helm 是一個(gè)能夠在 K8s 上打包、部署和管理應(yīng)用程序的工具,即使是最復(fù)雜的 K8s 應(yīng)用程序它都可以幫助定義,安裝和升級(jí),同時(shí)Helm 也是 CNCF 的畢業(yè)項(xiàng)目。
圖片
以下Helm中的概念
Helm Charts:預(yù)先配置yaml的模板,在這里叫Chart,用于描述 K8s 應(yīng)用程序的yaml和配置
Helm Client:用于與 Helm 交互并管理這些Chart版本的命令行界面
Chart 倉(cāng)庫(kù):管理Chart的倉(cāng)庫(kù),跟Maven的Nexus一個(gè)意思,比如在公司環(huán)境構(gòu)建上傳,在客戶的機(jī)房連接到這Chart 倉(cāng)庫(kù)下載Chart,并部署到k8s中。
Helm 示例
前置依賴
- k8s 集群
- Kubectl 客戶端
- helm客戶端
Helm Charts 是預(yù)先配置的 K8s 資源包。Helm Chart 包含部署特定應(yīng)用程序或服務(wù)所需的所有信息,包括 K8s 清單、環(huán)境變量和其他配置
目錄名稱是Chart的名稱,如Helm 文檔所示,我們通過(guò)helm create helm-demo命令創(chuàng)建一個(gè)Chart,執(zhí)行完以后,默認(rèn)會(huì)生成一個(gè) nginx 的Chart,如下圖
圖片
Chart.yaml
定義了當(dāng)前 chart版本,以及描述當(dāng)前chart用途,其中 name 參數(shù)表示 chart 名稱,后期上傳下載都會(huì)用此名稱
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
可變參數(shù),都是在此文件中定義,在yaml模板中引用,比如:image.repository,而引用則通過(guò).Values+變量的名進(jìn)行引用,如下圖
圖片
_helpers.tpl
定義通用代碼塊,然后yaml 文件會(huì)通過(guò) include 引用
定義
{{- define "helm-demo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
引用
{{ include "helm-demo.fullname" . }}
templates
此目錄主要存放的是要部署的 yaml文件模板,同時(shí)也包含_helpers.tpl文件,模板會(huì)引用values.yaml、Chart.yaml定義的參數(shù),以及_helpers.tpl定義的通用代碼塊
圖片
部署
helm package helm-demo
圖片
以下命令,通過(guò) set指定部署 2 個(gè)副本pod,此參數(shù)在 values.yaml 中有定義
helm install helm-demo helm-demo-0.1.0.tgz --set replicaCount=2
圖片
結(jié)果驗(yàn)證
可以看到部署了 2 個(gè)副本
kubectl get pods|grep helm
圖片
主要差異
操作方法
Kustomize 依賴特定于目錄的kustomization.yaml文件來(lái)構(gòu)建各個(gè)資源并對(duì)其進(jìn)行更改。這些文件將補(bǔ)丁和覆蓋應(yīng)用到共享基文件夾中聲明的資源,以提供自動(dòng)化的多環(huán)境配置。
Helm 通過(guò)引用value.yaml文件作為變量源,使用模板生成有效的 K8s 配置。模板目錄托管 Helm Chart在部署期間用于創(chuàng)建資源的文件。
便捷性
從K8s 版本 1.14 開始,Kustomize 與 kubectl CLI 捆綁在一起,因此不需要掌握任何其他工具。Kustomize 支持聲明式部署,并對(duì)每個(gè)文件使用純 YAML,從而更容易使用。
Helm 為K8s包管理任務(wù)添加了額外的抽象層,從而加快了希望簡(jiǎn)化集群配置和發(fā)布自動(dòng)化的團(tuán)隊(duì)的學(xué)習(xí)曲線。Helm Chart 相對(duì)Kustomize復(fù)雜,不過(guò)功能更加強(qiáng)大。
打包
Kustomize 缺乏的打包功能,并且每個(gè)資源都必須在基本文件夾中聲明,并在覆蓋kustomization.yaml文件中單獨(dú)聲明變體。
而Helm將所有必需的K8s資源都打包到一個(gè)文件夾中,該文件夾可以根據(jù)需要重復(fù)使用。Helm 還允許設(shè)置應(yīng)用程序默認(rèn)值,并且使用values.yaml文件修改參數(shù),從而注入引用的 yaml 文件中。
原生 kubectl 集成
從 K8s 1.14 版開始,Kustomize 就預(yù)裝了 kubectl,Helm 并未與 K8s 預(yù)先集成,因此必須手動(dòng)安裝 Helm。
Kustomize 與 Helm - 何時(shí)使用
何時(shí)使用 Kustomize
Kustomize允許在不改變?cè)嘉募那闆r下進(jìn)行精確更改。因此可以有以下場(chǎng)景
- 應(yīng)用配置的變體管理:當(dāng)你需要管理多個(gè)環(huán)境(例如開發(fā)、測(cè)試、生產(chǎn))中應(yīng)用的變體時(shí),Kustomize 是一個(gè)很好的選擇。它允許你為不同的環(huán)境創(chuàng)建不同的配置,并使用一套基礎(chǔ)配置來(lái)定義通用部分。
- 持續(xù)集成和持續(xù)部署(CI/CD)流水線:Kustomize 可以與 CI/CD 工具集成,幫助你實(shí)現(xiàn)自動(dòng)化部署。通過(guò)在流水線中使用 Kustomize,你可以根據(jù)需要生成特定環(huán)境的配置,并將其應(yīng)用到集群中。
何時(shí)使用 Helm
Helm 將所有 K8s 對(duì)象封裝到一個(gè)包中,減少了與各個(gè)yaml 文件的交互。除此之外,大多數(shù)第三方供應(yīng)商還提供預(yù)構(gòu)建的 Helm 圖表,以簡(jiǎn)化將其產(chǎn)品部署到 K8s 中的過(guò)程。因此,Helm 通常是安裝現(xiàn)成解決方案(例如監(jiān)控、數(shù)據(jù)庫(kù)和消息中間件等)的首選