mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-05 17:16:59 +02:00
224 lines
6.2 KiB
Markdown
224 lines
6.2 KiB
Markdown
# Plural
|
|
|
|
This tutorial describes how to setup ExternalDNS for usage within a Kubernetes cluster using Plural DNS.
|
|
|
|
Make sure to use **>=0.12.3** version of ExternalDNS for this tutorial.
|
|
|
|
## Creating Plural Credentials
|
|
|
|
A secret containing the a Plural access token is needed for this provider. You can get a token for your user [here](https://app.plural.sh/profile/tokens).
|
|
|
|
To create the secret you can run `kubectl create secret generic plural-env --from-literal=PLURAL_ACCESS_TOKEN=<replace-with-your-access-token>`.
|
|
|
|
## Deploy ExternalDNS
|
|
|
|
Connect your `kubectl` client to the cluster you want to test ExternalDNS with.
|
|
Then apply one of the following manifests file to deploy ExternalDNS.
|
|
|
|
## Using Helm
|
|
|
|
Create a values.yaml file to configure ExternalDNS to use plural DNS as the DNS provider. This file should include the necessary environment variables:
|
|
|
|
```shell
|
|
provider:
|
|
name: plural
|
|
extraArgs:
|
|
- --plural-cluster=example-plural-cluster
|
|
- --plural-provider=aws # gcp, azure, equinix and kind are also possible
|
|
env:
|
|
- name: PLURAL_ACCESS_TOKEN
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: PLURAL_ACCESS_TOKEN
|
|
key: plural-env
|
|
- name: PLURAL_ENDPOINT
|
|
value: https://app.plural.sh
|
|
```
|
|
|
|
Finally, install the ExternalDNS chart with Helm using the configuration specified in your values.yaml file:
|
|
|
|
```shell
|
|
helm upgrade --install external-dns external-dns/external-dns --values values.yaml
|
|
```
|
|
|
|
### Manifest (for clusters without RBAC enabled)
|
|
|
|
```yaml
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: external-dns
|
|
spec:
|
|
strategy:
|
|
type: Recreate
|
|
selector:
|
|
matchLabels:
|
|
app: external-dns
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: external-dns
|
|
spec:
|
|
containers:
|
|
- name: external-dns
|
|
image: registry.k8s.io/external-dns/external-dns:v0.15.0
|
|
args:
|
|
- --source=service # ingress is also possible
|
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
|
- --provider=plural
|
|
- --plural-cluster=example-plural-cluster
|
|
- --plural-provider=aws # gcp, azure, equinix and kind are also possible
|
|
env:
|
|
- name: PLURAL_ACCESS_TOKEN
|
|
valueFrom:
|
|
secretKeyRef:
|
|
key: PLURAL_ACCESS_TOKEN
|
|
name: plural-env
|
|
- name: PLURAL_ENDPOINT # (optional) use an alternative endpoint for Plural; defaults to https://app.plural.sh
|
|
value: https://app.plural.sh
|
|
```
|
|
|
|
### Manifest (for clusters with RBAC enabled)
|
|
|
|
```yaml
|
|
apiVersion: v1
|
|
kind: ServiceAccount
|
|
metadata:
|
|
name: external-dns
|
|
---
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
name: external-dns
|
|
rules:
|
|
- apiGroups: [""]
|
|
resources: ["services","endpoints","pods"]
|
|
verbs: ["get","watch","list"]
|
|
- apiGroups: ["extensions","networking.k8s.io"]
|
|
resources: ["ingresses"]
|
|
verbs: ["get","watch","list"]
|
|
- apiGroups: [""]
|
|
resources: ["nodes"]
|
|
verbs: ["list", "watch"]
|
|
---
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRoleBinding
|
|
metadata:
|
|
name: external-dns-viewer
|
|
roleRef:
|
|
apiGroup: rbac.authorization.k8s.io
|
|
kind: ClusterRole
|
|
name: external-dns
|
|
subjects:
|
|
- kind: ServiceAccount
|
|
name: external-dns
|
|
namespace: default
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: external-dns
|
|
spec:
|
|
strategy:
|
|
type: Recreate
|
|
selector:
|
|
matchLabels:
|
|
app: external-dns
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: external-dns
|
|
spec:
|
|
containers:
|
|
- name: external-dns
|
|
image: registry.k8s.io/external-dns/external-dns:v0.15.0
|
|
args:
|
|
- --source=service # ingress is also possible
|
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
|
- --provider=plural
|
|
- --plural-cluster=example-plural-cluster
|
|
- --plural-provider=aws # gcp, azure, equinix and kind are also possible
|
|
env:
|
|
- name: PLURAL_ACCESS_TOKEN
|
|
valueFrom:
|
|
secretKeyRef:
|
|
key: PLURAL_ACCESS_TOKEN
|
|
name: plural-env
|
|
- name: PLURAL_ENDPOINT # (optional) use an alternative endpoint for Plural; defaults to https://app.plural.sh
|
|
value: https://app.plural.sh
|
|
```
|
|
|
|
## Deploying an Nginx Service
|
|
|
|
Create a service file called 'nginx.yaml' with the following contents:
|
|
|
|
```yaml
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: nginx
|
|
spec:
|
|
selector:
|
|
matchLabels:
|
|
app: nginx
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: nginx
|
|
spec:
|
|
containers:
|
|
- image: nginx
|
|
name: nginx
|
|
ports:
|
|
- containerPort: 80
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: nginx
|
|
annotations:
|
|
external-dns.alpha.kubernetes.io/hostname: example.com
|
|
spec:
|
|
selector:
|
|
app: nginx
|
|
type: LoadBalancer
|
|
ports:
|
|
- protocol: TCP
|
|
port: 80
|
|
targetPort: 80
|
|
```
|
|
|
|
Note the annotation on the service; use the same hostname as the Plural DNS zone created above. The annotation may also be a subdomain
|
|
of the DNS zone (e.g. 'www.example.com').
|
|
|
|
By setting the TTL annotation on the service, you have to pass a valid TTL, which must be 120 or above.
|
|
This annotation is optional, if you won't set it, it will be 1 (automatic) which is 300.
|
|
|
|
ExternalDNS uses this annotation to determine what services should be registered with DNS. Removing the annotation
|
|
will cause ExternalDNS to remove the corresponding DNS records.
|
|
|
|
Create the deployment and service:
|
|
|
|
```
|
|
$ kubectl create -f nginx.yaml
|
|
```
|
|
|
|
Depending where you run your service it can take a little while for your cloud provider to create an external IP for the service.
|
|
|
|
Once the service has an external IP assigned, ExternalDNS will notice the new service IP address and synchronize
|
|
the Plural DNS records.
|
|
|
|
## Verifying Plural DNS records
|
|
|
|
Check your [Plural domain overview](https://app.plural.sh/account/domains) to view the domains associated with your Plural account. There you can view the records for each domain.
|
|
|
|
The records should show the external IP address of the service as the A record for your domain.
|
|
|
|
## Cleanup
|
|
|
|
Now that we have verified that ExternalDNS will automatically manage Plural DNS records, we can delete the tutorial's example:
|
|
|
|
```
|
|
$ kubectl delete -f nginx.yaml
|
|
$ kubectl delete -f externaldns.yaml
|