- 云原生
- 开发工具
- 微服务
- 网络
【免费下载链接】telepresence
Local development against a remote Kubernetes or OpenShift cluster
本指南围绕 Telepresence 在处理“命名空间数量多”与“Pod 数量多”两类大规模集群时的性能瓶颈展开,讲解如何在
telepresence connect阶段通过--mapped-namespaces限制 DNS 解析范围,如何通过 Helm chart 的namespaces/namespaceSelector限定 traffic-manager 的管理范围,以及如何借助podCIDRStrategy与podCIDRs避免对 Pod IP 的全量扫描。读完本文,你将掌握一套可直接落地的大集群配置方案,并理解这些配置在客户端与 traffic-manager 内部的真实作用机制。
Telepresence 用于在本地对远端 Kubernetes 或 OpenShift 集群做开发调试。当集群规模变大——例如命名空间数以百计、Pod 数量数以万计——默认的“全量接管”策略会产生可感知的延迟与 API server 压力。本文以 docs/howtos/large-clusters.md 为主线,结合仓库中的 Helm chart、客户端源码与命令文档,给出逐步收敛作用域、降低开销的完整方案。
大规模命名空间:DNS 顶层域(TLD)扫描的开销
问题根源:每个命名空间都要做可达性检查
当telepresence connect建立连接时,客户端会把集群中的每个命名空间配置成本地 DNS 解析器的一个顶层域(Top-Level Domain, TLD)。也就是说,如果集群里存在命名空间example,那么本地对my_service.example这类名字的解析请求都会被交给 Telepresence 的 DNS 服务器处理——因为该 DNS 服务器已经声明了自己负责example这个域。
为了保持克制,Telepresence 不会无条件地为所有命名空间创建 TLD,而是先检查当前用户是否能够访问该命名空间。这个检查在命名空间数量庞大的集群中会成为明显的瓶颈:单次检查通常需要约 1 秒,那么在包含 120 个命名空间的集群中,telepresence connect可能需要等待长达2 分钟才能完成。这对开发体验是难以接受的。
从源码结构看,这个“为每个命名空间建立 TLD 并做可达性检查”的行为发生在客户端与 traffic-manager 建立连接、建立 DNS 映射的过程中(参见 pkg/client/cli/daemon/request.go 中连接参数的组装,以及 pkg/client/config.go 中mappedNamespaces配置字段的解析)。每个被纳入映射的命名空间都会进入 DNS 解析器与 NAT 的考虑范围。
解决方案一:连接时用--mapped-namespaces收敛范围
telepresence connect支持一个专门用于限制 TLD 创建范围的参数:
telepresence connect --mapped-namespaces <逗号分隔的命名空间列表>例如,只关心default与backend两个命名空间时:
telepresence connect --mapped-namespaces default,backend--mapped-namespaces接受逗号分隔的字符串列表(strings类型),其语义在命令文档中有明确说明:它是DNS 解析器与出站连接 NAT 所考虑的命名空间集合,默认值为全部命名空间(见 docs/reference/cli/telepresence_connect.md)。
启用该参数后:
- 连接耗时大幅缩短:不再需要对集群中每个命名空间逐一做可达性检查,TLD 只针对列表内命名的命名空间创建;
- DNS 解析器性能提升:解析器只需维护少量 TLD,查询的匹配范围更小、缓存更有效;
- 出站路由更收敛:NAT 与路由规则只关心所列出命名空间内的服务,避免大集群中产生过多规则。
需要说明的是,--mapped-namespaces只是客户端侧的视图限制:它不影响 traffic-manager 自身的权限范围,也不影响其他用户或进程对集群其他命名空间的访问。它解决的是“这个客户端用户此刻只需要一小部分命名空间”的场景。
方案一补充:通过config.yml设置默认映射
除了命令行参数,映射命名空间的默认值还可以写进客户端的配置文件config.yml,字段为client.cluster.mappedNamespaces:
client: cluster: mappedNamespaces: - default - backend该字段的默认值为[](空列表,表示默认全部命名空间),完整说明见 docs/reference/config.md。从 pkg/client/cli/setup/input.go 的实现来看,配置中的mappedNamespaces会被“固定(pin)”为客户端连接时的默认值,而命令行--mapped-namespaces标志的优先级更高,可以覆盖配置默认值。
方案二:从源头限制 traffic-manager 的管理范围
客户端侧的收敛只是“视角”收敛。如果希望从根源上让 traffic-manager 只关心一部分命名空间(无论是为了性能还是权限隔离),可以在安装或升级 traffic-manager 时通过 Helm chart 的namespaces或namespaceSelector值来限定其管理范围。
chart 中这两个值的处理逻辑位于 charts/telepresence-oss/templates/_helpers.tpl:
namespaces是一个命名空间名称列表,例如:namespaces: - dev - staging它会被转换成
matchExpressions中的kubernetes.io/metadata.name In [dev, staging]选择器;namespaceSelector是标准的 Kubernetes label selector(matchLabels/matchExpressions),用于按标签动态选择命名空间,例如:namespaceSelector: matchLabels: team: platformnamespaces与namespaceSelector互斥:chart 模板会直接fail(渲染报错),如果两者同时设置,错误信息为namespaces and namespaceSelector are mutually exclusive(见 charts/telepresence-oss/templates/_helpers.tpl)。
一个设置了命名空间范围的 traffic-manager,会给所有连接到它的客户端隐含地设置一个mapped-namespaces集合:客户端连上它之后,自动只能看到并访问被该 manager 管理的命名空间。因此,“在 manager 侧限定范围”可以同时带来三方面收益:
- manager 只需对限定的命名空间维护 watcher 与状态,降低自身负载;
- 客户端无需显式传
--mapped-namespaces,连接耗时与 DNS 规模自动收敛; - 实现权限最小化:manager 的 RBAC 可以只授予被管理命名空间(静态选择器场景下仅需
Role/RoleBinding而非ClusterRole)。
关于该值如何被注入 traffic-manager 的配置,可参见 charts/telepresence-oss/templates/trafficManager-configmap.yaml:chart 会把解析出的namespace-selector.yaml写入 manager 的 ConfigMap。
静态选择器与动态选择器
selector 可分为**静态(static)与动态(dynamic)**两类,这决定了 manager 的 RBAC 形态(详细规则见 docs/install/manager.md):
- 静态选择器:恰好包含一个
matchLabels或matchExpression元素,且该元素的key必须是kubernetes.io/metadata.name、operator必须是In、values非空。典型的静态形式就是namespaces: [dev, staging]。静态选择器允许 chart 为每个被选命名空间渲染Role/RoleBinding,实现最小权限部署; - 动态选择器:其余形式(例如按
matchLabels选择或带多个表达式)。动态选择器要求 cluster-wide 的命名空间访问权限,因此需要ClusterRole/ClusterRoleBinding。
模板中还包含一个细节:当选择器为动态形式时,chart 会自动追加一条kubernetes.io/metadata.name NotIn [kube-system, kube-node-lease]表达式,确保系统命名空间永远不会被动态选择器纳入管理范围(见 charts/telepresence-oss/templates/_helpers.tpl)。
安装示例
创建values.yaml:
namespaces: - dev - staging安装到staging命名空间(即把 manager 本身部署在staging命名空间中):
telepresence helm install --namespace staging -f ./values.yaml或直接通过--set传递:
telepresence helm install --namespace dev --set 'namespaces={dev,staging}'命名空间冲突检测
chart 内置了命名空间碰撞检测机制,防止多个 traffic-manager 之间的管理范围重叠:安装时,chart 会把当前 selector 应用到集群全部命名空间,计算出管理集合,再与其他已存在的 traffic-manager ConfigMap 所声明的集合做比对,一旦发现重叠立即报错。例如:
# 第一次安装:管理 dev、staging telepresence helm install --namespace dev --set 'namespaces={dev,staging}' # 第二次安装:试图管理 staging、prod —— 会失败 telepresence helm install --namespace prod --set 'namespaces={staging,prod}'第二次安装会得到如下错误:
telepresence helm install: error: execution error at (telepresence-oss/templates/agentInjectorWebhook.yaml:61:14): traffic-manager in namespace dev already manages namespace staging修复方式是消除重叠:要么从第一个安装中移除staging,要么从第二个安装中移除staging。
多 traffic-manager 的命名空间切分
与上面的冲突检测配套,Telepresence 支持在一个集群中安装任意数量的 traffic-manager,只要每个 manager 管理的是互不重叠的唯一命名空间集合(该机制同样在 docs/install/manager.md 中有详细说明)。这种部署模式适用于:
- 按环境切分:
dev、staging、prod各自一套 manager; - 按团队/租户切分:不同团队只在自己的命名空间内拥有 manager;
- 权限最小化:静态选择器 + 命名空间级 RBAC,避免任何一方拥有 cluster-wide 权限。
客户端连接到某个 manager 后,其可访问的命名空间会自动被限制为该 manager 的管理范围。因此,多 manager 架构在提升隔离性的同时,也天然实现了本文第一部分描述的“大命名空间集群”收敛效果。
大规模 Pod:Pod 子网计算的 API 压力
问题根源:nodePodCIDRs 失效时的全量 Pod 扫描
traffic-manager 需要知道集群的Pod 子网(pod-subnets),用于在客户端侧配置路由与 NAT。其默认策略(auto)是优先从集群节点(Node)的podCIDR/podCIDRs字段提取子网。但在以下两类场景中,默认策略会失效并触发回退逻辑:
- RBAC 权限不足:manager 的 ServiceAccount 没有权限读取 Node 的
podCIDR字段; - Node 未定义
podCIDR:许多集群(尤其是部分云厂商托管的集群、自定义网络插件部署的集群)的 Node 对象上根本没有podCIDR。
回退方法(coverPodIPs)是:遍历所有 Pod,读取每个 Pod 的podIP/podIPs,再计算出一组能够覆盖这些 IP 的 CIDR。在 Pod 数量极大的集群中,这意味着对 Kubernetes API server 发起海量请求(每个 Pod 一次乃至多次 LIST/GET),既拖慢 manager 启动,也给 API server 带来明显压力。
对应实现可以参看 Helm chart 对这两个策略的描述(charts/telepresence-oss/values.yaml):
nodePodCIDRs:从 Node Spec 的podCIDR与podCIDRs字段提取 CIDR;coverPodIPs:从 Pod Status 的podIP与podIPs字段提取 IP,并计算覆盖这些 IP 所需的 CIDR;environment:直接使用POD_CIDRS环境变量中空格分隔的 CIDR 列表;auto:先尝试nodePodCIDRs,失败后回退到coverPodIPs(默认值)。
解决方案:手动指定podCIDRs
如果问题是权限不足,那么先补 RBAC 权限可能就够了。但如果集群 Node 本身就没有podCIDR定义,那么更彻底的做法是手动声明已知的 Pod CIDR,从而跳过“扫描 + 计算”的全量流程。通过 Helm chart 值设置如下:
podCIDRStrategy: environment podCIDRs: - <已知的 podCIDR,例如 10.244.0.0/16>注意:一个集群可能包含多个 Pod 子网(例如跨可用区部署时),此时应全部列出:
podCIDRStrategy: environment podCIDRs: - 10.244.0.0/16 - 10.245.0.0/16从 charts/telepresence-oss/templates/statefulset.yaml 可以看出这两个值的落地方式:chart 将podCIDRStrategy写入POD_CIDR_STRATEGY环境变量,将podCIDRs列表以空格连接后写入POD_CIDRS环境变量。也就是说,environment策略会原样使用POD_CIDRS环境变量中的 CIDR 列表,不再触碰 Node 或 Pod 资源——这正是避免大规模集群下 API server 压力的关键。
采用podCIDRStrategy: environment后的效果:
- 零 Pod 扫描:manager 启动时不再 LIST 全部 Pod 或读取全部 Node 的 podCIDR;
- 路由确定性:手动声明的 CIDR 与集群实际 Pod 网段完全一致,路由与 NAT 规则更可预期;
- 启动更快、更稳:不再受集群规模与 API server 响应速度影响。
需要提醒的是,手动指定的 CIDR 必须与实际 Pod 网段一致,否则会导致出站路由无法正确匹配到目标 Pod。
配套调优项:namespace 级 watcher 阈值
针对“命名空间多”场景,Helm chart 还提供一个与 watcher 相关的调优参数(charts/telepresence-oss/values.yaml):
# maxNamespaceSpecificWatchers 配置 traffic-manager 从"为每个被管理命名空间各维护一套 watcher" # 切换到"使用 cluster-wide watcher"的阈值。该阈值仅在使用了 namespaceSelector, # 且 traffic-manager 被允许列出集群全部命名空间时生效。 maxNamespaceSpecificWatchers: 10含义:当使用动态namespaceSelector、被管理的命名空间数量超过该阈值时,manager 会放弃“每个命名空间一套 watcher”的方式,改用 cluster-wide 的 watcher 集合,从而避免在命名空间数量很大时 watcher 数量失控。该参数默认值为10,可按实际规模适当调整。
综合配置示例
将以上所有方案整合成一份values.yaml,用于安装一个管理dev、staging两个命名空间、手动指定 Pod CIDR、并在命名空间数超过阈值时切换 cluster-wide watcher 的 traffic-manager:
# 1. 限定命名空间管理范围(隐式成为客户端的 mapped-namespaces) namespaces: - dev - staging # 2. 手动指定 Pod 子网,跳过 Pod 扫描 podCIDRStrategy: environment podCIDRs: - 10.244.0.0/16 - 10.245.0.0/16 # 3. 命名空间 watcher 阈值 maxNamespaceSpecificWatchers: 10安装命令:
telepresence helm install --namespace staging -f ./values.yaml安装完成后,客户端只需要执行普通的telepresence connect,即可自动获得仅限dev、staging的 DNS 映射与路由范围;同时 manager 因为不再扫描 Pod,在拥有上万 Pod 的集群中也能快速就绪。
适用前提与限制
- 以上所有配置均以当前仓库(Telepresence OSS)的实现为准;不同版本间的默认值与参数名可能变化,升级前请核对对应版本的 values.yaml 与 install/manager.md;
--mapped-namespaces只影响客户端自身的 DNS/NAT 视图,不改变 RBAC 权限;namespaces与namespaceSelector互斥,且动态选择器需要 cluster-wide RBAC;- 多 traffic-manager 共存时,各 manager 的命名空间集合必须互不重叠,否则 chart 安装会直接报错;
- 手动指定
podCIDRs时必须与实际 Pod 网段一致,错误声明会导致出站路由不可用; - 若要进一步了解静态选择器下的用户 RBAC 收敛方式(
clientRbac.create、subjects、namespaces),以及 manager 的完整安装/升级流程,可继续阅读 docs/install/manager.md 与 docs/reference/rbac.md。
- 云原生
- 开发工具
- 微服务
- 网络
【免费下载链接】telepresence
Local development against a remote Kubernetes or OpenShift cluster
相关推荐
CANN/ops-math AddMatMatElements算子
AddMatMatElements 产品支持情况 | 产品 | 是否支持 | | : | : : | | <term Ascend 950PR/Ascend 9
算子库人工智能CANNKubernetes 命名空间 Pod 配额配置指南
Kubernetes 命名空间 Pod 配额配置指南 引言:多租户环境下的资源隔离挑战 在现代云原生环境中,多个团队或项目共享同一个Kubernetes集群已成
文档教程云原生ROB101教材深度解析:计算线性代数的关键概念与应用
ROB101教材深度解析:计算线性代数的关键概念与应用 ROB101作为机器人学入门核心课程,其计算线性代数教材为学生提供了坚实的理论基础与实践指导。本文将系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考