奥飞火千万电 发表于 2018-1-6 08:53:42

weave-npc 介绍(适配k8s v1.6)

func root(cmd *cobra.Command, args []string) {  
common.SetLogLevel(logLevel)
  
//用于标识主机,产生本地的规则
  
if nodeName == "" {
  
// HOSTNAME is set by Kubernetes for pods in the host network namespace
  
nodeName = os.Getenv("HOSTNAME")
  
}
  
if nodeName == "" {
  
common.Log.Fatalf("Must set node name via --node-name or $HOSTNAME")
  
}
  
common.Log.Infof("Starting Weaveworks NPC %s; node name %q", version, nodeName)
  

  

  
if err := metrics.Start(metricsAddr); err != nil {
  
common.Log.Fatalf("Failed to start metrics: %v", err)
  
}
  

  
if err := ulogd.Start(); err != nil {
  
common.Log.Fatalf("Failed to start ulogd: %v", err)
  
}
  

  
config, err := rest.InClusterConfig()
  
handleError(err)
  

  
client, err := kubernetes.NewForConfig(config)
  
handleError(err)
  
// 创建iptables 对象,用于管理iptables规则及生效
  
ipt, err := iptables.New()
  
handleError(err)
  
// 创建ipeset对象,用于管理ipset资源
  
ips := ipset.New(common.LogLogger())
  
// resetIPTables在filter表添加WEAVE-NPC-INGRESS链、WEAVE-NPC-DEFAULT链、
  
// WEAVE-NPC链,若已经存在则置空(FLUSH)
  
handleError(resetIPTables(ipt))
  
// resetIPSets 将weave-npc创建的ipset,即名字为”weave-“开头的ipset的成员删除
  
handleError(resetIPSets(ips))
  
// createBaseRules初始化iptables规则
  
// weave-npc链中添加iptables规则

  
// -A WEAVE-NPC -m state --state>  
// -A WEAVE-NPC -d 224.0.0.0/4 -j ACCEPT
  
// -A WEAVE-NPC -m state --state NEW -j WEAVE-NPC-DEFAULT
  
// -A WEAVE-NPC -m state --state NEW -j WEAVE-NPC-INGRESS
  
// -A WEAVE-NPC -m set ! --match-set weave-local-pods dst -j ACCEPT
  
handleError(createBaseRules(ipt, ips))
  

  
npc := npc.New(nodeName, ipt, ips)
  
// 下面起了三个controller,利用client-go的informer来分别负责namespaces、pods和
  
// networkpolicies的创改删处理
  
nsController := makeController(client.Core().RESTClient(), "namespaces", &coreapi.Namespace{},
  
cache.ResourceEventHandlerFuncs{
  
AddFunc: func(obj interface{}) {
  
handleError(npc.AddNamespace(obj.(*coreapi.Namespace)))
  
},
  
DeleteFunc: func(obj interface{}) {
  
switch obj := obj.(type) {
  
case *coreapi.Namespace:
  
handleError(npc.DeleteNamespace(obj))
  
case cache.DeletedFinalStateUnknown:
  
// We know this object has gone away, but its final state is no longer
  
// available from the API server. Instead we use the last copy of it
  
// that we have, which is good enough for our cleanup.
  
handleError(npc.DeleteNamespace(obj.Obj.(*coreapi.Namespace)))
  
}
  
},
  
UpdateFunc: func(old, new interface{}) {
  
handleError(npc.UpdateNamespace(old.(*coreapi.Namespace), new.(*coreapi.Namespace)))
  
}})
  

  
podController := makeController(client.Core().RESTClient(), "pods", &coreapi.Pod{},
  
cache.ResourceEventHandlerFuncs{
  
AddFunc: func(obj interface{}) {
  
handleError(npc.AddPod(obj.(*coreapi.Pod)))
  
},
  
DeleteFunc: func(obj interface{}) {
  
switch obj := obj.(type) {
  
case *coreapi.Pod:
  
handleError(npc.DeletePod(obj))
  
case cache.DeletedFinalStateUnknown:
  
// We know this object has gone away, but its final state is no longer
  
// available from the API server. Instead we use the last copy of it
  
// that we have, which is good enough for our cleanup.
  
handleError(npc.DeletePod(obj.Obj.(*coreapi.Pod)))
  
}
  
},
  
UpdateFunc: func(old, new interface{}) {
  
handleError(npc.UpdatePod(old.(*coreapi.Pod), new.(*coreapi.Pod)))
  
}})
  

  
npController := makeController(client.Extensions().RESTClient(), "networkpolicies", &extnapi.NetworkPolicy{},
  
cache.ResourceEventHandlerFuncs{
  
AddFunc: func(obj interface{}) {
  
handleError(npc.AddNetworkPolicy(obj.(*extnapi.NetworkPolicy)))
  
},
  
DeleteFunc: func(obj interface{}) {
  
switch obj := obj.(type) {
  
case *extnapi.NetworkPolicy:
  
handleError(npc.DeleteNetworkPolicy(obj))
  
case cache.DeletedFinalStateUnknown:
  
// We know this object has gone away, but its final state is no longer
  
// available from the API server. Instead we use the last copy of it
  
// that we have, which is good enough for our cleanup.
  
handleError(npc.DeleteNetworkPolicy(obj.Obj.(*extnapi.NetworkPolicy)))
  
}
  
},
  
UpdateFunc: func(old, new interface{}) {
  
handleError(npc.UpdateNetworkPolicy(old.(*extnapi.NetworkPolicy), new.(*extnapi.NetworkPolicy)))
  
}})
  

  
go nsController.Run(wait.NeverStop)
  
go podController.Run(wait.NeverStop)
  
go npController.Run(wait.NeverStop)
  

  
signals := make(chan os.Signal, 1)
  
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
  
common.Log.Fatalf("Exiting: %v", <-signals)
  
}
  
页: [1]
查看完整版本: weave-npc 介绍(适配k8s v1.6)