沪ICP备2021032517号-1

Helm在Kubernetes上的基本使用

  |   0 评论   |   0 浏览

Helm是什么

很多人都使用过Ubuntu下的ap-get或者CentOS下的yum, 这两者都是Linux系统下的包管理工具。采用apt-get/yum,应用开发者可以管理应用包之间的依赖关系,发布应用;用户则可以以简单的方式查找、安装、升级、卸载应用程序。

我们可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。

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

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

Helm和charts的主要作用:

  • 应用程序封装
  • 版本管理
  • 依赖检查
  • 便于应用程序分发

Helm组件及相关术语

开始接触Helm时遇到的一个常见问题就是Helm中的一些概念和术语非常让人迷惑,我开始学习Helm就遇到这个问题。

因此我们先了解一下Helm的这些相关概念和术语。

Helm: Kubernetes的应用打包工具,也是命令行工具的名称。

Tiller: Helm的服务端,部署在Kubernetes集群中,用于处理Helm的相关命令。

Chart: Helm的打包格式,内部包含了一组相关的kubernetes资源。

Repoistory: Helm的软件仓库,repository本质上是一个web服务器,该服务器保存了chart软件包以供下载,并有提供一个该repository的chart包的清单文件以供查询。在使用时,Helm可以对接多个不同的Repository。

Release: 使用Helm install命令在Kubernetes集群中安装的Chart称为Release。

Chart Install 过程

  • Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
  • Helm 将指定的 Chart 结构和 Values 信息通过 gRPC 传递给 Tiller。
  • Tiller 根据 Chart 和 Values 生成一个 Release。
  • Tiller 将 Release 发送给 Kubernetes 用于生成 Release。

Chart Update 过程

  • Helm 从指定的目录或者 TAR 文件中解析出 Chart 结构信息。
  • Helm 将需要更新的 Release 的名称、Chart 结构和 Values 信息传递给 Tiller。
  • Tiller 生成 Release 并更新指定名称的 Release 的 History。
  • Tiller 将 Release 发送给 Kubernetes 用于更新 Release。

Chart Rollback 过程

  • Helm 将要回滚的 Release 的名称传递给 Tiller。
  • Tiller 根据 Release 的名称查找 History。
  • Tiller 从 History 中获取上一个 Release。
  • Tiller 将上一个 Release 发送给 Kubernetes 用于替换当前 Release。

安装Helm

前提要求

  • Kubernetes1.5以上版本
  • 集群可访问到的镜像仓库
  • 执行helm命令的主机可以访问到kubernetes集群

下面我们通过一个完整的示例来介绍Helm的相关概念,并学习如何使用Helm打包,分发,安装,升级及回退kubernetes应用。

安装Helm客户端

使用官方提供的脚本一键安装

curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh 

chmod 700 get_helm.sh  

./get_helm.sh  

手动下载安装

 wget https://get.helm.sh/helm-v3.0.0-beta.3-linux-amd64.tar.gz  
  
 tar -zxvf helm-v3.0.0-beta.3-linux-amd64.tar.gz  
  
 mv linux-amd64/helm /usr/local/bin/helm

helm2

安装Helm服务端 Tiller

helm init 

由于 Helm 默认会去 storage.googleapis.com 拉取镜像,如果你当前执行的机器不能访问该域名的话可以使用以下命令来安装:

helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v3.0.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

给 Tiller 授权

因为 Helm 的服务端 Tiller 是一个部署在 Kubernetes 中 Kube-System Namespace 下 的 Deployment,它会去连接 Kube-Api 在 Kubernetes 里创建和删除应用。

而从 Kubernetes 1.6 版本开始,API Server 启用了 RBAC 授权。目前的 Tiller 部署时默认没有定义授权的 ServiceAccount,这会导致访问 API Server 时被拒绝。所以我们需要明确为 Tiller 部署添加授权。

创建 Kubernetes 的服务帐号和绑定角色

kubectl create serviceaccount --namespace kube-system tiller

为 Tiller 设置帐号

kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

验证 Tiller 是否安装成功

kubectl -n kube-system get pods|grep tiller

Helm 服务器端 升级

+ helm list
Error: incompatible versions client[v2.10.0] server[v2.9.1]

jenkins流水线中提升版本不兼容 客户端是2.10 服务端是2.9.1

image.png

升级

录到Kubernetes集群master节点,执行以下命令。

