【云原生,k8s】Helm应用包管理器介绍

目录

一、为什么需要Helm?

(一)Helm介绍

(二)Helm有3个重要概念:

(三)Helm特点

[二、Helm V3变化](#二、Helm V3变化)

(一)架构变化

(二)自动创建名称空间

三、Helm应用包管理器部署

1、部署Helm客户端工具

2、Helm常用命令

3、配置国内的Chart仓库

4、使用chart部署一个Nginx应用

5、使用chart部署一个Tomcat应用

6、用变量渲染模板


前提配置:基于k8s(kubernetes几圈)

一、为什么需要Helm?

Kubernetes上部署的应用服务,都是由特定的资源描述组成,包括deployment、service等。每个资源对象都保存在各自文件中或者集中写到一个配置文件。然后通过kubectl apply --f demo.yaml命令进行部署。

如果业务系统只由一个或几个这样的服务组成,那么上面部署管理方式足够用了。

而对于一个复杂的业务系统,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源对象文件,而这种组织和管理应用的方式就显得力不从心了。

而且由于缺少对发布过的应用版本管理和控制,使Kubernetes上的应用维护和更新等面临诸多的挑战,主要面临以下问题:

如何将这些服务作为一个整体管理

这些资源文件如何高效复用

不支持应用级别的版本管理

(一)Helm介绍

Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt-get等一样,Helm可以很方便的将之前打包好的yaml文件部署到kubernetes上。

(二)Helm有3个重要概念:

****helm:****一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。

****Chart:****目录或者压缩包,用于应用描述,由一系列用于描述 k8s 资源对象相关文件的集合。

****Release:****基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象。

(三)Helm特点

开发的一个用于kubernetes的包管理器,每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tar.gz格式的单一文件,方便传输和存储)

对于应用发布者而言,可以通过Helm打包应用, 管理应用依赖关系,管理应用版本并发布应用到软件仓库。

对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用,

Helm提供了kubernetes上的软件部署,删除,升级, 回滚应用的强大功能

二、Helm V3变化

2019年11月13日, Helm团队发布 Helm v3的第一个稳定版本。该版本主要变化如下:

(一)架构变化

最明显的变化是 Tiller的删除

1)Release名称可以在不同命名空间重用

2)支持将 Chart 推送至 Docker 镜像仓库Harbor中

3)使用JSONSchema验证chart values

4)其他

为了更好地协调其他包管理者的措辞 Helm CLI个别更名

helm delete` 更名为 `helm uninstall

helm inspect` 更名为 `helm show

helm fetch` 更名为 `helm pull

但以上旧的命令当前仍能使用。

移除了用于本地临时搭建 Chart Repository的 helm serve 命令。

(二)自动创建名称空间

在不存在的命名空间中创建发行版时,Helm 2创建了命名空间。Helm 3遵循其他Kubernetes对象的行为,如果命名空间不存在则返回错误。

不再需要requirements.yaml, 依赖关系是直接在chart.yaml中定义。

三、 Helm应用包管理器部署

1、部署Helm客户端工具

Helm客户端下载地址:Releases · helm/helm · GitHub

将源码包解压并移动到/usr/bin/目录即可。

root@k8s-master \~\]# wget [https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz](https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz "https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz") \[root@k8s-master \~\]# tar xf helm-v3.5.2-linux-amd64.tar.gz \[root@k8s-master \~\]# cd linux-amd64/ \[root@k8s-master linux-amd64\]# ls \[root@k8s-master linux-amd64\]# mv helm /usr/bin/ ****\[root@k8s-master \~\]# helm**** ****#验证helm命令是否可用****

2、Helm常用命令

