目錄
概念
核心組件
Helm客戶端
Tiller
Chart
Repository
Release
Helm安裝
Helm使用
創建Helm Chart
定義Chart元數據
定義Template模板
定義values參數
打包和部署
Helm Chart 推送到遠程倉庫
Helm常用命令
概念
Helm 是一個 Kubernetes 的包管理工具,它被稱為 Kubernetes 的 “Yum” 或 “Apt”,用于簡化應用在 Kubernetes 中的部署、升級和管理。通過 Helm,你可以定義、安裝和管理復雜的 Kubernetes 應用。
核心組件
Helm的運行也是依賴各種組件,我們在機器上執行一次Helm實際上也是多個組件執行的結果,Helm總共包括5個核心組件:
Helm客戶端
Helm 是一個命令行下的客戶端工具。主要用于 Kubernetes 應用程序 Chart 的創建、打包、發布以及創建和管理本地和遠程的 Chart 倉庫。
Tiller
Tiller 是 Helm 的服務端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的請求,并根據 Chart 生成 Kubernetes 的部署文件( Helm 稱為 Release ),然后提交給 Kubernetes 創建應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。
Chart
- Chart 是一個 Helm 包,包含 Kubernetes 應用的資源定義文件(YAML 格式)和模板文件(用于動態生成 Kubernetes 資源)。Chart 是 Helm 的基本單元,相當于一個應用模板包。
- 一個 Chart 可以用于部署多種環境,例如開發、測試和生產,只需要修改配置值。
Repository
Repository 是存放 Helm Chart 的地方,類似于 Docker 鏡像倉庫。官方的 Chart 倉庫是 Artifact Hub,你也可以搭建私有倉庫。
Release
- 每次使用一個 Chart 部署應用時,Helm 會創建一個 Release。
- Release 是 Chart 的運行實例。可以有多個 Release 運行同一個 Chart,但每個 Release 會有不同的名稱和配置。
Helm安裝
安裝 Helm CLI
- 從 Helm 官方獲取安裝腳本:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
驗證安裝
helm version// 如果安裝成功,你會看到類似以下的輸出:
version.BuildInfo{Version:"v3.x.x", GitCommit:"xxxx", GitTreeState:"clean", GoVersion:"go1.x"}
Helm使用
介紹了這么多,現在用示例來看看如何使用Helm來部署kubernetes資源。
創建Helm Chart
Chart是一個項目包,也是執行Helm的基礎,所有的定義都是在Chart中定義的,我們使用Helm部署一些中間件的時候,比如nginx、Kafka等這些,都是倉庫中已有的Chart直接使用,這里我們直接自己自定義一個Chart定義自己的項目。
創建Chart命令:
helm create my-app
這樣可以生成一個my-app項目,項目目錄如下:
目錄結構說明:
- Chart.yaml:Chart的元數據,定義Chart的名稱和版本
- values.yaml:默認配置參數,配置Kubernetes的一些參數,配合模板使用
- templates:Kubernetes的資源模板,比如Deployment、service、pod等
- charts:存放依賴的子Chart目錄,一般是已經打包成.tgz文件的chart文件
定義Chart元數據
apiVersion: v2
name: my-app
description: A Helm chart for my business app
version: 1.0.0
appVersion: 1.0.0
定義Template模板
這里我們定義一個WEB業務項目中常用的資源,有Deployment、Service、Ingress:
創建Deployment模板:
apiVersion: apps/v1
kind: Deployment
metadata:name: {{ .Release.Name }}labels:app: {{ .Chart.Name }}
spec:replicas: {{ .Values.replicaCount }}selector:matchLabels:app: {{ .Chart.Name }}template:metadata:labels:app: {{ .Chart.Name }}spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"ports:- containerPort: 80resources:{{- toYaml .Values.resources | nindent 12 }}
創建Service模板:
apiVersion: v1
kind: Service
metadata:name: {{ .Release.Name }}labels:app: {{ .Chart.Name }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: 80selector:app: {{ .Chart.Name }}
創建Ingress:
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: {{ .Release.Name }}annotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: {{ .Values.ingress.host }}http:paths:- path: /pathType: Prefixbackend:service:name: {{ .Release.Name }}port:number: {{ .Values.service.port }}
{{- end }}
這樣一個常規web項目就定義好了,我們定義了項目的鏡像還有訪問方式,可以看到和我們平時用kubernetes app -f xxx.yaml的方式不同,這里的yaml資源值都是用參數表示的,我們僅僅是定義了一個模板,參數都是動態的,可想而知如果是多個這樣的web項目,我們是不是只需要這樣一個模板就可以隨意部署我們的項目了,是不是很方便。
定義values參數
values.yaml是配合template使用的,定義template模板中使用的默認參數:
replicaCount: 2image:repository: myregistry.com/my-apptag: "1.0.0"pullPolicy: IfNotPresentservice:type: ClusterIPport: 80ingress:enabled: truehost: my-app.example.comresources:limits:cpu: 500mmemory: 256Mirequests:cpu: 250mmemory: 128Mi
打包和部署
Chart項目的內容都定義好了,現在只需要打包成.tgz文件,然后通過Helm部署就可以了。
- 打包Chart
helm package my-app
- 部署到Kubernetes
// 命令格式 heml install {name} {chart}// 通過源文件直接部署 helm install my-app ./my-app// 通過已經打好的chart包部署 helm install my-app my-app-1.0.0.tgz
這樣資源就部署好了,我們可以通過kubernetes命令進行查看,也可以通過helm list查看
上面這個部署方式用的是默認values.yaml里定義的參數,我們也可以在執行命令的時候定義參數,這樣模板就動態創建不同的資源了:
- 使用set
helm install my-app ./my-app \--set replicaCount=3 \--set image.tag="2.0.0"
- 使用
--set-file
傳遞文件中的值
如果值較為復雜,或者需要動態加載值,可以將參數放到文件中,通過--set-file
引入。
創建一個文件override-values.yaml
:
安裝命令:replicaCount: 5image:repository: custom.registry.com/my-apptag: "3.0.0"
helm install my-app ./my-app -f override-values.yaml
Helm Chart 推送到遠程倉庫
從上面可以看到,Chart是一個模板項目,通過不同的參數可以創建不同的資源,所以模板是共用的,可以保存在Chart的倉庫中。
- 添加Helm倉庫
helm repo add my-repo https://my-repo.com/charts
- 推送Chart使用插件helm-push
helm push my-app-1.0.0.tgz my-repo
Helm常用命令
命令 | 功能說明 |
---|---|
helm create <chart-name> | 創建一個新的 Chart 項目目錄結構。 |
helm lint <chart-path> | 檢查 Chart 的語法和結構是否正確。 |
helm install <release-name> <chart> | 安裝一個 Chart 并創建一個 Release。 |
helm upgrade <release-name> <chart> | 升級指定的 Release,并應用最新的 Chart 更改。 |
helm uninstall <release-name> | 刪除指定的 Release,同時清理相關的 Kubernetes 資源。 |
helm rollback <release-name> <rev> | 回滾指定 Release 到指定的版本(默認上一個版本)。 |
helm list | 列出當前 Kubernetes 集群中所有的 Helm Releases。 |
helm repo add <repo-name> <repo-url> | 添加一個 Chart 倉庫到本地。 |
helm repo update | 更新本地的 Chart 倉庫索引,拉取最新的倉庫信息。 |
helm search repo <keyword> | 在本地添加的倉庫中搜索 Chart。 |
helm search hub <keyword> | 在 Helm Hub 上搜索 Chart(需聯網)。 |
helm template <chart> | 渲染 Chart 模板為 Kubernetes 資源清單文件(不執行部署)。 |
helm package <chart-path> | 將 Chart 打包成一個 .tgz 文件,用于分發和發布。 |
helm show values <chart> | 顯示指定 Chart 的默認 values.yaml 配置內容。 |
helm get values <release-name> | 查看指定 Release 的實際生效配置值。 |
helm get manifest <release-name> | 查看指定 Release 渲染后的 Kubernetes 資源清單文件。 |
helm get all <release-name> | 獲取指定 Release 的所有相關信息(包含配置、清單等)。 |
helm dependency update | 更新 Chart 的依賴,下載 Chart.yaml 中定義的子 Chart 到 charts/ 目錄。 |
helm dependency build | 構建 Chart 的依賴,功能與 helm dependency update 類似,主要用于初始構建。 |
helm history <release-name> | 查看指定 Release 的歷史版本記錄。 |
helm env | 顯示 Helm 的環境變量信息(例如倉庫路徑、緩存路徑等)。 |
helm test <release-name> | 運行 Chart 定義的測試用例,用于驗證部署是否成功。 |
helm pull <chart-repo> | 從遠程倉庫拉取 Chart 包到本地(支持版本選擇)。 |
helm plugin list | 列出已安裝的 Helm 插件。 |
helm version | 顯示 Helm 的版本信息。 |