一、概念
Helm是 Kubernetes 的包管理工具,它允許開發(fā)者和系統(tǒng)管理員通過定義、打包和部署應用程序來簡化 Kubernetes 應用的管理工作。Helm 的出現(xiàn)是為了解決在 Kubernetes 環(huán)境中部署和管理復雜應用的挑戰(zhàn)。Helm命令行客戶端工具,主要用于Kubernetes應用中的Chart的創(chuàng)建、打包、發(fā)布和管理。
Helm 的官方網(wǎng)站是Helm,在這里可以找到 Helm 的安裝指南、文檔、Chart 倉庫和社區(qū)貢獻信息。通過 Helm,用戶可以更高效地管理和部署 Kubernetes 應用,實現(xiàn)快速迭代和持續(xù)集成。
1.Helm核心概念
?Chart:Helm 的 Chart 是一個軟件包,它包含了一組定義 Kubernetes 資源的 YAML 文件。Chart 可以看作是 Kubernetes 應用的模板,它描述了如何部署一個應用,包括所需的 Deployments、Services、ConfigMaps 等資源。
?Repository:Helm 的 Repository 是一個存儲 Chart 的倉庫。用戶可以從這些倉庫中搜索、下載和安裝 Chart。每個 Repository 都有一個索引文件,列出了可用的 Chart 和它們的版本。
?Release:當使用 helm install 命令部署一個 Chart 到 Kubernetes 集群時,Helm 會創(chuàng)建一個 Release。Release 是 Chart 在集群中的一個實例,它代表了特定版本的應用部署;一個Chart被Helm運行后將生成對應的一個Release(將在K8S中創(chuàng)建出真實運行的資源對象)。用戶可以對同一個 Chart 創(chuàng)建多個 Release,每個 Release 都有自己的配置和狀態(tài)。
Chart:Helm程序包,一系列用于描述K8S資源和相關文件的集合,比方說我們部署Nginx,需要Deployment的Yaml,需要Service的Yaml,這兩個清單文件就是一個Helm程序包,在K8S中把這些Yaml清單文件叫做Chart圖表。
Vlues.yaml文件為模板中的文件賦值,可以實現(xiàn)我們自定義安裝
Chart---->通過Values.yaml文件賦值---->生成Release實例
總結:Helm把Kubernetes資源打包到一個Chart中,制作并完成各個Chart和Chart 本身依賴關系并利用Chart倉庫實現(xiàn)對外分發(fā),而Helm還可以通過Values.yaml文件完成可配置的發(fā)布,如果Chart版本更新了,Helm自動支持滾動更新機制,還可以一鍵回滾,但是不適合在生產(chǎn)環(huán)境使用,除非具有定義自制Chart的能力
2.Helm工作流程
?查找 Chart:用戶可以在 Helm 的 Repository 中查找所需的 Chart。
?安裝 Chart:使用 helm install 命令安裝 Chart 到 Kubernetes 集群,創(chuàng)建一個 Release。
?管理 Release:用戶可以使用 helm upgrade、helm rollback、helm uninstall 等命令來管理 Release,包括更新、回滾或卸載應用。
?維護 Repository:用戶可以添加、更新和刪除 Helm Repository,以管理可用的 Chart。
3.Helm 3 與 Helm 2的區(qū)別
?Helm 2:在 Helm 2 中,采用了客戶端-服務器模型,其中客戶端是 Helm,服務器端是 Tiller。Tiller 作為 Kubernetes 集群中的一個 Deployment 運行,負責管理 Helm 的 Release 和執(zhí)行 Kubernetes 操作。
?Helm 3:Helm 3 移除了 Tiller,簡化了架構?,F(xiàn)在,Helm 客戶端直接與 Kubernetes API 服務器通信,執(zhí)行所有的 Kubernetes 操作。這減少了復雜性,并提高了安全性,因為不再需要在集群中運行一個具有廣泛權限的 Tiller 服務。
架構變化:
? Helm服務端Tiller被刪除
? Release名稱可以在不同命名空間重用
? 支持將Chart推送至Docker鏡像倉庫中
? 使用JSONChema驗證Chartvalues
Helm版本以及其對應支持的Kubernetes版本
Helm版本 | 支持的Kubernetes版本 |
3.6.x | 1.21.x - 1.18.x |
3.5.x | 1.20.x - 1.17.x |
3.4.x | 1.19.x - 1.16.x |
3.3.x | 1.18.x - 1.15.x |
3.2.x | 1.18.x - 1.15.x |
3.1.x | 1.17.x - 1.14.x |
3.0.x | 1.16.x - 1.13.x |
2.16.x | 1.16.x - 1.15.x |
二、Helm部署
包括如何安裝 Helm 客戶端、添加和更新 Helm 倉庫、搜索和查看 Chart 信息、安裝和卸載應用
1.安裝Helm
1.1下載 Helm 客戶端
訪問 Helm 的 GitHub 標簽頁面 https://github.com/helm/helm/releases 來下載適合操作系統(tǒng)的 Helm 版本。例如,如果使用的是 Linux 系統(tǒng),可以下載 helm-v3.6.0-linux-amd64.tar.gz。
1.2安裝Helm
解壓下載的 Helm 壓縮包,并將其移動到系統(tǒng)的可執(zhí)行路徑中,例如/usr/local/bin。
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz mvlinux-amd64/helm /usr/local/bin/helm

