- 开发工具
- 云原生
- CLI
【免费下载链接】mirrord
Run any process, on your machine or in an AI agent's environment, as if it were a pod in your Kubernetes cluster: real env vars, DNS, network, traffic.
本篇技术指南围绕 mirrord 的Target(目标)机制展开:它决定了本地进程在集群中"伪装"成哪个 Kubernetes 工作负载,从而获得其网络环境、文件系统与环境变量。你将掌握 mirrord 支持的全部目标类型(Pod、Deployment、Argo Rollout、Job、CronJob、StatefulSet、Service、Label 等)、四种目标指定方式(配置文件、IDE 对话框、CLI 参数、环境变量)以及无需目标的 targetless 模式,并理解底层源码如何解析与校验目标路径。
目标(Target)是什么
在 mirrord 中,Target 是你指定给 mirrord 的集群资源,让本地应用按照 配置 访问该远程目标的环境变量、文件系统和网络。当指定了目标后,mirrord 会在目标 Pod 所在的同一节点上创建一个 mirrord-agent Pod:agent 与目标 Pod 共享同一 Linux 命名空间,从而嗅探网络流量、访问目标文件系统,并将文件操作与入站流量中继到本地进程。
一次要管理多个不同的应用?若要把多个不同应用作为一个受管组一起运行,参考
mirrord up;若要让一个应用跨多个工作负载(甚至没有工作负载)的所有 Pod 成为目标,参考 按 Label 定位 Pod。
支持的目标类型
mirrord OSS(开源版)
mirrord OSS 支持以下 Kubernetes 对象作为目标:
| 目标类型 | 说明 |
|---|---|
| Pod | 直接指定某个 Pod |
| Deployment | 指定 Deployment,取其中一个 Pod |
| Argo Rollouts | 指定 Argo Rollout,取其中一个 Pod |
在 OSS 中,当以多副本工作负载为目标时,mirrord 总是随机选择一个 Pod。
mirrord for Teams
mirrord for Teams(配合 mirrord Operator 使用)额外支持以下工作负载与目标:
| 目标类型 | 说明 |
|---|---|
| Jobs | 需要启用copy_target(mirrord 会自动开启) |
| CronJobs | 需要启用copy_target(mirrord 会自动开启) |
| StatefulSets | 需要 mirrord Operator |
| ReplicaSets | 需要 mirrord Operator |
| Services | 通过 Service 的 selector 解析到其背后的 Pod |
| Labels | 选中所有匹配 label selector 的 Pod |
在 mirrord for Teams 中,当以多副本工作负载为目标时,mirrord 总是将所有Pod 作为目标。
从源码结构看,这一差异体现在 target.rs 的requires_operator方法中:Job、CronJob、StatefulSet、Service、ReplicaSet、Label均被标记为"仅 Operator 支持";而 plan.rs 定义了Oss、Team、Enterprise三个计划等级,各目标类型通过x-mirrord-plan标注在 schema 上(例如 pod.rs 标注Plan::Oss,label.rs 标注Plan::Team)。
容器选择行为
无论 OSS 还是 Teams,如果你没有指定具体的容器,mirrord 会从 Pod spec 中选择第一个容器;某些容器(如 service mesh sidecar 代理)会被自动忽略。
目标路径格式
在所有指定目标的接口中,基本格式统一为<resource-type>/<resource-name>,可选地追加/container/<container-name>:
deploy/<YOUR-DEPLOYMENT-NAME>例如deploy/lolz,或者:
pod/<YOUR-POD-NAME>例如pod/lolz-64698df9b7-6plq8。
如需同时指定容器,在末尾追加/container/<CONTAINER-NAME>,例如pod/lolz-64698df9b7-6plq8/container/main-container。
从源码看,target.rs 中的TARGET_PATH_FORMATS常量完整列出了所有合法格式:
targetless pod/{pod-name}[/container/{container-name}] deployment/{deployment-name}[/container/{container-name}] deploy/{deployment-name}[/container/{container-name}] rollout/{rollout-name}[/container/{container-name}] job/{job-name}[/container/{container-name}] cronjob/{cronjob-name}[/container/{container-name}] statefulset/{statefulset-name}[/container/{container-name}] service/{service-name}[/container/{container-name}] replicaset/{replicaset-name}[/container/{container-name}] label/{key}={value}[,{key}={value}...][/container/{container-name}] serverless/{service-name}[/container/{container-name}]其中deploy是deployment的合法别名。Label 目标支持多个key=value用逗号分隔(全部必须匹配),例如label/app=web,tier=frontend/container/app。
指定目标的四种方式
1. 使用配置文件
目标路径放在target.path字段,目标所在的命名空间放在target.namespace字段。默认情况下,使用本地kubeconfig中当前指定的命名空间:
{ "target": { "path": "pod/lolz-64698df9b7-6plq8/container/main-container", "namespace": "lolzspace" } }target配置在源码中有两种形态(target.rs 的TargetFileConfig):
- Simple(简单形态):
target直接是一个路径字符串,例如"target": "pod/bear-pod"; - Advanced(对象形态):
target是{ "path": ..., "namespace": ... }对象,其中path既可以是路径字符串,也可以是对象映射,例如:
{ "target": { "path": { "pod": "bear-pod", "container": "bear-pod-container" }, "namespace": "bear-pod-namespace" } }对象映射的等价 JSON 形态如下(摘自 target.rs 的文档注释):
| 目标类型 | JSON 对象等价写法 |
|---|---|
| targetless | { "target": "targetless" } |
| pod | { "target": { "pod": "pod-name", "container": "container-name" } } |
| deployment | { "target": { "deployment": "deployment-name", "container": "container-name" } } |
| rollout | { "target": { "rollout": "rollout-name", "container": "container-name" } } |
| job | { "target": { "job": "job-name", "container": "container-name" } } |
| cronjob | { "target": { "cron_job": "cronjob-name", "container": "container-name" } } |
| statefulset | { "target": { "stateful_set": "statefulset-name", "container": "container-name" } } |
| service | { "target": { "service": "service-name", "container": "container-name" } } |
| label | { "target": { "labels": { "key": "value" }, "container": "container-name" } } |
| serverless | { "target": { "service": "service-name", "container": "replica-id" } } |
target.path若未给出,默认值为targetless;target.namespace默认取 Kubernetes 上下文中用户的默认命名空间。
2. 使用 IDE 的对话框
如果你正在使用 mirrord 的 IDE 扩展(VS Code 或 JetBrains 插件),且没有通过配置文件指定目标,运行时将弹出对话框供你选择目标。若想从其他命名空间选择目标,可以在配置文件中设置目标命名空间,对话框将只显示该命名空间内的目标。选择对话框中的No Target ("targetless")选项即可无目标运行。
3. 使用命令行参数
从命令行运行时,通过-t指定目标、-n指定其命名空间:
mirrord exec -t deploy/lolz -n lolzspace my-app在 cli/config.rs 中可以看到这两个参数的定义(#[arg(short = 't', long)]与#[arg(short = 'n', long)])。命令行参数指定的值会生效,即使配置文件或环境变量中设置了其他值。
从源码角度看,这一优先级机制的实现方式是:CLI 参数通过 TargetParams::as_env_vars 转换为对应的环境变量(-t→MIRRORD_IMPERSONATED_TARGET、-n→MIRRORD_TARGET_NAMESPACE),再参与配置解析。
4. 使用环境变量
你也可以直接设置以下环境变量:
MIRRORD_IMPERSONATED_TARGET:目标路径;MIRRORD_TARGET_NAMESPACE:目标命名空间。
环境变量指定的值会生效,即使配置文件设置了其他值。这一覆盖逻辑在 target.rs 的generate_config中体现:let path = Self::get_target_path_from_env(context)?.or(path_from_conf_file);,即环境变量优先于配置文件。该文件的单元测试(default与parse_target_config_from_json,target.rs)验证了环境变量对配置文件中命名空间的覆盖行为。
特定目标的行为细节
Service 目标
以 Service 为目标时,mirrord 通过 Service 的 selector 将其解析为背后的 Pod。ServiceTarget的结构体定义见 service.rs。
Job 与 CronJob 目标
Job 和 CronJob 没有长期运行的 Pod 供 agent 附着,因此需要启用copy_target:mirrord 会按照原目标的 Pod spec 创建一个新 Pod 副本,再以该副本为目标。使用 Job 或 CronJob 目标时,即使你未显式设置,copy_target也会被自动启用——这对应 target.rs 中的requires_copy方法。copy_target的完整配置(enabled、scale_down、exclude_containers、exclude_init_containers)见 copy_target.rs。
Label 目标
以 Label 为目标时,mirrord 会选中所有匹配 label selector 的 Pod,并对其流量进行镜像或窃取。标签目标是精确匹配(所有条目都必须匹配),且不允许空选择器——空选择器会被拒绝,以免意外选中命名空间中的所有 Pod(见 label.rs 的verify方法)。更详细的行为、版本要求与当前限制,参考 按 Label 定位 Pod。
运行 targetless(无目标)
当未指定任何目标时,mirrord 会启动一个targetlessagent。这在以下场景很有用:你想从集群内部连接服务,但没有任何想要"伪装"的目标——比如运行一个外部工具或一个新的微服务。
targetless 模式的行为:
- mirrord 会将应用发起的任何连接转发到集群外部(即通过 agent 从集群内发出);
- 不会镜像或窃取入站流量,因为 targetless agent 未连接到任何 Kubernetes Service,也不暴露任何端口;
- 因此,如果你的应用绑定并监听某个端口,该监听完全发生在本地机器上——例如管理程序暴露的 Web 界面可以监听
localhost,同时连接到集群内的远程服务。
通过配置文件运行 targetless
可以完全不写target键,也可以显式指定。注意:若要在 IDE 插件中跳过目标选择对话框,必须显式指定:
{ "target": "targetless" }在 IDE 中,选择目标对话框里的No Target ("targetless")选项即可(或不做选择)。同时应确保用于指定目标的环境变量未被设置(或设置为空值)。
注意:要设置 agent 被创建在哪个命名空间,应设置agent 命名空间而非目标命名空间。该值可通过配置文件的
agent.namespace字段、-aCLI 参数或MIRRORD_AGENT_NAMESPACE环境变量设置(源码定义见 agent.rs,CLI 映射见 cli/config.rs)。
补充一点:targetless 模式下,target.namespace的含义变为"远程网络(outgoing 流量与 DNS)发生的命名空间";而 agent 本身的命名空间则由agent.namespace控制,两者不要混淆。
目标路径的解析与错误提示(源码原理)
从源码看,目标路径的解析入口是 target.rs 中Target的FromStr实现:它以/分割字符串,根据第一个段(deployment/deploy、rollout、pod、job、cronjob、statefulset、service、replicaset、label、serverless、targetless)分发到对应目标类型的from_split解析器。例如 pod.rs 的PodTarget::from_split要求路径严格为pod/<name>或pod/<name>/container/<container>,其余形式均视为非法。
当目标路径无法解析时,mirrord 会给出详细的排错提示(target.rs 的FAIL_PARSE_DEPLOYMENT_OR_POD),内容包括:合法的格式列表、容器名可选(默认为 mirrord 选择的容器)、无 Operator 时以工作负载为目标会随机选中一个 Pod 副本,以及建议检查拼写、用kubectl get/describe确认目标存在、确认目标位于正确的命名空间。这套提示同时服务于mirrord exec及相关的所有命令。
总结
mirrord 的目标机制可以用一句话概括:用统一的目标路径格式,通过四种等价接口,把本地进程绑定到集群中的某个 Pod、某个工作负载、一组标签命中的 Pod,或者干脆不绑定(targetless)。OSS 与 Teams 在支持的目标类型上有所差异(后者支持 Job、CronJob、StatefulSet、ReplicaSet、Service、Label,且多副本时面向全部 Pod),而copy_target让 Job/CronJob 这类无长期运行 Pod 的工作负载同样可被调试。理解目标路径的解析规则与各接口的优先级(CLI/环境变量 > 配置文件),可以帮你快速定位配置问题,正确排布本地开发环境与集群资源的对应关系。
- 开发工具
- 云原生
- CLI
【免费下载链接】mirrord
Run any process, on your machine or in an AI agent's environment, as if it were a pod in your Kubernetes cluster: real env vars, DNS, network, traffic.
相关推荐
mirrord Targetless 模式实战指南:不指定目标运行进程,让本地工具直接接入集群网络
mirrord Targetless 模式实战指南:不指定目标运行进程,让本地工具直接接入集群网络 导读 :本指南系统讲解 mirrord 的 Targetle
开发工具云原生CLIPydantic 标准库类型支持全指南:内置类型与标准库类型的校验、约束与严格模式
Pydantic 标准库类型支持全指南:内置类型与标准库类型的校验、约束与严格模式 导读 Pydantic 的核心能力是基于 Python 类型注解(type
后端序列化Numba 支持的 Python 语言特性全指南:nopython 模式下的语法、内建类型与标准库支持速查
Numba 支持的 Python 语言特性全指南:nopython 模式下的语法、内建类型与标准库支持速查 本篇指南系统梳理 Numba(基于 LLVM 的 N
编译器高性能计算
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考