|------------|----------------------------------------------------------|
| 命令 | 描述 |
| create | 创建一个chart并指定名字 |
| dependency | 管理chart依赖 |
| get | 下载一个release。可用子命令:all、hooks、manifest、notes、values |
| history | 获取release历史 |
| install | 安装一个chart |
| list | 列出release |
| package | 将chart目录打包到chart存档文件中 |
| pull | 从远程仓库中下载chart并解压到本地 # helm pull stable/mysql --untar |
| repo | 添加,列出,移除,更新和索引chart仓库。可用子命令:add、index、list、remove、update |
| rollback | 从之前版本回滚 |
| search | 根据关键字搜索chart。可用子命令:hub、repo |
| show | 查看chart详细信息。可用子命令:all、chart、readme、values |
| status | 显示已命名版本的状态 |
| template | 本地呈现模板 |
| uninstall | 卸载一个release |
| upgrade | 更新一个release |
| version | 查看helm客户端版本 |

3、配置国内的Chart仓库

微软仓库(Index of /kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。

阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

官方仓库(Kubeapps | Home)官方chart仓库,国内有点不好使。

添加chart存储库

root@k8s-master \~\]# helm repo add stable http://mirror.azure.cn/kubernetes/charts \[root@k8s-master \~\]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts \[root@k8s-master \~\]# helm repo update

查看已配置的chart存储库

