kube-router是一个挺有想法的项目,兼备了calico和kube-proxy的功能。
这里分析的kube-router版本是v0.0.9。
kube-router developer guild很详细的介绍了编译的过程。
使用ipvs,将访问service的流量分发给pod。
使用iptables、ipset实现network policy。
使用gobgp实现pod的网络。
kube-router architecture中介绍了kube-router的设计,很简洁的架构。
kube-router的源码很简洁,启动之后,首先创建wathcer:
func (kr *KubeRouter) Run() error {
...
err = kr.startApiWatchers()
在startApiWatchers
中,会启动pod、endpoint、networkpolicy、namespace、service、node六个wather。
这六个wathcer将监听的变化发送到`Broadcaster
func NewBroadcaster() *Broadcaster {
return &Broadcaster{}
}
func (b *Broadcaster) Add(listener Listener) {
b.listenerLock.Lock()
defer b.listenerLock.Unlock()
b.listeners = append(b.listeners, listener)
}
func (b *Broadcaster) Notify(instance interface{}) {
b.listenerLock.RLock()
listeners := b.listeners
b.listenerLock.RUnlock()
for _, listener := range listeners {
go listener.OnUpdate(instance)
}
}
之后创建三个controller:NetworkPolicyController、NetworkRoutingController、NetworkServicesControllers。 每个controller会监听所关心的资源的变化。
func NewNetworkServicesController(clientset *kubernetes.Clientset,\
config *options.KubeRouterConfig) (*NetworkServicesController, error) {
...
nsc := NetworkServicesController{}
...
watchers.EndpointsWatcher.RegisterHandler(&nsc)
watchers.ServiceWatcher.RegisterHandler(&nsc)
...