aboutsummaryrefslogtreecommitdiff
path: root/plugin/kubernetes/controller_test.go
diff options
context:
space:
mode:
authorGravatar Brad Beam <bradbeam@users.noreply.github.com> 2018-09-29 10:43:09 -0500
committerGravatar Miek Gieben <miek@miek.nl> 2018-09-29 16:43:09 +0100
commita80ec6096f71337600ff2694040be1efb7b6b87b (patch)
tree8eb0214912dc013dc6ed72c799ceeeaa232d59e3 /plugin/kubernetes/controller_test.go
parent57197a49a49378c8daf7c7312dbeba67b8d36d4e (diff)
downloadcoredns-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.go159
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,
+ },
+ })
+}