root@k8s-master \~\]# helm repo list ![](https://file.jishuzhan.net/article/1693907917746475009/22d885e5f934480dad29130b87782135.png) ****删除存储库:**** > \[root@k8s-master \~\]# helm repo remove aliyun > > \[root@k8s-master \~\]# helm repo list ![](https://file.jishuzhan.net/article/1693907917746475009/597f35c659844f6a8f30b6334c203917.png) ### ****4、使用chart部署一个Nginx应用**** ****1)**** ****创建chart**** ****\[root@k8s-master \~\]# helm create nginx**** ![](https://file.jishuzhan.net/article/1693907917746475009/df208152e5514a68b69e5e869c0d286a.png) ****\[root@k8s-master \~\]# tree nginx/**** ****详解:**** > nginx/ > > ├── charts #依赖其他包的charts文件 > > ├── Chart.yaml #该chart的描述文件,包括ip地址,版本信息等 > > ├── templates #存放k8s模板文件目录 > > │ ├── deployment.yaml #创建k8s deployment资源的yaml 模板 > > │ ├── _helpers.tpl #下划线开头的文件,可以被其他模板引用 > > │ ├── hpa.yaml #配置服务资源CPU 内存 > > │ ├── ingress.yaml # ingress 配合service域名访问的配置 > > │ ├── NOTES.txt #说明文件,helm install之后展示给用户看的内容 > > │ ├── serviceaccount.yaml > > │ ├── service.yaml #kubernetes Serivce yaml模板 > > │ └── tests > > │ └── test-connection.yaml > > └── values.yaml #给模板文件使用的变量 ![](https://file.jishuzhan.net/article/1693907917746475009/b6a9f5bc55834a8a9f22f3f612378066.png) ****2)**** ****修改values.yaml 里的service的type为 NodePort**** \[root@k8s-master \~\]# cd nginx/ \[root@k8s-master nginx\]# vim values.yaml ![](https://file.jishuzhan.net/article/1693907917746475009/216b5a397b6a450f98fe67896e9835e4.png) ****3)**** ****安装chart任务(注意命令最后的点)**** \[root@k8s-master nginx\]# helm install -f values.yaml ![](https://file.jishuzhan.net/article/1693907917746475009/fed2aeb864c74834b714751d0c8ab597.png) ****4)**** ****查看release**** \[root@k8s-master nginx\]# helm ls #或者helm list ![](https://file.jishuzhan.net/article/1693907917746475009/ced4a1a2fada4f9aa3ff14d3652eb21f.png) ****5)**** ****删除release**** > \[root@k8s-master nginx\]# helm delete nginx ****6)**** ****查看pod状态**** > \[root@k8s-master nginx\]# kubectl get pod > > \[root@k8s-master nginx\]# kubectl get pod -o wide ****7)**** ****查看svc状态**** > \[root@k8s-master nginx\]# kubectl get svc ![](https://file.jishuzhan.net/article/1693907917746475009/0b388696f0a948e0a0d2809faf05e30f.png) 访问 192.168.100.132:30281 ![](https://file.jishuzhan.net/article/1693907917746475009/1a1757a2f2594b49b60f60165e3ffc48.png) ### ****5、使用chart部署一个Tomcat应用**** \[root@k8s-master \~\]# helm create tomcat Creating tomcat \[root@k8s-master \~\]# cd tomcat/ ![](https://file.jishuzhan.net/article/1693907917746475009/99edd2bc30c84c76a427e1ab7c953a27.png) 修改deployment.yaml和service.yaml文件 > \[root@k8s-master tomcat\]# vim templates/deployment.yaml ![](https://file.jishuzhan.net/article/1693907917746475009/e58c8fcceaf34a1c9912e4bfab53fa77.png) \[root@k8s-master tomcat\]# vim templates/service.yaml ![](https://file.jishuzhan.net/article/1693907917746475009/b8810916ea284063b2a2616b37745d91.png) ****创建release**** \[root@k8s-master tomcat\]# helm install tomcat . ![](https://file.jishuzhan.net/article/1693907917746475009/4f52d9527a4c421eb0abfd425eabd237.png) ****查看release**** \[root@k8s-master tomcat\]# helm ls ![](https://file.jishuzhan.net/article/1693907917746475009/e286404c48d6429b8898c107aefe90dc.png) ****查看pod和svc**** > > [root@k8s-master tomcat]# kubectl get pod > > [root@k8s-master tomcat]# kubectl get pod -o wide > > [root@k8s-master tomcat]# kubectl get svc ![](https://file.jishuzhan.net/article/1693907917746475009/b565ac1e921b4525b2db7942ac99b0b6.png) ****准备测试页**** > \[root@k8s-master tomcat\]# kubectl exec -it tomcat-67df6cd4d6-s7qxl /bin/bash > > root@tomcat-67df6cd4d6-s7qxl:/usr/local/tomcat# mkdir webapps/ROOT > > root@tomcat-67df6cd4d6-s7qxl:/usr/local/tomcat# echo "helm test1" \> webapps/ROOT/index.jsp ![](https://file.jishuzhan.net/article/1693907917746475009/217370483f7d4acebac8c10be998f5d1.png) > \[root@k8s-master tomcat\]# kubectl exec -it tomcat-67df6cd4d6-tkp95 /bin/bash > > root@tomcat-67df6cd4d6-tkp95:/usr/local/tomcat# mkdir webapps/ROOT > > root@tomcat-67df6cd4d6-tkp95:/usr/local/tomcat# echo "helm test2" \> webapps/ROOT/index.jsp ![](https://file.jishuzhan.net/article/1693907917746475009/0e843b8b4b8c4f6993b31c4605da2fab.png) 访问测试: ![](https://file.jishuzhan.net/article/1693907917746475009/b1dca94fc2814dc0a6e061fe93d304a3.png) 访问 192.168.100.132:32092 访问 192.168.100.133:32092 ![](https://file.jishuzhan.net/article/1693907917746475009/848c01518a7c4c16919bf08f812de636.png) ****删除**** \[root@k8s-master tomcat\]# helm delete tomcat \[root@k8s-master tomcat\]# helm ls ![](https://file.jishuzhan.net/article/1693907917746475009/2ee534bcf38d43f7a60a13f26a40fd91.png) ****升级(改完yaml文件之后重新应用)**** \[root@k8s-master tomcat\]# helm install tomcat . \[root@k8s-master tomcat\]# helm ls \[root@k8s-master tomcat\]# kubectl get pod ![](https://file.jishuzhan.net/article/1693907917746475009/3587d08bb6cd4f6c983e233fe054e0db.png) \[root@k8s-master tomcat\]# vim templates/deployment.yaml ![](https://file.jishuzhan.net/article/1693907917746475009/c83c337fd9d0407b9e76ddd6a21952d4.png) \[root@k8s-master tomcat\]# helm upgrade tomcat . \[root@k8s-master tomcat\]# kubectl get pod \[root@k8s-master tomcat\]# helm ls ![](https://file.jishuzhan.net/article/1693907917746475009/91ff41cd7b6b4997b5b8547c0d82e7cf.png) ****回滚**** \[root@k8s-master tomcat\]# helm rollback tomcat 1 \[root@k8s-master tomcat\]# helm ls \[root@k8s-master tomcat\]# kubectl get pod ![](https://file.jishuzhan.net/article/1693907917746475009/1da19530c6ec406684347e39229d2bea.png) ### ****6、用变量渲染模板**** 测试模板是否正常 \[root@k8s-master tomcat\]# helm install --dry-run tomcat . ![](https://file.jishuzhan.net/article/1693907917746475009/3a8921898f76460a931e87c55836bca5.png) ****在values.yaml文件中定义变量**** ****\[root@k8s-master tomcat\]# cat values.yaml**** ![](https://file.jishuzhan.net/article/1693907917746475009/0c58210ab4f048f3bceb7306c1ff8eed.png) ****\[root@k8s-master tomcat\]# cat templates/deployment.yaml**** ![](https://file.jishuzhan.net/article/1693907917746475009/0e32644e8236427c9dccb9e5fa6fb876.png) ****\[root@k8s-master tomcat\]# cat templates/service.yaml**** ![](https://file.jishuzhan.net/article/1693907917746475009/a0e9bce25c3847859faf4c05ef438f3b.png) > ****deployment.yaml**** 和****service.yaml****两个文件的变量都是预先在values.yaml里面定义过引用过来的值。 > > Release.Name 代表helm install 后面的那个名字 ****\[root@k8s-master tomcat\]# helm delete tomcat**** 将templates目录中多余的文件都删除,只保留两个测试文件 ****\[root@k8s-master tomcat\]# ls templates/**** ![](https://file.jishuzhan.net/article/1693907917746475009/441bc81d5b0f4e37a954cbcefa0f10ae.png) ****\[root@k8s-master tomcat\]# helm install -f values.yaml**** ![](https://file.jishuzhan.net/article/1693907917746475009/72741cc06baa4f6ba84707ab48c99b41.png) \[root@k8s-master tomcat\]# helm ls ![](https://file.jishuzhan.net/article/1693907917746475009/436bace9eb3d45e596647b324c98b14a.png) ****查看发布状态**** \[root@k8s-master tomcat\]# helm status tomcat \[root@k8s-master tomcat\]# kubectl get pod ![](https://file.jishuzhan.net/article/1693907917746475009/8c0bc878c67f4784812a5c4cb8f0c4ce.png) ****查看pod详细信息**** \[root@k8s-master tomcat\]# kubectl describe pod tomcat-dp-67df6cd4d6-78pxc ![](https://file.jishuzhan.net/article/1693907917746475009/8148c300d25b442ba490a25dcab65404.png)

