fix namespace networkpolicy

add filter on namespace event func
delete the code which do same work with namespace controller

Signed-off-by: Duan Jiong <djduanjiong@gmail.com>
This commit is contained in:
Duan Jiong
2020-05-21 09:39:58 +08:00
parent 0d12529051
commit 7a0b18315f
2 changed files with 41 additions and 35 deletions

View File

@@ -3,6 +3,7 @@ package nsnetworkpolicy
import ( import (
"fmt" "fmt"
"net" "net"
"sort"
"strings" "strings"
"time" "time"
@@ -280,12 +281,10 @@ func (c *NSNetworkPolicyController) generateNodeRule() (netv1.NetworkPolicyIngre
if snatIPs != "" { if snatIPs != "" {
ips = append(ips, strings.Split(snatIPs, ";")...) ips = append(ips, strings.Split(snatIPs, ";")...)
} }
for _, address := range node.Status.Addresses {
ips = append(ips, address.Address)
}
} }
sort.Strings(ips)
for _, ip := range ips { for _, ip := range ips {
cidr, err := stringToCIDR(ip) cidr, err := stringToCIDR(ip)
if err != nil { if err != nil {
@@ -339,15 +338,17 @@ func (c *NSNetworkPolicyController) nsEnqueue(ns *corev1.Namespace) {
return return
} }
klog.V(4).Infof("Enqueue namespace %s", ns.Name) workspaceName := ns.Labels[constants.WorkspaceLabelKey]
if workspaceName == "" {
return
}
c.nsQueue.Add(key) c.nsQueue.Add(key)
} }
func (c *NSNetworkPolicyController) addWorkspace(newObj interface{}) { func (c *NSNetworkPolicyController) addWorkspace(newObj interface{}) {
new := newObj.(*workspacev1alpha1.Workspace) new := newObj.(*workspacev1alpha1.Workspace)
klog.V(4).Infof("Add workspace %s", new.Name)
label := labels.SelectorFromSet(labels.Set{constants.WorkspaceLabelKey: new.Name}) label := labels.SelectorFromSet(labels.Set{constants.WorkspaceLabelKey: new.Name})
nsList, err := c.namespaceInformer.Lister().List(label) nsList, err := c.namespaceInformer.Lister().List(label)
if err != nil { if err != nil {
@@ -360,6 +361,18 @@ func (c *NSNetworkPolicyController) addWorkspace(newObj interface{}) {
} }
} }
func (c *NSNetworkPolicyController) addNode(newObj interface{}) {
nsList, err := c.namespaceInformer.Lister().List(labels.Everything())
if err != nil {
klog.Errorf("Error while list namespace by label")
return
}
for _, ns := range nsList {
c.nsEnqueue(ns)
}
}
func (c *NSNetworkPolicyController) addNamespace(obj interface{}) { func (c *NSNetworkPolicyController) addNamespace(obj interface{}) {
ns := obj.(*corev1.Namespace) ns := obj.(*corev1.Namespace)
@@ -368,8 +381,6 @@ func (c *NSNetworkPolicyController) addNamespace(obj interface{}) {
return return
} }
klog.V(4).Infof("Add namespace %s", ns.Name)
c.nsEnqueue(ns) c.nsEnqueue(ns)
} }
@@ -381,17 +392,7 @@ func isNetworkIsolateEnabled(ns *corev1.Namespace) bool {
return false return false
} }
func hadNamespaceLabel(ns *corev1.Namespace) bool {
if ns.Annotations[constants.NamespaceLabelKey] == ns.Name {
return true
}
return false
}
func (c *NSNetworkPolicyController) syncNs(key string) error { func (c *NSNetworkPolicyController) syncNs(key string) error {
klog.V(4).Infof("Sync namespace %s", key)
_, name, err := cache.SplitMetaNamespaceKey(key) _, name, err := cache.SplitMetaNamespaceKey(key)
if err != nil { if err != nil {
klog.Errorf("Not a valid controller key %s, %#v", key, err) klog.Errorf("Not a valid controller key %s, %#v", key, err)
@@ -411,9 +412,9 @@ func (c *NSNetworkPolicyController) syncNs(key string) error {
workspaceName := ns.Labels[constants.WorkspaceLabelKey] workspaceName := ns.Labels[constants.WorkspaceLabelKey]
if workspaceName == "" { if workspaceName == "" {
klog.Error("Workspace name should not be empty")
return nil return nil
} }
wksp, err := c.workspaceInformer.Lister().Get(workspaceName) wksp, err := c.workspaceInformer.Lister().Get(workspaceName)
if err != nil { if err != nil {
//Should not be here //Should not be here
@@ -425,16 +426,6 @@ func (c *NSNetworkPolicyController) syncNs(key string) error {
return err return err
} }
//Maybe some ns not labeled
if !hadNamespaceLabel(ns) {
ns.Labels[constants.NamespaceLabelKey] = ns.Name
_, err := c.client.CoreV1().Namespaces().Update(ns)
if err != nil {
//Just log, label can also be added by namespace controller
klog.Errorf("cannot label namespace %s", ns.Name)
}
}
matchWorkspace := false matchWorkspace := false
delete := false delete := false
nsnpList, _ := c.informer.Lister().NamespaceNetworkPolicies(ns.Name).List(labels.Everything()) nsnpList, _ := c.informer.Lister().NamespaceNetworkPolicies(ns.Name).List(labels.Everything())
@@ -611,7 +602,7 @@ func NewNSNetworkPolicyController(
AddFunc: controller.addWorkspace, AddFunc: controller.addWorkspace,
UpdateFunc: func(oldObj, newObj interface{}) { UpdateFunc: func(oldObj, newObj interface{}) {
old := oldObj.(*workspacev1alpha1.Workspace) old := oldObj.(*workspacev1alpha1.Workspace)
new := oldObj.(*workspacev1alpha1.Workspace) new := newObj.(*workspacev1alpha1.Workspace)
if old.Spec.NetworkIsolation == new.Spec.NetworkIsolation { if old.Spec.NetworkIsolation == new.Spec.NetworkIsolation {
return return
} }
@@ -619,12 +610,29 @@ func NewNSNetworkPolicyController(
}, },
}) })
namespaceInformer.Informer().AddEventHandlerWithResyncPeriod(cache.ResourceEventHandlerFuncs{ nodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.addNode,
UpdateFunc: func(oldObj, newObj interface{}) {
old := oldObj.(*corev1.Node)
new := newObj.(*corev1.Node)
if old.Annotations[NodeNSNPAnnotationKey] == new.Annotations[NodeNSNPAnnotationKey] {
return
}
controller.addNode(newObj)
},
})
namespaceInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: controller.addNamespace, AddFunc: controller.addNamespace,
UpdateFunc: func(oldObj interface{}, newObj interface{}) { UpdateFunc: func(oldObj interface{}, newObj interface{}) {
old := oldObj.(*corev1.Namespace)
new := newObj.(*corev1.Namespace)
if old.Annotations[NamespaceNPAnnotationKey] == new.Annotations[NamespaceNPAnnotationKey] {
return
}
controller.addNamespace(newObj) controller.addNamespace(newObj)
}, },
}, defaultSleepDuration) })
nsnpInformer.Informer().AddEventHandlerWithResyncPeriod(cache.ResourceEventHandlerFuncs{ nsnpInformer.Informer().AddEventHandlerWithResyncPeriod(cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) { AddFunc: func(obj interface{}) {

View File

@@ -50,7 +50,6 @@ func (c *k8sPolicyController) Start(stopCh <-chan struct{}) {
} }
func (c *k8sPolicyController) Set(np *netv1.NetworkPolicy) error { func (c *k8sPolicyController) Set(np *netv1.NetworkPolicy) error {
klog.V(4).Infof("Set NetworkPolicy %s/%s %+v", np.Namespace, np.Name, np)
// Add to cache. // Add to cache.
k := c.GetKey(np.Name, np.Namespace) k := c.GetKey(np.Name, np.Namespace)
c.resourceCache.Set(k, *np) c.resourceCache.Set(k, *np)
@@ -59,7 +58,6 @@ func (c *k8sPolicyController) Set(np *netv1.NetworkPolicy) error {
} }
func (c *k8sPolicyController) Delete(key string) { func (c *k8sPolicyController) Delete(key string) {
klog.V(4).Infof("Delete NetworkPolicy %s", key)
c.resourceCache.Delete(key) c.resourceCache.Delete(key)
} }