ExternalDNS Demo With Multiple Hosts¶
Simply add the external-dns.alpha.kubernetes.io/hostname annotation to either the kubernetes Ingress or Service, and ExternalDNS will use this information to create corresponding Route 53 records.
Let's see this in action!
Prerequisite¶
To follow this tutorial, you'll require a domain and, additionally, an SSL certificate for the domain and its subdomains.
-
Register a Route 53 Domain
Go to AWS Console and register a Route 53 domain. You can opt for a cheaper TLD (top level domain) such as
.linkNote
It usually takes about 10 minutes but it might take about an hour for the registered domain to become available.
-
Request a Public Certificate
Visit AWS Certificate Manager in AWS Console and request a public certificate for your domain and all the subdomains. For example, if you registered for a domain
example.comthen request certificate forexample.comand*.example.comNote
Make sure you request the certificate in the region where your EKS cluster is in.
-
Validate the Certificate
Validate the requested certificate by adding
CNAMErecords in Route 53. It is a very simple process. Go to the certificate you created and click onCreate records in Route 53. TheCNAMEswill be automatically added to Route 53.Note
It usually takes about 5 minutes but it might take about an hour for the certificate to be ready for use.
Now that you have everything you need, let's move on to the demonstration.
Docker Images¶
Here are the Docker Images used in this tutorial:
Note
reyanshkharga/nodeapp:v1 runs on port 5000 and has the following routes:
GET /Returns host info and app versionGET /healthReturns health status of the appGET /randomReturns a randomly generated number between 1 and 10
reyanshkharga/reactapp:v1 is a frontend app that runs on port 3000.
Objective¶
In this example we will have 2 microservices:
backend: uses docker imagereyanshkharga/nodeapp:v1frontend: uses docker imagereyanshkharga/reactapp:v1
We'll do the following:
- Create a deployment and service for
backendmicroservice. - Create a deployment and service for
frontendmicroservice. - Create a ingress that sends traffic to one of the microservices based on the host.
- We'll also provide separate ExternalDNS configuration for each microservice using
external-dns.alpha.kubernetes.io/hostnameannotation in the service definition of each microservice.
Step 1: Create Kubernetes Objects¶
Let's create the kubernetes objects as discussed above:
Observe that we have provided the ExternalDNS configuration for each of the microservices using the external-dns.alpha.kubernetes.io/hostname annotation.
Assuming your folder structure looks like the one below:
Let's apply the manifests to create the kubernetes objects:
This will create the following resources:
- Deployment and service for
backendmicroservice. - Deployment and service for
frontendmicroservice. - Ingress with two rules.
Step 2: Verify Kubernetes Objects¶
# List pods
kubectl get pods
# List deployments
kubectl get deployments
# List services
kubectl get svc
# List ingress
kubectl get ingress
Step 3: Verify AWS Resources in AWS Console¶
Visit the AWS console and verify the resources created by AWS Load Balancer Controller.
Also, go to AWS Route 53 and verify the records (api.example.com and app.example.com) that were added by ExternalDNS.
You can also check the events that external-dns pod performs:
Step 4: Access App Using Route 53 DNS¶
Once the load balancer is in Active state, you can hit the subdomains you created in Route 53 and verify if everything is working properly.
Try accessing the following hosts:
Note
For this demo, we have not enabled SSL to maintain the focus on the ExternalDNS annotation. However, you can add SSL-specific annotations to enable SSL if needed.
Clean Up¶
Assuming your folder structure looks like the one below:
Let's delete all the resources we created:
The Route 53 records will also be deleted when the ingress or service is deleted.