0%

k8s 中的云原生应用管理利器 -- Helm

关于 Kubernetes 系列其他文章的传送门

  1. 《 部署 Kubernetes 也能如此简单吗? 》

  2. 《 初识 k8s,新时代的宠儿 》

  3. 《 深度学习 Pod 》

  4. 《 学会这 5 种 Pod 控制器,搞定发布、更新、回滚,从此告别人肉运维!! 》

  5. 《 k8s 中的网络入口 – Service 资源管理 》

  6. 《 k8s 中的 7 层调度 – Ingress 》

  7. 《 k8s 中的存储系统 – Volumes 》

  8. 《 k8s 中强大的配置中心 – ConfigMap 》

  9. 《 k8s 中的部署神器 – Statefulset 控制器 》

  10. 《 k8s 中的安全守护神 – 你不知道不代表它不在 》

  11. 《 k8s 中的图形接口 – Dashboard 》

  12. 《 k8s 中的网络插件 – flannel 和 Calico 》

  13. 《 k8s 中的调度器 – 亲和性、污点和容忍性 》

  14. 《 k8s 中对资源的监控 – 资源指标、Prometheus、弹性伸缩器 HPA 》

  15. 《 k8s 中的云原生应用管理利器 – Helm 》     您当前所在位置

  16. 《 理解 k8s 高可用,让你的集群稳如泰山 》



logo

什么是 Helm ?

Helm 就是一个类似于 yum 的东西,能够让用户一键安装、部署 k8s 之上的应用。它会把应用需要用到的各种资源的配置清单,打包在一个文件当中,通过 Helm install 下载到集群上,之后展开并应用到集群上,完成一键部署,大大减低了手动写配置清单的难度。

一句话总结:Helm 就是 k8s 中的应用程序管理工具。

关于 Helm2

工作逻辑

Helm 只是一个 dff 客户端工具,在集群中有一个叫 Tailer 的守护进程,以 Pod 的形式运行,它才是真正执行相应部署任务的程序,而 Helm 就是 Tailer 的客户端。Helm 可以部署在任何位置,甚至是集群之外,只要它能和 Tailer 通信即可。

概念

部署应用程序时需要用到的清单称为 chart,保存在一个仓库中。Helm 负责维护和管理 chart 清单,并提交给 Tailer。Tarler 负责将收到的 chart 创建为 chart release,并负责管理。chart 是个静态的定义,只有一个,而 chart release 可以有很多个,可以理解为 chart 是个进程,而 chart release 是子进程。

工作流程

一些常用软件的维护方,已经把部署时需要用到的 chart 保存在仓库中,当用户创建程序时,Helm 连接到仓库去检索一个 chart,之后下载到本地并将其中的清单展开,一般为 yaml 格式。之后 Helm 把 chart 提交给 Tailer,再由 Tarler 提交给 apiServer,创建为 chart release。

自定义参数

chart 是一个打包的配置清单模板文件,可以调用 config 文件中的各种值生成配置清单。而 config 一个文本配置文件,有一些键值数据,用户可以自定义一些配置。

Helm 和 Tarler 之间通信使用的 GRPC 协议。而 Tarler 和 apiServer 之间通信使用的则是 HTTPS。其实 apiServer 也支持 GRPC 协议。

关于 Helm3

Helm 2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。

与之前版本相同,Helm 3 同样在 Release 页面提供了预编译好的二进制文件。差别在于原先的二进制包下载下来你会看到 helm 和 tiller,而 Helm 3 则只有 helm 的存在了。

Tiller 主要用于在 Kubernetes 集群中管理各种应用发布的版本,在 Helm 3 中移除了 Tiller, 版本相关的数据直接存储在了 Kubernetes 中。

关于 Helm3 的变动,从架构到使用上都有变化,必看读物:

官方的 Helm Hub 站点地址:https://hub.helm.sh/

安装 Helm

从二进制版本安装

Helm 要安装在能够运行 kubectl 命令的节点上,这个节点中应该有与 apiServer 通信的证书。因为安装后需要让 Helm 直接与 apiServer 通信去创建一个 Tarler 的 Pod。之后 Helm 才会只和 Tarler 通信,由 Tarler 去和 apiServer 联系。

  1. 下载 所需版本
  2. 解压 tar -zxvf helm-v3.0.0-linux-amd64.gz
  3. 在解压后的目录中找到 helm 的二进制文件,然后将其移至所需的目标位置 mv linux-amd64/helm /usr/local/bin/helm
  4. 之后就应该可以运行客户端了 helm help

这段是安装 Helm2 时需要的操作

默认情况下,Helm2 没有 k8s 集群的权限,所以应该提前创建一个 ServiceAccount,并为这个 SA 赋予一个拥有管理权限的 ClusterRole。

创建一个 tiller 的 SA 账户,并绑定在 k8s 内键的管理员集群角色 cluster-admin

