-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
shashidharatd
committed
Aug 17, 2018
1 parent
90e3653
commit bb5401e
Showing
4 changed files
with
176 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
# CRD Source | ||
|
||
CRD source provides a generic mechanism to manage DNS records in your favourite DNS provider supported by external-dns. | ||
|
||
### Details | ||
|
||
CRD source watches for the user specified CRD to extract [Endpoints](https://github.com/kubernetes-incubator/external-dns/blob/master/endpoint/endpoint.go) from its `Spec`. | ||
So users need to create such a CRD and register it to the kubernetes cluster and then create new object(s) of the CRD specifying the Endpoints. | ||
|
||
### Registering CRD | ||
|
||
Here is typical example of CRD which provides Endpoints to `CRD source`: | ||
|
||
```go | ||
type TTL int64 | ||
type Targets []string | ||
type ProviderSpecific map[string]string | ||
|
||
type Endpoint struct { | ||
// The hostname of the DNS record | ||
DNSName string `json:"dnsName,omitempty"` | ||
// The targets the DNS record points to | ||
Targets Targets `json:"targets,omitempty"` | ||
// RecordType type of record, e.g. CNAME, A, SRV, TXT etc | ||
RecordType string `json:"recordType,omitempty"` | ||
// TTL for the record | ||
RecordTTL TTL `json:"recordTTL,omitempty"` | ||
// Labels stores labels defined for the Endpoint | ||
// +optional | ||
Labels Labels `json:"labels,omitempty"` | ||
// ProviderSpecific stores provider specific config | ||
// +optional | ||
ProviderSpecific ProviderSpecific `json:"providerSpecific,omitempty"` | ||
} | ||
|
||
type DNSEndpointSpec struct { | ||
Endpoints []*Endpoint `json:"endpoints,omitempty"` | ||
} | ||
|
||
type DNSEndpointStatus struct { | ||
// The generation observed by the external-dns controller. | ||
// +optional | ||
ObservedGeneration int64 `json:"observedGeneration,omitempty"` | ||
} | ||
|
||
// +genclient | ||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object | ||
|
||
// DNSEndpoint is the CRD wrapper for Endpoint | ||
// +k8s:openapi-gen=true | ||
// +kubebuilder:resource:path=dnsendpoints | ||
// +kubebuilder:subresource:status | ||
type DNSEndpoint struct { | ||
metav1.TypeMeta `json:",inline"` | ||
metav1.ObjectMeta `json:"metadata,omitempty"` | ||
|
||
Spec DNSEndpointSpec `json:"spec,omitempty"` | ||
Status DNSEndpointStatus `json:"status,omitempty"` | ||
} | ||
|
||
``` | ||
|
||
Refer to [kubebuilder](https://github.com/kubernetes-sigs/kubebuilder) to create and register the CRD. | ||
|
||
### Usage | ||
|
||
One can use CRD source by specifying `--source` flag with `crd` and specifying the ApiVersion and Kind of the CRD with `--crd-source-apiversion` and `crd-source-kind` respectively. | ||
for e.g: | ||
|
||
``` | ||
$ build/external-dns --source crd --crd-source-apiversion externaldns.k8s.io/v1alpha1 --crd-source-kind DNSEndpoint --provider inmemory --once --dry-run | ||
``` | ||
|
||
### Creating DNS Records | ||
|
||
Create the objects of CRD type by filing in the fields of CRD and DNS record would be created accordingly. | ||
|
||
### Example | ||
|
||
Here is an example [CRD manifest](crd-source/crd-manifest.yaml) generated by kubebuilder. | ||
Apply this to register the CRD | ||
|
||
``` | ||
$ kubectl apply --validate=false -f docs/contributing/crd-source/crd-manifest.yaml | ||
customresourcedefinition.apiextensions.k8s.io "dnsendpoints.externaldns.k8s.io" created | ||
``` | ||
|
||
Then you can create the dns-endpoint yaml similar to [dnsendpoint-example](crd-source/dnsendpoint-example.yaml) | ||
|
||
``` | ||
$ kubectl apply -f docs/contributing/crd-source/dnsendpoint-example.yaml | ||
dnsendpoint.externaldns.k8s.io "examplednsrecord" created | ||
``` | ||
|
||
Run external-dns in dry-mode to see whether external-dns picks up the DNS record from CRD. | ||
|
||
``` | ||
$ build/external-dns --source crd --crd-source-apiversion externaldns.k8s.io/v1alpha1 --crd-source-kind DNSEndpoint --provider inmemory --once --dry-run | ||
INFO[0000] config: {Master: KubeConfig: Sources:[crd] Namespace: AnnotationFilter: FQDNTemplate: CombineFQDNAndAnnotation:false Compatibility: PublishInternal:false PublishHostIP:false ConnectorSourceServer:localhost:8080 Provider:inmemory GoogleProject: DomainFilter:[] ZoneIDFilter:[] AWSZoneType: AWSAssumeRole: AWSMaxChangeCount:4000 AWSEvaluateTargetHealth:true AzureConfigFile:/etc/kubernetes/azure.json AzureResourceGroup: CloudflareProxied:false InfobloxGridHost: InfobloxWapiPort:443 InfobloxWapiUsername:admin InfobloxWapiPassword: InfobloxWapiVersion:2.3.1 InfobloxSSLVerify:true DynCustomerName: DynUsername: DynPassword: DynMinTTLSeconds:0 OCIConfigFile:/etc/kubernetes/oci.yaml InMemoryZones:[] PDNSServer:http://localhost:8081 PDNSAPIKey: PDNSTLSEnabled:false TLSCA: TLSClientCert: TLSClientCertKey: Policy:sync Registry:txt TXTOwnerID:default TXTPrefix: Interval:1m0s Once:true DryRun:true LogFormat:text MetricsAddress::7979 LogLevel:info TXTCacheInterval:0s ExoscaleEndpoint:https://api.exoscale.ch/dns ExoscaleAPIKey: ExoscaleAPISecret: CRDSourceAPIVersion:externaldns.k8s.io/v1alpha1 CRDSourceKind:DNSEndpoint} | ||
INFO[0000] running in dry-run mode. No changes to DNS records will be made. | ||
INFO[0000] Connected to cluster at https://192.168.99.100:8443 | ||
INFO[0000] CREATE: foo.bar.com 180 IN A 192.168.99.216 | ||
INFO[0000] CREATE: foo.bar.com 0 IN TXT "heritage=external-dns,external-dns/owner=default" | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
apiVersion: apiextensions.k8s.io/v1beta1 | ||
kind: CustomResourceDefinition | ||
metadata: | ||
creationTimestamp: null | ||
labels: | ||
api: externaldns | ||
kubebuilder.k8s.io: 1.0.0 | ||
name: dnsendpoints.externaldns.k8s.io | ||
spec: | ||
group: externaldns.k8s.io | ||
names: | ||
kind: DNSEndpoint | ||
plural: dnsendpoints | ||
scope: Namespaced | ||
subresources: | ||
status: {} | ||
validation: | ||
openAPIV3Schema: | ||
properties: | ||
apiVersion: | ||
type: string | ||
kind: | ||
type: string | ||
metadata: | ||
type: object | ||
spec: | ||
properties: | ||
endpoints: | ||
items: | ||
properties: | ||
dnsName: | ||
type: string | ||
labels: | ||
type: object | ||
providerSpecific: | ||
type: object | ||
recordTTL: | ||
format: int64 | ||
type: integer | ||
recordType: | ||
type: string | ||
targets: | ||
items: | ||
type: string | ||
type: array | ||
type: object | ||
type: array | ||
type: object | ||
status: | ||
properties: | ||
observedGeneration: | ||
format: int64 | ||
type: integer | ||
type: object | ||
version: v1alpha1 | ||
status: | ||
acceptedNames: | ||
kind: "" | ||
plural: "" | ||
conditions: null |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
apiVersion: externaldns.k8s.io/v1alpha1 | ||
kind: DNSEndpoint | ||
metadata: | ||
name: examplednsrecord | ||
spec: | ||
endpoints: | ||
- dnsName: foo.bar.com | ||
recordTTL: 180 | ||
recordType: A | ||
targets: | ||
- 192.168.99.216 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters