https://github.com/vapor-ware/k8s-elector
A minimal kubernetes-native sidecar elector service.
https://github.com/vapor-ware/k8s-elector
election kubernetes sidecar
Last synced: 8 days ago
JSON representation
A minimal kubernetes-native sidecar elector service.
- Host: GitHub
- URL: https://github.com/vapor-ware/k8s-elector
- Owner: vapor-ware
- License: gpl-3.0
- Created: 2019-04-26T14:11:23.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2022-08-17T15:47:04.000Z (over 2 years ago)
- Last Synced: 2025-03-21T22:03:10.219Z (about 1 month ago)
- Topics: election, kubernetes, sidecar
- Language: Go
- Size: 70.3 KB
- Stars: 10
- Watchers: 8
- Forks: 12
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# k8s-elector
k8s-elector is a minimal Kubernetes-native sidecar elector service, allowing you to
perform simple leader election within your Kubernetes deployment.Internally, it uses `"k8s.io/client-go/tools/leaderelection"` to run the election.
## Usage
The k8s-elector is intended to be run as a sidecar to other services to provide
them leader election capabilities, but it can run on its own as well. For an example,
you can run just the elector containers with```
$ kubectl run k8s-elector --image=vaporio/k8s-elector --replicas=3 -- -election=example
```> **Note** By default, k8s-elector tries to use a Kubernetes LeaseLock. If running a
> version of Kubernetes which does not support this, you can change the lock type with
> the `-lock-type` flag. (valid values: leases, endpoints, configmaps)This will run 3 instances of the k8s-elector. You can observe their logs to verify
a leader is chosen among them.Looking through the logs for leadership is not tenable for a deployment to identify
leadership. k8s-elector exposes a basic HTTP API to provide leadership status information.
You can enable and conifgure it with the `-http` flag.```
$ kubectl run k8s-elector --image=vaporio/k8s-elector --replicas=3 -- -election=example -lock-type=configmaps -http=0.0.0.0:5002
```You can look through the logs to see a leader was elected and you can verify [from within
the cluster](https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#running-commands-in-a-pod)
that each pod reports its leadership status correctly.```console
/ # curl 10.1.0.180:5002/
{"is_leader":false,"leader":"k8s-elector-74c54b485f-hgf9z","node":"k8s-elector-74c54b485f-564ht","timestamp":"2019-05-02T18:28:51Z"}
/ # curl 10.1.0.181:5002/
{"is_leader":false,"leader":"k8s-elector-74c54b485f-hgf9z","node":"k8s-elector-74c54b485f-qztgk","timestamp":"2019-05-02T18:29:21Z"}
/ # curl 10.1.0.179:5002/
{"is_leader":true,"leader":"k8s-elector-74c54b485f-hgf9z","node":"k8s-elector-74c54b485f-hgf9z","timestamp":"2019-05-02T18:29:26Z"}
```As the above run command specified the lock type as "configmaps", you should also expect to
see a ConfigMap with the same name as the election.```
$ kubectl get cm
NAME DATA AGE
example 0 21m
```## Configuration
For a full list of configuration options, you can run the elector with the `-h` flags. These
will include both the flags for the elector itself as well as flags for configuring logging.```
Usage of ./elector:
-election string
The name of the election. This is required.
-http string
The HTTP address (host:port) which leader state will be reported on.
-id string
The ID of the election participant. If not set, the hostname, as reported by the kernel, is used.
-kubeconfig string
The kubeconfig file to use. If not set, in-cluster config will be used.
-lock-type string
The type of Kubernetes object to use for the lock (leases, endpoints, configmaps) (default "leases")
-namespace string
The Kubernetes namespace to run the election in. If not set, elections will run in the default namespace. (default "default")
-ttl duration
The TTL for the election. (default 10s)
```## API
When enabled, the exposed HTTP API consists of a single endpoint at the URL root.### `/`
Method: `GET`
#### Example response:
```json
{
"is_leader": false,
"leader": "k8s-elector-74c54b485f-hgf9z",
"node": "k8s-elector-74c54b485f-564ht",
"timestamp": "2019-05-02T18:28:51Z"
}
```#### Fields
| Field | Description |
| :---- | :---------- |
| *is_leader* | A boolean describing whether the node being queried is the leader node. |
| *leader* | The ID of the node which is currently the leader. |
| *node* | The ID of the node being queried for leadership status. |
| *timestamp* | The RFC3339-formatted UTC timestamp for when the response was returned. |