mcp-over-xds

在今年五月份社区已经添加了 MCP-OVER-XDS的实现 ,在当前的master代码中已经 移除了mcp 协议 的实现代码,将全部转换为MCP-OVER-XDS实现,也就意味着istio 1.9将不再支持原有MCP协议,具体参考 XDS-OVER-MCP设计

initConfigSources

当我们配置的ConfigSource为XDS类型时,将创建XDS client,用于发起请求

// 初始化一个ads client
xdsMCP, err := adsc.New(srcAddress.Host, &adsc.Config{
    Meta: model.NodeMetadata{
        Generator: "api",
    }.ToStruct(),
    InitialDiscoveryRequests: adsc.ConfigInitialRequests(),
})
if err != nil {
    return fmt.Errorf("failed to dial XDS %s %v", configSource.Address, err)
}
// 初始化一个configstore
store := memory.Make(collections.Pilot)
// 初始化config controller
configController := memory.NewController(store)
// 初始化istio config stroe
xdsMCP.Store = model.MakeIstioStore(configController)
// 运行
err = xdsMCP.Run()
if err != nil {
    return fmt.Errorf("MCP: failed running %v", err)
}
s.ConfigStores = append(s.ConfigStores, configController)
log.Warn("Started XDS config ", s.ConfigStores)

InitialDiscoveryRequests 用于进行建联后的初始请求,代表着istio所需要关注的资源,

Pilot 涉及的所有资源

ads run

ads run主要进行发送初始发现请求,然后接收返回的数据

handleMCP

因为adsc是一个通用的ads客户端,我们不需要关注其它的逻辑主要关注handleMCP

获取请求的gvk

判断cache内是否有对应的对象,有则更新,无则创建

当envoy连接时,将从configstore 获取配置列表下发到客户端,当连接后,对于Create或者update类型触发对应的handler,对应的为confighandler来进行push

MCP-OVER-XDS简单示例

部署istio

istioctl manifest generate --set profile=demo > demo.yaml 修改 istio.istio-system configmap添加以下内容

添加xds configsource

部署istio

实现ads server

对于原生的envoy-control-plane,使用xds.newserver,利用snapshotcache来实现ads server的方式在istio中不适用,因为envoy-control-plane只能管理原生envoy的xds资源,而mcp-over-xds涉及到istio的crd资源

对于一个adsserver 来说需要实现AggregatedDiscoveryServiceServer接口

pushall主要了推送对应数据的逻辑,istio会根据TypeUrl进行反解析

这里我们统一为客户端也就是istio推送一个PeerAuthentication策略

检查

  • 查看配置是否生效

    我们访问istiod的debug接口可以看到已经收到了对应的策略

  • 访问服务

部署测试实例

访问服务已经无法正常的访问

Last updated

Was this helpful?