Simple centralized cloud configuration server for Kubernetes in Go.
This configuration server exposes fast cached access to a slow backend.
-
The server is meant to run as multiple replicas service in a Kubernetes cluster.
-
groupcache is used as fast distributed cache. If multiple clients request a new configuration file, only a single replica fetches it from the backend and then makes the file available for all pending requests.
-
The pod replicas automatically find each other by querying Kubernetes API for pods with a shared label
app=<app-name>
. For example, if a deployment is used to create the replicas, the shared label would beapp=<deployment-name>
. -
The server handles refresh notification events from the AMQP queue
config-event-queue
below. Whenever a refresh notification is received for an application, cache entries with that application configuration file are cleared, forcing their refresh from the backend.
exchangeName: springCloudBus
exchangeType: topic
queue: config-event-queue
- The env var
TTL
can be used to enforce a TTL on cache entries. Example:TTL=300s
. Default value isTTL=0
, meaning no expiration set for cache entries.
git clone https://github.com/udhos/kubecloudconfigserver
cd kubecloudconfigserver
go mod tidy
go test -race ./...
export CGO_ENABLED=0
go install ./...
Proxying to an HTTP server:
export BACKEND=http://configserver:9000
kubeconfigserver
Reading from filesystem rooted at directory samples
:
export BACKEND=dir:samples
export BACKEND_OPTIONS=flatten ;# flatten request path into a flat dir
kubeconfigserver
Query server:
curl localhost:8080/deploy.yml
Query groupcache directly:
curl localhost:5000/_groupcache/<group>/<key>
curl localhost:5000/_groupcache/configfiles/deploy.yml
Docker hub:
https://hub.docker.com/r/udhos/kubecloudconfigserver
Pull from docker hub:
docker pull udhos/kubecloudconfigserver:0.0.0
Build recipe:
./docker/build.sh