3.1 为什么需要Helm
K8S上的应用对象,都是由特定的资源描述组成,包括deployment、service等。都保存各自文件中或者集中写到一个配置文件。然后kubectl apply –f 部署。
而对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心了。 且由于缺少对发布过的应用版本管理和控制,使Kubernetes上的应用维护和更新等面临诸多的挑战,主要面临以下问题:
(2) 这些资源文件如何高效复用 (3) 不支持应用级别的版本管理
3.2 Helm介绍
(1) helm # 一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。 (2) Chart # 应用描述,一系列用于描述 k8s 资源相关文件的集合。 (3) Release # 基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象。
3.3 Helm v3 变化
Helm目前有两个大版本:v2和v3,2019年11月,Helm团队发布 v3 版本,v3版本相比v2版本最主要变化如下。
1 架构变化
的删除,并大部分代码重构。
名称可以在不同命名空间重用
3 支持将 Chart 推送至 Docker 镜像仓库中
4 使用JSONSchema验证chart values
5 其他
个别更名
helm fetch 更名为 helm pull
(2) 移除了用于本地临时搭建 Chart Repository的 helm serve 命令。
(3) 自动创建名称空间
在不存在的命名空间中创建发行版时,Helm 2创建了命名空间。Helm 3遵循其他Kubernetes对象的行为,如果命名空间不存在则返回错误。
(4) 不再需要requirements.yaml, 依赖关系是直接在chart.yaml中定义。
3.4 Helm客户端
1 部署Helm客户端
Helm客户端下载地址:https://github.com/helm/helm/releases/
# mv linux-amd64/helm /usr/bin/
2 Helm常用命令
3 配置Chart仓库
1)官方仓库网址: https://hub.kubeapps.com/ 2)其它仓库网址: https://artifacthub.io/
(2) 添加存储库并更新
# helm repo update
(3) 查看配置的存储库
# helm repo list
(4) 查找chart应用
helm search repo <应用名>
(5) 删除存储库
# helm repo remove <仓库名>
3.5 Helm基本使用
1 Helm管理应用生命周期
# helm uninstall
2 使用chart部署一个应用
(1) 查找chart
# 为什么mariadb也在列表中,因为他和mysql有关。
(2) 查看chart的基本信息
# helm show chart aliyun/mysql
(3) 安装chart应用
# helm install db aliyun/mysql -n default
(4) 安装后查看chart帮助信息
# helm status db -n default
3 安装前自定义chart配置选项
上面部署的mysql并没有成功,这是因为并不是所有的 chart 都能按照默认配置运行成功,可能会需要一些环境依赖,例如PV。
所以我们需要自定义 chart 配置选项(覆盖values.yaml),安装过程中有两种方法可以传递配置数据:
--values 或 -f # 指定带有覆盖的YAML文件,这可以多次指定,最右边的文件优先。
--set # 在命令行上指定替代,如果两者都用,--set优先级高。
# vim mysql/templates/deployment.yaml
EOF persistence: enabled: true accessMode: ReadWriteOnce size: 8Gi mysqlUser: "k8s" mysqlPassword: "123456" mysqlDatabase: "k8s" EOF # kubectl create namespace mysql-db # 创建MySQL用户k8s,并授予此用户访问新创建的k8s数据库的权限,并指定资源所在的名称空间, # --set使用命令行替代变量,未指定的使用默认值。 # helm install db -f config.yaml -n mysql-db --set persistence.storageClass="managed-nfs-storage" ./mysql/ # kubectl get pod -n mysql-db NAME READY STATUS RESTARTS AGE db-mysql-5c695fcdfb-g6jt6 1/1 Running 0 77s # helm list -n mysql-db NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION db mysql-db 1 2021-10-22 17:17:32.401870823 +0800 CST deployed mysql-0.3.5 # kubectl get svc -n mysql-db NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE db-mysql ClusterIP 172.28.104.81 <none> 3306/TCP 2m38s # yum install mysql -y # mysql -uk8s -p123456 -h172.28.104.81 k8s MySQL [k8s]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | k8s | +--------------------+ 2 rows in set (0.00 sec)