k8s(十一) helm介绍和使用
helm
helm 是什么?解决了什么问题?
如果要部署一个应用,那么需要编写deploy 的yaml文件,service 的yaml文件,ingress的yaml。
如果服务很多的时候,比如几十个应用,需要管理的yaml文件的工作量是具大的。同时如果要完成服务的升级,那么需要对每一个deploy 分别执行升级命令,也是比较麻烦的。
helm 类似于 centos 的yum 包管理工具,将要发布的部署等方便的管理起来。方便我们对k8s容器中的服务,部署,pod 等进行高效的管理。
helm概述
Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。Helm通过软件打包的形式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用部署和管理的复杂性。
helm 官网 https://helm.sh/
helm 中的概念
Chart:一个Helm包,其中包含运行一个应用所需要的工具和 资源定义,还可能包含Kubernetes集群中的服务定义,类似于Yum中的RPM文件。
Release:在Kubernetes集群上运行的一个Chart实例。在同一个集群上,一个Chart可以被安装多次。例如有一个MySQL Chart,如果想
在服务器上运行两个MySQL数据库,就可以基于这个Chart安装两次。 每次安装都会生成新的Release,会有独立的Release名称。Repository:用于存放和共享Chart仓库。
helm 架构

- helm client 去 repository 获取一个 chart
- chart 部署到k8s集群 生成一个release
heml 安装
heml 是需要单独安装的。
heml github 地址 https://github.com/helm/helm/releases
下载对应的包
1
2
3
wget https://get.helm.sh/helm-v3.4.0-linux-amd64.tar.gz解压
1 | tar zxvf helm-v3.4.0-linux-amd64.tar.gz |
- 移动到bin目录
1 | mv linux-amd64/helm /usr/bin/ |
- 测试安装
1 | helm version |

- 配置仓库地址
1 | helm repo add stable http://mirror.azure.cn/kubernetes/charts |
- 仓库相关的命令
1 | helm repo list |

删除repo
1 | helm repo remove aliyun |
helm 基本命令
通过helm –help 可以查看能够操作的一些命令和功能
helm search: 搜索 charts
helm pull: 下载chart 到本地
helm install: 上传charts 到k8s
helm list: 展示k8s中所有的 releases
completion 为指定的shell生成自动完成脚本
create 执行名字生成 chart
dependency 管理charts依赖
env 客户端环境信息
get 获取某个release的拓展信息
history 拉取release 的历史信息
lint 对 chart 进行检查问题
package 将 chart 目录打包到 chart 存档文件中
plugin install, list, or uninstall 插件
repo 添加,列出,移除,更新和索引 chart 仓库。可用子命令:add、index、 list、remove、update
rollback 从之前版本回滚
show 查看 chart 详细信息。可用子命令:all、chart、readme、values
status 显示已命名版本的状态
template 本地呈现模板
test 执行release 的测试方法
uninstall 卸载 release
upgrade 升级 release
verify 校验chart的签名是否有效
helm 使用
从远程仓库快速部署应用
安装helm weave-scope 监控
- 从仓库搜索
1 | helm search repo weave |

查询chart 信息
1 |
|
- 安装chart
1 |
|
查看安装的pod信息
- 修改service 可对外访问

1 | kubectl edit svc weave-ui-weave-scope |
修改
- type = NodePort
- 添加nodePort属性

- 页面访问

自定义chart
最基本的chart 就是一些资源文件的集合,通过helm create 命令可以创建自定义的chart
- 创建chart
1 | #创建一个名字为 nginx-chart 的chart |
会在当前目录下生成一个同名文件夹。

chart 文件夹里的内容
- charts
- Charts.yaml 定义当前chart的一些配置信息,比如版本号等
- templates 定义了资源的模板文件 ,比如deploy.yaml servcie.yaml 等
- values.yaml 定义了共享的变量信息,这些变量可以用于模板文件中的取值
- 在templates 中创建自定义的yaml
//nginx-deploy.yaml
1 | apiVersion: apps/v1 |
//nginx-service.yaml
1 | apiVersion: v1 |
安装chart 和升级chart
执行目录执行 install 命令
1
helm install nginx-s nginx-chart/

