云原生应用管理:原理与实践
上QQ阅读APP看书,第一时间看更新

2.8 Helm插件

Helm插件是从2.1.0版本开始引进的功能,所谓的插件就是可以通过Helm命令行使用,但又不是Helm客户端原生的功能。目前大部分插件都可以在https://helm.sh/docs/community/related/中找到,本节将详细介绍Helm插件的概念和使用方式。

1.概览

Helm插件是可以和Helm命令行无缝衔接的增强工具。它提供了一种扩展Helm核心功能的方法,并且不需要修改Helm原生的代码。Helm插件有如下3个特点:

·在Helm命令行中添加和删除Helm插件,不会影响Helm核心工具;

·可以用任何编程语言进行编写;

·很容易与Helm整合,并且可以出现在Helm Help命令行中。

所有的Helm插件都存放在$(helm home)/plugins目录下。Helm插件机制是受Git插件启发诞生的,这样对于Helm Client而言,用户能够获取更加丰富的功能,但是对于具体的任务执行,则是由插件本身来完成。

2.安装一个插件

我们通过helm plugin install<path|url>命令来安装插件,可以指定一个本地的文件夹路径或者远程的某个url来安装。通过helm plugin install命令下载对应的插件后,会复制到$(helm home)/plugins路径下。

下载完整实例可以使用此命令:helm plugin install https://github.com/technosophos/helm-template

如果用户自己有一个插件的安装包,那么就可以直接解压到$(helm home)/plugins文件夹下。同样,远程的压缩包也可以通过这种方式直接安装:helm plugin install http://domain/path/to/plugin.tar.gz

3.构建一个插件

插件和Chart的结构差不多,每个插件都有一个顶层文件夹,里面含有一个plugin.yaml文件。


$(helm home)/plugins/
  |- keybase/
      |
      |- plugin.yaml
      |- keybase.sh

在上面的例子中,keybase插件放在了keybase文件夹下。keybase文件夹下有两个文件:一个是plugin.yaml,这个文件是必须存在的;另一个是keybase.sh,这个文件是一个具体的可执行文件,是可选的。

插件的核心就是plugin.yaml这个文件,其内容如下所示。


name: "keybase"
version: "0.1.0"
usage: "Integrate Keybase.io tools with Helm"
description: |-
  This plugin provides Keybase services to Helm.
ignoreFlags: false
useTunnel: false
command: "$HELM_PLUGIN_DIR/keybase.sh"

name是这个插件的名字,当Helm执行keybase插件时,就会用到这个名字。例如在上例中,helm keybase就会执行这个插件。

name必须和文件夹的名字相同。在上面的例子中,name:keybase意味着这个插件所处的文件夹的名字必须是keybase。

不过这里的命名有一定的限制条件:

·name不能和已有的helm命令同名;

·name所取字符必须包含在ASCII a~z、A~Z、0~9、_和-中。

version是一个符合SemVer 2规范的字符串。usage和description都是用来产生帮助命令的文本。

ignoreFlags标志提示Helm不要传递任何参数给插件。也就是说,如果一个插件以helm myplugin--foo方式调用,且ignoreFlags被设置为true,那么-foo这个参数就不会传递给插件。

useTunnel表明插件需要通过隧道的方式访问Tiller。如果一个插件需要访问Tiller,那么这个标志位必须被设置为true。这样会让Helm创建一个隧道,然后设置正确的$TILLER_HOST环境变量,Helm插件就能够通过隧道访问Tiller了。不过不用担心,如果Tiller是本地运行的,Helm也会自动检测到,然后不去创建隧道。

最后,最重要的就是command这个字段。这个字段含有的内容会在插件被调用的时候运行,环境变量会在命令执行前被解析。

对于插件的命令也有一些注意事项。

·如果一个插件包含可执行文件,这个可执行文件就添加到插件的文件夹里面去。

·在命令行运行的时候,可以访问到所有的环境变量参数,同时$HELM_PLUGIN_DIR也会指向插件所在的文件夹。

·Helm本身内置了很多环境变量,可以在命令行内输出环境变量,看看有哪些有用的信息。

·Helm插件不限制任何语言,用户可以使用自己擅长的语言编写。

·命令行需要设置对应的说明和介绍性文本。Helm会使用usage和description字段显示帮助信息,在helm help myplugin命令运行的时候就会显示出来,但是使用helm myplugin--help不会显示帮助信息。

4.下载插件

在Helm 2.4.0版本中增加了一个通过HTTP/HTTPS下载插件的功能,可以让Helm从任何指定的地方下载插件。

插件需要在plugin.yaml中实现一个字段:


downloaders:
- command: "bin/mydownloader"
  protocols:
  - "myprotocol"
  - "myprotocols"

如果安装这样的插件,Helm就会通过指定的协议与远程仓库建立连接,这个远程仓库也需要像Helm Repo那样添加对应的信息——helm repo add favorite myprotocol://example.com/。这些使用规则与下载Chart是一致的。

5.环境变量

当Helm执行某个插件的时候,它会将外部所有环境变量都传递到插件内部,同时也会将附加的环境变量一并塞入。如下环境变量会被自动传递到插件中。

·HELM_PLUGIN:插件文件夹的地址。

·HELM_PLUGIN_NAME:Helm插件的地址,比如执行helm myplug命令,则这个环境变量就是myplug。

·HELM_PLUGIN_DIR:存放插件的文件夹名字。

·HELM_BIN:Helm二进制的路径。

·HELM_HOME:Helm指定的目录名称。

·TILLER_HOST:Tiller的地址,以IP:PORT格式呈现。