拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Krew 插件目录(kubectl plugins available):集中式索引、插件发现与一键安装实战

Krew 插件目录(kubectl plugins available):集中式索引、插件发现与一键安装实战
  • 开发工具
  • 云原生

【免费下载链接】krew

📦 Find and install kubectl plugins

项目地址:https://gitcode.com/gh_mirrors/kr/krew
点击查看免费下载

Krew 是 kubectl 的插件管理器,而kubectl plugins available(即仓库中的 插件目录页)相当于 Krew 生态的"插件市场":它集中展示所有可通过 Krew 分发与安装的 kubectl 插件,并引导用户以两步完成从"发现"到"落地"。本文以该目录页为核心,拆解它的数据来源、前后端渲染机制,并给出从安装 Krew 到使用kubectl krew install/search/info/update的完整实战方案,让你既能熟练使用 Krew 安装插件,也能理解目录页背后"集中式索引 + 动态 API"的实现原理。

插件目录页是什么:Krew 生态的"插件市场"

仓库中的 site/content/plugins.md 定义了 Krew 官方站点上的插件列表页(slug 为plugins)。页面开宗明义地说明:这里展示的是由集中式索引 krew-index 分发的全部 kubectl 插件清单(krew-index 由 kubernetes-sigs 组织维护,是 Krew 生态的默认官方插件索引仓库,其中plugins目录下每个插件对应一个 YAML 清单文件)。

页面主体是一个三列表格:

列含义
Name插件名称,即kubectl krew install <PLUGIN_NAME>中使用的名称
Description插件的短描述(来源于插件清单中的shortDescription字段)
Repository插件对应的 GitHub 仓库链接

值得注意的一个细节:表格初始内容只是 "Loading..." 占位符。也就是说,这份"插件列表"并不是静态写死在 Markdown 里的,而是由站点前端通过调用动态函数接口实时拉取并渲染的——这正是下一节要深入讲解的机制。同样的"动态插件数量"也出现在站点首页 site/content/_index.md 中(首页显示⌛ kubectl plugins currently distributed,其中的⌛会被 JavaScript 替换为真实计数)。

两步上手:从目录页到本地安装

原文档给出的使用流程非常简洁,只有两步:

  1. 安装 Krew 本体;
  2. 运行kubectl krew install <PLUGIN_NAME>安装目标插件。

第一步:安装 Krew 本体

Krew 本身也是一个 kubectl 插件,并且通过 Krew 自举安装(Krew self-hosts)。完整的分平台安装说明在 安装指南 中,要点如下:

  • 兼容性前提:Krew 仅兼容kubectlv1.12 及以上版本;macOS/Linux 下安装前需确保已安装git。

  • macOS/Linux(bash/zsh):官方提供了一段下载脚本,逻辑是:进入临时目录 → 用uname推导出操作系统(OS)与架构(ARCH,如x86_64归一为amd64、aarch64归一为arm64)→ 从 Krew 官方 Releases 下载对应krew-${OS}_${ARCH}.tar.gz→ 解压后运行./krew install krew完成自举安装。完整可执行的命令原文请直接查阅 site/content/docs/user-guide/setup/install.md。

  • 配置 PATH:安装完成后需要把 Krew 的 bin 目录加入 PATH(编辑~/.bashrc或~/.zshrc):

    export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

    然后重启 shell,运行kubectl krew验证安装。

  • fish shell:在config.fish中追加set -gx PATH $PATH $HOME/.krew/bin。

  • Windows:需要下载krew.exe,以管理员权限打开命令提示符(安装过程会创建符号链接),运行.\krew install krew,并把%USERPROFILE%\.krew\bin加入 PATH 后开启新终端验证。

  • 其他包管理器:可通过 Homebrew(macOS)等方式安装,但官方当前并不主动支持该途径。

第二步:用kubectl krew install安装插件

安装 Krew 后,即可从目录页中挑选插件名直接安装:

kubectl krew install <PLUGIN_NAME>

以 cmd/krew/cmd/install.go 的实现为准,这条命令实际支持的用法比表面看起来更丰富:

  • 一次安装多个插件:kubectl krew install NAME [NAME...],多个插件名依次安装。
  • 从文件批量安装:kubectl krew install < file.txt,当 stdin 不是终端且未给出参数/--manifest时,命令会按行读取插件名(见 install.go 中基于bufio.Scanner的 stdin 读取逻辑)。
  • 从自定义索引安装:kubectl krew install INDEX/NAME,插件名支持索引名/插件名的规范写法(由pathutil.CanonicalPluginName解析)。
  • 开发者选项:--manifest=FILE指定本地插件清单、--manifest-url=URL指定远程清单、--archive=FILE强制使用本地归档文件代替网络下载。注意--manifest与--manifest-url互斥,--archive只能配合二者之一使用;使用本地清单时安装来源记为detached。
  • 索引更新控制:--no-update-index(实验性)可在安装前跳过本地索引副本的更新;默认情况下安装前会先同步索引(对应PreRunE中的ensureIndexes)。
  • 私有包下载认证:--enable-netrc配合--netrc-file(默认~/.netrc或 Windows 下的%HOME%/_netrc)为下载插件包提供登录凭据,readPluginFromURL会为请求附加 Basic Auth。

