【笔记】Helm-3 主题-12 Helm插件指南
Helm插件指南
Helm插件是一个可以通过helm CLI访问的工具,但不是Helm的内置代码。
已有插件可以搜索GitHub。
https://github.com/search?q=topic%3Ahelm-plugin&type=Repositories
该指南描述如何使用和创建插件。
概述
Helm插件是与Helm无缝集成的附加工具。插件提供一种扩展Helm核心特性集的方法,但不需要每个新的特性都用Go编写并加入核心工具中。
Helm插件有以下特性:
1、可以在不影响Helm核心工具的情况下添加和移除。
2、可以用任意编程语言编写。
3、与Helm集成,并展示在helm help和其他地方。
Helm插件存在与$HELM_PLUGINS。您可以找到该变量的当前值,包括不设置环境变量的默认值,使用helm env命令。
Helm插件模型部分基于Git的插件模型。为此,您有时可能听到helm以插件为基础被用作_porcelain_层。这是一种Helm提供用户体验和顶级处理逻辑的简写方式。而插件执行所需操作的“细节工作”。
安装一个插件
插件使用$ helm plugin install <path|url> 命令安装插件。您可以在本地文件系统上传一个路径或远程仓库url给插件。The helm plugin install 命令会克隆或拷贝给定路径的插件到$ HELM_PLUGINS。
$ helm plugin install https://github.com/adamreese/helm-env
$ helm plugin install https://github.com/adamreese/helm-env
如果是插件tar包,仅需要解压插件到$HELM_PLUGINS目录。也可以用tar包的url直接安装:helm plugin install https://domain/path/to/plugin.tar.gz。
构建插件
在很多方面,插件类似于chart。每个插件有个顶级目录和一个plugin.yaml文件。
$ HELM_PLUGINS/
$HELM_PLUGINS/|- last/||- plugin.yaml|- last.sh
上述示例中,last插件包含在last目录中。有两个文件:plugin.yaml(必须)和一个可执行脚本,last.sh(可选)。
插件的核心是一个简单的YAML文件plugin.yaml。下面是一个插件YAML,用于获取最新的release名称:
name: "last"
version: "0.1.0"
usage: "get the last release name"
description: "get the last release name"
ignoreFlags: false
command: "$HELM_BIN --host $TILLER_HOST list --short --max 1 --date -r"
platformCommand:
- os: linux
arch: i386
command: "$HELM_BIN list --short --max 1 --date -r"
- os: linux
arch: amd64
command: "$HELM_BIN list --short --max1 --date -r"
- os: windows
arch: amd64
command: "$HELM_BIN list --short --max 1 --date -r"
name: "last"
version: "0.1.0"
usage: "get the last release name"
description: "get the last release name"
ignoreFlags: false
command: "$HELM_BIN --host $TILLER_HOST list --short --max 1 --date -r"
platformCommand:- os: linuxarch: i386command: "$HELM_BIN list --short --max 1 --date -r"- os: linuxarch: amd64command: "$HELM_BIN list --short --max 1 --date -r"- os: windowsarch: amd64command: "$HELM_BIN list --short --max 1 --date -r"
name是插件名称。当Helm执行此插件时使用此名称。(比如,helm NAME 会调用此插件)。
上述示例中,name应该匹配目录名称,意味着last目录中应该包含name: last插件。
name的限制:
1、name无法复用现有的helm顶级命令。
2、name的字符必须限制为ASCII a-z,A-Z,0-9,_和-。
version时插件的语意化2的版本。usage和description用于生成命令的帮助文本。
ignoreFlags开关告诉Helm不要给插件传递的参数。因此如果一个插件使用helm myplugin --foo调用且ignoreFlags: true,那么--foo会被悄悄忽略。
最后,尤其重要的是platformCommand或command是插件调用时执行的命令。platformCommand部分定义了命令在系统/架构的特定变体。以下规则用于决定使用哪个命令:
1、如果platformCommand存在,会优先被搜索。
2、如果os和arch匹配了当前平台,搜索会停止并使用命令。
3、如果没有匹配platformCommand且不存在command,Helm会报错退出。
环境变量会在插件执行前被插入。上述模式说明了表示插件所在位置的首选方法。
有一些使用插件命令的策略:
1、如果插件中包含可执行文件,可执行文件针对于platformCommand: 或command: 命令,应该打包到插件目录中。
2、platformCommand: 或者command: 行会在执行之前展开任何环境变量。$HELM_PLUGIN_DIR会指向插件目录。
3、Helm在环境变量中插入很多配置。查看环境变量获取可用信息。
4、Helm对插件语言不做任何假设。您想写什么就写什么。
5、-h和--help命令负责实现特定的帮助文本。Helm会在helm help和helm help myplugin中使用usage和description,但不处理helm myplugin --help。
下载插件
默认情况下,Helm能够使用HTTP/S拉去chart。从Helm 2.4.0开始,插件有一种能力从任意来源下载chart。
插件应该在plugin.yaml(顶层的)文件中声明这个特殊能力:
downloaders:
- command: "bin/mydownloader"
protocols:
- "myprotocol"
- "myprotocols"
downloaders:
- command: "bin/mydownloader"protocols:- "myprotocol"- "myprotocols"
如果这个插件已经安装,Helm可以通过调用command可以使用指定的协议方案与存储仓库进行交互。特殊仓库的添加与常规仓库类似:helm repo add favorite myprotocol://example.com/。特殊仓库的规则也和常规仓库相同:为了发现和缓存chart的可用列表,Helm必须下载index.yaml文件。
以定义的命令可以通过以下结构调用:command certiFile keyFile caFile full-URL。SSL证书有仓库定义,存储在$HELM_REPOSITORY_CONFIG(即:$HELM_CONFIG_HOME/repositories.yaml)。下载器插件将原始内容使用stdout输出并使用stderr报告错误。
下载器命令也支持子命令和参数,允许在plugin.yaml指定,比如bin/mydownloader subcommand -d。如果您想在相同的可执行文件中执行主要的插件命令和下载器命令,这就变得很有用,但每个命令都有不同的子命令。
环境变量
当Helm执行插件时,会传递外部环境变量给插件,且会加入一些额外的环境变量。
像KUBECONFIG这样的变量,如果实在外部环境中设置的,则是为插件设置的。
要保证设置以下变量:
HELM_PLUGIN:插件目录路径。
HELM_PLUGIN_NAME:helm调用的插件名称。
HELM_PLUGIN_DIR:包含插件的目录。
HELM_BIN:(当前用户的)helm命令的路径。
HELM_DEBUG:表示helm是否设置了debug。
HELM_REGISTRY_CONFIG:注册配置的位置(如果启用)。
HELM_REPOSITORY_CACHE:缓存文件路径。
HELM_REPOSITORY_CONFIG:配置文件路径。
HELM_NAMESPACE:helm命令制定的命名空间(一般使用-n参数)。
HELM_KUBECONTEXT:helm命令给定的Kubernetes配置上下文的名称。
另外,如果明确指定Kubernetes配置文件,需要配置成KUBECONFIG变量。
参数解析说明
当执行插件时,Helm会解析自己的全局参数。这些参数都不会传递给插件。
--debug:如果指定,$HELM_DEBUG设置为1
--registry-config:链接到了$HELM_REGISTRY_CONFIG
--repository-cache:链接到了$HELM_REGISTRY_CACHE
--repository-config:链接到了$HELM_REPOSITORY_CONFIG
--namespace和-n:链接到了$HELM_NAMESPACE
--kube-context:链接到了$HELM_KUBECONTEXT
--kubeconfig:链接到了$KUBECONFIG
插件应该使用-h和--help显示帮助文本然后退出。在所有其他情况下,插件根据需要使用参数。
提供shell自动补全
从Helm 3.2开始,作为Helm现有的自动补全机制的一部分,插件可以选择性提供对shell自动补全的支持。
静态自动补全
如果插件提供了自己的参数或者子命令,可以通过位于插件跟目录的completion.yaml文件通知Helm。completion.yaml格式如下:
name: <pluginName>
flags:
- <flag 1>
- <flag 2>
validArgs:
- <arg value 1>
- <arg value 2>
commands:
name: <commandName>
flags:
- <flag 1>
- <flag 2>
validArgs:
- <arg value 1>
- <arg value 2>
commands:
<and so on, recursively>
name: <pluginName>
flags:
- <flag 1>
- <flag 2>
validArgs:
- <arg value 1>
- <arg value 2>
commands:name: <commandName>flags:- <flag 1>- <flag 2>validArgs:- <arg value 1>- <arg value 2>commands:<and so on, recursively>
注意:
1、所有部分都是可选的,应该在适用时提供。
2、参数不该包含-或--前缀。
3、可以而且应该指定短的和长的参数。短参数不需要与其对应的长格式关联,但是都应被列出。
4、参数不需要以任何方式排序,但是需要列举出在文件子命令层次结构的正确位置。
5、Helm现有的全局参数已经有Helm的自动补全机制处理,因此插件不需要指定以下参数:--debug,--namespace或-n,--kube-context,以及--kubeconfig,或者其他全局参数。
6、validArgs列表提供了一个以下子命令的第一个参数可能补全的静态列表。并不总是能事先提供这样一份清单。(查看下面的 动态补全 部分),这种情况下validArgs部分可以省略。
Helm | Helm插件指南
completion.yaml文件是完全可选的。如果没有提供,Helm不会为插件提供shell自动补全功能(除非插件支持 动态补全 )。并且,添加completion.yaml文件是向后兼容的,而且不会影响到插件使用helm旧版本的操作。
Helm | Helm插件指南
举个例子,针对fullstatus plugin,没有子命令但是接受与helm status命令相同的参数,completion.yaml文件如下:
name: fullsstatus
flags:
- o
- output
- revision
name: fullstatus
flags:
- o
- output
- revision
一个使用2to3 plugin更复杂的例子,completion.yaml文件如下:
name: 2to3
commands:
- name: cleanup
flags:
- config-leanup
- dry-run
- l
- label
- release-cleanup
- s
- release-storage
- tiller-cleanup
- t
- tiller-ns
- tiller-out-cluster
- name: convert
flags:
- delete-v2-releases
- dry-run
- l
- label
- s
- release-storage
- release-versions-max
- t
- tiller-ns
- tiller-out-cluster
- name: move
commands:
- name: config
flags:
- dry-run
name: 2to3
commands:
- name: cleanupflags:- config-cleanup- dry-run- l- label- release-cleanup- s- release-storage- tiller-cleanup- t- tiller-ns- tiller-out-cluster
- name: convertflags:- delete-v2-releases- dry-run- l- label- s- release-storage- release-versions-max- t- tiller-ns- tiller-out-cluster
- name: movecommands:- name: configflags:- dry-run
Dynamic completion
动态补全
也是从Helm3.2开始,插件可以提供它们自己的动态shell补全。动态补全是补全事先没有定义的参数值或标签值。比如说,补全集群中现在可用的helm发布的名称。
对于支持动态补全的插件,必须在根目录中提供一个命名为plugin.complete的可执行文件。当Helm的自动补全脚本需要为这个插件动态补全时,会执行plugin.complete文件,传递需要补全的命令行。plugin.complete可执行文件需要有判断核实补全选项的逻辑并将其通过Helm补全脚本输出到标准输出。
plugin.complete文件是完全可选的。如果没有提供,Helm不会为插件提供动态自动补全。并且,添加plugin.complete文件是向后兼容的,而且不会影响到插件使用Helm旧版本的操作。
plugin.complete脚本的输出应该是以行分隔的列表,例如:
rel1
rel2
rel3
当调用plugin.complete时,插件环境的设置与调用插件的主脚本时一样。因此,变量$HELM_NAMESPACE,$HELM_KUBECONTEXT,以及所有其他插件变量都已经设置好了,且它们对应的全局标志会被移除。
plugin.complete文件可以是任何可执行格式;可以是shell脚本,Go程序,或者任何其他Helm可以执行的类型。plugin.complete文件必须有对用户的可执行权限。plugin.complete文件必须以成功码退出(0)。
在有些场景中,动态补全需要从Kubernetes集群中获取信息。比如,helm fullstatus插件需要发布名称作为输入。在fullstatus插件中,针对它的plugin.complete脚本提供当前发布名称的补全,执行helm list -q即可输出结果。
如果想插件执行和插件补全使用同一个可执行文件,plugin.complete脚本可以使用特殊的参数或标签调用主插件执行文件;当主插件执行文件检测到特殊的参数或标签,它就知道应该执行补全。在以下示例中,plugin.complete执行如下:
#!/usr/bin/env sh
#!/usr/bin/env sh# "$@" is the entire command-line that requires completion.
# It is important to double-quote the "$@" variable to preserve a possibly empty last parameter.
$HELM_PLUGIN_DIR/status.sh --complete "$@"
fullstatus脚本的实际脚本(status.sh)必须查找 --complete,如果存在,打印出合适的补全。
提示和技巧
1、脚本会自动过滤掉不匹配输入的补全。因此,插件会返回所有相关的补全,而不删除与用户输入不匹配的补全。比如,如果命令行是helm fullstatus ngin<TAB>,不仅仅是以ngin开头的,plugin.complete脚本可以打印所有(default默认命名空间)的发布名称,脚本只会保留以ngin开头的。
2、为了简化动态补全支持,尤其是如果您有个复杂的插件,您可以有您的plugin.complete脚本调用您的主插件脚本并请求补全选项。查看上边 动态补全 的例子。
Helm | Helm插件指南
3、要调用动态补全和plugin.complete文件,可以运行以下命令查看补全效果:
helm_complete <pluginName> <arguments to complete>。比如
helm_complete fullstatus --output js<ENTER>,
helm_complete fullstatus -o json ""<ENTER>
helm __complete <pluginName> <arguments to complete>
。比如:helm __complete fullstatus --output js<ENTER>
,helm __complete fullstatus -o json ""<ENTER>
————————————
仅用于本人学习
来源:Helm | Docs
相关文章:

【笔记】Helm-3 主题-12 Helm插件指南
Helm插件指南 Helm插件是一个可以通过helm CLI访问的工具,但不是Helm的内置代码。 已有插件可以搜索GitHub。 https://github.com/search?qtopic%3Ahelm-plugin&typeRepositories 该指南描述如何使用和创建插件。 概述 Helm插件是与Helm无缝集成的附加工具…...

2023.1.17 关于 Redis 持久化 AOF 策略详解
目录 引言 AOF 策略 实例演示一 缓冲区 重写机制 手动触发 自动触发 AOF 重写流程 实例演示二 引言 Redis 实现持久化的两大策略 RDB ——> Redis DataBase(定期备份)AOF ——> Append Only File(实时备份) 注意&…...

P2PNet推理和训练
0、环境信息 Package Version ------------------------ ------------ certifi 2023.11.17 charset-normalizer 3.3.2 contourpy 1.2.0 cycler 0.12.1 easydict 1.11 filelock …...

pyexecjs原生js加密算法逆向
查看必要参数,得知sign签名 从堆栈自上到下依次查找源代码 如下图,找到后打上断点,得知e是输入的参数,说明b()是一个加密函数,点击进入查看底层函数 把1117这个函数内的三个方法CV到python中的一个js文件中,…...