helm init --tiller-image registry.cn-hangzhou.aliyuncs.com/acs/tiller:v2.11.0 --upgrade

image.png

升级成功,jenkins再次执行成功

卸载 Helm 服务器端 Tiller

如果你需要在 Kubernetes 中卸载已部署的 Tiller,可使用以下命令完成卸载。

helm reset  

构建一个Helm chart

helm create mychart

该命令创建了一个 mychart 目录,该目录结构如下所示。这里我们主要关注目录中的 Chart.yaml、values.yaml、NOTES.txt 和 Templates 目录

image.png

  • Chart.yaml 用于描述这个 Chart的相关信息,包括名字、描述信息以及版本等。
  • values.yaml 用于存储 templates 目录中模板文件中用到变量的值。
  • NOTES.txt 用于介绍 Chart 部署后的一些信息,例如:如何使用这个 Chart、列出缺省的设置等。
  • Templates 目录下是 YAML 文件的模板,YAML 文件模板的值默认都是在 values.yaml 里定义的。

删除chart

helm  list  

helm  delete  --purge  mychart

helm3

Helm3 新功能

  • 移除了 Tiller
  • 不同的 namespace 可以使用相同的 Release Name
  • 简化模板对象 .Capabilities
  • 使用 JSONSchema 验证 charts 的 Values
  • 将 requirements.yaml 合并到 Chart.yaml 中
  • helm install 时需要指定 Release Name, 开启自动生成需要 –generate-name 参数
  • 支持 push 到远端 registry (如: harbor)
  • 移除 helm serve
  • 命令行变化 (将原先的命令保留为别名Aliases)
    • helm delete –> helm uninstall
    • helm inspect -> helm show
    • helm fetch -> helm pull
  • go 导入路径改变 k8s.io/helm –> helm.sh/helm

具体新特性可以参考 Helm 3 GitHub, 或者参考 Helm 官方文档

有关Helm3和Helm2的区别,详情请参见 CHANGES SINCE HELM 2

helm3没有服务端的概念

helm3 install

wget https://get.helm.sh/helm-v3.1.0-linux-amd64.tar.gz

tar -zxf helm-v3.1.0-linux-amd64.tar.gz

cp linux-amd64/helm /usr/local/bin/

helm version

helm repo list

helm plugin install https://github.com/chartmuseum/helm-push

添加 harbor 仓库

使用 harbor 作为 helm的仓库

  1. 在harbor创建一个项目helm-chart用于存放后 helm chart
  2. 执行添加命令

项目 helm-chart

image.png

执行添加命令

格式

helm repo add --ca-file ca.crt --username=admin --password=Passw0rd helm-chart https://xx.xx.xx.xx/chartrepo/helm-chart

上面 https://xx.xx.xx.xx/chartrepo/helm-chart 中的 chartrepo 是固定格式符 必须添加 和项目无关。helm-chart 是仓库名

查看是否成功添加

helm repo list

创建一个项目并推送到 helm-chart

helm create app

helm push --ca-file=/etc/docker/certs.d/hbr.zifuy.cn/ca.crt --username=admin --password=Harbor12345 app https://hbr.zifuy.cn/chartrepo/helm-chart

11.png

查看仓库

image.png

helm 常用命令

helm create mychart #创建一个mychart目录

helm delete mysql #删除一个chart(可恢复)

helm delete --purge mysql #彻底删除一个chart (不可恢复)

helm repo list   

helm list

helm repo update

helm repo remove

helm search hello

helm lint mysql  #检查下载的chart是否存在问题

helm upgrade mysql -f mysql/values.yaml --set resources.requests.memory=1024Mi mysql #更新release

helm install --name redis --namespaces prod bitnami/redis # install chart

Helm 包管理

helm list --all-namespaces -a #列出所有命名空间下的helm服务

helm -n scrm-test uninstall scrm-h5  #卸载 scrm-test 命名空间下的 scrm-h5服务

Helm push插件

在线部署:

helm plugin install https://github.com/chartmuseum/helm-push

离线部署:

wget https://github.com/chartmuseum/helm-push/releases/download/v0.9.0/helm-push_0.9.0_darwin_amd64.tar.gz
mkdir -p /root/.helm/plugins/helm-push
tar -xf helm-push_0.9.0_darwin_amd64.tar.gz -C /root/.helm/plugins/helm-push

标题:Helm在Kubernetes上的基本使用
作者:zifuy
地址:https://www.zifuy.cn/articles/2019/09/30/1569826621644.html