diff options
author | 2018-09-29 10:43:09 -0500 | |
---|---|---|
committer | 2018-09-29 16:43:09 +0100 | |
commit | a80ec6096f71337600ff2694040be1efb7b6b87b (patch) | |
tree | 8eb0214912dc013dc6ed72c799ceeeaa232d59e3 /plugin/kubernetes/controller_test.go | |
parent | 57197a49a49378c8daf7c7312dbeba67b8d36d4e (diff) | |
download | coredns-a80ec6096f71337600ff2694040be1efb7b6b87b.tar.gz coredns-a80ec6096f71337600ff2694040be1efb7b6b87b.tar.zst coredns-a80ec6096f71337600ff2694040be1efb7b6b87b.zip |
Benchmark for k8s services (#2107)
* Benchmark for k8s services
* Adding k8s.io/client-go/kubernetes/fake dep
Diffstat (limited to 'plugin/kubernetes/controller_test.go')
-rw-r--r-- | plugin/kubernetes/controller_test.go | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/plugin/kubernetes/controller_test.go b/plugin/kubernetes/controller_test.go index 02915fb51..1663e4c6a 100644 --- a/plugin/kubernetes/controller_test.go +++ b/plugin/kubernetes/controller_test.go @@ -1,11 +1,18 @@ package kubernetes import ( + "context" + "net" "strconv" "strings" "testing" + "github.com/coredns/coredns/plugin/test" + "github.com/miekg/dns" api "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/fake" ) func endpointSubsets(addrs ...string) (eps []api.EndpointSubset) { @@ -51,3 +58,155 @@ func TestEndpointsSubsetDiffs(t *testing.T) { } } } + +func inc(ip net.IP) { + for j := len(ip) - 1; j >= 0; j-- { + ip[j]++ + if ip[j] > 0 { + break + } + } +} + +func BenchmarkController(b *testing.B) { + client := fake.NewSimpleClientset() + dco := dnsControlOpts{ + zones: []string{"cluster.local."}, + } + controller := newdnsController(client, dco) + cidr := "10.0.0.0/19" + + // Add resources + generateEndpoints(cidr, client) + generateSvcs(cidr, "all", client) + m := new(dns.Msg) + m.SetQuestion("svc1.testns.svc.cluster.local.", dns.TypeA) + k := New([]string{"cluster.local."}) + k.APIConn = controller + ctx := context.Background() + rw := &test.ResponseWriter{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + k.ServeDNS(ctx, rw, m) + } +} + +func generateEndpoints(cidr string, client kubernetes.Interface) { + // https://groups.google.com/d/msg/golang-nuts/zlcYA4qk-94/TWRFHeXJCcYJ + ip, ipnet, err := net.ParseCIDR(cidr) + if err != nil { + log.Fatal(err) + } + + count := 1 + ep := &api.Endpoints{ + Subsets: []api.EndpointSubset{{ + Ports: []api.EndpointPort{ + { + Port: 80, + Protocol: "tcp", + Name: "http", + }, + }, + }}, + ObjectMeta: meta.ObjectMeta{ + Namespace: "testns", + }, + } + for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) { + ep.Subsets[0].Addresses = []api.EndpointAddress{ + { + IP: ip.String(), + Hostname: "foo" + strconv.Itoa(count), + }, + } + ep.ObjectMeta.Name = "svc" + strconv.Itoa(count) + _, err = client.Core().Endpoints("testns").Create(ep) + count += 1 + } +} + +func generateSvcs(cidr string, svcType string, client kubernetes.Interface) { + ip, ipnet, err := net.ParseCIDR(cidr) + if err != nil { + log.Fatal(err) + } + + count := 1 + switch svcType { + case "clusterip": + for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) { + createClusterIPSvc(count, client, ip) + count += 1 + } + case "headless": + for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) { + createHeadlessSvc(count, client, ip) + count += 1 + } + case "external": + for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) { + createExternalSvc(count, client, ip) + count += 1 + } + default: + for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) { + if count%3 == 0 { + createClusterIPSvc(count, client, ip) + } else if count%3 == 1 { + createHeadlessSvc(count, client, ip) + } else if count%3 == 2 { + createExternalSvc(count, client, ip) + } + count += 1 + } + } +} + +func createClusterIPSvc(suffix int, client kubernetes.Interface, ip net.IP) { + client.Core().Services("testns").Create(&api.Service{ + ObjectMeta: meta.ObjectMeta{ + Name: "svc" + strconv.Itoa(suffix), + Namespace: "testns", + }, + Spec: api.ServiceSpec{ + ClusterIP: ip.String(), + Ports: []api.ServicePort{{ + Name: "http", + Protocol: "tcp", + Port: 80, + }}, + }, + }) +} + +func createHeadlessSvc(suffix int, client kubernetes.Interface, ip net.IP) { + client.Core().Services("testns").Create(&api.Service{ + ObjectMeta: meta.ObjectMeta{ + Name: "hdls" + strconv.Itoa(suffix), + Namespace: "testns", + }, + Spec: api.ServiceSpec{ + ClusterIP: api.ClusterIPNone, + }, + }) +} + +func createExternalSvc(suffix int, client kubernetes.Interface, ip net.IP) { + client.Core().Services("testns").Create(&api.Service{ + ObjectMeta: meta.ObjectMeta{ + Name: "external" + strconv.Itoa(suffix), + Namespace: "testns", + }, + Spec: api.ServiceSpec{ + ExternalName: "coredns" + strconv.Itoa(suffix) + ".io", + Ports: []api.ServicePort{{ + Name: "http", + Protocol: "tcp", + Port: 80, + }}, + Type: api.ServiceTypeExternalName, + }, + }) +} |