跳到主要内容

架构

本节将对关键组件、数据结构以及组件间的关系进行解释。

architecture

关键组件

Provider

云提供商的抽象,负责探测集群的网络类型,以及创建Network

Network

云提供商特定的网络。Network中应当对诊断过程中需要的所有资源进行配置,包括PluginDiagnostorInfraShim等。

Diagnostor

诊断算法的实现。该算法会在通过在源NetNode上执行Send动作,获得初始的链路信息。随后,将会在随后生成出的NetNode上执行Receive动作,不断产生新的链路和节点,直到整张链路图被构造完成。

Plugin

网络插件(flannel、calico等)。负责从网络配置中创建出实际的NetNode,作为NetNodeAction返回。

NetNodeManager

创建并缓存NetNodeAction。通过CollectorManager采集Kubernetes pod/node网络栈信息后,通过Plugin创建出NetNodeAction

CollectorManager

管理Kubernetes pod/nodes网络栈信息的采集任务。

IPCache

缓存被诊断过程使用的主要Kubernetes对象,防止对API Server的冗余访问。

NetNodeAction

代表NetNode上的网络动作的接口。任何NetNode都应当实现该接口。

InfraShim

对基础设施提供的资源的断言。该部分应当根据不同的云提供商实现。

service.Processor

代表处理Service的组件(如kube-proxy)。它获得service的后端端点,并且根据网络栈信息来检查它们是否配置正确。

(包)assertions

用于诊断中的断言。包括NetstackAssertionKubernetesAssertion

(包)netstack

与Linux网络栈相关的组件和实用工具。包括RouterNetfilterIPTables等。

关键数据结构

Context

type Context struct {
Ctx *sync.Map
}

Context 用于存储运行时配置。除此之外,它同时负责为各个模块绑定其所需的命令行参数,以及提供模块注册用的接口。

Endpoint

type Endpoint struct {
IP string
Type EndpointType
Port uint16
}

网络层面的端点,包括IPPort、和Type

Packet

type Packet struct {
Src net.IP
Sport uint16
Dst net.IP
Dport uint16
Protocol Protocol
Encap *Packet
Mark uint32
}

一个数据包。

  • Encap: 如果是一个被封装过的数据包(比如IPIP数据包),被封装的真实数据包储存于该字段。

  • Mark: 用于路由以及iptables模拟。

NetNode

type NetNode struct {
Type NetNodeType
ID string
Actions map[*Link]*Action
Suspicions []Suspicion
initiative *Action
}

网络链路图中的节点。它可以是Kubernets中的PodNode,也可以是云上的网络资源等。NetNode实现了NetNodeAction接口来处理网络流量,以及Assertion接口用来在节点上储存断言信息。

Transmission

type Transmission struct {
NextHop Hop
Link *Link
}

NetNodeSend()或者Receive()动作创建出的一次传输请求。其中包括指向下一个NetNodeNetHop,以及描述了本次传输信息的Link

Hop

type Hop struct {
Type NetNodeType
ID string
}

某一跳的信息,用于定位到某个NetNode

type Link struct {
Type LinkType
Source NetNodeAction
Destination NetNodeAction
Packet *Packet
SourceAttribute LinkAttribute
DestinationAttribute LinkAttribute

Level int // for print
}

type LinkAttribute interface {
GetAttrs() map[string]string
}

两个节点之间的传输链路。

  • Type: 包括 external, vpc, veth, ipvlan, local等。

  • SourceAttribute&DestinationAttribute: 在源节点和目的节点上,用于描述该条链路信息的键值对。

k8s.Pod

type PodMeta struct {
Namespace string
PodName string
NodeName string
HostNetwork bool
}

type Pod struct {
model.NetNode
netstack.NetNS
PodMeta
}

Kubernetes上的Pod信息。包括Pod的元数据和网络栈数据。

k8s.NodeInfo

type NodeInfo struct {
netstack.NetNS
SubNetNSInfo []netstack.NetNSInfo
NodeMeta
}

type NodeNetworkStackDump struct {
Pods []PodNetInfo `json:"pods"`
Netns []netstack.NetNSInfo `json:"netns"`
}

type NodeMeta struct {
NodeName string
}

Kubernetes上的Node信息。包括Node的元数据,Node和Node上Pod的网络栈数据。

Suspicion

type Suspicion struct {
Level SuspicionLevel
Message string
}

NetNode上出现的问题。

  • Level: 问题的严重程度。包括InfoWarningCriticalFatal

  • Message: 问题描述。