Try It Out
In this example we will deploy ExternalDNS on a Kubernetes cluster using the Minimus ExternalDNS Advanced Helm chart. ExternalDNS will automatically create DNS records for Services and Ingresses based on annotations.
Step 1: Start Cluster
If you have a cluster to work with, skip this step. Otherwise, start a Minikube cluster. Deployment instructions
Step 2: Create Namespace
Create a namespace:
kubectl create ns external-dns-advanced
Step 3: Save Values File Locally
Go to the Values tab and save a copy of it locally. You will need to add the flag -f values.yaml to override the defaults when you deploy the chart in the next step.
For testing with the inmemory provider, update your values.yaml to include:
external-dns:
provider:
name: inmemory
txtOwnerId: external-dns-test
interval: 5s
domainFilters:
- internal.example.org
Step 4: Deploy the Helm Chart
Deploy the Minimus Helm chart with the values.yaml file you saved in the previous step:
helm install my-external-dns-advanced oci://helm.mini.dev/external-dns-advanced \
--version 0.1.0 \
-f values.yaml \
-n external-dns-advanced \
--wait
Step 5: Verify ExternalDNS is Running
To check that the pod was successfully created run:
kubectl get pods -n external-dns-advanced -l app.kubernetes.io/name=external-dns
You should see output similar to:
NAME READY STATUS RESTARTS AGE
my-external-dns-advanced-xxxxxxxxx 1/1 Running 0 2m
Step 6: Create a Test Service
Create a test-service and discover its IP:
kubectl create service clusterip test-service --tcp=80:80 -n external-dns-advanced
TEST_SERVICE_IP=$(kubectl get svc test-service -o jsonpath='{.spec.clusterIP}' -n external-dns-advanced)
echo TEST_SERVICE_IP=${TEST_SERVICE_IP}
Step 7: Make the Service Discoverable
First, add variables:
TEST_DOMAIN="internal.example.org"
TEST_SERVICE_NAME="test-service"
INTERNAL_SERVICE_NAME="${TEST_SERVICE_NAME}.${TEST_DOMAIN}"
Annotate the test-service to make it discoverable by external-dns:
kubectl annotate service test-service \
-n external-dns-advanced \
external-dns.alpha.kubernetes.io/internal-hostname="${INTERNAL_SERVICE_NAME}"
Step 8: Verify DNS Record Creation
Wait 5-10 seconds for ExternalDNS to discover and process the test-service.
Since we deployed ExternalDNS with the inmemory provider in the values.yaml file, it will not interact with a real DNS provider. To confirm that a service has been processed, check the pod's logs:
kubectl logs deployment/my-external-dns-advanced -n external-dns-advanced | \
grep "CREATE: ${INTERNAL_SERVICE_NAME} 0 IN A" | \
grep ${TEST_SERVICE_IP} && echo Success
The logs should print the URL of the internal test-service: test-service.internal.example.org, for example:
time="2025-09-26T11:35:54Z" level=info msg="CREATE: test-service.internal.example.org 0 IN A 10.96.209.17 []"
Step 9: Clean Up
Uninstall the chart and delete the namespace to remove all resources, including Pods, Deployments, Services, Secrets, ConfigMaps, etc.:
helm uninstall my-external-dns-advanced -n external-dns-advanced
kubectl delete namespace external-dns-advanced
Terms & Info
Trademark
This catalog is published by Minimus. All product names, logos, and marks, other than those belonging to Minimus, shown are owned by their respective rights holders and appear here only to identify the open source software each image contains. Minimus claims no ownership of those marks and implies no affiliation with, endorsement by, certification by, or sponsorship by any rights holder.
Disclaimer
Images are provided "as-is" without warranty of any kind. "Hardened" refers to the security configuration applied at the time of build and does not constitute a guarantee of ongoing security or absence of vulnerabilities. The free tier is provided without support, SLA, or guaranteed patching timelines. Security updates may be applied to paid subscriptions before or instead of free tier images. By pulling or using any image you agree to our Terms of Use.