Merge pull request #3305 from weaveworks/issues/3289-many-namespaces

Make the ipset list size bigger
This commit is contained in:
Martynas Pumputis authored and GitHub committed 2018-06-11 16:36:26 +02:00
commit c19c64a990
3 files changed
+39 -6

No files matched your search

+7 -1
View File
@@ -1,6 +1,7 @@
package ipset package ipset
import ( import (
"fmt"
"log" "log"
"os/exec" "os/exec"
"strings" "strings"
@@ -40,6 +41,7 @@ type entryKey struct {
type ipset struct { type ipset struct {
*log.Logger *log.Logger
enableComments bool enableComments bool
maxListSize int
// List of users per ipset entry. User is either a namespace or a pod. // List of users per ipset entry. User is either a namespace or a pod.
// There might be multiple users for the same ipset & entry pair because // There might be multiple users for the same ipset & entry pair because
// events from k8s API server might be out of order causing duplicate IPs: // events from k8s API server might be out of order causing duplicate IPs:
@@ -47,10 +49,11 @@ type ipset struct {
users map[entryKey]map[types.UID]struct{} users map[entryKey]map[types.UID]struct{}
} }
func New(logger *log.Logger) Interface { func New(logger *log.Logger, maxListSize int) Interface {
ips := &ipset{ ips := &ipset{
Logger: logger, Logger: logger,
enableComments: true, enableComments: true,
maxListSize: maxListSize,
users: make(map[entryKey]map[types.UID]struct{}), users: make(map[entryKey]map[types.UID]struct{}),
} }
@@ -71,6 +74,9 @@ func New(logger *log.Logger) Interface {
func (i *ipset) Create(ipsetName Name, ipsetType Type) error { func (i *ipset) Create(ipsetName Name, ipsetType Type) error {
args := []string{"create", string(ipsetName), string(ipsetType)} args := []string{"create", string(ipsetName), string(ipsetType)}
if ipsetType == ListSet && i.maxListSize > 0 {
args = append(args, "size", fmt.Sprintf("%d", i.maxListSize))
}
if i.enableComments { if i.enableComments {
args = append(args, "comment") args = append(args, "comment")
} }
+3 -1
View File
@@ -31,6 +31,7 @@ var (
allowMcast bool allowMcast bool
nodeName string nodeName string
legacy bool legacy bool
maxList int
) )
func handleError(err error) { common.CheckFatal(err) } func handleError(err error) { common.CheckFatal(err) }
@@ -152,7 +153,7 @@ func root(cmd *cobra.Command, args []string) {
ipt, err := iptables.New() ipt, err := iptables.New()
handleError(err) handleError(err)
ips := ipset.New(common.LogLogger()) ips := ipset.New(common.LogLogger(), maxList)
handleError(resetIPTables(ipt)) handleError(resetIPTables(ipt))
handleError(resetIPSets(ips)) handleError(resetIPSets(ips))
@@ -245,6 +246,7 @@ func main() {
rootCmd.PersistentFlags().BoolVar(&allowMcast, "allow-mcast", true, "allow all multicast traffic") rootCmd.PersistentFlags().BoolVar(&allowMcast, "allow-mcast", true, "allow all multicast traffic")
rootCmd.PersistentFlags().StringVar(&nodeName, "node-name", "", "only generate rules that apply to this node") rootCmd.PersistentFlags().StringVar(&nodeName, "node-name", "", "only generate rules that apply to this node")
rootCmd.PersistentFlags().BoolVar(&legacy, "use-legacy-netpol", false, "use legacy network policies (pre k8s 1.7 vsn)") rootCmd.PersistentFlags().BoolVar(&legacy, "use-legacy-netpol", false, "use legacy network policies (pre k8s 1.7 vsn)")
rootCmd.PersistentFlags().IntVar(&maxList, "max-list-size", 1024, "maximum size of ipset list (for namespaces)")
handleError(rootCmd.Execute()) handleError(rootCmd.Execute())
} }
+29 -4
View File
@@ -225,12 +225,39 @@ run_on $HOST1 "$KUBECTL delete netpol allow-nettest-deny"
# nettest-deny should still not be able to reach nettest pods # nettest-deny should still not be able to reach nettest pods
assert_raises "! $SSH $HOST1 $KUBECTL exec $denyPodName -- curl -s -S -f -m 2 http://$DOMAIN:8080/status >/dev/null" assert_raises "! $SSH $HOST1 $KUBECTL exec $denyPodName -- curl -s -S -f -m 2 http://$DOMAIN:8080/status >/dev/null"
# allow access for all # Create many namespaces to stress namespaceSelector
for n in 1 2 3 4 5 6 7 8 9 10; do
run_on $HOST1 "$KUBECTL create namespace namespace${n}"
done
# allow access from any namespace
run_on $HOST1 "$KUBECTL apply -f -" <<EOF run_on $HOST1 "$KUBECTL apply -f -" <<EOF
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: NetworkPolicy kind: NetworkPolicy
metadata: metadata:
name: allow-nettest-deny name: allow-any-namespace
namespace: default
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector: {}
EOF
# Should be able to access from the "deny" pod now
assert_raises "$SSH $HOST1 $KUBECTL exec $denyPodName -- curl -s -S -f -m 2 http://$DOMAIN:8080/status >/dev/null"
# host should still not be able to reach pods via service virtual IP or NodePort
# because host is not in a namespace
assert_raises "! $SSH $HOST1 curl -s -S -f -m 2 http://$VIRTUAL_IP/status >/dev/null"
assert_raises "! $SSH $HOST1 curl -s -S -f -m 2 http://$HOST2:31138/status >/dev/null"
# allow access from anywhere
run_on $HOST1 "$KUBECTL apply -f -" <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-anywhere
namespace: default namespace: default
spec: spec:
podSelector: {} podSelector: {}
@@ -238,8 +265,6 @@ spec:
- {} - {}
EOF EOF
assert_raises "$SSH $HOST1 $KUBECTL exec $denyPodName -- curl -s -S -f -m 2 http://$DOMAIN:8080/status >/dev/null"
# Virtual IP and NodePort should now work # Virtual IP and NodePort should now work
assert_raises "$SSH $HOST1 curl -s -S -f -m 2 http://$VIRTUAL_IP/status >/dev/null" assert_raises "$SSH $HOST1 curl -s -S -f -m 2 http://$VIRTUAL_IP/status >/dev/null"
assert_raises "$SSH $HOST1 curl -s -S -f -m 2 http://$HOST2:31138/status >/dev/null" assert_raises "$SSH $HOST1 curl -s -S -f -m 2 http://$HOST2:31138/status >/dev/null"