背景
目前,k8s項目的應用組件越來越多,每次升級和部署都需要更新大量的pod容器鏡像和配置文件,整個過程非常繁瑣,給運維升級造成很大的困擾。為了簡化生產環境應用的部署和升級,提升開發和運維的工作效率,確保應用能夠快速、穩定地發布到生產環境中,我們可以在自己項目中使用Helm這個工具。
Helm簡介
Helm 是一個用于 Kubernetes 的包管理工具,它通過 Helm Chart 來定義、安裝、升級和管理 Kubernetes 應用,Helm有三個重要的概念:
| Chart | Helm Chart 是一個包含 Kubernetes 資源定義的包,它描述了如何部署一個應用,包括所需的 Deployments、Services、ConfigMaps 等 |
| Repository | Helm Repository 是一個存儲 Chart 的倉庫,用戶可以從這些倉庫中搜索、download和安裝 Chart |
| Release | 當使用 helm install 命令將一個 Chart 部署到 Kubernetes 集群時,會創建一個 Release,它代表了特定版本的應用部署 |
Helm 適用于需要管理和部署復雜應用場景的環境。通過Helm,用戶可以輕松地安裝、升級和uninstall Kubernetes應用,同時支持版本管理和依賴關系處理。這使得在Kubernetes平臺上管理和部署應用變得更加高效和可靠。
入門指南
使用Helm,需要準備以下幾點:
- 一個 Kubernetes 集群,并安裝了kubectl指令
- 確定你安裝版本的安全配置
- 安裝和配置Helm。
使用Helm 部署 Kubernetes 應用
charts 除了可以在 repo 中download,還可以自己自定義,創建完成后通過 helm 部署到 k8s。
一個典型的 Helm Chart 包含以下目錄和文件結構:
my-app/├── Chart.yaml # Chart 的元數據├── values.yaml # 默認配置├── .helmignore # 忽略的文件模式├── templates/ # Kubernetes 資源模板│ ├── NOTES.txt # 部署后的提示信息│ ├── _helpers.tpl # 輔助模板│ ├── deployment.yaml # Deployment 資源模板│ ├── service.yaml # Service 資源模板│ └── ingress.yaml # Ingress 資源模板(可選)└── charts/ # 依賴的子 Chart(可選) |
1. 編寫 Chart.yaml
Chart.yaml 是 Helm Chart 的元數據文件,包含 Chart 的基本信息。例如:
apiVersion: v2name: my-appdescription: A Helm chart for my applicationtype: applicationversion: 0.1.0appVersion: "1.0" |
-
apiVersion:Helm Chart 的版本格式(v2 是當前推薦的版本)。 -
name:Chart 的名稱。 -
description:Chart 的描述。 -
type:Chart 的類型(application或library)。 -
version:Chart 的版本號。 -
appVersion:應用本身的版本號。
2. 編寫 values.yaml
values.yaml 是 Helm Chart 的默認配置文件,用戶可以通過它覆蓋默認值。例如:
# 默認配置replicaCount: 1image: repository: my-app tag: latest pullPolicy: IfNotPresentservice: type: ClusterIP port: 80ingress: enabled: false annotations: {} hosts: - host: my-app.local paths: ["/"] tls: []resources: {} |
-
replicaCount:Pod 的副本數量。 -
image:Docker 鏡像的配置。 -
service:Service 的配置。 -
ingress:Ingress 的配置。 -
resources:資源限制的配置。
3. 編寫 .helmignore
.helmignore 文件用于指定在打包 Chart 時需要忽略的文件或目錄。例如:
# 忽略文件.DS_Store.git/.gitignoreREADME.md |
4. 編寫 templates/ 目錄中的 Kubernetes 資源模板
templates/ 目錄包含 Kubernetes 資源的模板文件。Helm 會根據 values.yaml 中的配置渲染這些模板。
# 忽略文件.DS_Store.git/.gitignoreREADME.md |
4.1 編寫 deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: {{ .Values.nameOverride }} labels: app.kubernetes.io/name: {{ .Chart.Name }} app.kubernetes.io/instance: {{ .Release.Name }}spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app.kubernetes.io/name: {{ .Chart.Name }} app.kubernetes.io/instance: {{ .Release.Name }} template: metadata: labels: app.kubernetes.io/name: {{ .Chart.Name }} app.kubernetes.io/instance: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - containerPort: {{ .Values.service.port }} |
4.2 編寫 service.yaml
apiVersion: v1kind: Servicemetadata: name: {{ .Values.nameOverride }} labels: app.kubernetes.io/name: {{ .Chart.Name }} app.kubernetes.io/instance: {{ .Release.Name }}spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: {{ .Values.service.port }} protocol: TCP name: http selector: app.kubernetes.io/name: {{ .Chart.Name }} app.kubernetes.io/instance: {{ .Release.Name }} |
5. 編寫 charts/ 目錄(可選)
如果需要依賴其他 Helm Charts,可以將它們放在 charts/ 目錄中。例如:
my-app/└── charts/ └── my-dependency/ ├── Chart.yaml ├── values.yaml └── templates/ └── ... |
6. 打包和安裝 Helm Chart
完成 Chart 的編寫后,可以通過以下命令打包和安裝:
helm package my-apphelm install my-release ./my-app |
使用Helm升級 Kubernetes 應用
使用 Helm 升級 Kubernetes 應用的步驟如下:
1、更新 Helm 倉庫索引:
helm repo update |
確保本地倉庫索引是最新的。
2、查看可用的 Chart 版本:
helm search repo <chart名稱> |
查看目標 Chart 的可用版本。
3、升級應用程序:
運行helm upgrade命令,指定要升級的Release名稱和Chart名稱,以及任何必要的配置參數。
helm upgrade --install <release名稱> <chart名稱> --version <版本號> -n <命名空間> -f <自定義值文件> --set <參數1>=<值1>,<參數2>=<值2> ... |
例如:
helm upgrade --install poptestagent sa_helm_rel/poptestserver --version 3.23.1821 -n platform -f /root/tmp/poptestserver.yaml |
使用Helm動態更新配置文件
如果需要更新配置文件,可以直接修改 values.yaml 文件,然后運行以下命令:
helm upgrade RELEASE_NAME . |
也可以通過命令行參數覆蓋values.yaml中的值:
helm upgrade RELEASE_NAME --set image.tag='1.19.6' . |
或者使用 YAML 文件指定配置:
helm upgrade RELEASE_NAME -f values.yaml . |
注意事項
在升級之前,建議先運行 helm status <release名稱> 檢查當前部署的狀態。
如果需要回滾到之前的版本,可以使用 helm rollback <release名稱> <版本號>