mirror of
				https://github.com/kubernetes-sigs/external-dns.git
				synced 2025-10-31 02:31:00 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			182 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Using ExternalDNS with alb-ingress-controller
 | |
| 
 | |
| This tutorial describes how to use ExternalDNS with the [aws-alb-ingress-controller][1].
 | |
| 
 | |
| [1]: https://kubernetes-sigs.github.io/aws-load-balancer-controller
 | |
| 
 | |
| ## Setting up ExternalDNS and aws-alb-ingress-controller
 | |
| 
 | |
| Follow the [AWS tutorial](aws.md) to setup ExternalDNS for use in Kubernetes clusters
 | |
| running in AWS. Specify the `source=ingress` argument so that ExternalDNS will look
 | |
| for hostnames in Ingress objects. In addition, you may wish to limit which Ingress
 | |
| objects are used as an ExternalDNS source via the `ingress-class` argument, but
 | |
| this is not required.
 | |
| 
 | |
| For help setting up the ALB Ingress Controller, follow the [Setup Guide][2].
 | |
| 
 | |
| [2]: https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/deploy/installation/
 | |
| 
 | |
| Note that the ALB ingress controller uses the same tags for [subnet auto-discovery][3]
 | |
| as Kubernetes does with the AWS cloud provider.
 | |
| 
 | |
| [3]: https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/deploy/subnet_discovery/
 | |
| 
 | |
| In the examples that follow, it is assumed that you configured the ALB Ingress
 | |
| Controller with the `ingress-class=alb` argument (not to be confused with the
 | |
| same argument to ExternalDNS) so that the controller will only respect Ingress
 | |
| objects with the `kubernetes.io/ingress.class` annotation set to "alb".
 | |
| 
 | |
| ## Deploy an example application
 | |
| 
 | |
| Create the following sample "echoserver" application to demonstrate how
 | |
| ExternalDNS works with ALB ingress objects.
 | |
| 
 | |
| ```yaml
 | |
| apiVersion: apps/v1
 | |
| kind: Deployment
 | |
| metadata:
 | |
|   name: echoserver
 | |
| spec:
 | |
|   replicas: 1
 | |
|   selector:
 | |
|     matchLabels:
 | |
|       app: echoserver
 | |
|   template:
 | |
|     metadata:
 | |
|       labels:
 | |
|         app: echoserver
 | |
|     spec:
 | |
|       containers:
 | |
|       - image: gcr.io/google_containers/echoserver:1.4
 | |
|         imagePullPolicy: Always
 | |
|         name: echoserver
 | |
|         ports:
 | |
|         - containerPort: 8080
 | |
| ---
 | |
| apiVersion: v1
 | |
| kind: Service
 | |
| metadata:
 | |
|   name: echoserver
 | |
| spec:
 | |
|   ports:
 | |
|     - port: 80
 | |
|       targetPort: 8080
 | |
|       protocol: TCP
 | |
|   type: NodePort
 | |
|   selector:
 | |
|     app: echoserver
 | |
| ```
 | |
| 
 | |
| Note that the Service object is of type `NodePort`. We don't need a Service of
 | |
| type `LoadBalancer` here, since we will be using an Ingress to create an ALB.
 | |
| 
 | |
| ## Ingress examples
 | |
| 
 | |
| Create the following Ingress to expose the echoserver application to the Internet.
 | |
| 
 | |
| ```yaml
 | |
| apiVersion: networking.k8s.io/v1
 | |
| kind: Ingress
 | |
| metadata:
 | |
|   annotations:
 | |
|     alb.ingress.kubernetes.io/scheme: internet-facing
 | |
|     kubernetes.io/ingress.class: alb
 | |
|   name: echoserver
 | |
| spec:
 | |
|   ingressClassName: alb
 | |
|   rules:
 | |
|   - host: echoserver.mycluster.example.org
 | |
|     http: &echoserver_root
 | |
|       paths:
 | |
|       - path: /
 | |
|         backend:
 | |
|           service:
 | |
|             name: echoserver
 | |
|             port:
 | |
|               number: 80
 | |
|         pathType: Prefix
 | |
|   - host: echoserver.example.org
 | |
|     http: *echoserver_root
 | |
| ```
 | |