1.3驗證安裝
#運行 helm version 來檢查 Helm 是否已成功安裝。 helm version

1.4命令補全
#為了提高使用 Helm 的效率,可以啟用命令補全功能 echo"source <(helm completion bash)"?>> ~/.bashrc

2.使用Helm安裝Chart
2.1添加Helm倉庫
#添加常用的 Helm 倉庫,以便可以搜索和安裝各種 Chart helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo add incubator https://charts.helm.sh/incubator

2.2更新Helm倉庫
#更新 Helm 倉庫列表,以確??梢栽L問最新的 Chart 版本 helm repo update

2.3查看 Helm 倉庫列表
#查看已添加的 Helm 倉庫 helm repo list

2.4刪除Helm倉庫
#如果不再需要某個 Helm 倉庫,可以將其從列表中刪除 helm repo remove incubator
2.5查看Chart信息
#查看特定 Chart 的基本信息或所有信息 helm show chart stable/mysql # 查看基本信息 helm show all stable/mysql # 獲取所有信息


2.6安裝 Chart
#使用 helm install 命令安裝 Chart。可以指定一個 release 名稱,或者使用 --generate-name 讓 Helm 為生成一個隨機名稱 helm install my-redis bitnami/redis [-n default] # 指定 release 名稱 helm install bitnami/redis --generate-name # 自動生成 release 名稱
2.7查看所有Release
#列出所有已安裝的 Helm release helmls #helm list 來獲取更詳細的信息 helm list

2.8查看Release狀態(tài)
#查看特定 release 的狀態(tài)信息 helm status my-redis

2.9刪除Release
#使用 helm uninstall 命令刪除指定的 Helm release helm uninstall my-redis

三、Helm Chart 自定義模板
1.查看Chart文件細節(jié)
charts 除了可以在 repo 中下載,還可以自己自定義,創(chuàng)建完成后通過 helm 部署到 k8s
Helm Chart 是 Helm 用來部署 Kubernetes 應用的包。一個 Chart 包含一系列的 Kubernetes 資源定義文件(YAML 格式),以及一個描述 Chart 的 Chart.yaml 文件和一個用于配置的 values.yaml 文件。自定義 Helm Chart 允許根據(jù)具體需求來創(chuàng)建和部署 Kubernetes 應用。
2.拉取 Helm Chart
mkdir/opt/helm cd/opt/helm helm pull stable/mysql ls mysql-1.6.9.tgz

3.查看Chart結構
tar xf mysql-1.6.9.tgz yum install -y tree tree mysql mysql ├── Chart.yaml #包含 chart 的元數(shù)據(jù) ├── README.md #提供關于 chart 的信息和使用說明 ├── templates #包含 chart 的模板文件 │ ├── configurationFiles-configmap.yaml #配置文件的 ConfigMap 模板 │ ├── deployment.yaml #Deployment 資源的模板 │ ├── _helpers.tpl #輔助模板文件 │ ├── initializationFiles-configmap.yaml #初始化文件的 ConfigMap 模板 │ ├── NOTES.txt #安裝后的說明和注意事項 │ ├── pvc.yaml #PersistentVolumeClaim 資源的模板 │ ├── secrets.yaml #Secret 資源的模板 │ ├── serviceaccount.yaml #ServiceAccount 資源的模板 │ ├── servicemonitor.yaml #ServiceMonitor 資源的模板 │ ├── service.yaml #Service 資源的模板 │ ├── ingress.yaml #Ingress 資源的模板 │ └── tests #包含測試相關的模板文件 │ ├── test-configmap.yaml │ └── test.yaml └── values.yaml #包含 chart 的默認配置值 #通過這個結構,我們可以看到 Helm chart 是如何組織和管理 Kubernetes 應用程序的部署配置的。用戶可以根據(jù)需要編輯這些文件,以自定義應用程序的行為和配置。

