一、Helm介绍
helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。
Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件(deployment.yaml、service.yaml)。然后kubectl自动调用K8S资源部署。
对于K8s来说,应用资源配置可以定义为K8s API对象,包括Deployment,Namespace,Service, PV(Persistent Volumes)和PVC(PersistentVolumeClaims)等等。通常一个应用的部署会涉及很多资源的共同协作,用户会定义这些API对象到一系列Yaml文件中,然后通过kubectl来逐一进行部署。
那么问题来了,假如我没接触过K8s, 只想部署个应用了解下,不会写Yaml一个个配这些资源对象怎么破?需要去结合K8s文档学习Yaml语法。过了几天我终于学会了,一个个配好了这些资源对象的Yaml文件,并逐一部署在这台机器上。后面想在这台机器上再重复部署几套,另外还有十台环境要配成和这台一样,怎么办?拷贝过去再一一部署出来?这配置管理也太麻烦了,不好用,直接劝退!
先别急!幸好已经有Helm,避免了我们去完成这些繁琐配置和维护过程。它能够把这些零零散散的应用资源文件放在一起进行统一配置,极大方便了开发人员对K8s集群应用的管理。
1、Helm 组件及相关术语
Helm是官方提供类似于YUM的包管理,是部署环境的流程封装,Helm有三个重要的概念:chart、release和Repository
- Helm:Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
- Tiller:Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
- Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。Chart有特定的文件目录结构,如果开发者想自定义一个新的 Chart,只需要使用Helm create命令生成一个目录结构即可进行开发。
- Repoistory:Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository, 官方仓库的地址是https://hub.helm.sh。
- Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。
2、Helm工作原理
- Chart Install 过程:
Helm从指定的目录或者tgz文件中解析出Chart结构信息
Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
Tiller根据Chart和Values生成一个Release
Tiller将Release发送给Kubernetes用于生成Release
- Chart Update过程:
Helm从指定的目录或者tgz文件中解析出Chart结构信息
Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
Tiller生成Release并更新指定名称的Release的History
Tiller将Release发送给Kubernetes用于更新Release
- Chart Rollback过程:
Helm将要回滚的Release的名称传递给Tiller
Tiller根据Release的名称查找History
Tiller从History中获取上一个Release
Tiller将上一个Release发送给Kubernetes用于替换当前Release
二、Helm部署
现在越来越多的公司和团队开始使用Helm这个Kubernetes的包管理器,我们也会使用Helm安装Kubernetes的常用组件。Helm由客户端命令helm工具和服务端tiller组成。
helm的GitHub地址:https://github.com/helm/helm
方式一:使用官方提供的脚本一键安装
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
方式二:手动下载安装
wget https://get.helm.sh/helm-v3.11.3-linux-amd64.tar.gz
tar -zxvf helm-v3.11.3-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin/
echo "source <(helm completion bash)" >> ~/.bashrc
source ~/.bashrc
做完上述设置后即可使用helm search搜索官方helm hub chart库
helm search hub nginx
添加第三方Chart库
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 bitnami https://charts.bitnami.com/bitnami
查看Chart库
helm repo list
可以使用helm search repo从你所添加的仓库中查找chart的名字
helm search repo nginx
三、helm部署nginx应用
1、harbor仓库相关配置
在harbor仓库中新建项目(公开):bitnami,再拉取镜像
docker pull bitnami/nginx:1.19.7-debian-10-r1
上传镜像到harbor仓库
docker push 192.168.65.30:88/bitnami/nginx:1.19.7-debian-10-r1
2、nginx Chart包
拉取nginx Chart包并做相应配置
helm pull bitnami/nginx --version 14.1.1
解压nginx Chart包
tar -zxf nginx-14.1.1.tgz
修改配置文件
cd nginx/
vim values.yaml9 global:10 imageRegistry: 192.168.65.30:88 # 指定仓库地址71 image: # 指定镜像72 registry: docker.io73 repository: bitnami/nginx74 tag: 1.19.7-debian-10-r175 digest: ""
523 service:
524 ## @param service.type Service type
525 ##
526 type: ClusterIP # 设置service类型
2.1、测试nginx部署效果
安装webserver
helm install webserver .
查看详细信息
helm status webserver
查看分配到的IP,再访问服务
kubectl get all
curl 查看到的ip
2.2、升级与回滚
修改配置文件
vim values.yaml
120 replicaCount: 3
升级
helm upgrade webserver .
查看升级结果
kubectl get pod
查看记录
helm history webserver
御载
helm uninstall webserver
三、构建Helm Chart
1、创建
创建一个mychart
helm create mychart
mychart目录结结
tree .
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
- 目录结构说明:
charts/:包含 chart 所依赖的其他 chart
Chart.yaml:用于描述 chart 信息的 yaml 文件,应用描述相关文件
templates/:chart 模板文件,引入变量值后可以生成用于 Kubernetes 的 manifest 文件
templates/NOTES.txt:可选: 包含简短使用说明的纯文本文件
values.yaml:用于存储 chart 所需要的默认配置,应用部署相关文件以下是可选文件:
— LICENSE:用于存储关于 chart 的 LICENSE 文件
— README.md:README 文件
— values.schema.json:一个使用JSON结构的 values.yaml 文件
— crds/:自定义资源的定义
- Chart.yaml文件结构和说明
Chart.yaml文件是chart包中必须存在的文件,它包含以下字段:
apiVersion: # chart API 版本信息, 通常是 "v1" (必须)
name: # chart 的名称 (必须)
version: # chart 包的版本 (必须)
kubeVersion: # 指定 Kubernetes 版本 (可选)
type: # chart类型 (可选)
description: # 对项目的描述 (可选)
keywords:- # 有关于项目的一些关键字 (可选)
home: # 项目 HOME 页面的 URL 地址 (可选)
sources:- # 项目源码的 URL 地址 (可选)
dependencies: # chart 必要条件列表 (可选)- name: # chart名称 (nginx)version: # chart版本 ("1.2.3")repository: # (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")condition: # (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )tags: # (可选)- # 用于一次启用/禁用 一组chart的tagimport-values: # (可选)- # ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项alias: # (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)维护者信息- name: # 维护者的名称email: # 维护者的邮件地址url: # 维护者的个人主页
engine: gotpl # 模板引擎的名称(可选,默认为 gotpl)
icon: # (可选)指定 chart 图标的 SVG 或 PNG 图像的 URL
appVersion: # 应用程序包含的版本
deprecated: # (可选,使用布尔值)该 chart 是否被废弃
annotations:example: # 按名称输入的批注列表 (可选).
设置配置文件values.yaml
vim values.yaml7 image:8 repository: myapp # 指定镜像9 pullPolicy: IfNotPresent10 # Overrides the image tag whose default is the chart appVersion.11 tag: "v1" # 指定tag
检查依赖和模板配置是否正确
helm lint .
打包
cd ..
helm package mychart/
添加第三方仓库,这个charts项目需要提前在harbor仓库中创建
helm repo add --username admin --password Harbor12345 mychart http://192.168.65.30:88/chartrepo/chart
1.1、安装push插件
helm plugin install https://github.com/chartmuseum/helm-push,现在用离线安装
wget https://github.com/chartmuseum/helm-push/releases/download/v0.10.3/helm-push_0.10.3_linux_amd64.tar.gz
获取插件目录
helm env
HELM_BIN="helm"
HELM_BURST_LIMIT="100"
HELM_CACHE_HOME="/root/.cache/helm"
HELM_CONFIG_HOME="/root/.config/helm"
HELM_DATA_HOME="/root/.local/share/helm"
HELM_DEBUG="false"
HELM_KUBEAPISERVER=""
HELM_KUBEASGROUPS=""
HELM_KUBEASUSER=""
HELM_KUBECAFILE=""
HELM_KUBECONTEXT=""
HELM_KUBEINSECURE_SKIP_TLS_VERIFY="false"
HELM_KUBETLS_SERVER_NAME=""
HELM_KUBETOKEN=""
HELM_MAX_HISTORY="10"
HELM_NAMESPACE="default"
HELM_PLUGINS="/root/.local/share/helm/plugins" # push插件目录
HELM_REGISTRY_CONFIG="/root/.config/helm/registry/config.json"
HELM_REPOSITORY_CACHE="/root/.cache/helm/repository"
HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"
创建插件目录
mkdir -p /root/.local/share/helm/plugins/helm-push/
cd /root/.local/share/helm/plugins/helm-push/
解压包
tar -zxf helm-push_0.10.3_linux_amd64.tar.gz
查看插件
helm plugin list
上传chart包到仓库
helm cm-push --username=admin --password=Harbor12345 nginx-14.1.1.tgz mychart
查询chart
helm search repo mychart
拉取chart
helm pull mychart/mychart --version=0.1.0
1.2、部署
部署mychart应用到集群
helm install webserver mychart