Scalability testing of the Kubernetes API machinery
This is a kube API client that creates and deletes ConfigMap
objects. It makes a simple attempt at a Poisson arrival process, and
a simple attempt at a constant lifetime for each object.
Another client that thrashes ConfigMap objects. This one uses a
closed-loop structure and includes one update in each object's
lifecycle.
This is a controller, adapted from
https://github.com/kubernetes/client-go/tree/master/examples/workqueue
, that has an informer on ConfigMap objects and a work queue. This
controller does nothing but log timing information about notifications
from the informer and dequeuing from the work queue.
This is a kube API client that creates and deletes Flunder objects.
It makes a simple attempt at a Poisson arrival process, and a simple
attempt at a constant lifetime for each object. Flunders are from
https://github.com/kubernetes/sample-apiserver/tree/master/pkg/apis/wardle
.
This is a controller, adapted from
https://github.com/kubernetes/client-go/tree/master/examples/workqueue
, that has an informer on Flunder objects and a work queue. This
controller does nothing but log timing information about notifications
from the informer and dequeuing from the work queue. Flunders are
from
https://github.com/kubernetes/sample-apiserver/tree/master/pkg/apis/wardle
.
This package has a simple executable that loops over time-limited
watches on Flunder objects. This package also has a ReplicaSet of
pods that run an image with that executable.
This is a cousin of iperf based on Go and HTTP/2.
It is always a server, so that you can fetch its
/debug/pprof (see also
https://tip.golang.org/doc/diagnostics.html#profiling).
Its performance-oriented URL path is /blocks, and it requires three
query parameters:
size, a positive integer number of bytes;n, a positive integer number of blocks to return; andperiodMS, a positive integer number of milliseconds.
GETting such a URL will return the requested number of blocks of
bytes, of the requested size each. The server will attempt to send 1
block every periodMS milliseconds.
If given a -base-url on the command line, this program will also act
as a client. In its client role it takes request parameters plus also
-threads and -connections. Each thread repeatedly makes a request
on the server. Those threads are load-balanced across the given
number of TLS connections to the server.
In both its roles as client and server, go_httperf logs the
TLS keys
that it uses.
When given -v=2, go_httperf logs its transmit and receive rates.
Higher values of -v produce more detailed logging.
Each piece is built on its own. There are two sorts of pieces here: those that include support for containerization and those that are simple processes.
For a simple process, just cd and go build.
For a piece that supports containerization, there are three stages and
a Makefile that handles the first two. To build the executable for
your development machine, just cd and go build. The make or
make build command will build the executable for use in a container.
Use make publish to create a Docker image and push it somewhere. By
default that somewhere is $LOGNAME at Dockerhub; you can make publish DOCKERPFX=$reg/$ns to push to $reg/$ns instead. Finally,
there is a YAML file that describes a Kubernetes ReplicaSet that runs
the image that I built (you may want to edit it to run the image that
you build). You will also need to kubectl create namespace scaletest and kubectl create -f authz.yaml before creating the
ReplicaSet.
Dependencies are managed by go 1.11 modules. Each piece has its own
go.mod and go.sum.
The pieces that depend on Kubernetes depend on the 1.18 release.