数据结构Java版(4)——链表
一、概述 链表是一种常见的数据结构,用于存储一系列具有相同类型的数据元素。它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。 链表与数组不同,它的节点在内存中不是连续存储的,而是通过每个节点中的指针…...

cfssl简单使用
1、安装 方式1:直接下载 详见:手动生成证书 | Kubernetes # 1、下载cfssl、cfssljson、cfssl-certinfo # cfssl:用于签发证书 # cfssljson:将cfssl签发生成的证书(json格式)变成文件承载式文件 # cfssl-certinfo:验…...

基于Word2vec词聚类的关键词实现
一.基于Word2vec词聚类的关键词步骤 基于Word2Vec的词聚类关键词提取包括以下步骤: 1.准备文本数据:收集或准备文本数据,可以是单一文档或文档集合,涵盖关键词提取的领域。2.文本预处理:清洗文本数据,去除…...

开源项目_大模型应用_Chat2DB
1 基本信息 项目地址:https://github.com/chat2db/Chat2DBStar:10.7K 2 功能 Chat2DB 是一个智能且多功能的 SQL 客户端和报表工具,适用于各种数据库。 对于那些平时会用到数据库,但又不是数据库专家的程序员来说,…...

【线性代数与矩阵论】范数理论
范数理论 2023年11月16日 文章目录 范数理论1. 向量的范数2. 常用向量范数3. 向量范数的等价性4. 矩阵的范数5. 常用的矩阵范数6. 矩阵范数与向量范数的相容性7. 矩阵范数诱导的向量范数8. 由向量范数诱导的矩阵范数9. 矩阵范数的酉不变性10. 矩阵范数的等价性11. 长方阵的范数…...

