- 开发工具
- 云原生
【免费下载链接】krew
📦 Find and install kubectl plugins
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 替换为真实计数)。
两步上手:从目录页到本地安装
原文档给出的使用流程非常简洁,只有两步:
- 安装 Krew 本体;
- 运行
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:
- 拉取索引目录:调用 GitHub API 的
Repositories.GetContents读取kubernetes-sigs/krew-index仓库下plugins目录的条目列表(main.go中的pluginCountHandler与pluginsHandler)。 - 过滤 YAML 清单:
filterYAMLs只保留类型为文件、且文件名以constants.ManifestExtension(即.yaml)结尾的条目,每个 YAML 就是一个插件清单。 - 并发下载与解析:
fetchPlugins启动pluginFetchWorkers(值为 40)个并发 worker,通过 channel 分发每个清单文件的下载 URL,readPlugin用http.Get拉取内容后以sigs.k8s.io/yaml解析成krew.Plugin结构(即 pkg/index/types.go 中定义的清单模型)。 - 组装响应字段:每个插件最终输出
name、homepage、short_description、github_repo四个字段。其中github_repo由findRepo推导:优先用正则.*github\.com/([^/]+/[^/#]+)从主页 URL 提取仓库路径;对于主页不在 GitHub 上的已知插件(如 krew、ingress-nginx、kudo、kubevirt、popeye、kubetap),则通过knownHomePages映射表人工指定仓库。 - 缓存:两个接口的响应都设置
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
相关推荐
Krew 架构深度解析:kubectl 插件的索引、清单与安装机制
Krew 架构深度解析:kubectl 插件的索引、清单与安装机制 本文以仓库内 docs/KREW_ARCHITECTURE.md https://link.
开发工具云原生2012年的老Mac怎么装上最新macOS:OpenCore Legacy Patcher免费完整上手指南
2012年的老Mac怎么装上最新macOS:OpenCore Legacy Patcher免费完整上手指南 你正打开App Store,却弹出"与此Mac不兼容
开发工具云原生三步快速跑通量化回测:从零到第一份完整回测报告
三步快速跑通量化回测:从零到第一份完整回测报告 一套趋势策略在回测里三年赚 212%,实盘第一个月亏 18%。差距几乎都来自回测系统里的三种“假利润”:过拟合、
开发工具云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考