背景
目前,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: v2 name: my-app description: A Helm chart for my application type: application version: 0.1 . 0 appVersion: "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: 1 image: repository: my-app tag: latest pullPolicy: IfNotPresent service: type: ClusterIP port: 80 ingress: 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/ .gitignore README.md |
4. 编写 templates/
目录中的 Kubernetes 资源模板
templates/
目录包含 Kubernetes 资源的模板文件。Helm 会根据 values.yaml
中的配置渲染这些模板。
# 忽略文件 .DS_Store .git/ .gitignore README.md |
4.1 编写 deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: 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: v1 kind: Service metadata: 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-app helm 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名称> <版本号>