当前位置: 代码迷 >> 综合 >> Linkerd2 proxy destination 学习笔记
  详细解决方案

Linkerd2 proxy destination 学习笔记

热度:60   发布时间:2023-12-18 18:26:28.0

作者: 哗啦啦 mesh团队,热衷于kubernetes、devops、apollo、istio、linkerd、openstack、calico 等领域技术。

linkerd2介绍

Linkerd由控制平面数据平面组成:

  • 控制平面是在所属的Kubernetes命名空间(linkerd默认情况下)中运行的一组服务,这些服务可以完成汇聚遥测数据,提供面向用户的API,并向数据平面代理提供控制数据等,它们共同驱动数据平面。
  • 数据平面用Rust编写的轻量级代理,该代理安装在服务的每个pod中,并成为数据平面的一部分,它接收Pod的所有接入流量,并通过initContainer配置iptables正确转发流量的拦截所有传出流量,因为它是附加工具,并且拦截服务的所有传入和传出流量,所以不需要更改代码,甚至可以将其添加到正在运行的服务中。

借用官方的图:

proxy-destination

proxy由rust开发完成,其内部的异步运行时采用了Tokio框架,服务组件用到了tower。

本文主要关注proxy与destination组件交互相关的整体逻辑,分析proxy内部的运行逻辑。

流程分析

初始化

proxy启动后:

  1. app::init初始化配置
  2. app::Main::new创建主逻辑main
  3. main.run_until内新加一任务 ProxyParts::build_proxy_task

ProxyParts::build_proxy_task中会进行一系列的初始化工作,此处只关注dst_svc,其创建代码为:

    dst_svc = svc::stack(connect::svc(keepalive)).push(tls::client::layer(local_identity.clone())).push_timeout(config.control_connect_timeout).push(control::client::layer()).push(control::resolve::layer(dns_resolver.clone())).push(reconnect::layer({let backoff = config.control_backoff.clone();move |_| Ok(backoff.stream())})).push(http_metrics::layer::<_, classify::Response>(ctl_http_metrics.clone(),)).push(proxy::grpc::req_body_as_payload::layer().per_make()).push(control::add_origin::layer()).push_buffer_pending(config.destination_buffer_capacity,config.control_dispatch_timeout,).into_inner().make(config.destination_addr.clone())

dst_svc一共有2处引用,一是crate::resolve::Resolver的创建会涉及;另一个就是ProfilesClient的创建。

Resolver

  1. api_resolve::Resolve::new(dst_svc.clone())创建resolver对象
  2. 调用outbound::resolve创建 map_endpoint::Resolve类型对象,并当做参数resolve传入outbound::spawn函数开启出口线程

outbound::spawn中,resolve被用于创建负载均衡控制层,并用于后续路由控制:

let balancer_layer = svc::layers().push_spawn_ready().push(discover::Layer::new(DISCOVER_UPDATE_BUFFER_CAPACITY,resolve,)).push(balance::layer(EWMA_DEFAULT_RTT, EWMA_DECAY));

discover::Layer::layer中:

let from_resolve = FromResolve::new(self.resolve.clone());
let make_discover = MakeEnd
  相关解决方案