4.Helm Chart結構
Helm chart 的關鍵組成部分的詳細說明
4.1Chart.yaml
? 這是 Helm chart 的自描述文件,它包含了 chart 的基本信息。
? 必須包含 name 字段,用于指定 chart 的名稱。
? 必須包含 version 字段,用于指定 chart 的版本號。
? 還可以包含其他元數(shù)據(jù),如描述、圖標、維護者信息等。
4.2模板
? Helm chart 包含一個或多個模板,這些模板是 Kubernetes 資源清單文件的文本模板。
? 模板中可以包含 Go 模板 語法,用于動態(tài)生成 Kubernetes 清單文件。
? 模板會根據(jù) values.yaml 文件中的值進行填充和處理,生成最終的 Kubernetes 資源清單。
4.3具體模板文件
? NOTES.txt:這是一個文本文件,包含安裝 chart 后顯示給用戶的信息,通常包括配置提示、使用說明等。
? deployment.yaml:這個模板定義了一個 Kubernetes Deployment 資源,用于指定如何部署應用程序的副本。
? service.yaml:這個模板定義了一個 Kubernetes Service 資源,通常用于提供對 Deployment 的網(wǎng)絡訪問。
? ingress.yaml:這個模板定義了一個 Kubernetes Ingress 資源,用于管理外部訪問到 Service 的路由。
? _helpers.tpl:這個文件包含可重用的模板助手函數(shù),可以在 chart 的其他模板中調用。
通過這些組件,Helm charts 為 Kubernetes 應用程序的部署提供了一種標準化和自動化的方法。用戶可以通過修改 values.yaml 文件和模板來定制應用程序的部署,然后使用 Helm 命令進行部署和管理。
5.創(chuàng)建自定義的Chart
5.1創(chuàng)建自定義Helm Chart
helm create nginx #創(chuàng)建一個新的 Helm chart,例如 nginx tree nginx nginx ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml catnginx/templates/deployment.yaml #查看 templates/deployment.yaml 文件,了解如何在模板中使用 Go 模板語法引用 values.yaml 中的變量 #在 templates 目錄下 yaml 文件模板中的變量(go template語法)的值默認是在 nginx/values.yaml 中定義的,只需要修改 nginx/values.yaml 的內容,也就完成了 templates 目錄下 yaml 文件的配置。 比如在 deployment.yaml 中定義的容器鏡像: image:"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" catnginx/values.yaml | grep repository repository: nginx #以上變量值是在 create chart 的時候就自動生成的默認值,你可以根據(jù)實際情況進行修改。



5.2修改Helm Chart
#修改 chart vim nginx/Chart.yaml apiVersion: v2 name: nginx #chart名字 description: A Helm chartforKubernetes type: application #chart類型,application或library version: 0.1.0 #chart版本 appVersion: 1.16.0 #application部署版本 vim nginx/values.yaml replicaCount: 1 image: repository: nginx pullPolicy: IfNotPresent tag:"latest" #設置鏡像標簽,加上該內容 imagePullSecrets: [] nameOverride:"" fullnameOverride:"" serviceAccount: create:true annotations: {} name:"" podAnnotations: {} podSecurityContext: {} # fsGroup: 2000 securityContext: {} # capabilities: # drop: # - ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000 service: type: ClusterIP port: 80 ingress: enabled:true #開啟 ingress className:"" annotations: {} # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" hosts: - host: www.cxk.com #指定ingress域名 paths: - path: / pathType: Prefix #指定ingress路徑類型 tls: [] # - secretName: chart-example-tls # hosts: # - chart-example.local resources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Mi autoscaling: enabled:false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80 nodeSelector: {} tolerations: [] affinity: {}

5.3打包和部署Helm Chart
helm lint nginx #檢查依賴和模版配置是否正確 helm package nginx #打包 chart,會在當前目錄下生成壓縮包 nginx-0.1.0.tgz #部署 chart helm install nginx ./nginx --dry-run --debug #使用 --dry-run 參數(shù)驗證 Chart 的配置,并不執(zhí)行安裝 helm install nginx ./nginx -n default #部署 chart,release 版本默認為 1 或者 helm install nginx ./nginx-0.1.0.tgz #可根據(jù)不同的配置來 install,默認是 values.yaml helm install nginx ./nginx -f ./nginx/values.yaml helmls kubectl get pod,svc




