Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
f4b7352
parse selectors to kv based labels
Apr 2, 2019
61acc0b
TestsplitPolicy
Apr 3, 2019
3dbbd36
ParseLabel
Apr 3, 2019
d4ec358
addPolicy
Apr 9, 2019
557c25f
start deductPolicy
Apr 10, 2019
341b0ad
deduct network policy
Apr 24, 2019
4db9122
remvoe redundant print
Apr 24, 2019
77c36fc
Merge branch 'master' into mergePolicies
Apr 24, 2019
217d1a7
TestDeductPolicy
Apr 29, 2019
1dfe4b6
Merge branch 'master' into mergePolicies
Apr 29, 2019
14b8338
translatePolicy
May 1, 2019
36301c4
try build
May 1, 2019
6b81fd6
print policy
May 1, 2019
6f5f827
record newPolicy
May 1, 2019
1b4d2a1
pass in addedPolicy
May 2, 2019
1051448
translateIngress
May 2, 2019
bd509be
comma
May 2, 2019
3d6d7da
fix build err
May 2, 2019
4fed131
fix build err
May 2, 2019
ae390d6
remove
May 2, 2019
44c4f4c
change telemetry to message queue and add npm
Jun 12, 2019
ef51b86
remove [Azure-NPM] prefix
Jun 12, 2019
44e5f07
remove npmreport url
Jun 12, 2019
c647f71
merge with telemetry changes
Jun 14, 2019
7c821ed
fair scheduling
Jun 17, 2019
9045288
holds up to 1k reports for each type
Jun 18, 2019
5aa60e9
fix cap on reports
Jun 18, 2019
d2e9315
Merge branch 'npmTelemetry' into mergePolicies
Jun 18, 2019
7571856
rename const
Jun 20, 2019
5441b4c
handle ingress port rules
Jun 20, 2019
556f1a4
add comma
Jun 20, 2019
5e44b77
rename npNs
Jun 20, 2019
1d71e67
handle ipblock
Jun 20, 2019
2c834f4
going to remvoe nsChain
Jun 27, 2019
5ff7245
update translatePolicy_test.go
Jul 16, 2019
08923af
parse ingress namespaceSelector
Jul 23, 2019
7373f06
TODO: namespaceSelector & podSelector
Jul 24, 2019
3dc765b
rename sets and lists
Jul 30, 2019
609331c
rename iptablesMatchFlag to iptablesModuleFlag
Aug 1, 2019
648bc1c
reduce cases by generalizing operators
Aug 1, 2019
a0ef995
parse entry from selector
Aug 6, 2019
2d0bc2d
finished translateIngress
Aug 7, 2019
5963881
rename ParseSelector to parseSelector
Aug 7, 2019
0a00823
finished translateEgress
Aug 7, 2019
7761057
add prefix "ns-" to namespace ipsets
Aug 8, 2019
954d8a0
consistent hashing of metav1.LabelSelector
Aug 15, 2019
3f3d120
use podSelector as key for processedNpMap
Aug 16, 2019
01abe6d
address Kaleb's comments
Aug 16, 2019
4fd8b8a
consistent prefix to namespace
Aug 16, 2019
4ca90f6
testing
Aug 17, 2019
cf83290
address Kaleb's comment
Aug 19, 2019
0e87a71
handle empty selector
Aug 22, 2019
c75af9d
address empty selectors
Aug 23, 2019
cb4d551
fix ns prefix in translatePolicy_test.go
Aug 26, 2019
fb32b93
remove splitPolicy
Aug 26, 2019
ae24b7a
add drop entries for each targetSelector
Aug 27, 2019
0a36d09
allow external traffic
Aug 28, 2019
1b8dbae
make protocol and port optional
Aug 28, 2019
7fbc4f7
need to fix order of sets and lists gen from sel
Aug 28, 2019
bda22cd
access selector through sorted order
Aug 29, 2019
534767c
normal networkpolicies unit tests done
Aug 29, 2019
17fa5a3
remove extra ns-
Aug 29, 2019
eef1363
finished translatePolicy unit tests
Aug 29, 2019
3e0c0bf
merge with master
Aug 29, 2019
65c6ce6
address jaeryn's comments
Aug 29, 2019
5a3d5cd
add AZURE-NPM-KUBE-SYSTEM chain
Aug 30, 2019
20db12f
use nsName
Aug 30, 2019
d5ea6a3
process rules separately
Aug 30, 2019
ae2ccf3
defer translatePolicy result print
Aug 30, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions npm/ipsm/ipsm.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,10 @@ func (ipsMgr *IpsetManager) DeleteList(listName string) error {

// AddToList inserts an ipset to an ipset list.
func (ipsMgr *IpsetManager) AddToList(listName string, setName string) error {
if listName == setName {
return nil
}

if ipsMgr.Exists(listName, setName, util.IpsetSetListFlag) {
return nil
}
Expand Down
65 changes: 40 additions & 25 deletions npm/iptm/iptm.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ const (
type IptEntry struct {
Command string
Name string
HashedName string
Chain string
Flag string
LockWaitTimeInSeconds string
Expand Down Expand Up @@ -80,9 +79,9 @@ func (iptMgr *IptablesManager) InitNpmChains() error {
// Add default allow CONNECTED/RELATED rule to AZURE-NPM chain.
entry.Chain = util.IptablesAzureChain
entry.Specs = []string{
util.IptablesMatchFlag,
util.IptablesModuleFlag,
util.IptablesStateModuleFlag,
util.IptablesStateFlag,
util.IptablesMatchStateFlag,
util.IptablesRelatedState + "," + util.IptablesEstablishedState,
util.IptablesJumpFlag,
util.IptablesAccept,
Expand All @@ -100,12 +99,38 @@ func (iptMgr *IptablesManager) InitNpmChains() error {
}
}

// Create AZURE-NPM-KUBE-SYSTEM chain.
if err := iptMgr.AddChain(util.IptablesAzureKubeSystemChain); err != nil {
return err
}

// Append AZURE-NPM-KUBE-SYSTEM chain to AZURE-NPM chain.
entry = &IptEntry{
Chain: util.IptablesAzureChain,
Specs: []string{
util.IptablesJumpFlag,
util.IptablesAzureKubeSystemChain,
},
}
exists, err = iptMgr.Exists(entry)
if err != nil {
return err
}

if !exists {
iptMgr.OperationFlag = util.IptablesAppendFlag
if _, err = iptMgr.Run(entry); err != nil {
log.Errorf("Error: failed to add AZURE-NPM-KUBE-SYSTEM chain to AZURE-NPM chain.")
return err
}
}

// Create AZURE-NPM-INGRESS-PORT chain.
if err := iptMgr.AddChain(util.IptablesAzureIngressPortChain); err != nil {
return err
}

// Insert AZURE-NPM-INGRESS-PORT chain to AZURE-NPM chain.
// Append AZURE-NPM-INGRESS-PORT chain to AZURE-NPM chain.
entry.Chain = util.IptablesAzureChain
entry.Specs = []string{util.IptablesJumpFlag, util.IptablesAzureIngressPortChain}
exists, err = iptMgr.Exists(entry)
Expand All @@ -121,13 +146,8 @@ func (iptMgr *IptablesManager) InitNpmChains() error {
}
}

// Create AZURE-NPM-INGRESS-FROM-NS chain.
if err = iptMgr.AddChain(util.IptablesAzureIngressFromNsChain); err != nil {
return err
}

// Create AZURE-NPM-INGRESS-FROM-POD chain.
if err = iptMgr.AddChain(util.IptablesAzureIngressFromPodChain); err != nil {
// Create AZURE-NPM-INGRESS-FROM chain.
if err = iptMgr.AddChain(util.IptablesAzureIngressFromChain); err != nil {
return err
}

Expand All @@ -152,13 +172,8 @@ func (iptMgr *IptablesManager) InitNpmChains() error {
}
}

// Create AZURE-NPM-EGRESS-TO-NS chain.
if err = iptMgr.AddChain(util.IptablesAzureEgressToNsChain); err != nil {
return err
}

// Create AZURE-NPM-EGRESS-TO-POD chain.
if err = iptMgr.AddChain(util.IptablesAzureEgressToPodChain); err != nil {
// Create AZURE-NPM-EGRESS-TO chain.
if err = iptMgr.AddChain(util.IptablesAzureEgressToChain); err != nil {
return err
}

Expand All @@ -167,7 +182,7 @@ func (iptMgr *IptablesManager) InitNpmChains() error {
return err
}

// Insert AZURE-NPM-TARGET-SETS chain to AZURE-NPM chain.
// Append AZURE-NPM-TARGET-SETS chain to AZURE-NPM chain.
entry.Chain = util.IptablesAzureChain
entry.Specs = []string{util.IptablesJumpFlag, util.IptablesAzureTargetSetsChain}
exists, err = iptMgr.Exists(entry)
Expand All @@ -190,12 +205,11 @@ func (iptMgr *IptablesManager) InitNpmChains() error {
func (iptMgr *IptablesManager) UninitNpmChains() error {
IptablesAzureChainList := []string{
util.IptablesAzureChain,
util.IptablesAzureKubeSystemChain,
util.IptablesAzureIngressPortChain,
util.IptablesAzureIngressFromNsChain,
util.IptablesAzureIngressFromPodChain,
util.IptablesAzureIngressFromChain,
util.IptablesAzureEgressPortChain,
util.IptablesAzureEgressToNsChain,
util.IptablesAzureEgressToPodChain,
util.IptablesAzureEgressToChain,
util.IptablesAzureTargetSetsChain,
}

Expand Down Expand Up @@ -282,6 +296,7 @@ func (iptMgr *IptablesManager) DeleteChain(chain string) error {
log.Printf("Chain doesn't exist %s.", entry.Chain)
return nil
}

log.Errorf("Error: failed to delete iptables chain %s.", entry.Chain)
return err
}
Expand All @@ -291,7 +306,7 @@ func (iptMgr *IptablesManager) DeleteChain(chain string) error {

// Add adds a rule in iptables.
func (iptMgr *IptablesManager) Add(entry *IptEntry) error {
log.Printf("Add iptables entry: %+v.", entry)
log.Printf("Adding iptables entry: %+v.", entry)

exists, err := iptMgr.Exists(entry)
if err != nil {
Expand All @@ -302,7 +317,7 @@ func (iptMgr *IptablesManager) Add(entry *IptEntry) error {
return nil
}

iptMgr.OperationFlag = util.IptablesInsertionFlag
iptMgr.OperationFlag = util.IptablesAppendFlag
if _, err := iptMgr.Run(entry); err != nil {
log.Errorf("Error: failed to create iptables rules.")
return err
Expand Down
90 changes: 56 additions & 34 deletions npm/namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,25 @@ import (
)

type namespace struct {
name string
setMap map[string]string
podMap map[types.UID]*corev1.Pod
npMap map[string]*networkingv1.NetworkPolicy
ipsMgr *ipsm.IpsetManager
iptMgr *iptm.IptablesManager
name string
setMap map[string]string
podMap map[types.UID]*corev1.Pod
rawNpMap map[string]*networkingv1.NetworkPolicy
processedNpMap map[string]*networkingv1.NetworkPolicy
ipsMgr *ipsm.IpsetManager
iptMgr *iptm.IptablesManager
}

// newNS constructs a new namespace object.
func newNs(name string) (*namespace, error) {
ns := &namespace{
name: name,
setMap: make(map[string]string),
podMap: make(map[types.UID]*corev1.Pod),
npMap: make(map[string]*networkingv1.NetworkPolicy),
ipsMgr: ipsm.NewIpsetManager(),
iptMgr: iptm.NewIptablesManager(),
name: name,
setMap: make(map[string]string),
podMap: make(map[types.UID]*corev1.Pod),
rawNpMap: make(map[string]*networkingv1.NetworkPolicy),
processedNpMap: make(map[string]*networkingv1.NetworkPolicy),
ipsMgr: ipsm.NewIpsetManager(),
iptMgr: iptm.NewIptablesManager(),
}

return ns, nil
Expand All @@ -40,16 +42,26 @@ func isSystemNs(nsObj *corev1.Namespace) bool {
return nsObj.ObjectMeta.Name == util.KubeSystemFlag
}

func (ns *namespace) policyExists(npObj *networkingv1.NetworkPolicy) bool {
if np, exists := ns.rawNpMap[npObj.ObjectMeta.Name]; exists {
if isSamePolicy(np, npObj) {
return true
}
}

return false
}

// InitAllNsList syncs all-namespace ipset list.
func (npMgr *NetworkPolicyManager) InitAllNsList() error {
allNs := npMgr.nsMap[util.KubeAllNamespacesFlag]
for nsName := range npMgr.nsMap {
if nsName == util.KubeAllNamespacesFlag {
for ns:= range npMgr.nsMap {
if ns == util.KubeAllNamespacesFlag {
continue
}

if err := allNs.ipsMgr.AddToList(util.KubeAllNamespacesFlag, nsName); err != nil {
log.Errorf("Error: failed to add namespace set %s to list %s", nsName, util.KubeAllNamespacesFlag)
if err := allNs.ipsMgr.AddToList(util.KubeAllNamespacesFlag, ns); err != nil {
log.Errorf("Error: failed to add namespace set %s to ipset list %s", ns, util.KubeAllNamespacesFlag)
return err
}
}
Expand All @@ -60,13 +72,13 @@ func (npMgr *NetworkPolicyManager) InitAllNsList() error {
// UninitAllNsList cleans all-namespace ipset list.
func (npMgr *NetworkPolicyManager) UninitAllNsList() error {
allNs := npMgr.nsMap[util.KubeAllNamespacesFlag]
for nsName := range npMgr.nsMap {
if nsName == util.KubeAllNamespacesFlag {
for ns := range npMgr.nsMap {
if ns == util.KubeAllNamespacesFlag {
continue
}

if err := allNs.ipsMgr.DeleteFromList(util.KubeAllNamespacesFlag, nsName); err != nil {
log.Errorf("Error: failed to delete namespace set %s from list %s", nsName, util.KubeAllNamespacesFlag)
if err := allNs.ipsMgr.DeleteFromList(util.KubeAllNamespacesFlag, ns); err != nil {
log.Errorf("Error: failed to delete namespace set %s from list %s", ns, util.KubeAllNamespacesFlag)
return err
}
}
Expand All @@ -81,8 +93,8 @@ func (npMgr *NetworkPolicyManager) AddNamespace(nsObj *corev1.Namespace) error {

var err error

nsName, nsNs, nsLabel := nsObj.ObjectMeta.Name, nsObj.ObjectMeta.Namespace, nsObj.ObjectMeta.Labels
log.Printf("NAMESPACE CREATING: [%s/%s/%+v]", nsName, nsNs, nsLabel)
nsName, nsLabel := "ns-" + nsObj.ObjectMeta.Name, nsObj.ObjectMeta.Labels
log.Printf("NAMESPACE CREATING: [%s/%v]", nsName, nsLabel)

ipsMgr := npMgr.nsMap[util.KubeAllNamespacesFlag].ipsMgr
// Create ipset for the namespace.
Expand All @@ -97,16 +109,21 @@ func (npMgr *NetworkPolicyManager) AddNamespace(nsObj *corev1.Namespace) error {
}

// Add the namespace to its label's ipset list.
var labelKeys []string
nsLabels := nsObj.ObjectMeta.Labels
for nsLabelKey, nsLabelVal := range nsLabels {
labelKey := util.GetNsIpsetName(nsLabelKey, nsLabelVal)
labelKey := "ns-" + nsLabelKey
log.Printf("Adding namespace %s to ipset list %s", nsName, labelKey)
if err = ipsMgr.AddToList(labelKey, nsName); err != nil {
log.Errorf("Error: failed to add namespace %s to ipset list %s", nsName, labelKey)
return err
}
labelKeys = append(labelKeys, labelKey)

label := "ns-" + nsLabelKey + ":" + nsLabelVal
log.Printf("Adding namespace %s to ipset list %s", nsName, label)
if err = ipsMgr.AddToList(label, nsName); err != nil {
log.Errorf("Error: failed to add namespace %s to ipset list %s", nsName, label)
return err
}
}

ns, err := newNs(nsName)
Expand All @@ -122,11 +139,11 @@ func (npMgr *NetworkPolicyManager) AddNamespace(nsObj *corev1.Namespace) error {
func (npMgr *NetworkPolicyManager) UpdateNamespace(oldNsObj *corev1.Namespace, newNsObj *corev1.Namespace) error {
var err error

oldNsName, oldNsNs, oldNsLabel := oldNsObj.ObjectMeta.Name, oldNsObj.ObjectMeta.Namespace, oldNsObj.ObjectMeta.Labels
newNsName, newNsNs, newNsLabel := newNsObj.ObjectMeta.Name, newNsObj.ObjectMeta.Namespace, newNsObj.ObjectMeta.Labels
oldNsNs, oldNsLabel := "ns-" + oldNsObj.ObjectMeta.Name, oldNsObj.ObjectMeta.Labels
newNsNs, newNsLabel := "ns-" + newNsObj.ObjectMeta.Name, newNsObj.ObjectMeta.Labels
log.Printf(
"NAMESPACE UPDATING:\n old namespace: [%s/%s/%+v]\n new namespace: [%s/%s/%+v]",
oldNsName, oldNsNs, oldNsLabel, newNsName, newNsNs, newNsLabel,
"NAMESPACE UPDATING:\n old namespace: [%s/%v]\n new namespace: [%s/%v]",
oldNsNs, oldNsLabel, newNsNs, newNsLabel,
)

if err = npMgr.DeleteNamespace(oldNsObj); err != nil {
Expand All @@ -149,8 +166,8 @@ func (npMgr *NetworkPolicyManager) DeleteNamespace(nsObj *corev1.Namespace) erro

var err error

nsName, nsNs, nsLabel := nsObj.ObjectMeta.Name, nsObj.ObjectMeta.Namespace, nsObj.ObjectMeta.Labels
log.Printf("NAMESPACE DELETING: [%s/%s/%+v]", nsName, nsNs, nsLabel)
nsName, nsLabel := "ns-" + nsObj.ObjectMeta.Name, nsObj.ObjectMeta.Labels
log.Printf("NAMESPACE DELETING: [%s/%v]", nsName, nsLabel)

_, exists := npMgr.nsMap[nsName]
if !exists {
Expand All @@ -159,16 +176,21 @@ func (npMgr *NetworkPolicyManager) DeleteNamespace(nsObj *corev1.Namespace) erro

// Delete the namespace from its label's ipset list.
ipsMgr := npMgr.nsMap[util.KubeAllNamespacesFlag].ipsMgr
var labelKeys []string
nsLabels := nsObj.ObjectMeta.Labels
for nsLabelKey, nsLabelVal := range nsLabels {
labelKey := util.GetNsIpsetName(nsLabelKey, nsLabelVal)
labelKey := "ns-" + nsLabelKey
log.Printf("Deleting namespace %s from ipset list %s", nsName, labelKey)
if err = ipsMgr.DeleteFromList(labelKey, nsName); err != nil {
log.Errorf("Error: failed to delete namespace %s from ipset list %s", nsName, labelKey)
return err
}
labelKeys = append(labelKeys, labelKey)

label := "ns-" + nsLabelKey + ":" + nsLabelVal
log.Printf("Deleting namespace %s from ipset list %s", nsName, label)
if err = ipsMgr.DeleteFromList(label, nsName); err != nil {
log.Errorf("Error: failed to delete namespace %s from ipset list %s", nsName, label)
return err
}
}

// Delete the namespace from all-namespace ipset list.
Expand Down
2 changes: 2 additions & 0 deletions npm/npm.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ type NetworkPolicyManager struct {
nodeName string
nsMap map[string]*namespace
isAzureNpmChainCreated bool
isSafeToCleanUpAzureNpmChain bool

clusterState telemetry.ClusterState
reportManager *telemetry.ReportManager
Expand Down Expand Up @@ -219,6 +220,7 @@ func NewNetworkPolicyManager(clientset *kubernetes.Clientset, informerFactory in
nodeName: os.Getenv("HOSTNAME"),
nsMap: make(map[string]*namespace),
isAzureNpmChainCreated: false,
isSafeToCleanUpAzureNpmChain: false,
clusterState: telemetry.ClusterState{
PodCount: 0,
NsCount: 0,
Expand Down
Loading