1
2
3
kubectl create serviceaccount tiller -n kube-system

kubectl create clusterrolebinding tiller --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

初始化 Helm2:

  • init:初始化 Helm 自身和 Tarler 端;
  • Service-account:指定 SA 账号;
1
helm init --service-account tiller

这段是安装 Helm3 时需要的操作

直接添加官方的仓库即可:

1
helm repo add stable https://kubernetes-charts.storage.googleapis.com/

官方的 Helm Hub 站点地址:https://hub.helm.sh/

关于-Helm3

Helm3 命令

以下命令是在 helm3 中使用的,不确定在 helm2 能否使用。

  • helm repo update:更新仓库,建议每天使用前先更新;
  • helm search repo redis:搜索仓库中的软件;
  • helm show readme stable/redis:查看 redis 程序的自述文件;
  • helm install redis stable/redis --set password=123qwe:下载 redis 的 chart 并安装;
    • --set:定义一个变量的值;
    • -f FILE:指定一个文件,从文件中加载变量。这两种定义的变量优先级最高;
  • helm uninstall redis:移除程序和 chart;
  • helm list:移除程序和 chart;

chart 文件的目录结构

Helm 会把每一个 chart 下载到本地,保存在 /root/.cache/helm/repository 目录下。

  • Chart.yaml:用于描述当前 chart 的元数据文件,包括版本号、名称等;
  • ci:是一个目录,用于保存部署时在不同环境下各种配置文件中的基础变量值。如不指定则使用 default-values.yaml 文件;
  • values.yaml:为当前 chart 提供配置文件中变量的默认值。ci 目录中的变量文件不是被直接使用的。默认情况下,是直接使用此文件的;其他模板文件引用此文件中的变量时,格式为 .Values.image.repository,开头为固定格式表示从 Values 这个文件中加载变量;
  • README.md:自述文件;
  • templates:是一个目录,保存着模板文件。每个模板文件都要需要结合 values.yaml 文件中的值,加以处理以后才能生成真正可用的配置清单;
  • templates/NOTES.txt:是各种配置清单模板的使用说明,一般会在使用 helm install 后显示;
  • LICENSE:许可文件;
  • requirements.yaml:描述当前 chart 所依赖的其他 chart,如果没有可以不定义;
  • charts:是一个目录,保存所有被当前 chart 所依赖的其他 chart 的程序包;

chart 的创建、升级、回滚

创建 chart

使用以下命令创建一个 chart,会自动生成模板文件:

1
2
3
-> # helm create myapp
-> # ls myapp
charts Chart.yaml templates values.yaml

编辑 ./myapp/value.yaml 更改以下字段,定义要使用的容器:

1
2
3
4
5
6
7
8
9
10
...
...

image:
repository: ikubernetes/myapp
tag: v1
pullPolicy: IfNotPresent

...
...

如何从本地 chart 创建:

  • helm lint myapp:查看指定的 chart 目录是否存在语法等方面的错误;
  • helm install myapp ./myapp:从本地目录中加载 chart,并指定创建的名字为 myapp
  • helm install --set service.type=NodePort myapp ./myapp/:默认此 chart 的 service type 为 ClusterIP,可以使用这种方式改变变量为 NodePort,优先级最高;

升级 chart

升级 chart 的步骤:

1、先将 ./myapp/Chart.yaml 中关于 chart 的元数据信息升级版本,这里更改的只是属性信息,实际内容没有改变:

  • version: 0.1.0 改为 0.1.1
  • appVersion: 1.16.0 改为 1.16.1

2、然后将镜像的版本进行升级,这是实质性的改变,编辑 ./myapp/value.yaml,将 tag 字段中的版本升级:

1
2
3
4
5
6
7
8
...
...

tag: v1
# ↓↓↓↓
tag: v2
...
...

升级语法:
helm upgrade [RELEASE] [CHART] [flags]

1
helm upgrade --set server.type=NodePort myapp ./myapp

回滚 chart

查看版本:

1
2
3
4
-> # helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myapp default 2 2019-12-05 17:33:41.154058774 +0800 CST deployed myapp-0.1.1 1.16.1
# 当前版本是 1.16.1

回滚:

1
-> # helm rollback myapp 1

再次查看版本:

1
2
3
4
-> # helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myapp default 2 2019-12-05 17:36:18.724378091 +0800 CST deployed myapp-0.1.0 1.16.0
# 版本回到了 1.16.0

分发 chart

1
helm package

一些其他的管理命令

  • helm status:查看已部署的 chart 的状态,会显示刚部署后提示的哪些信息;
  • get:仅下载,不安装;
  • fetch:仅下载并自动解压到本地目录;
  • dependency:管理依赖关系;会自动把依赖到的其他 chart 下载并放至 chart 中;