架构
本节将对关键组件、数据结构以及组件间的关系进行解释。
关键组件
Provider
云提供商的抽象,负责探测集群的网络类型,以及创建Network
。
Network
云提供商特定的网络。Network
中应当对诊断过程中需要的所有资源进行配置,包括Plugin
、Diagnostor
、InfraShim
等。
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
用于诊断中的断言。包括NetstackAssertion
和KubernetesAssertion
。
(包)netstack
与Linux网络栈相关的组件和实用工具。包括Router
、Netfilter
、IPTables
等。
关键数据结构
Context
type Context struct {
Ctx *sync.Map
}
Context
用于存储运行时配置。除此之外,它同时负责为各个模块绑定其所需的命令行参数,以及提供模块注册用的接口。
Endpoint
type Endpoint struct {
IP string
Type EndpointType
Port uint16
}
网络层面的端点,包括IP
、Port
、和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中的Pod
或Node
,也可以是云上的网络资源等。NetNode
实现了NetNodeAction
接口来处理网络流量,以及Assertion
接口用来在节点上储存断言信息。
Transmission
type Transmission struct {
NextHop Hop
Link *Link
}
NetNode
上Send()
或者Receive()
动作创建出的一次传输请求。其中包括指向下一个NetNode
的NetHop
,以及描述了本次传输信息的Link
。
Hop
type Hop struct {
Type NetNodeType
ID string
}
某一跳的信息,用于定位到某个NetNode
。
Link
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
: 问题的严重程度。包括Info
、Warning
、Critical
和Fatal
。Message
: 问题描述。