相关推荐
斤斤计较5 分钟前
Docker 环境安装(2025最新版)
运维·docker·容器
小锋学长生活大爆炸7 分钟前
【教程】Docker方式本地部署Overleaf
运维·docker·容器
Hfc.9 分钟前
ubuntu20.04系统搭建k8s1.28集群-docker作为容器运行时
ubuntu·kubernetes
欧先生^_^10 分钟前
Docker 的各种网络模式
网络·docker·容器
开源架构师12 分钟前
JVM 与云原生的完美融合:引领技术潮流
jvm·微服务·云原生·性能优化·serverless·内存管理·容器化
掘金者说20 分钟前
docker系列-DockerDesktop报错信息(Windows Hypervisor is not present)
运维·docker·容器
金刚猿4 小时前
openfeign 拦截器实现微服务上下文打通
微服务·云原生·架构
lcw_lance4 小时前
技术中台-核心技术介绍(微服务、云原生、DevOps等)
微服务·云原生·devops
alden_ygq7 小时前
Kubernetes Horizontal Pod Autosscaler(HPA)核心机制解析
云原生·容器·kubernetes
格桑阿sir8 小时前
Kubernetes控制平面组件:Kubelet详解(三):CRI 容器运行时接口层
docker·kubernetes·containerd·kubelet·cri-o·容器运行时·cri