【C++】priority_queue模拟实现过程中值得注意的点
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 本篇文章旨在记录博主在模…...

Git提交 ssh: connect to host github.com port 22: Connection timed out解决方案
你们好,我是金金金。 场景 之前都是好好的,不知道今天为什么提交代码就这样了 排查 根据英文可以看出,ssh端口号被拒绝了,22号端口不行,那就换一个端口 造成error的原因 ssh端口被拒绝 解决 找到.ssh文件ÿ…...

Java调用WebService接口,SOAP协议HTTP请求返回XML对象
Java调用Web service接口SOAP协议HTTP请求,解析返回的XML字符串: 1. 使用Java的HTTP库发送SOAP请求,并接收返回的响应。 可以使用Java的HttpURLConnection、Apache HttpClient等库。 2. 将返回的响应转换为字符串。 3. 解析XML字符串&…...

Django框架二
一、模型层及ORM 1.模型层定义 负责跟数据库之间进行通信 2.Django配置mysql 安装mysqlclient,mysqlclient版本最好在13.13以上 pip3 install mysqlclient DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: "mysite1",USER:root,PASSWO…...

工业相机与镜头参数及选型
文章目录 1、相机成像系统模型1.1 视场1.2 成像简化模型 2、工业相机参数2.1 分辨率2.2 靶面尺寸2.3 像元尺寸2.4 帧率/行频2.5 像素深度2.6 动态范围2.7 信噪比2.8 曝光时间2.9 相机接口 3、工业镜头参数3.1 焦距3.2 光圈3.3 景深3.4 镜头分辨率3.5 工作距离(Worki…...

VSCode使用Makefile Tools插件开发C/C++程序
提起Makefile,可能有人会觉得它已经过时了,毕竟现在有比它更好的工具,比如CMake,XMake,Meson等等,但是在Linux下很多C/C源码都是直接或者间接使用Makefile文件来编译项目的,可以说Makefile是基石…...

用C语言验证“三门定理”
#include <stdio.h> #include <stdbool.h> #include <stdlib.h> #include <time.h>// 一个源自博弈论的数学游戏问题: // 参赛者会看见三扇门, // 其中一扇门的里面有一辆汽车, // 选中里面是汽车的那扇门࿰…...

计算机网络-分层结构,协议,接口,服务
文章目录 总览为什么要分层怎样分层正式认识分层概念小结 总览 为什么要分层 发送文件前要做的准备工作很多 把这个准备工作分层小问题解决,也就分层解决 怎样分层 每层相互独立,每层做的工作不同 界面自然清晰,层与层之间的接口能够体现…...

前端开发 2: CSS
在前端开发中,CSS(层叠样式表)是一种用于描述网页样式的语言。它控制着网页的布局、颜色、字体等外观效果。在本篇博客中,我将为你介绍 CSS 的基础知识和常用技巧,帮助你更好地掌握前端开发中的样式设计。 CSS 基础知…...

嵌入式-Stm32-江科大基于标准库的GPIO4个小实验
文章目录 一 、硬件介绍二 、实验:LED闪烁、LED流水灯、蜂鸣器提示2.1 需求1:面包板上的LED以1s为周期进行闪烁。亮0.5s,灭0.5s.....2.2 需求2: 8个LED实现流水灯2.3 需求3:蜂鸣器不断地发出滴滴、滴滴.....的提示音。蜂鸣器低电平触发。 三、…...

HackTheBox - Medium - Linux - Noter
Noter Noter 是一种中型 Linux 机器,其特点是利用了 Python Flask 应用程序,该应用程序使用易受远程代码执行影响的“节点”模块。由于“MySQL”守护进程以用户“root”身份运行,因此可以通过利用“MySQL”的用户定义函数来利用它来获得RCE并…...

Uniapp多选Popup(弹出层)
uniapp中多选组件很少,故个人简单开发了一个,可简单使用,也可根据个人需求稍微改进 支持的功能 单选多选(默认)限制选择数量默认选中禁用选项 属性说明 属性默认值说明singlefalsetrue为开启单选,否则为…...

什么是网络安全?网络安全概况
网络安全涉及保护我们的计算机网络、设备和数据免受未经授权的访问或破坏。 这个领域包括多种技术、过程和控制措施,旨在保护网络、设备和数据免受攻击、损害或未授权访问。网络安全涉及多个方面,包括但不限于信息安全、应用程序安全、操作系统安全等 …...

c语言小游戏之扫雷
目录 一:游戏设计理念及思路 二:初步规划的游戏界面 三:开始扫雷游戏的实现 注:1.创建三个文件,test.c用来测试整个游戏的运行,game.c用来实现扫雷游戏的主体,game.h用来函数声明和包含头文…...

如何本地安装Python Flask并结合内网穿透实现远程开发
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

在线App封装技术:HTML5的新生命
HTML5封装的魅力所在HTML5带来了丰富的多媒体功能、地理位置服务、离线存储等特性,使得Web应用的体验更加接近原生App。封装HTML5到App中,可以大大缩短开发周期,降低开发成本,并且一次编写,多平台运行,极大…...

Spring Boot 4.0:构建云原生Java应用的前沿工具
目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…...

Debian系统写Mysql时中文出现乱码无法定入的问题解决方案
原因是操作系统可能精简安装,没有GBK字符集,只有UTF8在转换或使用的时候有问题。 使用locale -a查看系统支持的字符集。正常的比较全的字符集的操作系统如下: 有问题的操作系统字符集如下: 解决方案: 步骤1&#…...

CPMS靶场练习
关键:找到文件上传点,分析对方验证的手段 首先查看前端发现没有任何上传的位置,找到网站的后台,通过弱口令admin 123456可以进入 通过查看网站内容发现只有文章列表可以进行文件上传;有两个图片上传点 图片验证很严格…...

CTFhub-bak文件
CTFhub-Web-信息泄露-备份文件下载-bak文件 题目信息 解题过程 看到提示说和index.php有关,在url后面加index.php.bak,跳转到http://challenge-7a4da2076cfabae6.sandbox.ctfhub.com:10800/index.php.bak网址,即: 跳转到下载页…...

本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…...