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 中;