目录
一、为什么需要Helm?
(一)Helm介绍
(二)Helm有3个重要概念:
(三)Helm特点
二、Helm V3变化
(一)架构变化
(二)自动创建名称空间
三、Helm应用包管理器部署
1、部署Helm客户端工具
2、Helm常用命令
3、配置国内的Chart仓库
4、使用chart部署一个Nginx应用
5、使用chart部署一个Tomcat应用
6、用变量渲染模板
前提配置:基于k8s(kubernetes几圈)
Kubernetes上部署的应用服务,都是由特定的资源描述组成,包括deployment、service等。每个资源对象都保存在各自文件中或者集中写到一个配置文件。然后通过kubectl apply –f demo.yaml命令进行部署。
如果业务系统只由一个或几个这样的服务组成,那么上面部署管理方式足够用了。
而对于一个复杂的业务系统,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源对象文件,而这种组织和管理应用的方式就显得力不从心了。
而且由于缺少对发布过的应用版本管理和控制,使Kubernetes上的应用维护和更新等面临诸多的挑战,主要面临以下问题:
如何将这些服务作为一个整体管理
这些资源文件如何高效复用
不支持应用级别的版本管理
Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt-get等一样,Helm可以很方便的将之前打包好的yaml文件部署到kubernetes上。
helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
Chart:目录或者压缩包,用于应用描述,由一系列用于描述 k8s 资源对象相关文件的集合。
Release:基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象。
开发的一个用于kubernetes的包管理器,每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tar.gz格式的单一文件,方便传输和存储)
对于应用发布者而言,可以通过Helm打包应用, 管理应用依赖关系,管理应用版本并发布应用到软件仓库。
对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用,
Helm提供了kubernetes上的软件部署,删除,升级, 回滚应用的强大功能
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客户端下载地址:Releases · helm/helm · GitHub
将源码包解压并移动到/usr/bin/目录即可。
[root@k8s-master ~]# wget 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命令是否可用
命令 |
描述 |
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客户端版本 |
微软仓库(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
删除存储库:
[root@k8s-master ~]# helm repo remove aliyun
[root@k8s-master ~]# helm repo list
1)创建chart
[root@k8s-master ~]# helm create nginx
[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 #给模板文件使用的变量
2)修改values.yaml 里的service的type为 NodePort
[root@k8s-master ~]# cd nginx/
[root@k8s-master nginx]# vim values.yaml
3)安装chart任务(注意命令最后的点)
[root@k8s-master nginx]# helm install -f values.yaml
4)查看release
[root@k8s-master nginx]# helm ls #或者helm list
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
访问 192.168.100.132:30281
[root@k8s-master ~]# helm create tomcat
Creating tomcat
[root@k8s-master ~]# cd tomcat/
修改deployment.yaml和service.yaml文件
[root@k8s-master tomcat]# vim templates/deployment.yaml
[root@k8s-master tomcat]# vim templates/service.yaml
创建release
[root@k8s-master tomcat]# helm install tomcat .
查看release
[root@k8s-master tomcat]# helm ls
查看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
准备测试页
[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
[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
访问测试:
访问 192.168.100.132:32092
访问 192.168.100.133:32092
删除
[root@k8s-master tomcat]# helm delete tomcat
[root@k8s-master tomcat]# helm ls
升级(改完yaml文件之后重新应用)
[root@k8s-master tomcat]# helm install tomcat .
[root@k8s-master tomcat]# helm ls
[root@k8s-master tomcat]# kubectl get pod
[root@k8s-master tomcat]# vim templates/deployment.yaml
[root@k8s-master tomcat]# helm upgrade tomcat .
[root@k8s-master tomcat]# kubectl get pod
[root@k8s-master tomcat]# helm ls
回滚
[root@k8s-master tomcat]# helm rollback tomcat 1
[root@k8s-master tomcat]# helm ls
[root@k8s-master tomcat]# kubectl get pod
测试模板是否正常
[root@k8s-master tomcat]# helm install --dry-run tomcat .
在values.yaml文件中定义变量
[root@k8s-master tomcat]# cat values.yaml
[root@k8s-master tomcat]# cat templates/deployment.yaml
[root@k8s-master tomcat]# cat templates/service.yaml
deployment.yaml 和service.yaml两个文件的变量都是预先在values.yaml里面定义过引用过来的值。
Release.Name 代表helm install 后面的那个名字
[root@k8s-master tomcat]# helm delete tomcat
将templates目录中多余的文件都删除,只保留两个测试文件
[root@k8s-master tomcat]# ls templates/
[root@k8s-master tomcat]# helm install -f values.yaml
[root@k8s-master tomcat]# helm ls
查看发布状态
[root@k8s-master tomcat]# helm status tomcat
[root@k8s-master tomcat]# kubectl get pod
查看pod详细信息
[root@k8s-master tomcat]# kubectl describe pod tomcat-dp-67df6cd4d6-78pxc