This package allows you to use ConfigMap objects in Kubernetes to
drive the update of dynamic go-flagz
at runtime of your service.
The Updater
is split into two phases:
Initialize()
- used on server startup which allows bothstatic
anddynamic
flags to be updated from values stored in aConfigMap
Start()
- kicking off a anfsnotify
Go-routine which watches for updates of values in the ConfigMap. To avoid races, this allows only to updatedynamic
flags.
// First parse the flags from the command line, as normal.
common.SharedFlagSet.Parse(os.Args[1:])
u, err := configmaps.New(common.SharedFlagSet, "/etc/flagz", logger)
if err != nil {
logger.Fatalf("failed setting up %v", err)
}
// Read flagz from etcd and update their values in common.SharedFlagSet
if err := u.Initialize(); err != nil {
log.Fatalf("failed setting up %v", err)
}
// Start listening of ConfigMap updates mounted in /etc/flagz.
u.Start()
You define a ConfigMap with values for your flags.
kind: ConfigMap
apiVersion: v1
metadata:
creationTimestamp: 2016-09-09T09:14:38Z
name: example-config
namespace: default
data:
example_my_dynamic_string: something
example_my_dynamic_int: 20
example_my_dynamic_json: |-
{
"policy": "allow",
"rate": 50
}
Then you just push it to your Kubernetes cluster:
# kubectl replace -f example.yaml
And all your jobs referencing this ConfigMap via a volume mount will see updates go-flagz
updates to keys in your data. For an end to end example see server_kube.
- Kubernetes
<= 1.3
validate ConfigMap keys against DNS names, meaning that certain common characters (e.g._
) are not allowed. With>=1.4
, ConfigMaps are validated against[-._a-zA-Z0-9]+
RE2 regex. - With Kubernetes
<=1.4
ConfigMaps don't get updated async, but on pod changes and otherwise at least every 60s. See kubernetes#30189.