如果需要升级可以使用upgrade 命令
1 | helm upgrade nginx-s nginx-chart/ |

chart 的安装方式
- 通过仓库安装
- 通过本地目录 helm install xx path
- 通过压缩包 helm install xx foo-0.1.1.tgz
- 通过远程链接 helm install https://example.com/charts/foo- 1.2.3.tgz
使用charts模板来定义charts
在定义charts 文件的template 文件的时候,直接通过模板文件的方式定义资源文件。
模板文件中可以获取
- 当前Replease 的相关变量信息
- values.yaml 中定义的变量信息
内置可获取的构建对象
Release
- Release.Name: 发布名称
- Release.Namespace
- Release.IsUpgrade: 当前是否是升级或回滚
- Release.IsInstall: 当前是否是安装
- Release.Revision 版本号,每次加1
示例:
{{` .Release.Name `}}Values
从values 文件定义的变量获取值。
1
示例: {{ .Values.favoriteDrink }}
Chart Chart.yaml文件内容
1
示例:{{ .Chart.Name }}
Files 访问一个指定文件的信息(除了template 对象)
1
示例: 获取路径信息 {{ .Files.Get $path }}
Capabilities 获取集群的相关信息
1
示例: {{ .Capabilities.APIVersions}} 获取版本列表
支持灵活的定义模板文件,可以查看文档链接查看详细的内容 https://helm.sh/zh/docs/chart_template_guide/getting_started/
简单示例
修改上面的自定义chart 将一些变量信息抽到vlaue.yaml 文件中
1 | apiVersion: apps/v1 |
1 | apiVersion: v1 |
values.yaml
1 | image: |
生成文件,教程是否格式错误
1 | helm install ng nginx-chart/ --dry-run -o yaml |