5.4部署Ingress-Nginx
#部署 ingress wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml #下載 Ingress-Nginx 的配置文件 mandatory.yaml 和 service-nodeport.yaml kubectl apply -f mandatory.yaml kubectl apply -f service-nodeport.yaml #使用 kubectl apply 命令應用這些配置文件,以部署 Ingress 控制器和 NodePort 類型的 Service kubectl get pod,svc -n ingress-nginx kubectl get ingress vim /etc/hosts ..... 192.168.241.23 node02 www.cxk.com curl http://www.cxk.com:32733



5.5升級Helm Chart
#修改為 NodePort 訪問后,升級 vim nginx/values.yaml service: type: NodePort #修改 values.yaml 文件以更改 Service 類型為 NodePort 并設置 nodePort port: 80 nodePort: 30080 ingress: enabled:false vim nginx/templates/service.yaml #模板以反映 Service 類型的變化 apiVersion: v1 kind: Service metadata: name: {{ include"nginx.fullname". }} labels: {{- include"nginx.labels". | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http nodePort: {{ .Values.service.nodePort }} #指定 nodePort selector: {{- include"nginx.selectorLabels". | nindent 4 }} #升級 release,release 版本加 1 helm upgrade nginx nginx kubectl get svc curl 192.168.241.23:30080

通過這些步驟,可以創(chuàng)建和部署自定義的 Helm charts,以及管理和配置 Kubernetes 集群中的 Ingress 規(guī)則。這些步驟提供了一個從創(chuàng)建到部署再到升級的完整流程,有助于理解 Helm charts 的使用和管理。
四、回滾
使用 Helm 進行回滾操作以及如何在命令行中使用--set參數(shù)來部署或升級 Helm release 的信息
1.回滾Helm Release
1.1查看Release歷史
helmhistorynginx #使用 helm history 命令查看 Helm release 的歷史記錄,包括每次更新的詳細信息和狀態(tài)

1.2執(zhí)行回滾操作
helm rollback nginx 1 #使用 helm rollback 命令加上 release 名稱和要回滾到的版本號來執(zhí)行回滾操作。 helmhistorynginx #執(zhí)行回滾后,可以再次使用 helm history 命令確認 release 是否已經(jīng)成功回滾到指定版本

1.3維護Helm Chart
在 Helm chart 的templates目錄下的 Kubernetes 清單文件配置好后,通常的維護工作主要涉及修改Chart.yaml和values.yaml文件。
?Chart.yaml:更新 chart 的元數(shù)據(jù),如版本號、描述等。
?values.yaml:調整或添加配置參數(shù),這些參數(shù)將應用于模板中,以定制 Kubernetes 資源的行為。
1.4使用-set參數(shù)部署或升級Release
在部署或升級 Helm release 時,可以使用--set參數(shù)在命令行中直接指定配置值。這些值將覆蓋values.yaml文件中的同名參數(shù)。
#例如,要將 Nginx chart 的鏡像標簽升級到 1.15,可以使用以下命令 helm upgrade nginx nginx --setimage.tag='1.15' #這個命令會更新 Nginx chart 的鏡像標簽,而無需修改 values.yaml 文件。這種快捷方式在需要快速更改配置或在沒有訪問 values.yaml 文件的情況下非常有用。

總結來說,Helm 提供了靈活的方式來管理和維護 Kubernetes 應用程序的部署。通過回滾功能,可以輕松撤銷更改;通過--set參數(shù),可以在部署或升級時動態(tài)調整配置。這些功能使得 Helm 成為 Kubernetes 集群中應用程序部署和維護的強有力工具。
五、Helm倉庫
使用 Harbor 作為本地 Helm 倉庫,并將自定義的 Helm chart 推送至 Harbor 倉庫的詳細步驟
1.安裝Harbor
1. 準備 Harbor 的離線安裝包 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件。
2. 配置 harbor.yml 文件,設置 Harbor 的主機名、管理員密碼、數(shù)據(jù)存儲路徑等。
3. 使用 ./install.sh --with-clair --with-chartmuseum 命令安裝 Harbor,并啟用 Clair 服務和 chart 倉庫服務。
#上傳 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目錄 cd/opt cpdocker-compose /usr/local/bin/ chmod+x /usr/local/bin/docker-compose curl -SL https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose #如果安裝最新版的Docker需要安裝高版本的Docker-Compose wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.1.tgz tar zxf harbor-offline-installer-v1.9.1.tgz cdharbor/ vim harbor.yml hostname: 192.168.241.24 harbor_admin_password: Harbor12345 #admin用戶初始密碼 data_volume: /data #數(shù)據(jù)存儲路徑,自動創(chuàng)建 chart: absolute_url: enabled #在chart中啟用絕對url log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harbor #日志路徑 #安裝帶有 Clair service 和 chart 倉庫服務的 Harbor ./install.sh --with-clair --with-chartmuseum


