https://github.com/webtor-io/dnslb
Round-robin DNS LoadBalancer for Kubernetes
https://github.com/webtor-io/dnslb
cloudflare dns kubernetes load-balancer
Last synced: 6 months ago
JSON representation
Round-robin DNS LoadBalancer for Kubernetes
- Host: GitHub
- URL: https://github.com/webtor-io/dnslb
- Owner: webtor-io
- License: mit
- Created: 2020-11-05T21:22:51.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2022-12-24T17:30:37.000Z (about 3 years ago)
- Last Synced: 2024-12-19T01:02:27.498Z (about 1 year ago)
- Topics: cloudflare, dns, kubernetes, load-balancer
- Language: Go
- Homepage:
- Size: 3.66 MB
- Stars: 12
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# dnslb
Round-robin DNS LoadBalancer for Kubernetes.
## Should I use it?
You shouldn't use it if:
1. You are running your cluster on GKE, AKS, EKS or similar managed Kubernetes cluster.
LoadBalancer is already there, so you should just set your service type to `LoadBalancer` and
load-balancing will be served for you out of the box.
2. You are running Kubernetes cluster at environment that offers Layer2-traffic between nodes or it is possible
to establish BGP-sessions between your nodes and routing hardware. So in this case you should go with [MetalLB](https://metallb.universe.tf/).
3. You just running a single node cluster so you can just make single A-recored at your DNS provider to point to your node.
In any other scenario **dnslb** might be the only way to get load-balancing and explosure of your
services.
## Drawbacks
It is well-known that DNS round-robin is not the best choice for load-balancing because of caching of DNS-responses on the
client-side. So keep in mind if some of your nodes goes down users may still try to reach them for a long time.
## How does it work?
1. Search for pods by selector specified by `pod-selector`.
2. Checks whether they are running or not and gets IPs of nodes they are running on.
3. Searches for ingress-objects and gets all domains that are defined in them (hosts and TLS sections).
4. Publishes A-records for each domain and each node IP to DNS-provider.
## What DNS providers are supported?
Only Cloudflare right now.
## Prerequirements
You should have ingres-controller in your cluster with `HostPort` enabled.
## Usage
```
% ./dnslb --help
Usage of ./dnslb:
-cf-api-email string
Cloudflare API Email [$CF_API_EMAIL]
-cf-api-key string
Cloudflare API Key [$CF_API_KEY]
-check-interval int
check interval in seconds [$CHECK_INTERVAL] (default 10)
-concurrency int
number of concurrent dns syncs [$CONCURRENCY] (default 5)
-daemon
daemon mode [$DAEMON]
-dry-run
dry run mode [$DRY_RUN]
-full-check-interval int
full check interval in seconds [$FULL_CHECK_INTERVAL] (default 600)
-ingress-namespace string
ingresses to be balanced [$INGRESS_NAMESPACE]
-json-log
outputs logs in json [$JSON_LOG]
-kubeconfig string
path to kubernetes config file [$KUBECONFIG] (default "$HOME/.kube/config")
-node-address-type string
node address type to balance to, MUST be InternalIP or ExternalIP [$NODE_ADDRESS_TYPE] (default "ExternalIP")
-node-selector string
node selector to be balanced, in case if you wish to reduce balancing only to specific nodes [$NODE_SELECTOR]
-pod-namespace string
pod namespace to be balanced [$POD_NAMESPACE]
-pod-selector string
pod selector to be balanced [$POD_SELECTOR] (default "app.kubernetes.io/component=controller,app=nginx-ingress")
-verbose
verbose mode [$VERBOSE]
```
## Special ingress annotation
By adding special annotation to your ingress-objects you can modify **dnslb** behaviour.
`dnslb/cloudflare-proxied` - specifies which domains should be proxied through Cloudflare (example value `example.org,someothere.org`). By default all records are created with `DNS only`.
## Helm chart
You can find helm-chart [there](https://github.com/webtor-io/helm-charts/tree/master/charts/dnslb).
How to install:
```
helm repo add webtor https://charts.webtor.io
helm install --set cloudflare.apiKey=YOUR_API_KEY --set cloudflare.apiEmail=YOUR_API_EMAIL -n dnslb webtor/dnslb
```