helm是k8s的包管理工具,类似于centos 的yum;
当前版本有helm2、helm3 相对来说helm3功能更加完善,使用更加方便
主要作用是相较于传统的k8s部署应用需要手工编排yaml文件(比如Deployment.yml、service.yml、ingress.yml等),使用helm可以快速部署应用。
helm3与helm2 的区别在于helm3删除了tiller、支持release在不同的命名空间重用,可以将chart推送到私有仓库中。
官方详细介绍:Helm | 快速入门指南
helm:客户端命令行工具,用于chart的创建、打包、发布与管理
chart: helm管理的包,包含k8s集群内部运行的应用程序,工具或服务的资源定义。相似于centos yum所管理的rpm包。是一系列资源文件的集合
repository: 用于存放chart的地方,类似于yum仓库。可以使用官方的仓库,也可以自定义私有仓库。
release: 是 k8s集群中运行的chart实列,chart可以在k8s集群中反复部署,每次部署都会创建一个新的release。
1 安装helm客户端
heml软件包获取网址
https://github.com/helm/helm/releases (在这个网址下获取自己想要的安装包,下载极慢,耐心等待)自己有的,使用自己下载。解决办法是下面这个,使用其他地址下载
https://repo.huaweicloud.com/helm/
wget https://repo.huaweicloud.com/helm/v3.5.4/helm-v3.5.4-linux-amd64.tar.gz
tar xf helm-v3.5.4-linux-amd64.tar.gz
mv linux-amd64 helm
mv helm/helm /usr/local/bin/
到这helm已经安装完毕,接下来是helm的基本使用。
微软仓库(http://mirror.azure.cn/kubernetes/charts/)
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
推荐仓库(https://charts.bitnami.com/bitnami )
添加仓库 :helm repo add 自定义仓库名 仓库地址 (仓库地址就是上面几个网站地址)
删除仓库 : helm repo remove 仓库名
更新仓库 : helm repo update
查看仓库 : helm repo list
搜索仓库的chart: helm search repo chart名称
这里是已经在添加仓库的条件下执行
1、根据需要搜索自己需要的chart(以nginx为例子)
[root@master01 ~]# helm search repo nginx
2、安装对应仓库的chart
[root@master01 ~]# helm install nginx bitnami/nginx(说明helm install 自定义release名 仓库名/chart名 )
3、查看安装的release
[root@master01 ~]# helm list
[root@master01 ~]# helm status nginx
4、查看k8s集群pod与svc情况,发现一个nginx pod已经运行,同时nginx service也生成,svc的类型为LoadBalancer,可以使用kubectl edit svc 命令修改。尽管service类型为LoadBalancer,但是LoadBalancer也只是在NodePort的基础上增加外部负载均衡器,我仍然可以使用NodePort的方式访问,可以看到nginx的首页欢迎页面
小总结:正常情况下,如果要使用k8s部署一个简单的web服务作测试,最少需要自己手动编排deployment.yml文件,service.yml文件。本案列中只是helm install命令装了一个chart包,就实现了相同的效果。相对来说不那么繁琐
1、创建自定义chart并查看目录结构
[root@master01 ~]# helm create nginx #创建一个名为apache的自定义chart
[root@master01 ~]# tree nginx #查看自定义chart的目录结构
charts目录,默认为空,包含chart的子目录,暂时用不到。
Chart.yml 是自定义chart的元数据,即chart的一些属性信息,包括chart的名称,描述,类型,版本与应用版本
values.yml 包含了chart的所有可配置项及其默认值,在安装chart时传递的配置项会覆盖默认值
templates目录,这个目录中包含的是k8s资源申明的模板文件,在安装时,k8s会将模板文件与配置项的值结合起来,得到k8s的资源定义,并应用到k8s上,
Chart.yml存放的是chart的描述信息,可以不用更改
这里是以nginx为例子,删除或者移动template模板下的所有资源文件到某个目录,原因在于始终不是自己写的,还需要将里面的变量与values.yml文件里面的值意义对应,有点烦琐。还不如自己手动命令创建资源文件再修改。
[root@master01 ~]# helm create nginx
[root@master01 ~]# rm -rf nginx/templates/*
创建nginx.deployment.yml及nginx.service资源文件
[root@master01 ~]# kubectl create deployment nginx-deployment --image=nginx
[root@master01 ~]# kubectl expose deployment nginx-deployment --port=80 --target-port=80 --type=NodePort --dry-run -o yaml>>/root/nginx/templates/nginx.service.yml
[root@master01 ~]# kubectl create deployment nginx-deployment --image=nginx:v1.23.3 --dry-run -o yaml >>/root/nginx/templates/nginx.deployment.yml
[root@master01 ~]# kubectl delete deployments.apps nginx-deployment
此时相应的deployment资源文件及service文件已经在templates模板目录下生成
[root@master01~]# helm lint nginx # 使用命令检测是否有语法错误,没有错误才可以安装或者打包
安装自定义chart
[root@master01 ~]# helm install mynginx nginx
#mynginx是自定义chart名称,nginx是自定义chart所在的目录
查看pod及svc情况
如果chart内容有更新,直接使用 helm upgrade chart名称进行更新
使用helm实现资源文件的复用,通过在values.yml文件中定义变量及值,在templates模板下的资源文件中引用变量
总的来说,服用简单的deployment文件或者service文件,只是名称,镜像、标签、版本、端口、副本数量等常见配置不一样,其他地方资源文件并没有什么差异。
变量的引用 {{.Values.变量名称}}
删除之前创建的release
[root@master01 ~]# helm list
[root@master01 ~]# helm uninstall mynginx
仍然以nginx为例子
查看编辑的deployment、service及values.yml文件
[root@master01 ~]# cat nginx/templates/nginx.deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx-deployment
name: {{.Release.Name}}-deployment
spec:
replicas: 1
selector:
matchLabels:
app: {{.Values.label}}
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: {{.Values.label}}
spec:
containers:
- image: {{.Values.image}}
name: nginx
resources: {}
status: {}
[root@master01 ~]# cat nginx/templates/nginx.service.yml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: {{.Values.label}}
name: {{.Release.Name}}
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: {{.Values.label}}
type: NodePort
status:
loadBalancer: {}
[root@master01 ~]# cat nginx/values.yaml
image: nginx
label: nginx
测试多次安装releae实列
[root@master01 ~]# helm install test-nginx nginx
[root@master01 ~]# helm install mynginx nginx
查看pod,svc
第一步:安装harbor仓库,在安装harbor仓库的时候加上--with-chartmuseum选项,即可以使用harbor作为chart仓库
habor仓库的安装参考:
http与https两种方式部署harbor私有仓库_xhredeem的博客-CSDN博客_https nodeport部署harbor
# 这里在 harbor 服务器上操作
# cd /usr/local/harbor/
# ./install.sh --with-chartmuseum
第二步:安装helm插件(官网下载地址如下,我下载了0.10.1版本并上传到自己机器)
Releases · chartmuseum/helm-push · GitHub
查看helm插件的环境变量,helm插件的位置应当位于/root/.local/share/helm/plugins下
创建目录并解压
[root@master01 ~]# mkdir -p /root/.local/share/helm/plugins/helm-push
[root@master01 ~]# cp helm-push_0.10.1_linux_amd64.tar.gz /root/.local/share/helm/plugins/helm-push
[root@master01 ~]# cd /root/.local/share/helm/plugins/helm-push
[root@master01 helm-push]# tar xf helm-push_0.10.1_linux_amd64.tar.gz
查看helm插件是否安装成功
[root@master01 helm-push]# helm plugin list
第三步:在harbor仓库新建自定义名称的新建项目并添加为helm私有仓库(这里我自定义mychart新建项目)
[root@master01 helm-push]# helm repo add chartrepo --username=admin --password=Harbor12345 http://192.168.11.138:80/chartrepo/mychart
harbor的用户名密码以及chartrepo是必须的
第五步:上传自定义chart到harbor私有仓库(注意使用cm-push不要使用push)
打包自定义chart包
[root@master01 ~]# helm package nginx
将自定义chart包推送到仓库
[root@master01 ~]# helm-cm-push nginx-0.1.0.tgz chartrepo
查看harbor仓库已经推送成功
推送成功以后在仓库搜索并没有发现chartrepo仓库下又自定义chart,是因为没有更新仓库
更新仓库再次查看,在第二行可以看到上传到自定义仓库chartrepo的chart,名为chartrepo/nginx
[root@master01 ~]# helm repo update
删除当前自定义nginx chart压缩包,测试从自定义仓库拉取
[root@master01 ~]# rm -rf nginx-0.1.0.tgz
拉取chart压缩包到本地,查看目录下已经有nginx的chart压缩包
[root@master01 ~]# helm pull chartrepo/nginx
[root@master01 ~]# ls | grep nginx-0.1.0.tgz