| 
 | |
| The above should result in the creation of an (ipv4) ALB in AWS which will forward
 | |
| traffic to the echoserver application.
 | |
| 
 | |
| If the `source=ingress` argument is specified, then ExternalDNS will create DNS
 | |
| records based on the hosts specified in ingress objects. The above example would
 | |
| result in two alias records being created, `echoserver.mycluster.example.org` and
 | |
| `echoserver.example.org`, which both alias the ALB that is associated with the
 | |
| Ingress object.
 | |
| 
 | |
| Note that the above example makes use of the YAML anchor feature to avoid having
 | |
| to repeat the http section for multiple hosts that use the exact same paths. If
 | |
| this Ingress object will only be fronting one backend Service, we might instead
 | |
| create the following:
 | |
| 
 | |
| ```yaml
 | |
| apiVersion: networking.k8s.io/v1
 | |
| kind: Ingress
 | |
| metadata:
 | |
|   annotations:
 | |
|     alb.ingress.kubernetes.io/scheme: internet-facing
 | |
|     external-dns.alpha.kubernetes.io/hostname: echoserver.mycluster.example.org, echoserver.example.org
 | |
|     kubernetes.io/ingress.class: alb
 | |
|   name: echoserver
 | |
| spec:
 | |
|   ingressClassName: alb
 | |
|   rules:
 | |
|   - http:
 | |
|       paths:
 | |
|       - path: /
 | |
|         backend:
 | |
|           service:
 | |
|             name: echoserver
 | |
|             port:
 | |
|               number: 80
 | |
|         pathType: Prefix
 | |
| ```
 | |
| 
 | |
| In the above example we create a default path that works for any hostname, and
 | |
| make use of the `external-dns.alpha.kubernetes.io/hostname` annotation to create
 | |
| multiple aliases for the resulting ALB.
 | |
| 
 | |
| ## Dualstack ALBs
 | |
| 
 | |
| AWS [supports][4] both IPv4 and "dualstack" (both IPv4 and IPv6) interfaces for ALBs.
 | |
| The ALB ingress controller uses the `alb.ingress.kubernetes.io/ip-address-type`
 | |
| annotation (which defaults to `ipv4`) to determine this. If this annotation is
 | |
| set to `dualstack` then ExternalDNS will create two alias records (one A record
 | |
| and one AAAA record) for each hostname associated with the Ingress object.
 | |
| 
 | |
| [4]: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#ip-address-type
 | |
| 
 | |
| Example:
 | |
| 
 | |
| ```yaml
 | |
| apiVersion: networking.k8s.io/v1
 | |
| kind: Ingress
 | |
| metadata:
 | |
|   annotations:
 | |
|     alb.ingress.kubernetes.io/scheme: internet-facing
 | |
|     alb.ingress.kubernetes.io/ip-address-type: dualstack
 | |
|     kubernetes.io/ingress.class: alb
 | |
|   name: echoserver
 | |
| spec:
 | |
|   ingressClassName: alb
 | |
|   rules:
 | |
|   - host: echoserver.example.org
 | |
|     http:
 | |
|       paths:
 | |
|       - path: /
 | |
|         backend:
 | |
|           service:
 | |
|             name: echoserver
 | |
|             port:
 | |
|               number: 80
 | |
|         pathType: Prefix
 | |
| ```
 | |
| 
 | |
| The above Ingress object will result in the creation of an ALB with a dualstack
 | |
| interface. ExternalDNS will create both an A `echoserver.example.org` record and
 | |
| an AAAA record of the same name, that each are aliases for the same ALB.
 |