从源码还可以确认几条重要的安装行为约定(对理解目录页流程很有帮助):

  • 已安装的插件会被跳过,并输出Skipping plugin "X", it is already installed(对应installation.ErrIsAlreadyInstalled判断);
  • 某个插件安装失败不会中断其他插件的安装,最后统一汇总失败列表;
  • 安装成功后会打印"如何使用"提示:kubectl <plugin>、Documentation(即清单中的homepage)以及Caveats注意事项;
  • 从默认索引安装的插件还会额外打印安全提示(internal.PrintSecurityNotice,详见 cmd/krew/cmd/internal/security_notice.go)。

目录页的数据管道:Netlify Functions + GitHub API

目录页能实时列出全部插件,依赖的是一套"前端静态页 + 服务端无服务器函数"的架构。核心证据集中在两处:site/functions/server/main.go(后端)与 site/layouts/partials/footer.html(前端渲染脚本)。

后端:拉取、过滤、并发解析插件清单

后端是一个基于 Netlify Functions(AWS Lambda 风格)的 Go 服务,核心逻辑在 site/functions/server/main.go:

  1. 拉取索引目录:调用 GitHub API 的Repositories.GetContents读取kubernetes-sigs/krew-index仓库下plugins目录的条目列表(main.go中的pluginCountHandler与pluginsHandler)。
  2. 过滤 YAML 清单:filterYAMLs只保留类型为文件、且文件名以constants.ManifestExtension(即.yaml)结尾的条目,每个 YAML 就是一个插件清单。
  3. 并发下载与解析:fetchPlugins启动pluginFetchWorkers(值为 40)个并发 worker,通过 channel 分发每个清单文件的下载 URL,readPlugin用http.Get拉取内容后以sigs.k8s.io/yaml解析成krew.Plugin结构(即 pkg/index/types.go 中定义的清单模型)。
  4. 组装响应字段:每个插件最终输出name、homepage、short_description、github_repo四个字段。其中github_repo由findRepo推导:优先用正则.*github\.com/([^/]+/[^/#]+)从主页 URL 提取仓库路径;对于主页不在 GitHub 上的已知插件(如 krew、ingress-nginx、kudo、kubevirt、popeye、kubetap),则通过knownHomePages映射表人工指定仓库。
  5. 缓存:两个接口的响应都设置Cache-Control: public, max-age=3600(cacheSeconds = 60 * 60),让 Netlify 的 CDN 缓存 1 小时,以缓解 GitHub API 的速率限制压力。

访问路径为/.netlify/functions/api/plugins(返回插件列表)和/.netlify/functions/api/pluginCount(返回插件数量,供首页统计用)。

前端:lit-html 动态渲染表格

目录页表格的填充逻辑写在 site/layouts/partials/footer.html 的脚本中:

  • 页面加载完成后,向/.netlify/functions/api/plugins发起请求;
  • 拿到插件数组后按name做localeCompare排序,再用 lit-html 渲染成<tr>行:Name 列链接到插件homepage,Repository 列展示对应 GitHub 仓库的 star 徽章;
  • 请求失败或列表为空时,渲染 "failed to load plugins" 的错误行;
  • 同页的另一段脚本负责把首页的krew-plugin-count占位元素替换为pluginCount接口返回的真实插件数量。

这套机制意味着:目录页的表格内容完全由 krew-index 仓库中的清单文件驱动,新增/下架插件后,网站无需重新构建即可通过 API 反映最新状态(受 CDN 缓存影响,最长延迟 1 小时)。

本地开发与部署注意点

site/functions/README.md 记录了本地联调方式与生产部署要点:

  • 本地开发:先cd ./site && hugo serve启动 Hugo 站点(端口 1313),再cd ./functions && go run ./server -port=8080启动函数服务。带-port参数时服务会对localhost:1313做反向代理,因此访问http://localhost:8080即可同时看到站点和可用的函数接口。
  • GitHub API 速率限制:生产环境务必在 Netlify 控制台配置无权限的GITHUB_ACCESS_TOKEN环境变量来提升接口速率上限;由于动态响应已被 CDN 长期缓存,单个 token 通常足以支撑很长时间。本地开发若频繁调用同样可能触发速率限制,可按需配置该环境变量。

目录背后的插件清单结构:manifest 与平台选择

目录页展示的每一条记录,源头都是 krew-index 中一份 YAML 格式的插件清单。清单的数据模型定义在 pkg/index/types.go:

  • Plugin:清单根结构,内嵌 Kubernetes 风格的TypeMeta与ObjectMeta(metadata.name即插件名),核心内容是Spec;
  • PluginSpec:包含version(版本)、shortDescription(短描述,目录页表格直接展示)、description(长描述,kubectl krew info展示)、caveats(安装后的注意事项)、homepage(主页,目录页 Name 列链接到它)以及platforms(平台定义列表);
  • Platform:面向特定操作系统/架构的安装描述,包括uri(下载地址)、sha256(校验和)、selector(用 LabelSelector 匹配os/arch)、files(从归档解压到安装目录的文件操作from/to)以及bin(插件可执行文件相对路径,安装完成后会被链接为kubectl-<name>)。

仓库中的 hack/krew.yaml 正是 Krew 自己作为插件被分发的清单(apiVersionkrew.googlecontainertools.github.com/v1alpha2,kindPlugin),它同时列出了 darwin/linux/windows 等多个平台的uri、sha256、files与selector配置,是理解清单写法的第一手示例。可以看到一个清单如何为不同os/arch组合(如linux/amd64、darwin/arm64、windows/amd64等)声明各自独立的下载与安装策略,这也解释了目录页插件在特定平台上"可用/不可用"的判断依据:Krew 在安装、搜索时会调用installation.GetMatchingPlatform匹配当前平台的Platform条目(见 cmd/krew/cmd/search.go)。

命令行插件发现:终端里的"目录页"

目录页适合人类浏览,而日常操作更常直接在终端完成同样的发现流程,对应命令都在 cmd/krew 下。

刷新索引:kubectl krew update

目录页数据源于 krew-index,本地同样维护一份索引副本。kubectl krew update通过gitutil.EnsureUpdated同步本地索引(见 cmd/krew/cmd/update.go)。两个实用特性:

  • 你不必手动运行它——执行krew install或krew upgrade时会静默触发索引更新;
  • 更新后若索引中出现了新插件,或已安装插件有版本升级,会分别提示New plugins available与Upgrades available for installed plugins(含旧版本 → 新版本变化);
  • 若本机尚未配置任何索引,命令会自动添加默认官方索引(ensureDefaultIndexIfNoneExist)。

搜索插件:kubectl krew search

kubectl krew search列出全部插件;带关键词时执行模糊搜索(基于sahilm/fuzzy),同时匹配插件名与短描述,并对描述命中做去重与Score > 0过滤(见 cmd/krew/cmd/search.go 的searchByNameAndDesc)。输出为三列表格:

NAME DESCRIPTION INSTALLED access-matrix Show an RBAC access matrix for server resources no advise-psp Suggests PodSecurityPolicies for cluster. no ...

其中INSTALLED列标记插件是否已安装:已装显示yes,未装但支持当前平台显示no,若插件没有匹配当前GOOS/GOARCH的 Platform,则显示unavailable on <os>/<arch>;短描述超过 50 字符会被截断为...。更完整的示例可参考 site/content/docs/user-guide/search.md。

查看插件详情:kubectl krew info

kubectl krew info PLUGIN(或INDEX/PLUGIN)输出单个插件的完整信息,字段由 cmd/krew/cmd/info.go 的printPluginInfo决定:NAME、INDEX(来源索引)、VERSION、HOMEPAGE、DESCRIPTION、CAVEATS,并且在当前平台匹配时还会给出URI与SHA256校验和,便于安装前核对来源。

小结

kubectl plugins available目录页本质上是 Krew 集中式索引(krew-index)的"前台窗口":后端由 Netlify Functions 通过 GitHub API 拉取索引中的 YAML 清单并做并发解析,前端以 lit-html 动态渲染成 Name / Description / Repository 三列表格。对使用者来说,完整闭环只有两步——先按 安装指南 装好 Krew,再用kubectl krew install <PLUGIN_NAME>完成安装;而对开发者与运维者来说,search、info、update三个命令加上 pkg/index/types.go 的清单模型,构成了在终端里完成插件发现、评估与批量管理的完整工具箱。

  • 开发工具
  • 云原生

【免费下载链接】krew

📦 Find and install kubectl plugins

项目地址:https://gitcode.com/gh_mirrors/kr/krew
点击查看免费下载
上一篇:Torchattacks AutoAttack详解:一站式解决模型鲁棒性测试
下一篇:libguestfs终极指南:如何高效访问与修改虚拟机磁盘镜像

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表