写点什么

Kubectl Plugin 推荐(三)| 插件开发篇

用户头像
郭旭东
关注
发布于: 2021 年 03 月 17 日
Kubectl Plugin 推荐(三)| 插件开发篇

前言


之前的两篇文章中笔者推荐了一些好用的 Kubectl Plugin。但在实践中那些插件不一定能满足全部需求,这时不妨动手开发一个,花费时间不多,但却能极高的提升工作效率和使用体验。


本篇文章就来讲解如何快速开发一款自己的 Kubectl Plugin。

简介


Kubectl Plugin 的开发流程和注意事项:


  • 编写一个二进制可执行文件以 kubectl-xxx 命名

  • 需要将可执行文件放在环境变量 PATH 中

  • 之后就可以使用 kubectl xxx 来调用了

  • 无法覆盖 kubectl 内置的命令


二进制可执行文件可以是任何语言开发,本文主要讲解使用 go 语言开发,官方推荐使用 cli-runtime[1] 项目,可以参考 sample-cli-plugin[2] 示例。


使用 GitHub Template


模板地址:https://github.com/replicatedhq/krew-plugin-template


推荐使用 GitHub Template 创建 Plugin 项目,该模板遵循最佳实践开发,并集成了一些简化开发流程的工具,使用 GoReleaser[3] 和 GitHub Action 进行自动化发布。该 template 也是官方文档推荐的 非官方 GitHub Template


创建项目


进入 krew-plugin-template 项目,点击 Use this template


使用模板


输入 Repository name,点击 Create repository from template 创建 repo


创建项目


配置项目


待项目创建完成后, clone 该项目并在本地通过终端进入该项目所在目录。


$ git clone https://github.com/sunny0826/kubectl-demo.git$ cd kubectl-demo
复制代码

使用 make setup 命令开始配置


set up


根据提示,填入 GitHub Organization or UsernameGitHub Repo Namek 和 Plugin Name 后,会自动对项目进行配置。


项目结构


配置完成后,一个 Kubectl Plugin 项目的基本框架就完成了,结构如下:


.├── LICENSE├── Makefile├── README.md├── cmd│   └── plugin│       ├── cli│       │   └── root.go   # cli 配置│       └── main.go       # 项目入口├── deploy│   └── krew│       └── plugin.yaml   # krew-index 配置├── doc│   └── USAGE.md├── go.mod├── go.sum└── pkg    ├── logger    │   └── logger.go    └── plugin        └── plugin.go     # 业务逻辑代码
复制代码

接下来就是业务逻辑的开发,主要的业务逻辑代码就写在 pkg/plugn/plugin.go 中;CLI 的相关配置,如 flag 和子命令的配置则在 cmd/plugin/cli/root.go 中。开发所需的 client-go 、k8s API 等资源也都已经集成在项目中,可直接使用。

构建测试


在业务逻辑完成后,需要先在本地进行测试。使用 make bin 命令可以将项目构建为可执行文件并用来测试,该命令会完成基础的 fmtvet 测试并完成 build


make bin


创建 Release


在完成代码逻辑和测试后,就可以将其发布到 github release 了,GitHub Action 和 GoReleaser[4] 会自动完成 Release 相关操作,只需给项目打上 tag 并 push 代码,无需任何手动操作。


$ git tag v0.1.0 -m 'initial release'$ git push --tags
复制代码

如果是首次 Release,会出现 Release 成功但是 GitHub Action 失败的情况,这里可以忽略,失败的是自动推送 PR 到 krew-index 的步骤。

推送到 krew-index


Release 完成后,就可以将已经开发好的 Kubectl Plugin 推送到 krew-index[5] 了,这样就可以使用 kubectl krew install 安装了。


首次推送


首次提交需要手动 fork krew-index 项目并提交 PR,拷贝 deploy/krew/plugin.yaml 中的内容,根据 release checksums.txt 内容补全不同平台可执行文件的 sha256 和 description 值,将其放入 plugin 目录并提交 PR。


自动推送


完成首次 PR 提交后,就可以使用 GitHub Action 自动提交 PR 到 krew-index 了,通过 krew-release-bot[6] 机器人自动提交的 PR 无需 review 自动 merge,大大降低了更新流程。


使用这个 GitHub Action,首先需要一份 .krew.yaml 配置文件,该项目作者提供了一个不错的工具,可以根据已经提交的 Kubectl Plugin 自动生成 .krew.yaml 内容,将生成的配置拷贝到 .krew.yaml,之后的 Release 成功后会自动提交 PR 到 krew-index。


Krew Release Bot Helper


工具地址:https://rajatjindal.com/tools/krew-release-bot-helper/


在 <your-git-root>/.github/workflows/release.yml 添加配置(GitHub Template 中已包含该配置):


name: releaseon:  push:    tags:    - 'v*.*.*'jobs:  goreleaser:    runs-on: ubuntu-latest    steps:    - name: Checkout      uses: actions/checkout@master    - name: Setup Go      uses: actions/setup-go@v1      with:        go-version: 1.13    - name: GoReleaser      uses: goreleaser/goreleaser-action@v1      with:        version: latest        args: release --rm-dist      env:        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}    - name: Update new version in krew-index      uses: rajatjindal/krew-release-bot@v0.0.38
复制代码

之后每次 Release 都会自动推送更新 PR,效果如下:


PR 自动合并


注意事项


官方提供了插件命名指南[7],大致有以下内容:


  • 使用小写字母和连字符,不要使用驼峰式命名

  • 表意明确,独一无二

  • 使用动词和资源类型命名,如 open-svc

  • 如果是供应商插件,前缀请使用供应商,如 gke-login

  • 不能包含 kube 前缀

  • 避免资源缩写,如 debug-ingress 而不能是 new-ing


同时 description 要描述清楚,且每行不要操作 80 个字符,这样可以方便窄屏幕的用户使用。


结语


本篇为《Kubectl Plugin 推荐》系列最后一篇,授人以鱼不如授人以渔,开发一个 Kubectl Plugin 并不会花费很多时间,但根据实际使用情况,为 kubectl 增加更多的功能和拓展,大大提升工作效率和使用体验,非常值得一试。



发布于: 2021 年 03 月 17 日阅读数: 11
用户头像

郭旭东

关注

服务可靠无异常,节点稳定不宕机 2018.09.08 加入

柴猫双全的码农

评论

发布
暂无评论
Kubectl Plugin 推荐(三)| 插件开发篇