2.安裝Helm Push插件
#在線安裝 Helm Push 插件 helm plugin install https://github.com/chartmuseum/helm-push
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz #離線安裝 Helm Push 插件: mkdir~/.local/share/helm/plugins/helm-push -p tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push helm repols


3.配置Helm倉庫
helm repo add harbor http://192.168.241.24/chartrepo/chart_repo --username=admin --password=Harbor12345 #登錄到 Harbor 的 Web UI 界面,并創(chuàng)建一個新項目 chart_repo。 #瀏覽器訪問:http://192.168.241.24 ,默認的管理員用戶名和密碼是 admin/Harbor12345 點擊 “+新建項目” 按鈕 填寫項目名稱為 “chart_repo”,訪問級別勾選 “公開”,點擊 “確定” 按鈕,創(chuàng)建新項目 #添加 Harbor 項目作為 Helm 倉庫: #這里的 repo 的地址是/chartrepo/,Harbor 中每個項目是分開的 repo。如果不提供項目名稱, 則默認使用 library 這個項目。



4.推送Chart 到 Harbor
cd/opt/ helm push nginx harbor #使用 helm push 命令將 chart 推送到 Harbor 倉庫


在 Harbor 的 Web UI 界面中查看chart_repo項目,確認已成功推送的 Helm Charts
通過這些步驟,可以將自定義的 Helm charts 推送到本地的 Harbor 倉庫中,從而實現(xiàn) Helm charts 的存儲、管理和分發(fā)。Harbor 作為一個企業(yè)級的 Docker Registry 管理項目,也支持 Helm charts 的存儲和分發(fā),這使得它成為 Kubernetes 環(huán)境中管理 Helm charts 的理想選擇。
六、總結
1.Helm命令總結
Helm命令總結
命令 | 含義 |
Completion | 命令補全 |
Create | 創(chuàng)建一個給定名稱的Chart |
Dependency | 管理Chart的依賴關系 |
Env | Helm環(huán)境信息 |
Get | 獲取給定Release的擴展信息 |
Help | 命令幫助 |
History | 獲取Release歷史 |
Install | 部署Chart |
Lint | 對Chart進行語法檢查 |
List | Release列表,List可簡寫成Ls |
Package | 打包Chart |
Plugin | Install、List、UnInstall、Helm插件 |
Pull | 從Repo中下載Chart并(可選)將其解壓到本地目錄 |
Repo | ADD、List、Remove、Update、Index、Helm的Repo |
RollBack | 回滾Release到一個以前的版本 |
Search | 查詢在Charts中的關鍵字 |
Show | 顯示Chart的信息 |
Status | 顯示給定Release的狀態(tài) |
Template | 本地渲染模板 |
Test | 測試運行Release |
Uninstall | 刪除Release |
Upgrade | 升級Release |
Verify | 驗證給定路徑的Chart是否已簽名且有效 |
Version | 顯示Helm的版本信息 |
鏈接:https://blog.csdn.net/weixin_46560589/article/details/135459378
-
服務器
+關注
關注
12文章
9596瀏覽量
86966 -
文件
+關注
關注
1文章
577瀏覽量
25125 -
kubernetes
+關注
關注
0文章
237瀏覽量
8906
原文標題:為什么每個 Kubernetes 工程師都在用 Helm?一文告訴你!
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
使用Helm 在容器服務k8s集群一鍵部署wordpress
在阿里云Kubernetes容器服務上打造TensorFlow實驗室
Kubernetes API詳解

首次部署 Kubernetes 應用程序需注意的“陷阱”

Helm的一些概念及用法

Awesome 工具如何更好地管理Kubernetes

請問如何使用Helm在K8s上集成Prometheus呢?

評論