可以看到模板数据已经被填充
1 | //直接运行 |
搭建helm本地仓库
对于经常使用的chart最好的管理方式是建立一个私有的helm 仓库,方便chart的管理。
chart仓库 是一个配置了index.yaml文件和一些已经打包chart的HTTP服务器。
chart仓库结构
比如,https://example.com/charts仓库布局可能看起来像这样:
charts/
|
|- index.yaml
|
|- alpine-0.1.2.tgz
|
|- alpine-0.1.2.tgz.prov
简单的说charts 仓库只需要一个能提供静态http 的服务就可以了。
对于helm的搭建有很多种方式
- 基于githubpage
- githlabpage
- Chartmuseum 工具
Chartmuseum 搭建仓库
ChartMuseum 是一个开源的、易于部署的,Helm Chart 存储库服务器。
Chartmuseum 支持的存储方式也有很多种,比如常见的 aws,阿里云oss ,腾讯云,甚至百度云也支持。
当然也支持本地磁盘存储。
- 通过docker安装
1 | mkdir -p /data/charts |
启动完成后使用api 获取charts
1 | curl localhost:8080/api/charts |
返回
{}
- 向本地目录中放入已存在chart ,通过接口看是否能正常返回
1 | cd /data/charts/ |
再次通过接口访问
1 | curl localhost:8080/api/charts |
1 | { |
能看到返回了chart的相关列表信息
- 向仓库上传chart,一般远程其他机器不可能直接向这个目录下丢文件,可以通过接口的方式上传
helm cm push 插件 https://github.com/chartmuseum/helm-push
安装插件 ,有变动根据github为准
1 | //前提安装git |
1 | //添加仓库 |
查看帮助和示例
1 | helm cm-push --help |
基本用法: helm cm-push . https://my.chart.repo.com
上传之前自定义的chart目录
1 |
|
如果出现权限的错误 500 提示。需要给对应的仓库文件夹加权限
1 | chmod 777 /data/charts |

从本地远程仓库中搜索
1 | //仓库执行更新 |

helm 界面管理工具
Kubeapps 是一个web ui界面的Kubernetes 管理工具;
github https://github.com/vmware-tanzu/kubeapps
安装
通过helm安装到k8s集群中
1 | helm repo add bitnami https://charts.bitnami.com/bitnami |
查看pod是否都启动起来
1 | kubectl get pod -n kubeapps -o wide |

为了能够外部访问,将 kubeapps 的这个service 修改能够外部访问
1 | kubectl get service -n kubeapps |
修改service 为type = nodePort 并加 nodePort 端口号信息

访问 : http://192.168.1.101:30005 端口号 自己定
可以看到登录页面

创建访问控制
目前的kubeapps 是无法访问k8s 集群的,需要给kubeapps做集群权限的授权。
1 | kubectl create --namespace default serviceaccount kubeapps-operator |
这里的权限是 cluster-admin 权限,生成环境建立对用户配置细粒度的访问控制
执行命令获取登录用的令牌
1 | kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath='{range .secrets[*]}{.name}{"\n"}{end}' | grep kubeapps-operator-token) -o jsonpath='{.data.token}' -o go-template='{{.data.token | base64decode}}' && echo |
返回信息
1 | eyJhbGciOiJSUzI1NiIsImtpZCI6Imo2azZEWjBPaDlZSzdwNjZWWDJwaUpMdHlaQldTeTY0Ulhhd1JCdGlJVWsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yLXRva2VuLWg5amRmIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZGFkZGU3NjEtNjZjMy00NDY3LWFhYTItYWY5MmQ5OWE0NWU2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6a3ViZWFwcHMtb3BlcmF0b3IifQ.fbyXAoIcjQ2othmjHaoZA6o9f2CXDt-F4v9L5JkvNYQPEBpMWAURPP8eRvmTqHCDmE8Nu0GT8kVSw3zX1RgrjW2UBOqZCghW2i5me9KhdD-nJOjisLbUx1HN9Hk30kfcVBM3uOUBf2ho5RQ0ELcWnt_y4utTt3r_hNOpaqBNaZB6g2zARf8_MArHDJyrCyaNRzq-ZizD2j0yN5t0-1ixfzdJfw4WhS4uwPbOqipxgCnodv1VBfUkKSn8j6pP7PRyO1TG1tVD_XK4cylwE_ktLDHQ_ejg1RcGP950AkedoAVAwsKT0qzONq0aS1PHpwKGk69K85i-jVWNeag7mOEQug |
解决pod异常
当输入token 后,返回的说明是token不对,
查看pod的状态

有pod出现不运行的状态;
postgresql 的原因是存储的问题
kubeapps-postgresql-primary-0
kubeapps-postgresql-read-0
1 | Warning FailedScheduling <unknown> default-scheduler running "VolumeBinding" filter plugin for pod "kubeapps-postgresql-primary-0": pod has unbound immediate PersistentVolumeClaims |
编辑对应的deploy
1 | kubectl get pvc -n kubeapps |
原因是:这2个pvc并没有具体绑定的pv.
因为pvc要自动匹配pv 要满足几个条件.要进行pvc 和pv要匹配
- VolumeMode
- Storageclass
- AccessMode
- Size 容联要足够
问题是 AccessMode 不一样,就再创建pvc一样的pv ,自动绑定成功;pod 也就能正常启动了.

pvc 也恢复到了绑定状态
进入页面

出现此错误信息;
1 | Unable to list apps |
检查下这是请求的那里

发现是 kubeapps-postgresql-primary-0 无法请求了,那么需要解决这个pod的问题
查看pod日志
1 | kubectl logs kubeapps-postgresql-primary-0 -n kubeapps |

发现是挂载目录下没有执行权限导致;
修改nfs的权限配置
将挂载的前目录增加执行权限
1 |
|

kubeapps-postgresql-primary-0 已经正常
基本使用
到这里安装已经全部正常


右上角还可以安装更多的仓库

页面上搜相关的helm

可以页面上点击部署和修改配置
更多的相关使用可以参考官网,不再赘述。


