
服务网格云原生可观测性【免费下载链接】linkerd2Ultralight, security-first service mesh for Kubernetes. Main repo for Linkerd 2.x.项目地址https://gitcode.com/gh_mirrors/li/linkerd2点击查看免费下载导读Linkerd2.x通过一套轻量的扩展模型开放生态能力——任何第三方都可以用一个linkerd-name可执行文件 一组 Kubernetes 资源的形式为服务网格增加功能。本文以仓库根目录的 EXTENSIONS.md 为核心骨架结合 cli/cmd/check_extensions.go、pkg/healthcheck/healthcheck_output.go、pkg/k8s/api.go 等源码系统讲解扩展的定义、安装、卸载、健康检查协议以及内置扩展 viz / multicluster 的落地方案。读完本文你将能够独立开发一个可被linkerd check自动发现与集成的扩展二进制。扩展模型概览一个二进制 一组资源Linkerd 的扩展模型允许第三方为服务网格添加功能其核心约定非常简单每个扩展由一个名为linkerd-name的 CLI 二进制name即扩展名和一组 Kubernetes 资源清单组成用户运行linkerd name时Linkerd CLI 会在当前PATH中搜索名为linkerd-name的可执行文件并执行它——也就是说扩展的调用本质上是一个约定式命令派发linkerd name等效于在 PATH 中查找并运行linkerd-name。这套设计在源码中有直接印证cli/cmd/check_extensions.go中的findCLIExtensionsOnPath使用filepath.Glob(filepath.Join(dir, linkerd-*))遍历 PATH 的每一个目录把命中的文件按名称去重再通过exec.LookPath确认其可执行cli/cmd/check_extensions.go。而suffix函数负责从路径中剥离出扩展名linkerd-foo→foo、linkerd-foo-bar→foo-barcli/cmd/check_extensions.go。从源码结构看linkerd check、linkerd viz ...、linkerd multicluster ...等命令之所以能对扩展无感知地统一处理正是因为扩展发现完全基于文件名约定而不是注册表或配置文件。内置扩展viz 与 multicluster仓库中已经内置了两个官方扩展它们是理解扩展模型的最佳范本viz位于 viz/提供拓扑、流量统计、tap 等可观测性能力其子命令stat、top、tap、edges、routes、dashboard等全部实现在 viz/cmd/multicluster位于 multicluster/提供跨集群服务镜像能力命令实现在 multicluster/cmd/。在cli/cmd/check_extensions.go的builtInChecks中可以看到这两个内置扩展名被显式登记cli/cmd/check_extensions.go它们的安装资源分别由 Helm chart 渲染viz/charts/linkerd-viz/与multicluster/charts/linkerd-multicluster/。安装与卸载扩展安装扩展分为两步下载扩展可执行文件并放入 PATH。由于扩展发现机制完全依赖 PATH这一步是否成功决定了linkerd name能否被解析到。把扩展安装进 Kubernetes 集群linkerd extension name install | kubectl apply -f -卸载时使用对称的命令linkerd extension name uninstall | kubectl delete -f -这一设计的精妙之处在于install和uninstall都只是向标准输出打印 YAML 清单的纯函数真正对集群生效的是kubectl apply/delete。这种CLI 只负责生成清单、kubectl 负责执行的职责划分让扩展的安装/卸载不需要任何集群内注册逻辑。查看已安装扩展运行linkerd check会打印一份完整的已安装扩展清单。其检测机制是通过kubeAPI.GetAllNamespacesWithExtensionLabel以LabelSelector: linkerd.io/extension列出所有带扩展标签的命名空间pkg/k8s/api.go标签常量定义在 pkg/k8s/labels.goLinkerdExtensionLabel linkerd.io/extension然后把 PATH 中的linkerd-*可执行文件与集群中已安装的扩展标签做匹配cli/cmd/check.go 与 cli/cmd/check_extensions.go。因此一个扩展要能被linkerd check识别为已安装其 Namespace 必须带有linkerd.io/extensionname标签——这正是下一节开发规范中install命令的硬性要求。若某个命名空间带有该标签但 PATH 中找不到对应可执行文件linkerd check会将其报告为missing缺失的可执行文件并以 warning 形式提示cli/cmd/check_extensions.go。开发扩展约定与规范命名与约束开发一个扩展需要满足以下硬性约定可执行文件必须命名为linkerd-name其中name为扩展名name不能与任何内置 Linkerd 命令重名如check也不能与既有扩展重名如viz扩展名会用于命令派发linkerd name、PATH 文件匹配linkerd-name、Namespace 标签linkerd.io/extensionname三处必须保持一致。必须接受的全局标志扩展在与 Kubernetes API 通信的任何时刻都必须接受并尊重下列标志。注意所有标志必须被接受但如果并不适用可以被忽略标志说明--api-addr绕过 kubeconfig直接与 host:port 上的控制平面通信主要用于测试--context要使用的 kubeconfig context 名称--asKubernetes 操作时模拟impersonate的用户名--as-groupKubernetes 操作时模拟的用户组--help/-h打印帮助信息--kubeconfig用于 CLI 请求的 kubeconfig 文件路径--linkerd-namespace/-LLinkerd 安装所在的命名空间支持环境变量$LINKERD_NAMESPACE--verbose开启调试日志这些标志正是 Linkerd 根命令的全局标志集合。在 cli/cmd/root.go 中可以看到它们以PersistentFlags方式定义--linkerd-namespace/-L默认linkerd、--kubeconfig、--context、--as、--as-groupStringArrayVar可重复、--api-addr默认空值表示使用 Kubernetes 配置、--verbose。扩展遵循同样的约定能保证用户心智模型一致——任何linkerd系命令都有一致的连接与身份参数。必须实现的三个子命令linkerd-name install职责打印该扩展的 Kubernetes 清单YAML要求可以直接通过管道交给kubectl apply -f。硬性要求清单中必须包含一个带linkerd.io/extensionname标签的 Namespace 资源name即扩展名。这一标签正是上一节所述linkerd check检测已安装扩展的依据。linkerd-name uninstall职责打印该扩展全部集群作用域资源ClusterRole、ClusterRoleBinding、CRD 等以及扩展自身的 Namespace的清单要求可以管道交给kubectl delete -f。这一命令与install是严格的镜像关系install 输出什么uninstall 就应该能完整撤销什么且必须覆盖集群级资源避免卸载后残留 ClusterRole/CRD 等泄漏。linkerd-name check职责执行扩展的健康检查至少包括检查扩展资源存在且处于健康状态全部通过时退出码为 0否则退出码非 0。推荐与linkerd check保持一致的输出格式例如linkerd-version --------------- √ can determine the latest version √ cli is up-to-date Status check results are √输出协议约束输出最后一行必须是Status check results are √全部通过或Status check results are ×存在失败。这是linkerd check聚合多个扩展检查结果时的解析基础——linkerd check会为集群中每个已安装扩展调用其 check 命令并要求 JSON 输出。linkerd-name check除了接受上述全局标志外还必须接受标志说明--namespace/-n用于--proxy检查的命名空间默认所有命名空间--output/-o输出格式table、json、short之一--pre仅运行安装前检查判断扩展是否可以安装--proxy仅运行数据平面检查判断数据平面是否健康--wait所有检查通过所允许的最大等待时间这些标志与 Linkerd 核心check命令的标志一一对应见 cli/cmd/check.go 中的checkOptions结构与nonConfigFlagSet/checkFlagSet定义--pre与--proxy互斥validate()中强制校验--output仅接受table/json/short三种取值--wait默认300 * time.Second。JSON 输出协议当--output json时输出必须是如下结构的 JSONlinkerd check对扩展的调用正是采用此格式{ success: false, categories: [ { categoryName: kubernetes-api, checks: [ { description: can initialize the client, result: success }, { description: can query the Kubernetes API, result: success }, { description: linkerd-viz Namespace exists, hint: https://linkerd.io/2/checks/#l5d-viz-ns-exists, error: could not find the linkerd-viz extension, result: error } ] } ] }字段语义success为整体结果categories为检查类别数组每个类别含categoryName与checks列表每条检查含description、result如success/error还可有 warning 类取值、可选的error失败原因与hint帮助链接。源码侧cli/cmd/check_extensions.go的parseJSONCheckOutput会解析该结构把 JSON 还原为统一的healthcheck.CheckResults再交由healthcheck.RunChecks按用户指定的输出格式渲染cli/cmd/check_extensions.go。与linkerd check的集成方式源码确认的调用链linkerd check读取 PATH 中所有linkerd-*可执行文件读取集群中所有带linkerd.io/extension标签的命名空间对PATH 中存在且集群中已安装的扩展以linkerd-name check --output json方式执行解析其 JSON 结果并渲染对集群中已安装但 PATH 中找不到的扩展输出 warning为保持向前兼容推荐扩展的 check 命令忽略任何未知标志未来linkerd check可能传入新增标志。runExtensionsChecks的实现cli/cmd/check_extensions.go还展示了细节扩展 check 以子进程方式运行解析失败时会构造一条描述为Running: command的失败检查并附带指向版本化文档的 HintURL。可选子命令linkerd-name _extension-metadata该子命令是可选的作用是让扩展选择加入opt-inlinkerd check的检查流程——即使集群中尚未安装该扩展也会被检查。选择加入的方式_extension-metadata输出如下 JSON{ name: linkerd-name, checks: always }name必须与可执行文件名匹配源码校验见 cli/cmd/check_extensions.gostrings.EqualFold(metadataOutput.Name, filename)即linkerd-foo合法、linkerd-foo-v0.XX.X不合法checks目前只支持always常量定义在 pkg/healthcheck/healthcheck_output.go源码中另有cluster、never的 TODO 注释说明该字段未来可能扩展为按集群状态决定是否检查。验证机制linkerd check为了确认哪些扩展选择加入会对 PATH 中的每一个linkerd-*可执行文件运行linkerd-* _extension-metadata见 cli/cmd/check_extensions.go 的findAlwaysChecks。也就是说一个扩展是否被无条件检查取决于它能否成功响应_extension-metadata且声明checks: always。另外扩展可以也鼓励实现更多自定义子命令超出本文定义的最小集——例如viz扩展就实现了stat、top、tap等丰富命令viz/cmd/。源码视角扩展检查的完整工作流综合 cli/cmd/check.go 与 cli/cmd/check_extensions.golinkerd check与扩展的完整交互流程可以归纳为linkerd check ├─ 1. kubeAPI.GetAllNamespacesWithExtensionLabel() │ └─ 通过 LabelSelector linkerd.io/extension 列出已安装扩展的命名空间 ├─ 2. findExtensions(PATH, filepath.Glob, exec, nsLabels) │ ├─ a. findCLIExtensionsOnPath: 遍历 PATH 匹配 linkerd-* │ ├─ b. findAlwaysChecks: 执行 _extension-metadata收集 always 扩展 │ ├─ c. 匹配集群标签中的扩展viz/multicluster 走内置路径 │ └─ d. 剩余标签 → missing 列表 ├─ 3. runExtensionsChecks: 对每个扩展执行 ext check [flags] --output json │ ├─ parseJSONCheckOutput: 解析扩展返回的 JSON 检查结果 │ └─ healthcheck.RunChecks: 按 table/json/short 渲染并汇总 └─ 4. 对 missing 扩展输出 warning 检查项关键设计点发现即约定无注册中心、无配置文件一切基于文件名 Namespace 标签两个约定结果可聚合所有扩展的 check 结果统一为 JSON 协议再由主 CLI 统一渲染因此linkerd check可以给出一份跨扩展的整体健康报告向前兼容扩展应忽略未知标志保证未来主 CLI 演进时不会被破坏无侵入卸载uninstall输出完整清单交给kubectl delete无集群内残留逻辑。实战建议开发你自己的扩展结合上文规范一个最小扩展的实现骨架如下伪代码示意// linkerd-mycooltool 的入口 func main() { root : cobra.Command{Use: linkerd-mycooltool} root.AddCommand(cmdInstall()) // 打印清单含 linkerd.io/extensionmycooltool 标签的 Namespace root.AddCommand(cmdUninstall()) // 打印待删除的集群级资源 Namespace root.AddCommand(cmdCheck()) // 健康检查支持 --output json/table/short 等 root.AddCommand(cmdMetadata()) // 输出 {name:linkerd-mycooltool,checks:always} // 同时通过 PersistentFlags 接受 --api-addr/--context/--as/--as-group/ // --help/--kubeconfig/--linkerd-namespace/-L/--verbose }开发时需要特别注意的检查清单命名不冲突避开内置命令check、install等与既有扩展名viz、multicluster标志完整8 个全局标志全部声明可忽略不适用者check 子命令额外声明-n/-o/--pre/--proxy/--wait标签正确install输出必须包含linkerd.io/extensionname标签的 Namespace否则linkerd check无法识别它已安装退出码正确check全部通过返回 0否则返回非 0输出最后一行严格为Status check results are √或Status check results are ×JSON 合法被linkerd check以--output json调用时输出结构与字段名严格遵循上述协议容错忽略未知标志保持向前兼容。验证方式将编译好的linkerd-mycooltool放入 PATH运行linkerd mycooltool install | kubectl apply -f -安装再运行linkerd check即可在报告中看到扩展被自动发现并纳入检查。结语Linkerd 的扩展模型以二进制约定 标签约定 输出协议三个简单规则换取了极强的可插拔性开发者只需交付一个符合约定的可执行文件就能无缝融入linkerd的命令体系和linkerd check的健康检查生态。仓库中的 EXTENSIONS.md 定义了契约本身而vizviz/与multiclustermulticluster/两个内置扩展则是这份契约最完整的参考实现——无论是想集成第三方工具、还是贡献新的官方扩展本文的规范与源码路径都可以作为你的起点。赞分享服务网格云原生可观测性【免费下载链接】linkerd2Ultralight, security-first service mesh for Kubernetes. Main repo for Linkerd 2.x.项目地址https://gitcode.com/gh_mirrors/li/linkerd2点击查看免费下载相关推荐Plaso部署完全指南从安装到生产环境的完整流程Plaso部署完全指南从安装到生产环境的完整流程 Plaso是一款强大的数字取证工具能够帮助用户从各种来源收集和分析时间线数据。本指南将带你完成从安装到生产网络安全Xonsh 扩展机制Xontribs完整指南从查找、加载到开发自己的扩展Xonsh 扩展机制Xontribs完整指南从查找、加载到开发自己的扩展 导读 xonsh 是一个可扩展、可由用户自由修补的 Python shell第开发工具探索PyRay几何形状库多面体、抛物面和黄金分割球体的创建方法探索PyRay几何形状库多面体、抛物面和黄金分割球体的创建方法 PyRay是一个完全用Python编写的3D渲染库它提供了丰富的几何形状创建功能包括多面体创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考