mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-27 11:51:00 +02:00
Merge branch 'kubernetes-sigs:master' into hetzner-readme-link
This commit is contained in:
commit
45a1ee7f1f
2
.github/workflows/gh-workflow-approve.yaml
vendored
2
.github/workflows/gh-workflow-approve.yaml
vendored
@ -17,7 +17,7 @@ jobs:
|
|||||||
actions: write
|
actions: write
|
||||||
steps:
|
steps:
|
||||||
- name: Update PR
|
- name: Update PR
|
||||||
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1
|
uses: actions/github-script@e69ef5462fd455e02edcaf4dd7708eda96b9eda0 # v7.0.0
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@ -16,13 +16,13 @@ The following table documents which sources support which annotations:
|
|||||||
| Gloo | | | | Yes | Yes[^5] | Yes[^5] |
|
| Gloo | | | | Yes | Yes[^5] | Yes[^5] |
|
||||||
| Ingress | Yes | Yes[^1] | | Yes | Yes | Yes |
|
| Ingress | Yes | Yes[^1] | | Yes | Yes | Yes |
|
||||||
| Istio | Yes | Yes[^1] | | Yes | Yes | Yes |
|
| Istio | Yes | Yes[^1] | | Yes | Yes | Yes |
|
||||||
| Kong | | Yes | | Yes | Yes | Yes |
|
| Kong | | Yes[^1] | | Yes | Yes | Yes |
|
||||||
| Node | Yes | | | Yes | Yes | |
|
| Node | Yes | | | Yes | Yes | |
|
||||||
| OpenShift | Yes | Yes[^1] | | Yes | Yes | Yes |
|
| OpenShift | Yes | Yes[^1] | | Yes | Yes | Yes |
|
||||||
| Pod | | Yes | Yes | Yes | | |
|
| Pod | | Yes | Yes | Yes | | |
|
||||||
| Service | Yes | Yes[^1] | Yes[^1][^2] | Yes[^3] | Yes | Yes |
|
| Service | Yes | Yes[^1] | Yes[^1][^2] | Yes[^3] | Yes | Yes |
|
||||||
| Skipper | Yes | Yes[^1] | | Yes | Yes | Yes |
|
| Skipper | Yes | Yes[^1] | | Yes | Yes | Yes |
|
||||||
| Traefik | | Yes | | Yes | Yes | Yes |
|
| Traefik | | Yes[^1] | | Yes | Yes | Yes |
|
||||||
|
|
||||||
[^1]: Unless the `--ignore-hostname-annotation` flag is specified.
|
[^1]: Unless the `--ignore-hostname-annotation` flag is specified.
|
||||||
[^2]: Only behaves differently than `hostname` for `Service`s of type `ClusterIP` or `LoadBalancer`.
|
[^2]: Only behaves differently than `hostname` for `Service`s of type `ClusterIP` or `LoadBalancer`.
|
||||||
|
@ -209,7 +209,7 @@ $ docker run \
|
|||||||
-e EXTERNAL_DNS_SOURCE=$'service\ningress' \
|
-e EXTERNAL_DNS_SOURCE=$'service\ningress' \
|
||||||
-e EXTERNAL_DNS_PROVIDER=google \
|
-e EXTERNAL_DNS_PROVIDER=google \
|
||||||
-e EXTERNAL_DNS_DOMAIN_FILTER=$'foo.com\nbar.com' \
|
-e EXTERNAL_DNS_DOMAIN_FILTER=$'foo.com\nbar.com' \
|
||||||
registry.k8s.io/external-dns/external-dns:v0.13.5
|
registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
time="2017-08-08T14:10:26Z" level=info msg="config: &{APIServerURL: KubeConfig: Sources:[service ingress] Namespace: ...
|
time="2017-08-08T14:10:26Z" level=info msg="config: &{APIServerURL: KubeConfig: Sources:[service ingress] Namespace: ...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ You must be an official maintainer of the project to be able to do a release.
|
|||||||
- Branch out from the default branch and run `scripts/kustomize-version-updater.sh` to update the image tag used in the kustomization.yaml.
|
- Branch out from the default branch and run `scripts/kustomize-version-updater.sh` to update the image tag used in the kustomization.yaml.
|
||||||
- Create an issue to release the corresponding Helm chart via the chart release process (below) assigned to a chart maintainer
|
- Create an issue to release the corresponding Helm chart via the chart release process (below) assigned to a chart maintainer
|
||||||
- Create a PR with the kustomize change.
|
- Create a PR with the kustomize change.
|
||||||
- Create a PR to replace all versions for docker images in the tutorials. A possible script to use is `sd registry.k8s.io/external-dns/external-dns:.* registry.k8s.io/external-dns/external-dns:v0.13.2 $(fd --type file)` which uses the `fd` and `sd` utilities.
|
- Create a PR to replace all versions for docker images in the tutorials. A possible script to use is `sd registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
- Once the PR is merged, all is done :-)
|
- Once the PR is merged, all is done :-)
|
||||||
|
|
||||||
## How to release a new chart version
|
## How to release a new chart version
|
||||||
|
@ -106,5 +106,6 @@ as one of the values.
|
|||||||
|
|
||||||
### ExternalName
|
### ExternalName
|
||||||
|
|
||||||
Creates a target with the value of the Service's `externalName` field.
|
1. If the Service has one or more `spec.externalIPs`, uses the values in that field.
|
||||||
|
2. Otherwise, creates a target with the value of the Service's `externalName` field.
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ spec:
|
|||||||
- name: external-dns
|
- name: external-dns
|
||||||
# You will need to check what the latest version is yourself:
|
# You will need to check what the latest version is yourself:
|
||||||
# https://github.com/kubernetes-sigs/external-dns/releases
|
# https://github.com/kubernetes-sigs/external-dns/releases
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
# (optional) limit to only example.com domains; change to match the
|
# (optional) limit to only example.com domains; change to match the
|
||||||
@ -114,7 +114,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
# (optional) limit to only example.com domains; change to match the
|
# (optional) limit to only example.com domains; change to match the
|
||||||
|
@ -57,7 +57,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # or ingress or both
|
- --source=service # or ingress or both
|
||||||
- --provider=akamai
|
- --provider=akamai
|
||||||
@ -143,7 +143,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # or ingress or both
|
- --source=service # or ingress or both
|
||||||
- --provider=akamai
|
- --provider=akamai
|
||||||
|
@ -113,7 +113,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -187,7 +187,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
|
@ -81,7 +81,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
env:
|
env:
|
||||||
- name: AWS_REGION
|
- name: AWS_REGION
|
||||||
value: us-east-1 # put your CloudMap NameSpace region
|
value: us-east-1 # put your CloudMap NameSpace region
|
||||||
@ -148,7 +148,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
env:
|
env:
|
||||||
- name: AWS_REGION
|
- name: AWS_REGION
|
||||||
value: us-east-1 # put your CloudMap NameSpace region
|
value: us-east-1 # put your CloudMap NameSpace region
|
||||||
|
@ -414,7 +414,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -509,7 +509,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -962,7 +962,7 @@ A simple way to implement randomised startup is with an init container:
|
|||||||
spec:
|
spec:
|
||||||
initContainers:
|
initContainers:
|
||||||
- name: init-jitter
|
- name: init-jitter
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
- -c
|
- -c
|
||||||
|
@ -130,7 +130,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: externaldns
|
- name: externaldns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -201,7 +201,7 @@ spec:
|
|||||||
serviceAccountName: externaldns
|
serviceAccountName: externaldns
|
||||||
containers:
|
containers:
|
||||||
- name: externaldns
|
- name: externaldns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -272,7 +272,7 @@ spec:
|
|||||||
serviceAccountName: externaldns
|
serviceAccountName: externaldns
|
||||||
containers:
|
containers:
|
||||||
- name: externaldns
|
- name: externaldns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
|
@ -489,7 +489,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -557,7 +557,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -628,7 +628,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
|
@ -46,7 +46,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --log-level=debug
|
- --log-level=debug
|
||||||
- --source=service
|
- --source=service
|
||||||
@ -136,7 +136,7 @@ spec:
|
|||||||
secretName: bluecatconfig
|
secretName: bluecatconfig
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: bluecatconfig
|
- name: bluecatconfig
|
||||||
mountPath: "/etc/external-dns/"
|
mountPath: "/etc/external-dns/"
|
||||||
|
@ -40,7 +40,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -104,7 +104,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -56,7 +56,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -125,7 +125,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -24,7 +24,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -93,7 +93,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
|
@ -108,7 +108,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
- --provider=coredns
|
- --provider=coredns
|
||||||
@ -175,7 +175,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
- --provider=coredns
|
- --provider=coredns
|
||||||
|
@ -59,7 +59,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -136,7 +136,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -43,7 +43,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -107,7 +107,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -35,7 +35,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone you create in DNSimple.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone you create in DNSimple.
|
||||||
@ -100,7 +100,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone you create in DNSimple.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone you create in DNSimple.
|
||||||
|
@ -43,7 +43,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
- --txt-prefix=_d
|
- --txt-prefix=_d
|
||||||
|
@ -40,7 +40,7 @@ spec:
|
|||||||
# serviceAccountName: external-dns
|
# serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=ingress # or service or both
|
- --source=ingress # or service or both
|
||||||
- --provider=exoscale
|
- --provider=exoscale
|
||||||
|
@ -27,7 +27,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --log-level=debug
|
- --log-level=debug
|
||||||
- --source=service
|
- --source=service
|
||||||
|
@ -39,7 +39,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -103,7 +103,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -72,7 +72,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
# Add desired Gateway API Route sources.
|
# Add desired Gateway API Route sources.
|
||||||
- --source=gateway-httproute
|
- --source=gateway-httproute
|
||||||
|
@ -319,7 +319,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
|
@ -22,7 +22,7 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
# update this to the desired external-dns version
|
# update this to the desired external-dns version
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=gloo-proxy
|
- --source=gloo-proxy
|
||||||
- --gloo-namespace=custom-gloo-system # gloo system namespace. Specify multiple times for multiple namespaces. Omit to use the default (gloo-system)
|
- --gloo-namespace=custom-gloo-system # gloo system namespace. Specify multiple times for multiple namespaces. Omit to use the default (gloo-system)
|
||||||
@ -90,7 +90,7 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
# update this to the desired external-dns version
|
# update this to the desired external-dns version
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=gloo-proxy
|
- --source=gloo-proxy
|
||||||
- --gloo-namespace=custom-gloo-system # gloo system namespace. Specify multiple times for multiple namespaces. Omit to use the default (gloo-system)
|
- --gloo-namespace=custom-gloo-system # gloo system namespace. Specify multiple times for multiple namespaces. Omit to use the default (gloo-system)
|
||||||
|
@ -44,7 +44,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -115,7 +115,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -31,7 +31,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --log-level=debug
|
- --log-level=debug
|
||||||
- --source=service
|
- --source=service
|
||||||
@ -96,7 +96,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --log-level=debug
|
- --log-level=debug
|
||||||
- --source=service
|
- --source=service
|
||||||
|
@ -69,7 +69,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -142,7 +142,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -69,7 +69,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains.
|
- --domain-filter=example.com # (optional) limit to only example.com domains.
|
||||||
@ -150,7 +150,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains.
|
- --domain-filter=example.com # (optional) limit to only example.com domains.
|
||||||
|
@ -28,7 +28,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -98,7 +98,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
|
@ -22,7 +22,7 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
# update this to the desired external-dns version
|
# update this to the desired external-dns version
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=kong-tcpingress
|
- --source=kong-tcpingress
|
||||||
- --provider=aws
|
- --provider=aws
|
||||||
@ -86,7 +86,7 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
# update this to the desired external-dns version
|
# update this to the desired external-dns version
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=kong-tcpingress
|
- --source=kong-tcpingress
|
||||||
- --provider=aws
|
- --provider=aws
|
||||||
|
@ -41,7 +41,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -105,7 +105,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -273,7 +273,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
- --domain-filter=external-dns-test.gcp.zalan.do
|
- --domain-filter=external-dns-test.gcp.zalan.do
|
||||||
@ -568,7 +568,7 @@ spec:
|
|||||||
- --google-project=zalando-external-dns-test
|
- --google-project=zalando-external-dns-test
|
||||||
- --registry=txt
|
- --registry=txt
|
||||||
- --txt-owner-id=my-identifier
|
- --txt-owner-id=my-identifier
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
name: external-dns
|
name: external-dns
|
||||||
securityContext:
|
securityContext:
|
||||||
fsGroup: 65534
|
fsGroup: 65534
|
||||||
|
@ -29,7 +29,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=node # will use nodes as source
|
- --source=node # will use nodes as source
|
||||||
- --provider=aws
|
- --provider=aws
|
||||||
@ -100,7 +100,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=node # will use nodes as source
|
- --source=node # will use nodes as source
|
||||||
- --provider=aws
|
- --provider=aws
|
||||||
|
@ -61,7 +61,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -125,7 +125,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -66,7 +66,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=openshift-route
|
- --source=openshift-route
|
||||||
- --domain-filter=external-dns-test.my-org.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
|
- --domain-filter=external-dns-test.my-org.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
|
||||||
@ -133,7 +133,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=openshift-route
|
- --source=openshift-route
|
||||||
- --domain-filter=external-dns-test.my-org.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
|
- --domain-filter=external-dns-test.my-org.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
|
||||||
|
@ -170,7 +170,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -180,6 +180,9 @@ spec:
|
|||||||
# Specifies the OCI DNS Zone scope, defaults to GLOBAL.
|
# Specifies the OCI DNS Zone scope, defaults to GLOBAL.
|
||||||
# May be GLOBAL, PRIVATE, or an empty value to specify both GLOBAL and PRIVATE OCI DNS Zones
|
# May be GLOBAL, PRIVATE, or an empty value to specify both GLOBAL and PRIVATE OCI DNS Zones
|
||||||
# - --oci-zone-scope=GLOBAL
|
# - --oci-zone-scope=GLOBAL
|
||||||
|
# Specifies the zone cache duration, defaults to 0s. If set to 0s, the zone cache is disabled.
|
||||||
|
# Use of zone caching is recommended to reduce the amount of requests sent to OCI DNS.
|
||||||
|
# - --oci-zones-cache-duration=0s
|
||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: config
|
- name: config
|
||||||
mountPath: /etc/kubernetes/
|
mountPath: /etc/kubernetes/
|
||||||
|
@ -91,7 +91,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -165,7 +165,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -42,7 +42,7 @@ spec:
|
|||||||
# serviceAccountName: external-dns
|
# serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # or ingress or both
|
- --source=service # or ingress or both
|
||||||
- --provider=pdns
|
- --provider=pdns
|
||||||
|
@ -81,7 +81,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
# If authentication is disabled and/or you didn't create
|
# If authentication is disabled and/or you didn't create
|
||||||
# a secret, you can remove this block.
|
# a secret, you can remove this block.
|
||||||
envFrom:
|
envFrom:
|
||||||
|
@ -35,7 +35,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -105,7 +105,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -243,7 +243,7 @@ spec:
|
|||||||
- --txt-owner-id=external-dns
|
- --txt-owner-id=external-dns
|
||||||
- --ingress-class=external-ingress
|
- --ingress-class=external-ingress
|
||||||
- --aws-zone-type=public
|
- --aws-zone-type=public
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
name: external-dns-public
|
name: external-dns-public
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ spec:
|
|||||||
- --txt-owner-id=dev.k8s.nexus
|
- --txt-owner-id=dev.k8s.nexus
|
||||||
- --ingress-class=internal-ingress
|
- --ingress-class=internal-ingress
|
||||||
- --aws-zone-type=private
|
- --aws-zone-type=private
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
name: external-dns-private
|
name: external-dns-private
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -120,7 +120,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -54,7 +54,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
- --provider=rdns
|
- --provider=rdns
|
||||||
@ -123,7 +123,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
- --provider=rdns
|
- --provider=rdns
|
||||||
|
@ -218,7 +218,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --registry=txt
|
- --registry=txt
|
||||||
- --txt-prefix=external-dns-
|
- --txt-prefix=external-dns-
|
||||||
@ -261,7 +261,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --registry=txt
|
- --registry=txt
|
||||||
- --txt-prefix=external-dns-
|
- --txt-prefix=external-dns-
|
||||||
|
@ -60,7 +60,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -140,7 +140,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
@ -20,7 +20,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- ... # your arguments here
|
- ... # your arguments here
|
||||||
securityContext:
|
securityContext:
|
||||||
|
@ -129,7 +129,7 @@ spec:
|
|||||||
- --policy=sync # set `upsert-only` would prevent ExternalDNS from deleting any records
|
- --policy=sync # set `upsert-only` would prevent ExternalDNS from deleting any records
|
||||||
- --tencent-cloud-zone-type=private # only look at private hosted zones. set `public` to use the public dns service.
|
- --tencent-cloud-zone-type=private # only look at private hosted zones. set `public` to use the public dns service.
|
||||||
- --tencent-cloud-config-file=/etc/kubernetes/tencent-cloud.json
|
- --tencent-cloud-config-file=/etc/kubernetes/tencent-cloud.json
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
imagePullPolicy: Always
|
imagePullPolicy: Always
|
||||||
name: external-dns
|
name: external-dns
|
||||||
resources: {}
|
resources: {}
|
||||||
|
@ -24,7 +24,7 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
# update this to the desired external-dns version
|
# update this to the desired external-dns version
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.3
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=traefik-proxy
|
- --source=traefik-proxy
|
||||||
- --provider=aws
|
- --provider=aws
|
||||||
@ -87,7 +87,7 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
# update this to the desired external-dns version
|
# update this to the desired external-dns version
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.3
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=traefik-proxy
|
- --source=traefik-proxy
|
||||||
- --provider=aws
|
- --provider=aws
|
||||||
|
@ -36,7 +36,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains
|
- --domain-filter=example.com # (optional) limit to only example.com domains
|
||||||
@ -107,7 +107,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains
|
- --domain-filter=example.com # (optional) limit to only example.com domains
|
||||||
|
@ -6,7 +6,7 @@ For this tutorial, please make sure that you are using a version **> 0.7.2** of
|
|||||||
|
|
||||||
## Managing DNS with UltraDNS
|
## Managing DNS with UltraDNS
|
||||||
|
|
||||||
If you would like to read-up on the UltraDNS service, you can find additional details here: [Introduction to UltraDNS](https://docs.ultradns.neustar)
|
If you would like to read-up on the UltraDNS service, you can find additional details here: [Introduction to UltraDNS](https://docs.ultradns.com/)
|
||||||
|
|
||||||
Before proceeding, please create a new DNS Zone that you will create your records in for this tutorial process. For the examples in this tutorial, we will be using `example.com` as our Zone.
|
Before proceeding, please create a new DNS Zone that you will create your records in for this tutorial process. For the examples in this tutorial, we will be using `example.com` as our Zone.
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress # ingress is also possible
|
- --source=ingress # ingress is also possible
|
||||||
@ -116,7 +116,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service
|
- --source=service
|
||||||
- --source=ingress
|
- --source=ingress
|
||||||
@ -191,9 +191,9 @@ Once the service has an external IP assigned, ExternalDNS will notice the new se
|
|||||||
|
|
||||||
## Verifying UltraDNS Records
|
## Verifying UltraDNS Records
|
||||||
|
|
||||||
Please verify on the [UltraDNS UI](https://portal.ultradns.neustar) that the records are created under the zone "example.com".
|
Please verify on the [UltraDNS UI](https://portal.ultradns.com/login) that the records are created under the zone "example.com".
|
||||||
|
|
||||||
For more information on UltraDNS UI, refer to (https://docs.ultradns.neustar/mspuserguide.html).
|
For more information on UltraDNS UI, refer to (https://docs.ultradns.com/Content/MSP_User_Guide/Content/User%20Guides/MSP_User_Guide/Navigation/Moving%20Around%20the%20UI.htm#_Toc2780722).
|
||||||
|
|
||||||
Select the zone that was created above (or select the appropriate zone if a different zone was used.)
|
Select the zone that was created above (or select the appropriate zone if a different zone was used.)
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ $ kubectl create -f expose-apple-banana-app.yaml
|
|||||||
$ kubectl create -f external-dns.yaml
|
$ kubectl create -f external-dns.yaml
|
||||||
```
|
```
|
||||||
- Depending on where you run your service from, it can take a few minutes for your cloud provider to create an external IP for the service.
|
- Depending on where you run your service from, it can take a few minutes for your cloud provider to create an external IP for the service.
|
||||||
- Please verify on the [UltraDNS UI](https://portal.ultradns.neustar) that the records have been created under the zone "example.com".
|
- Please verify on the [UltraDNS UI](https://portal.ultradns.com/login) that the records have been created under the zone "example.com".
|
||||||
- Finally, you will need to clean up the deployment and service. Please verify on the UI afterwards that the records have been deleted from the zone "example.com":
|
- Finally, you will need to clean up the deployment and service. Please verify on the UI afterwards that the records have been deleted from the zone "example.com":
|
||||||
```console
|
```console
|
||||||
$ kubectl delete -f apple-banana-echo.yaml
|
$ kubectl delete -f apple-banana-echo.yaml
|
||||||
@ -358,7 +358,7 @@ $ kubectl create -f apple-banana-echo.yaml
|
|||||||
$ kubectl create -f external-dns.yaml
|
$ kubectl create -f external-dns.yaml
|
||||||
```
|
```
|
||||||
- Depending on where you run your service from, it can take a few minutes for your cloud provider to create an external IP for the service.
|
- Depending on where you run your service from, it can take a few minutes for your cloud provider to create an external IP for the service.
|
||||||
- Please verify on the [UltraDNS UI](https://portal.ultradns.neustar), that the records have been created under the zone "example.com".
|
- Please verify on the [UltraDNS UI](https://portal.ultradns.com/login), that the records have been created under the zone "example.com".
|
||||||
- Finally, you will need to clean up the deployment and service. Please verify on the UI afterwards that the records have been deleted from the zone "example.com":
|
- Finally, you will need to clean up the deployment and service. Please verify on the UI afterwards that the records have been deleted from the zone "example.com":
|
||||||
```console
|
```console
|
||||||
$ kubectl delete -f apple-banana-echo.yaml
|
$ kubectl delete -f apple-banana-echo.yaml
|
||||||
@ -629,7 +629,7 @@ $ kubectl create -f apple-banana-echo.yaml
|
|||||||
$ kubectl create -f external-dns.yaml
|
$ kubectl create -f external-dns.yaml
|
||||||
```
|
```
|
||||||
- Depending on where you run your service from, it can take a few minutes for your cloud provider to create an external IP for the service.
|
- Depending on where you run your service from, it can take a few minutes for your cloud provider to create an external IP for the service.
|
||||||
- Please verify on the [UltraDNS UI](https://portal.ultradns.neustar), that the records have been created under the zone "example.com".
|
- Please verify on the [UltraDNS UI](https://portal.ultradns.com/login), that the records have been created under the zone "example.com".
|
||||||
- Finally, you will need to clean up the deployment and service. Please verify on the UI afterwards that the records have been deleted from the zone "example.com":
|
- Finally, you will need to clean up the deployment and service. Please verify on the UI afterwards that the records have been deleted from the zone "example.com":
|
||||||
```console
|
```console
|
||||||
$ kubectl delete -f apple-banana-echo.yaml
|
$ kubectl delete -f apple-banana-echo.yaml
|
||||||
|
@ -66,7 +66,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --provider=vinyldns
|
- --provider=vinyldns
|
||||||
- --source=service
|
- --source=service
|
||||||
@ -137,7 +137,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --provider=vinyldns
|
- --provider=vinyldns
|
||||||
- --source=service
|
- --source=service
|
||||||
|
@ -42,7 +42,7 @@ spec:
|
|||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
@ -106,7 +106,7 @@ spec:
|
|||||||
serviceAccountName: external-dns
|
serviceAccountName: external-dns
|
||||||
containers:
|
containers:
|
||||||
- name: external-dns
|
- name: external-dns
|
||||||
image: registry.k8s.io/external-dns/external-dns:v0.13.5
|
image: registry.k8s.io/external-dns/external-dns:v0.14.0
|
||||||
args:
|
args:
|
||||||
- --source=service # ingress is also possible
|
- --source=service # ingress is also possible
|
||||||
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
- --domain-filter=example.com # (optional) limit to only example.com domains; change to match the zone created above.
|
||||||
|
4
go.mod
4
go.mod
@ -13,7 +13,7 @@ require (
|
|||||||
github.com/IBM/go-sdk-core/v5 v5.13.4
|
github.com/IBM/go-sdk-core/v5 v5.13.4
|
||||||
github.com/IBM/networking-go-sdk v0.42.2
|
github.com/IBM/networking-go-sdk v0.42.2
|
||||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2
|
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2
|
||||||
github.com/alecthomas/kingpin v2.2.6+incompatible
|
github.com/alecthomas/kingpin/v2 v2.3.2
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.62.483
|
github.com/aliyun/alibaba-cloud-sdk-go v1.62.483
|
||||||
github.com/ans-group/sdk-go v1.16.6
|
github.com/ans-group/sdk-go v1.16.6
|
||||||
github.com/aws/aws-sdk-go v1.44.311
|
github.com/aws/aws-sdk-go v1.44.311
|
||||||
@ -87,7 +87,6 @@ require (
|
|||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
|
||||||
github.com/Masterminds/semver v1.4.2 // indirect
|
github.com/Masterminds/semver v1.4.2 // indirect
|
||||||
github.com/Yamashou/gqlgenc v0.14.0 // indirect
|
github.com/Yamashou/gqlgenc v0.14.0 // indirect
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
|
||||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
||||||
github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 // indirect
|
github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 // indirect
|
||||||
github.com/ans-group/go-durationstring v1.2.0 // indirect
|
github.com/ans-group/go-durationstring v1.2.0 // indirect
|
||||||
@ -181,6 +180,7 @@ require (
|
|||||||
github.com/subosito/gotenv v1.4.2 // indirect
|
github.com/subosito/gotenv v1.4.2 // indirect
|
||||||
github.com/terra-farm/udnssdk v1.3.5 // indirect
|
github.com/terra-farm/udnssdk v1.3.5 // indirect
|
||||||
github.com/vektah/gqlparser/v2 v2.5.1 // indirect
|
github.com/vektah/gqlparser/v2 v2.5.1 // indirect
|
||||||
|
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
|
go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
|
||||||
go.mongodb.org/mongo-driver v1.11.3 // indirect
|
go.mongodb.org/mongo-driver v1.11.3 // indirect
|
||||||
go.opencensus.io v0.24.0 // indirect
|
go.opencensus.io v0.24.0 // indirect
|
||||||
|
7
go.sum
7
go.sum
@ -112,10 +112,9 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia
|
|||||||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
|
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
|
||||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 h1:F1j7z+/DKEsYqZNoxC6wvfmaiDneLsQOFQmuq9NADSY=
|
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 h1:F1j7z+/DKEsYqZNoxC6wvfmaiDneLsQOFQmuq9NADSY=
|
||||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2/go.mod h1:QlXr/TrICfQ/ANa76sLeQyhAJyNR9sEcfNuZBkY9jgY=
|
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2/go.mod h1:QlXr/TrICfQ/ANa76sLeQyhAJyNR9sEcfNuZBkY9jgY=
|
||||||
github.com/alecthomas/kingpin v2.2.6+incompatible h1:5svnBTFgJjZvGKyYBtMB0+m5wvrbUHiqye8wRJMlnYI=
|
github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU=
|
||||||
github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE=
|
github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
|
|
||||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
@ -1162,6 +1161,8 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:
|
|||||||
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
|
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
|
||||||
github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
|
github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||||
|
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
|
||||||
|
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
|
||||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8=
|
github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8=
|
||||||
|
2
main.go
2
main.go
@ -360,7 +360,7 @@ func main() {
|
|||||||
} else {
|
} else {
|
||||||
config, err = oci.LoadOCIConfig(cfg.OCIConfigFile)
|
config, err = oci.LoadOCIConfig(cfg.OCIConfigFile)
|
||||||
}
|
}
|
||||||
|
config.ZoneCacheDuration = cfg.OCIZoneCacheDuration
|
||||||
if err == nil {
|
if err == nil {
|
||||||
p, err = oci.NewOCIProvider(*config, domainFilter, zoneIDFilter, cfg.OCIZoneScope, cfg.DryRun)
|
p, err = oci.NewOCIProvider(*config, domainFilter, zoneIDFilter, cfg.OCIZoneScope, cfg.DryRun)
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ import (
|
|||||||
|
|
||||||
"sigs.k8s.io/external-dns/endpoint"
|
"sigs.k8s.io/external-dns/endpoint"
|
||||||
|
|
||||||
"github.com/alecthomas/kingpin"
|
"github.com/alecthomas/kingpin/v2"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"sigs.k8s.io/external-dns/source"
|
"sigs.k8s.io/external-dns/source"
|
||||||
@ -136,6 +136,7 @@ type Config struct {
|
|||||||
OCICompartmentOCID string
|
OCICompartmentOCID string
|
||||||
OCIAuthInstancePrincipal bool
|
OCIAuthInstancePrincipal bool
|
||||||
OCIZoneScope string
|
OCIZoneScope string
|
||||||
|
OCIZoneCacheDuration time.Duration
|
||||||
InMemoryZones []string
|
InMemoryZones []string
|
||||||
OVHEndpoint string
|
OVHEndpoint string
|
||||||
OVHApiRateLimit int
|
OVHApiRateLimit int
|
||||||
@ -293,6 +294,7 @@ var defaultConfig = &Config{
|
|||||||
InfobloxCacheDuration: 0,
|
InfobloxCacheDuration: 0,
|
||||||
OCIConfigFile: "/etc/kubernetes/oci.yaml",
|
OCIConfigFile: "/etc/kubernetes/oci.yaml",
|
||||||
OCIZoneScope: "GLOBAL",
|
OCIZoneScope: "GLOBAL",
|
||||||
|
OCIZoneCacheDuration: 0 * time.Second,
|
||||||
InMemoryZones: []string{},
|
InMemoryZones: []string{},
|
||||||
OVHEndpoint: "ovh-eu",
|
OVHEndpoint: "ovh-eu",
|
||||||
OVHApiRateLimit: 20,
|
OVHApiRateLimit: 20,
|
||||||
@ -527,6 +529,7 @@ func (cfg *Config) ParseFlags(args []string) error {
|
|||||||
app.Flag("oci-compartment-ocid", "When using the OCI provider, specify the OCID of the OCI compartment containing all managed zones and records. Required when using OCI IAM instance principal authentication.").StringVar(&cfg.OCICompartmentOCID)
|
app.Flag("oci-compartment-ocid", "When using the OCI provider, specify the OCID of the OCI compartment containing all managed zones and records. Required when using OCI IAM instance principal authentication.").StringVar(&cfg.OCICompartmentOCID)
|
||||||
app.Flag("oci-zone-scope", "When using OCI provider, filter for zones with this scope (optional, options: GLOBAL, PRIVATE). Defaults to GLOBAL, setting to empty value will target both.").Default(defaultConfig.OCIZoneScope).EnumVar(&cfg.OCIZoneScope, "", "GLOBAL", "PRIVATE")
|
app.Flag("oci-zone-scope", "When using OCI provider, filter for zones with this scope (optional, options: GLOBAL, PRIVATE). Defaults to GLOBAL, setting to empty value will target both.").Default(defaultConfig.OCIZoneScope).EnumVar(&cfg.OCIZoneScope, "", "GLOBAL", "PRIVATE")
|
||||||
app.Flag("oci-auth-instance-principal", "When using the OCI provider, specify whether OCI IAM instance principal authentication should be used (instead of key-based auth via the OCI config file).").Default(strconv.FormatBool(defaultConfig.OCIAuthInstancePrincipal)).BoolVar(&cfg.OCIAuthInstancePrincipal)
|
app.Flag("oci-auth-instance-principal", "When using the OCI provider, specify whether OCI IAM instance principal authentication should be used (instead of key-based auth via the OCI config file).").Default(strconv.FormatBool(defaultConfig.OCIAuthInstancePrincipal)).BoolVar(&cfg.OCIAuthInstancePrincipal)
|
||||||
|
app.Flag("oci-zones-cache-duration", "When using the OCI provider, set the zones list cache TTL (0s to disable).").Default(defaultConfig.OCIZoneCacheDuration.String()).DurationVar(&cfg.OCIZoneCacheDuration)
|
||||||
app.Flag("rcodezero-txt-encrypt", "When using the Rcodezero provider with txt registry option, set if TXT rrs are encrypted (default: false)").Default(strconv.FormatBool(defaultConfig.RcodezeroTXTEncrypt)).BoolVar(&cfg.RcodezeroTXTEncrypt)
|
app.Flag("rcodezero-txt-encrypt", "When using the Rcodezero provider with txt registry option, set if TXT rrs are encrypted (default: false)").Default(strconv.FormatBool(defaultConfig.RcodezeroTXTEncrypt)).BoolVar(&cfg.RcodezeroTXTEncrypt)
|
||||||
app.Flag("inmemory-zone", "Provide a list of pre-configured zones for the inmemory provider; specify multiple times for multiple zones (optional)").Default("").StringsVar(&cfg.InMemoryZones)
|
app.Flag("inmemory-zone", "Provide a list of pre-configured zones for the inmemory provider; specify multiple times for multiple zones (optional)").Default("").StringsVar(&cfg.InMemoryZones)
|
||||||
app.Flag("ovh-endpoint", "When using the OVH provider, specify the endpoint (default: ovh-eu)").Default(defaultConfig.OVHEndpoint).StringVar(&cfg.OVHEndpoint)
|
app.Flag("ovh-endpoint", "When using the OVH provider, specify the endpoint (default: ovh-eu)").Default(defaultConfig.OVHEndpoint).StringVar(&cfg.OVHEndpoint)
|
||||||
|
@ -95,6 +95,7 @@ var (
|
|||||||
InfobloxMaxResults: 0,
|
InfobloxMaxResults: 0,
|
||||||
OCIConfigFile: "/etc/kubernetes/oci.yaml",
|
OCIConfigFile: "/etc/kubernetes/oci.yaml",
|
||||||
OCIZoneScope: "GLOBAL",
|
OCIZoneScope: "GLOBAL",
|
||||||
|
OCIZoneCacheDuration: 0 * time.Second,
|
||||||
InMemoryZones: []string{""},
|
InMemoryZones: []string{""},
|
||||||
OVHEndpoint: "ovh-eu",
|
OVHEndpoint: "ovh-eu",
|
||||||
OVHApiRateLimit: 20,
|
OVHApiRateLimit: 20,
|
||||||
@ -205,6 +206,7 @@ var (
|
|||||||
InfobloxMaxResults: 2000,
|
InfobloxMaxResults: 2000,
|
||||||
OCIConfigFile: "oci.yaml",
|
OCIConfigFile: "oci.yaml",
|
||||||
OCIZoneScope: "PRIVATE",
|
OCIZoneScope: "PRIVATE",
|
||||||
|
OCIZoneCacheDuration: 30 * time.Second,
|
||||||
InMemoryZones: []string{"example.org", "company.com"},
|
InMemoryZones: []string{"example.org", "company.com"},
|
||||||
OVHEndpoint: "ovh-ca",
|
OVHEndpoint: "ovh-ca",
|
||||||
OVHApiRateLimit: 42,
|
OVHApiRateLimit: 42,
|
||||||
@ -328,6 +330,7 @@ func TestParseFlags(t *testing.T) {
|
|||||||
"--pdns-skip-tls-verify",
|
"--pdns-skip-tls-verify",
|
||||||
"--oci-config-file=oci.yaml",
|
"--oci-config-file=oci.yaml",
|
||||||
"--oci-zone-scope=PRIVATE",
|
"--oci-zone-scope=PRIVATE",
|
||||||
|
"--oci-zones-cache-duration=30s",
|
||||||
"--tls-ca=/path/to/ca.crt",
|
"--tls-ca=/path/to/ca.crt",
|
||||||
"--tls-client-cert=/path/to/cert.pem",
|
"--tls-client-cert=/path/to/cert.pem",
|
||||||
"--tls-client-cert-key=/path/to/key.pem",
|
"--tls-client-cert-key=/path/to/key.pem",
|
||||||
@ -449,6 +452,7 @@ func TestParseFlags(t *testing.T) {
|
|||||||
"EXTERNAL_DNS_INFOBLOX_MAX_RESULTS": "2000",
|
"EXTERNAL_DNS_INFOBLOX_MAX_RESULTS": "2000",
|
||||||
"EXTERNAL_DNS_OCI_CONFIG_FILE": "oci.yaml",
|
"EXTERNAL_DNS_OCI_CONFIG_FILE": "oci.yaml",
|
||||||
"EXTERNAL_DNS_OCI_ZONE_SCOPE": "PRIVATE",
|
"EXTERNAL_DNS_OCI_ZONE_SCOPE": "PRIVATE",
|
||||||
|
"EXTERNAL_DNS_OCI_ZONES_CACHE_DURATION": "30s",
|
||||||
"EXTERNAL_DNS_INMEMORY_ZONE": "example.org\ncompany.com",
|
"EXTERNAL_DNS_INMEMORY_ZONE": "example.org\ncompany.com",
|
||||||
"EXTERNAL_DNS_OVH_ENDPOINT": "ovh-ca",
|
"EXTERNAL_DNS_OVH_ENDPOINT": "ovh-ca",
|
||||||
"EXTERNAL_DNS_OVH_API_RATE_LIMIT": "42",
|
"EXTERNAL_DNS_OVH_API_RATE_LIMIT": "42",
|
||||||
|
@ -467,6 +467,12 @@ func newRecord(ep *endpoint.Endpoint) *dns.ResourceRecordSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ep.RecordType == endpoint.RecordTypeSRV {
|
||||||
|
for i, srvRecord := range ep.Targets {
|
||||||
|
targets[i] = provider.EnsureTrailingDot(srvRecord)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// no annotation results in a Ttl of 0, default to 300 for backwards-compatibility
|
// no annotation results in a Ttl of 0, default to 300 for backwards-compatibility
|
||||||
var ttl int64 = googleRecordTTL
|
var ttl int64 = googleRecordTTL
|
||||||
if ep.RecordTTL.IsConfigured() {
|
if ep.RecordTTL.IsConfigured() {
|
||||||
|
44
provider/oci/cache.go
Normal file
44
provider/oci/cache.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2023 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package oci
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/oracle/oci-go-sdk/v65/dns"
|
||||||
|
)
|
||||||
|
|
||||||
|
type zoneCache struct {
|
||||||
|
age time.Time
|
||||||
|
duration time.Duration
|
||||||
|
zones map[string]dns.ZoneSummary
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *zoneCache) Reset(zones map[string]dns.ZoneSummary) {
|
||||||
|
if z.duration > time.Duration(0) {
|
||||||
|
z.age = time.Now()
|
||||||
|
z.zones = zones
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *zoneCache) Get() map[string]dns.ZoneSummary {
|
||||||
|
return z.zones
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *zoneCache) Expired() bool {
|
||||||
|
return len(z.zones) < 1 || time.Since(z.age) > z.duration
|
||||||
|
}
|
75
provider/oci/cache_test.go
Normal file
75
provider/oci/cache_test.go
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2023 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package oci
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/oracle/oci-go-sdk/v65/dns"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestZoneCache(t *testing.T) {
|
||||||
|
now := time.Now()
|
||||||
|
var testCases = map[string]struct {
|
||||||
|
z *zoneCache
|
||||||
|
expired bool
|
||||||
|
}{
|
||||||
|
"inactive-zone-cache": {
|
||||||
|
&zoneCache{
|
||||||
|
duration: 0 * time.Second,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
"empty-active-zone-cache": {
|
||||||
|
&zoneCache{
|
||||||
|
duration: 30 * time.Second,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
"expired-zone-cache": {
|
||||||
|
&zoneCache{
|
||||||
|
age: now.Add(300 * time.Second),
|
||||||
|
duration: 30 * time.Second,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
"active-zone-cache": {
|
||||||
|
&zoneCache{
|
||||||
|
zones: map[string]dns.ZoneSummary{
|
||||||
|
zoneIdBaz: testPrivateZoneSummaryBaz,
|
||||||
|
},
|
||||||
|
duration: 30 * time.Second,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, testCase := range testCases {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
assert.Equal(t, testCase.expired, testCase.z.Expired())
|
||||||
|
var resetZoneLength = 1
|
||||||
|
if testCase.z.duration == 0 {
|
||||||
|
resetZoneLength = 0
|
||||||
|
}
|
||||||
|
testCase.z.Reset(map[string]dns.ZoneSummary{
|
||||||
|
zoneIdQux: testPrivateZoneSummaryQux,
|
||||||
|
})
|
||||||
|
assert.Len(t, testCase.z.Get(), resetZoneLength)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -20,6 +20,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/oracle/oci-go-sdk/v65/common"
|
"github.com/oracle/oci-go-sdk/v65/common"
|
||||||
"github.com/oracle/oci-go-sdk/v65/common/auth"
|
"github.com/oracle/oci-go-sdk/v65/common/auth"
|
||||||
@ -49,8 +50,9 @@ type OCIAuthConfig struct {
|
|||||||
|
|
||||||
// OCIConfig holds the configuration for the OCI Provider.
|
// OCIConfig holds the configuration for the OCI Provider.
|
||||||
type OCIConfig struct {
|
type OCIConfig struct {
|
||||||
Auth OCIAuthConfig `yaml:"auth"`
|
Auth OCIAuthConfig `yaml:"auth"`
|
||||||
CompartmentID string `yaml:"compartment"`
|
CompartmentID string `yaml:"compartment"`
|
||||||
|
ZoneCacheDuration time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
// OCIProvider is an implementation of Provider for Oracle Cloud Infrastructure
|
// OCIProvider is an implementation of Provider for Oracle Cloud Infrastructure
|
||||||
@ -63,6 +65,7 @@ type OCIProvider struct {
|
|||||||
domainFilter endpoint.DomainFilter
|
domainFilter endpoint.DomainFilter
|
||||||
zoneIDFilter provider.ZoneIDFilter
|
zoneIDFilter provider.ZoneIDFilter
|
||||||
zoneScope string
|
zoneScope string
|
||||||
|
zoneCache *zoneCache
|
||||||
dryRun bool
|
dryRun bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,11 +138,18 @@ func NewOCIProvider(cfg OCIConfig, domainFilter endpoint.DomainFilter, zoneIDFil
|
|||||||
domainFilter: domainFilter,
|
domainFilter: domainFilter,
|
||||||
zoneIDFilter: zoneIDFilter,
|
zoneIDFilter: zoneIDFilter,
|
||||||
zoneScope: zoneScope,
|
zoneScope: zoneScope,
|
||||||
dryRun: dryRun,
|
zoneCache: &zoneCache{
|
||||||
|
duration: cfg.ZoneCacheDuration,
|
||||||
|
},
|
||||||
|
dryRun: dryRun,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *OCIProvider) zones(ctx context.Context) (map[string]dns.ZoneSummary, error) {
|
func (p *OCIProvider) zones(ctx context.Context) (map[string]dns.ZoneSummary, error) {
|
||||||
|
if !p.zoneCache.Expired() {
|
||||||
|
log.Debug("Using cached zones list")
|
||||||
|
return p.zoneCache.zones, nil
|
||||||
|
}
|
||||||
zones := make(map[string]dns.ZoneSummary)
|
zones := make(map[string]dns.ZoneSummary)
|
||||||
scopes := []dns.GetZoneScopeEnum{dns.GetZoneScopeEnum(p.zoneScope)}
|
scopes := []dns.GetZoneScopeEnum{dns.GetZoneScopeEnum(p.zoneScope)}
|
||||||
// If zone scope is empty, list all zones types.
|
// If zone scope is empty, list all zones types.
|
||||||
@ -155,6 +165,7 @@ func (p *OCIProvider) zones(ctx context.Context) (map[string]dns.ZoneSummary, er
|
|||||||
if len(zones) == 0 {
|
if len(zones) == 0 {
|
||||||
log.Warnf("No zones in compartment %q match domain filters %v", p.cfg.CompartmentID, p.domainFilter)
|
log.Warnf("No zones in compartment %q match domain filters %v", p.cfg.CompartmentID, p.domainFilter)
|
||||||
}
|
}
|
||||||
|
p.zoneCache.Reset(zones)
|
||||||
return zones, nil
|
return zones, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/oracle/oci-go-sdk/v65/common"
|
"github.com/oracle/oci-go-sdk/v65/common"
|
||||||
"github.com/oracle/oci-go-sdk/v65/dns"
|
"github.com/oracle/oci-go-sdk/v65/dns"
|
||||||
@ -137,7 +138,10 @@ func newOCIProvider(client ociDNSClient, domainFilter endpoint.DomainFilter, zon
|
|||||||
domainFilter: domainFilter,
|
domainFilter: domainFilter,
|
||||||
zoneIDFilter: zoneIDFilter,
|
zoneIDFilter: zoneIDFilter,
|
||||||
zoneScope: zoneScope,
|
zoneScope: zoneScope,
|
||||||
dryRun: dryRun,
|
zoneCache: &zoneCache{
|
||||||
|
duration: 0 * time.Second,
|
||||||
|
},
|
||||||
|
dryRun: dryRun,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,9 +140,6 @@ func (sc *httpProxySource) Endpoints(ctx context.Context) ([]*endpoint.Endpoint,
|
|||||||
log.Debugf("Skipping HTTPProxy %s/%s because controller value does not match, found: %s, required: %s",
|
log.Debugf("Skipping HTTPProxy %s/%s because controller value does not match, found: %s, required: %s",
|
||||||
hp.Namespace, hp.Name, controller, controllerAnnotationValue)
|
hp.Namespace, hp.Name, controller, controllerAnnotationValue)
|
||||||
continue
|
continue
|
||||||
} else if hp.Status.CurrentStatus != "valid" {
|
|
||||||
log.Debugf("Skipping HTTPProxy %s/%s because it is not valid", hp.Namespace, hp.Name)
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hpEndpoints, err := sc.endpointsFromHTTPProxy(hp)
|
hpEndpoints, err := sc.endpointsFromHTTPProxy(hp)
|
||||||
@ -244,11 +241,6 @@ func (sc *httpProxySource) filterByAnnotations(httpProxies []*projectcontour.HTT
|
|||||||
|
|
||||||
// endpointsFromHTTPProxyConfig extracts the endpoints from a Contour HTTPProxy object
|
// endpointsFromHTTPProxyConfig extracts the endpoints from a Contour HTTPProxy object
|
||||||
func (sc *httpProxySource) endpointsFromHTTPProxy(httpProxy *projectcontour.HTTPProxy) ([]*endpoint.Endpoint, error) {
|
func (sc *httpProxySource) endpointsFromHTTPProxy(httpProxy *projectcontour.HTTPProxy) ([]*endpoint.Endpoint, error) {
|
||||||
if httpProxy.Status.CurrentStatus != "valid" {
|
|
||||||
log.Warn(errors.Errorf("cannot generate endpoints for HTTPProxy with status %s", httpProxy.Status.CurrentStatus))
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
resource := fmt.Sprintf("HTTPProxy/%s/%s", httpProxy.Namespace, httpProxy.Name)
|
resource := fmt.Sprintf("HTTPProxy/%s/%s", httpProxy.Namespace, httpProxy.Name)
|
||||||
|
|
||||||
ttl := getTTLFromAnnotations(httpProxy.Annotations, resource)
|
ttl := getTTLFromAnnotations(httpProxy.Annotations, resource)
|
||||||
|
@ -269,14 +269,6 @@ func testEndpointsFromHTTPProxy(t *testing.T) {
|
|||||||
httpProxy: fakeHTTPProxy{},
|
httpProxy: fakeHTTPProxy{},
|
||||||
expected: []*endpoint.Endpoint{},
|
expected: []*endpoint.Endpoint{},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: "one rule.host invalid httpproxy",
|
|
||||||
httpProxy: fakeHTTPProxy{
|
|
||||||
host: "foo.bar",
|
|
||||||
invalid: true,
|
|
||||||
},
|
|
||||||
expected: []*endpoint.Endpoint{},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: "no targets",
|
title: "no targets",
|
||||||
httpProxy: fakeHTTPProxy{},
|
httpProxy: fakeHTTPProxy{},
|
||||||
@ -1114,19 +1106,11 @@ type fakeHTTPProxy struct {
|
|||||||
annotations map[string]string
|
annotations map[string]string
|
||||||
|
|
||||||
host string
|
host string
|
||||||
invalid bool
|
|
||||||
delegate bool
|
delegate bool
|
||||||
loadBalancer fakeLoadBalancerService
|
loadBalancer fakeLoadBalancerService
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ir fakeHTTPProxy) HTTPProxy() *projectcontour.HTTPProxy {
|
func (ir fakeHTTPProxy) HTTPProxy() *projectcontour.HTTPProxy {
|
||||||
var status string
|
|
||||||
if ir.invalid {
|
|
||||||
status = "invalid"
|
|
||||||
} else {
|
|
||||||
status = "valid"
|
|
||||||
}
|
|
||||||
|
|
||||||
var spec projectcontour.HTTPProxySpec
|
var spec projectcontour.HTTPProxySpec
|
||||||
if ir.delegate {
|
if ir.delegate {
|
||||||
spec = projectcontour.HTTPProxySpec{}
|
spec = projectcontour.HTTPProxySpec{}
|
||||||
@ -1161,7 +1145,6 @@ func (ir fakeHTTPProxy) HTTPProxy() *projectcontour.HTTPProxy {
|
|||||||
},
|
},
|
||||||
Spec: spec,
|
Spec: spec,
|
||||||
Status: projectcontour.HTTPProxyStatus{
|
Status: projectcontour.HTTPProxyStatus{
|
||||||
CurrentStatus: status,
|
|
||||||
LoadBalancer: lb,
|
LoadBalancer: lb,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -383,6 +383,27 @@ func testCRDSourceEndpoints(t *testing.T) {
|
|||||||
expectEndpoints: true,
|
expectEndpoints: true,
|
||||||
expectError: false,
|
expectError: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "Create SRV record",
|
||||||
|
registeredAPIVersion: "test.k8s.io/v1alpha1",
|
||||||
|
apiVersion: "test.k8s.io/v1alpha1",
|
||||||
|
registeredKind: "DNSEndpoint",
|
||||||
|
kind: "DNSEndpoint",
|
||||||
|
namespace: "foo",
|
||||||
|
registeredNamespace: "foo",
|
||||||
|
labels: map[string]string{"test": "that"},
|
||||||
|
labelFilter: "test=that",
|
||||||
|
endpoints: []*endpoint.Endpoint{
|
||||||
|
{
|
||||||
|
DNSName: "_svc._tcp.example.org",
|
||||||
|
Targets: endpoint.Targets{"0 0 80 abc.example.org", "0 0 80 def.example.org"},
|
||||||
|
RecordType: endpoint.RecordTypeSRV,
|
||||||
|
RecordTTL: 180,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectEndpoints: true,
|
||||||
|
expectError: false,
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
ti := ti
|
ti := ti
|
||||||
t.Run(ti.title, func(t *testing.T) {
|
t.Run(ti.title, func(t *testing.T) {
|
||||||
|
@ -47,16 +47,17 @@ var kongGroupdVersionResource = schema.GroupVersionResource{
|
|||||||
|
|
||||||
// kongTCPIngressSource is an implementation of Source for Kong TCPIngress objects.
|
// kongTCPIngressSource is an implementation of Source for Kong TCPIngress objects.
|
||||||
type kongTCPIngressSource struct {
|
type kongTCPIngressSource struct {
|
||||||
annotationFilter string
|
annotationFilter string
|
||||||
dynamicKubeClient dynamic.Interface
|
ignoreHostnameAnnotation bool
|
||||||
kongTCPIngressInformer informers.GenericInformer
|
dynamicKubeClient dynamic.Interface
|
||||||
kubeClient kubernetes.Interface
|
kongTCPIngressInformer informers.GenericInformer
|
||||||
namespace string
|
kubeClient kubernetes.Interface
|
||||||
unstructuredConverter *unstructuredConverter
|
namespace string
|
||||||
|
unstructuredConverter *unstructuredConverter
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewKongTCPIngressSource creates a new kongTCPIngressSource with the given config.
|
// NewKongTCPIngressSource creates a new kongTCPIngressSource with the given config.
|
||||||
func NewKongTCPIngressSource(ctx context.Context, dynamicKubeClient dynamic.Interface, kubeClient kubernetes.Interface, namespace string, annotationFilter string) (Source, error) {
|
func NewKongTCPIngressSource(ctx context.Context, dynamicKubeClient dynamic.Interface, kubeClient kubernetes.Interface, namespace string, annotationFilter string, ignoreHostnameAnnotation bool) (Source, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
// Use shared informer to listen for add/update/delete of Host in the specified namespace.
|
// Use shared informer to listen for add/update/delete of Host in the specified namespace.
|
||||||
@ -85,12 +86,13 @@ func NewKongTCPIngressSource(ctx context.Context, dynamicKubeClient dynamic.Inte
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &kongTCPIngressSource{
|
return &kongTCPIngressSource{
|
||||||
annotationFilter: annotationFilter,
|
annotationFilter: annotationFilter,
|
||||||
dynamicKubeClient: dynamicKubeClient,
|
ignoreHostnameAnnotation: ignoreHostnameAnnotation,
|
||||||
kongTCPIngressInformer: kongTCPIngressInformer,
|
dynamicKubeClient: dynamicKubeClient,
|
||||||
kubeClient: kubeClient,
|
kongTCPIngressInformer: kongTCPIngressInformer,
|
||||||
namespace: namespace,
|
kubeClient: kubeClient,
|
||||||
unstructuredConverter: uc,
|
namespace: namespace,
|
||||||
|
unstructuredConverter: uc,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,9 +212,11 @@ func (sc *kongTCPIngressSource) endpointsFromTCPIngress(tcpIngress *TCPIngress,
|
|||||||
|
|
||||||
providerSpecific, setIdentifier := getProviderSpecificAnnotations(tcpIngress.Annotations)
|
providerSpecific, setIdentifier := getProviderSpecificAnnotations(tcpIngress.Annotations)
|
||||||
|
|
||||||
hostnameList := getHostnamesFromAnnotations(tcpIngress.Annotations)
|
if !sc.ignoreHostnameAnnotation {
|
||||||
for _, hostname := range hostnameList {
|
hostnameList := getHostnamesFromAnnotations(tcpIngress.Annotations)
|
||||||
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
for _, hostname := range hostnameList {
|
||||||
|
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if tcpIngress.Spec.Rules != nil {
|
if tcpIngress.Spec.Rules != nil {
|
||||||
|
@ -40,9 +40,10 @@ func TestKongTCPIngressEndpoints(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, ti := range []struct {
|
for _, ti := range []struct {
|
||||||
title string
|
title string
|
||||||
tcpProxy TCPIngress
|
tcpProxy TCPIngress
|
||||||
expected []*endpoint.Endpoint
|
ignoreHostnameAnnotation bool
|
||||||
|
expected []*endpoint.Endpoint
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
title: "TCPIngress with hostname annotation",
|
title: "TCPIngress with hostname annotation",
|
||||||
@ -220,6 +221,67 @@ func TestKongTCPIngressEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "TCPIngress ignoring hostname annotation",
|
||||||
|
tcpProxy: TCPIngress{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: kongGroupdVersionResource.GroupVersion().String(),
|
||||||
|
Kind: "TCPIngress",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "tcp-ingress-both",
|
||||||
|
Namespace: defaultKongNamespace,
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "d.example.com",
|
||||||
|
"kubernetes.io/ingress.class": "kong",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: tcpIngressSpec{
|
||||||
|
Rules: []tcpIngressRule{
|
||||||
|
{
|
||||||
|
Port: 30004,
|
||||||
|
Host: "e.example.com",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Port: 30005,
|
||||||
|
Host: "f.example.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Status: tcpIngressStatus{
|
||||||
|
LoadBalancer: corev1.LoadBalancerStatus{
|
||||||
|
Ingress: []corev1.LoadBalancerIngress{
|
||||||
|
{
|
||||||
|
Hostname: "a12e71861a4303f063456769a314a3bd-1291189659.us-east-1.elb.amazonaws.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignoreHostnameAnnotation: true,
|
||||||
|
expected: []*endpoint.Endpoint{
|
||||||
|
{
|
||||||
|
DNSName: "e.example.com",
|
||||||
|
Targets: []string{"a12e71861a4303f063456769a314a3bd-1291189659.us-east-1.elb.amazonaws.com"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "tcpingress/kong/tcp-ingress-both",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
DNSName: "f.example.com",
|
||||||
|
Targets: []string{"a12e71861a4303f063456769a314a3bd-1291189659.us-east-1.elb.amazonaws.com"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "tcpingress/kong/tcp-ingress-both",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "TCPIngress with target annotation",
|
title: "TCPIngress with target annotation",
|
||||||
tcpProxy: TCPIngress{
|
tcpProxy: TCPIngress{
|
||||||
@ -300,7 +362,7 @@ func TestKongTCPIngressEndpoints(t *testing.T) {
|
|||||||
_, err = fakeDynamicClient.Resource(kongGroupdVersionResource).Namespace(defaultKongNamespace).Create(context.Background(), &tcpi, metav1.CreateOptions{})
|
_, err = fakeDynamicClient.Resource(kongGroupdVersionResource).Namespace(defaultKongNamespace).Create(context.Background(), &tcpi, metav1.CreateOptions{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
source, err := NewKongTCPIngressSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultKongNamespace, "kubernetes.io/ingress.class=kong")
|
source, err := NewKongTCPIngressSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultKongNamespace, "kubernetes.io/ingress.class=kong", ti.ignoreHostnameAnnotation)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, source)
|
assert.NotNil(t, source)
|
||||||
|
|
||||||
@ -312,7 +374,7 @@ func TestKongTCPIngressEndpoints(t *testing.T) {
|
|||||||
endpoints, err := source.Endpoints(context.Background())
|
endpoints, err := source.Endpoints(context.Background())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, endpoints, len(ti.expected))
|
assert.Len(t, endpoints, len(ti.expected))
|
||||||
assert.Equal(t, endpoints, ti.expected)
|
assert.Equal(t, ti.expected, endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -555,6 +555,9 @@ func extractServiceIps(svc *v1.Service) endpoint.Targets {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func extractServiceExternalName(svc *v1.Service) endpoint.Targets {
|
func extractServiceExternalName(svc *v1.Service) endpoint.Targets {
|
||||||
|
if len(svc.Spec.ExternalIPs) > 0 {
|
||||||
|
return svc.Spec.ExternalIPs
|
||||||
|
}
|
||||||
return endpoint.Targets{svc.Spec.ExternalName}
|
return endpoint.Targets{svc.Spec.ExternalName}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3545,6 +3545,7 @@ func TestExternalServices(t *testing.T) {
|
|||||||
labels map[string]string
|
labels map[string]string
|
||||||
annotations map[string]string
|
annotations map[string]string
|
||||||
externalName string
|
externalName string
|
||||||
|
externalIPs []string
|
||||||
expected []*endpoint.Endpoint
|
expected []*endpoint.Endpoint
|
||||||
expectError bool
|
expectError bool
|
||||||
}{
|
}{
|
||||||
@ -3562,6 +3563,7 @@ func TestExternalServices(t *testing.T) {
|
|||||||
hostnameAnnotationKey: "service.example.org",
|
hostnameAnnotationKey: "service.example.org",
|
||||||
},
|
},
|
||||||
"111.111.111.111",
|
"111.111.111.111",
|
||||||
|
[]string{},
|
||||||
[]*endpoint.Endpoint{
|
[]*endpoint.Endpoint{
|
||||||
{DNSName: "service.example.org", Targets: endpoint.Targets{"111.111.111.111"}, RecordType: endpoint.RecordTypeA},
|
{DNSName: "service.example.org", Targets: endpoint.Targets{"111.111.111.111"}, RecordType: endpoint.RecordTypeA},
|
||||||
},
|
},
|
||||||
@ -3581,6 +3583,7 @@ func TestExternalServices(t *testing.T) {
|
|||||||
hostnameAnnotationKey: "service.example.org",
|
hostnameAnnotationKey: "service.example.org",
|
||||||
},
|
},
|
||||||
"2001:db8::111",
|
"2001:db8::111",
|
||||||
|
[]string{},
|
||||||
[]*endpoint.Endpoint{
|
[]*endpoint.Endpoint{
|
||||||
{DNSName: "service.example.org", Targets: endpoint.Targets{"2001:db8::111"}, RecordType: endpoint.RecordTypeAAAA},
|
{DNSName: "service.example.org", Targets: endpoint.Targets{"2001:db8::111"}, RecordType: endpoint.RecordTypeAAAA},
|
||||||
},
|
},
|
||||||
@ -3600,11 +3603,53 @@ func TestExternalServices(t *testing.T) {
|
|||||||
hostnameAnnotationKey: "service.example.org",
|
hostnameAnnotationKey: "service.example.org",
|
||||||
},
|
},
|
||||||
"remote.example.com",
|
"remote.example.com",
|
||||||
|
[]string{},
|
||||||
[]*endpoint.Endpoint{
|
[]*endpoint.Endpoint{
|
||||||
{DNSName: "service.example.org", Targets: endpoint.Targets{"remote.example.com"}, RecordType: endpoint.RecordTypeCNAME},
|
{DNSName: "service.example.org", Targets: endpoint.Targets{"remote.example.com"}, RecordType: endpoint.RecordTypeCNAME},
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"annotated ExternalName service with externalIPs returns a single endpoint with multiple targets",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeExternalName,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
"service.example.org",
|
||||||
|
[]string{"10.2.3.4", "11.2.3.4"},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeA, Targets: endpoint.Targets{"10.2.3.4", "11.2.3.4"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"annotated ExternalName service with externalIPs of dualstack addresses returns 2 endpoints with multiple targets",
|
||||||
|
"",
|
||||||
|
"testing",
|
||||||
|
"foo",
|
||||||
|
v1.ServiceTypeExternalName,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
false,
|
||||||
|
map[string]string{"component": "foo"},
|
||||||
|
map[string]string{
|
||||||
|
hostnameAnnotationKey: "service.example.org",
|
||||||
|
},
|
||||||
|
"service.example.org",
|
||||||
|
[]string{"10.2.3.4", "11.2.3.4", "2001:db8::1", "2001:db8::2"},
|
||||||
|
[]*endpoint.Endpoint{
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeA, Targets: endpoint.Targets{"10.2.3.4", "11.2.3.4"}},
|
||||||
|
{DNSName: "service.example.org", RecordType: endpoint.RecordTypeAAAA, Targets: endpoint.Targets{"2001:db8::1", "2001:db8::2"}},
|
||||||
|
},
|
||||||
|
false,
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
tc := tc
|
tc := tc
|
||||||
t.Run(tc.title, func(t *testing.T) {
|
t.Run(tc.title, func(t *testing.T) {
|
||||||
@ -3617,6 +3662,7 @@ func TestExternalServices(t *testing.T) {
|
|||||||
Spec: v1.ServiceSpec{
|
Spec: v1.ServiceSpec{
|
||||||
Type: tc.svcType,
|
Type: tc.svcType,
|
||||||
ExternalName: tc.externalName,
|
ExternalName: tc.externalName,
|
||||||
|
ExternalIPs: tc.externalIPs,
|
||||||
},
|
},
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: tc.svcNamespace,
|
Namespace: tc.svcNamespace,
|
||||||
|
@ -300,7 +300,7 @@ func BuildWithConfig(ctx context.Context, source string, p ClientGenerator, cfg
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return NewTraefikSource(ctx, dynamicClient, kubernetesClient, cfg.Namespace, cfg.AnnotationFilter)
|
return NewTraefikSource(ctx, dynamicClient, kubernetesClient, cfg.Namespace, cfg.AnnotationFilter, cfg.IgnoreHostnameAnnotation)
|
||||||
case "openshift-route":
|
case "openshift-route":
|
||||||
ocpClient, err := p.OpenShiftClient()
|
ocpClient, err := p.OpenShiftClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -341,7 +341,7 @@ func BuildWithConfig(ctx context.Context, source string, p ClientGenerator, cfg
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return NewKongTCPIngressSource(ctx, dynamicClient, kubernetesClient, cfg.Namespace, cfg.AnnotationFilter)
|
return NewKongTCPIngressSource(ctx, dynamicClient, kubernetesClient, cfg.Namespace, cfg.AnnotationFilter, cfg.IgnoreHostnameAnnotation)
|
||||||
case "f5-virtualserver":
|
case "f5-virtualserver":
|
||||||
kubernetesClient, err := p.KubeClient()
|
kubernetesClient, err := p.KubeClient()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -80,6 +80,7 @@ var (
|
|||||||
|
|
||||||
type traefikSource struct {
|
type traefikSource struct {
|
||||||
annotationFilter string
|
annotationFilter string
|
||||||
|
ignoreHostnameAnnotation bool
|
||||||
dynamicKubeClient dynamic.Interface
|
dynamicKubeClient dynamic.Interface
|
||||||
ingressRouteInformer informers.GenericInformer
|
ingressRouteInformer informers.GenericInformer
|
||||||
ingressRouteTcpInformer informers.GenericInformer
|
ingressRouteTcpInformer informers.GenericInformer
|
||||||
@ -92,7 +93,7 @@ type traefikSource struct {
|
|||||||
unstructuredConverter *unstructuredConverter
|
unstructuredConverter *unstructuredConverter
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTraefikSource(ctx context.Context, dynamicKubeClient dynamic.Interface, kubeClient kubernetes.Interface, namespace string, annotationFilter string) (Source, error) {
|
func NewTraefikSource(ctx context.Context, dynamicKubeClient dynamic.Interface, kubeClient kubernetes.Interface, namespace string, annotationFilter string, ignoreHostnameAnnotation bool) (Source, error) {
|
||||||
// Use shared informer to listen for add/update/delete of Host in the specified namespace.
|
// Use shared informer to listen for add/update/delete of Host in the specified namespace.
|
||||||
// Set resync period to 0, to prevent processing when nothing has changed.
|
// Set resync period to 0, to prevent processing when nothing has changed.
|
||||||
informerFactory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(dynamicKubeClient, 0, namespace, nil)
|
informerFactory := dynamicinformer.NewFilteredDynamicSharedInformerFactory(dynamicKubeClient, 0, namespace, nil)
|
||||||
@ -149,6 +150,7 @@ func NewTraefikSource(ctx context.Context, dynamicKubeClient dynamic.Interface,
|
|||||||
|
|
||||||
return &traefikSource{
|
return &traefikSource{
|
||||||
annotationFilter: annotationFilter,
|
annotationFilter: annotationFilter,
|
||||||
|
ignoreHostnameAnnotation: ignoreHostnameAnnotation,
|
||||||
dynamicKubeClient: dynamicKubeClient,
|
dynamicKubeClient: dynamicKubeClient,
|
||||||
ingressRouteInformer: ingressRouteInformer,
|
ingressRouteInformer: ingressRouteInformer,
|
||||||
ingressRouteTcpInformer: ingressRouteTcpInformer,
|
ingressRouteTcpInformer: ingressRouteTcpInformer,
|
||||||
@ -653,9 +655,11 @@ func (ts *traefikSource) endpointsFromIngressRoute(ingressRoute *IngressRoute, t
|
|||||||
|
|
||||||
providerSpecific, setIdentifier := getProviderSpecificAnnotations(ingressRoute.Annotations)
|
providerSpecific, setIdentifier := getProviderSpecificAnnotations(ingressRoute.Annotations)
|
||||||
|
|
||||||
hostnameList := getHostnamesFromAnnotations(ingressRoute.Annotations)
|
if !ts.ignoreHostnameAnnotation {
|
||||||
for _, hostname := range hostnameList {
|
hostnameList := getHostnamesFromAnnotations(ingressRoute.Annotations)
|
||||||
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
for _, hostname := range hostnameList {
|
||||||
|
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, route := range ingressRoute.Spec.Routes {
|
for _, route := range ingressRoute.Spec.Routes {
|
||||||
@ -687,9 +691,11 @@ func (ts *traefikSource) endpointsFromIngressRouteTCP(ingressRoute *IngressRoute
|
|||||||
|
|
||||||
providerSpecific, setIdentifier := getProviderSpecificAnnotations(ingressRoute.Annotations)
|
providerSpecific, setIdentifier := getProviderSpecificAnnotations(ingressRoute.Annotations)
|
||||||
|
|
||||||
hostnameList := getHostnamesFromAnnotations(ingressRoute.Annotations)
|
if !ts.ignoreHostnameAnnotation {
|
||||||
for _, hostname := range hostnameList {
|
hostnameList := getHostnamesFromAnnotations(ingressRoute.Annotations)
|
||||||
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
for _, hostname := range hostnameList {
|
||||||
|
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, route := range ingressRoute.Spec.Routes {
|
for _, route := range ingressRoute.Spec.Routes {
|
||||||
@ -722,9 +728,11 @@ func (ts *traefikSource) endpointsFromIngressRouteUDP(ingressRoute *IngressRoute
|
|||||||
|
|
||||||
providerSpecific, setIdentifier := getProviderSpecificAnnotations(ingressRoute.Annotations)
|
providerSpecific, setIdentifier := getProviderSpecificAnnotations(ingressRoute.Annotations)
|
||||||
|
|
||||||
hostnameList := getHostnamesFromAnnotations(ingressRoute.Annotations)
|
if !ts.ignoreHostnameAnnotation {
|
||||||
for _, hostname := range hostnameList {
|
hostnameList := getHostnamesFromAnnotations(ingressRoute.Annotations)
|
||||||
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
for _, hostname := range hostnameList {
|
||||||
|
endpoints = append(endpoints, endpointsForHostname(hostname, targets, ttl, providerSpecific, setIdentifier, resource)...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return endpoints, nil
|
return endpoints, nil
|
||||||
|
@ -39,9 +39,10 @@ func TestTraefikProxyIngressRouteEndpoints(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, ti := range []struct {
|
for _, ti := range []struct {
|
||||||
title string
|
title string
|
||||||
ingressRoute IngressRoute
|
ingressRoute IngressRoute
|
||||||
expected []*endpoint.Endpoint
|
ignoreHostnameAnnotation bool
|
||||||
|
expected []*endpoint.Endpoint
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
title: "IngressRoute with hostname annotation",
|
title: "IngressRoute with hostname annotation",
|
||||||
@ -248,6 +249,54 @@ func TestTraefikProxyIngressRouteEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "IngressRoute ignoring annotation",
|
||||||
|
ingressRoute: IngressRoute{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: ingressrouteGVR.GroupVersion().String(),
|
||||||
|
Kind: "IngressRoute",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "ingressroute-multi-host-annotations-match",
|
||||||
|
Namespace: defaultTraefikNamespace,
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "f.example.com",
|
||||||
|
"external-dns.alpha.kubernetes.io/target": "target.domain.tld",
|
||||||
|
"kubernetes.io/ingress.class": "traefik",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: traefikIngressRouteSpec{
|
||||||
|
Routes: []traefikRoute{
|
||||||
|
{
|
||||||
|
Match: "Host(`g.example.com`, `h.example.com`)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignoreHostnameAnnotation: true,
|
||||||
|
expected: []*endpoint.Endpoint{
|
||||||
|
{
|
||||||
|
DNSName: "g.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroute/traefik/ingressroute-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
DNSName: "h.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroute/traefik/ingressroute-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "IngressRoute omit wildcard",
|
title: "IngressRoute omit wildcard",
|
||||||
ingressRoute: IngressRoute{
|
ingressRoute: IngressRoute{
|
||||||
@ -299,7 +348,7 @@ func TestTraefikProxyIngressRouteEndpoints(t *testing.T) {
|
|||||||
_, err = fakeDynamicClient.Resource(ingressrouteGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
_, err = fakeDynamicClient.Resource(ingressrouteGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik")
|
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik", ti.ignoreHostnameAnnotation)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, source)
|
assert.NotNil(t, source)
|
||||||
|
|
||||||
@ -311,7 +360,7 @@ func TestTraefikProxyIngressRouteEndpoints(t *testing.T) {
|
|||||||
endpoints, err := source.Endpoints(context.Background())
|
endpoints, err := source.Endpoints(context.Background())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, endpoints, len(ti.expected))
|
assert.Len(t, endpoints, len(ti.expected))
|
||||||
assert.Equal(t, endpoints, ti.expected)
|
assert.Equal(t, ti.expected, endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -320,9 +369,10 @@ func TestTraefikProxyIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, ti := range []struct {
|
for _, ti := range []struct {
|
||||||
title string
|
title string
|
||||||
ingressRouteTCP IngressRouteTCP
|
ingressRouteTCP IngressRouteTCP
|
||||||
expected []*endpoint.Endpoint
|
ignoreHostnameAnnotation bool
|
||||||
|
expected []*endpoint.Endpoint
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
title: "IngressRouteTCP with hostname annotation",
|
title: "IngressRouteTCP with hostname annotation",
|
||||||
@ -493,6 +543,54 @@ func TestTraefikProxyIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "IngressRouteTCP ignoring annotation",
|
||||||
|
ingressRouteTCP: IngressRouteTCP{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: ingressrouteTCPGVR.GroupVersion().String(),
|
||||||
|
Kind: "IngressRouteTCP",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "ingressroutetcp-multi-host-annotations-match",
|
||||||
|
Namespace: defaultTraefikNamespace,
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "f.example.com",
|
||||||
|
"external-dns.alpha.kubernetes.io/target": "target.domain.tld",
|
||||||
|
"kubernetes.io/ingress.class": "traefik",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: traefikIngressRouteTCPSpec{
|
||||||
|
Routes: []traefikRouteTCP{
|
||||||
|
{
|
||||||
|
Match: "HostSNI(`g.example.com`, `h.example.com`)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignoreHostnameAnnotation: true,
|
||||||
|
expected: []*endpoint.Endpoint{
|
||||||
|
{
|
||||||
|
DNSName: "g.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroutetcp/traefik/ingressroutetcp-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
DNSName: "h.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroutetcp/traefik/ingressroutetcp-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "IngressRouteTCP omit wildcard host sni",
|
title: "IngressRouteTCP omit wildcard host sni",
|
||||||
ingressRouteTCP: IngressRouteTCP{
|
ingressRouteTCP: IngressRouteTCP{
|
||||||
@ -544,7 +642,7 @@ func TestTraefikProxyIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
_, err = fakeDynamicClient.Resource(ingressrouteTCPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
_, err = fakeDynamicClient.Resource(ingressrouteTCPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik")
|
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik", ti.ignoreHostnameAnnotation)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, source)
|
assert.NotNil(t, source)
|
||||||
|
|
||||||
@ -556,7 +654,7 @@ func TestTraefikProxyIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
endpoints, err := source.Endpoints(context.Background())
|
endpoints, err := source.Endpoints(context.Background())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, endpoints, len(ti.expected))
|
assert.Len(t, endpoints, len(ti.expected))
|
||||||
assert.Equal(t, endpoints, ti.expected)
|
assert.Equal(t, ti.expected, endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -565,9 +663,10 @@ func TestTraefikProxyIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, ti := range []struct {
|
for _, ti := range []struct {
|
||||||
title string
|
title string
|
||||||
ingressRouteUDP IngressRouteUDP
|
ingressRouteUDP IngressRouteUDP
|
||||||
expected []*endpoint.Endpoint
|
ignoreHostnameAnnotation bool
|
||||||
|
expected []*endpoint.Endpoint
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
title: "IngressRouteTCP with hostname annotation",
|
title: "IngressRouteTCP with hostname annotation",
|
||||||
@ -639,6 +738,26 @@ func TestTraefikProxyIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "IngressRouteTCP ignoring hostname annotation",
|
||||||
|
ingressRouteUDP: IngressRouteUDP{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: ingressrouteUDPGVR.GroupVersion().String(),
|
||||||
|
Kind: "IngressRouteUDP",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "ingressrouteudp-annotation",
|
||||||
|
Namespace: defaultTraefikNamespace,
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "a.example.com",
|
||||||
|
"external-dns.alpha.kubernetes.io/target": "target.domain.tld",
|
||||||
|
"kubernetes.io/ingress.class": "traefik",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignoreHostnameAnnotation: true,
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
ti := ti
|
ti := ti
|
||||||
t.Run(ti.title, func(t *testing.T) {
|
t.Run(ti.title, func(t *testing.T) {
|
||||||
@ -665,7 +784,7 @@ func TestTraefikProxyIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
_, err = fakeDynamicClient.Resource(ingressrouteUDPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
_, err = fakeDynamicClient.Resource(ingressrouteUDPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik")
|
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik", ti.ignoreHostnameAnnotation)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, source)
|
assert.NotNil(t, source)
|
||||||
|
|
||||||
@ -677,7 +796,7 @@ func TestTraefikProxyIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
endpoints, err := source.Endpoints(context.Background())
|
endpoints, err := source.Endpoints(context.Background())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, endpoints, len(ti.expected))
|
assert.Len(t, endpoints, len(ti.expected))
|
||||||
assert.Equal(t, endpoints, ti.expected)
|
assert.Equal(t, ti.expected, endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -686,9 +805,10 @@ func TestTraefikProxyOldIngressRouteEndpoints(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, ti := range []struct {
|
for _, ti := range []struct {
|
||||||
title string
|
title string
|
||||||
ingressRoute IngressRoute
|
ingressRoute IngressRoute
|
||||||
expected []*endpoint.Endpoint
|
ignoreHostnameAnnotation bool
|
||||||
|
expected []*endpoint.Endpoint
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
title: "IngressRoute with hostname annotation",
|
title: "IngressRoute with hostname annotation",
|
||||||
@ -895,6 +1015,54 @@ func TestTraefikProxyOldIngressRouteEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "IngressRoute ignoring annotation",
|
||||||
|
ingressRoute: IngressRoute{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: oldIngressrouteGVR.GroupVersion().String(),
|
||||||
|
Kind: "IngressRoute",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "ingressroute-multi-host-annotations-match",
|
||||||
|
Namespace: defaultTraefikNamespace,
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "f.example.com",
|
||||||
|
"external-dns.alpha.kubernetes.io/target": "target.domain.tld",
|
||||||
|
"kubernetes.io/ingress.class": "traefik",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: traefikIngressRouteSpec{
|
||||||
|
Routes: []traefikRoute{
|
||||||
|
{
|
||||||
|
Match: "Host(`g.example.com`, `h.example.com`)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignoreHostnameAnnotation: true,
|
||||||
|
expected: []*endpoint.Endpoint{
|
||||||
|
{
|
||||||
|
DNSName: "g.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroute/traefik/ingressroute-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
DNSName: "h.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroute/traefik/ingressroute-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "IngressRoute omit wildcard",
|
title: "IngressRoute omit wildcard",
|
||||||
ingressRoute: IngressRoute{
|
ingressRoute: IngressRoute{
|
||||||
@ -946,7 +1114,7 @@ func TestTraefikProxyOldIngressRouteEndpoints(t *testing.T) {
|
|||||||
_, err = fakeDynamicClient.Resource(oldIngressrouteGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
_, err = fakeDynamicClient.Resource(oldIngressrouteGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik")
|
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik", ti.ignoreHostnameAnnotation)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, source)
|
assert.NotNil(t, source)
|
||||||
|
|
||||||
@ -958,7 +1126,7 @@ func TestTraefikProxyOldIngressRouteEndpoints(t *testing.T) {
|
|||||||
endpoints, err := source.Endpoints(context.Background())
|
endpoints, err := source.Endpoints(context.Background())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, endpoints, len(ti.expected))
|
assert.Len(t, endpoints, len(ti.expected))
|
||||||
assert.Equal(t, endpoints, ti.expected)
|
assert.Equal(t, ti.expected, endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -967,9 +1135,10 @@ func TestTraefikProxyOldIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, ti := range []struct {
|
for _, ti := range []struct {
|
||||||
title string
|
title string
|
||||||
ingressRouteTCP IngressRouteTCP
|
ingressRouteTCP IngressRouteTCP
|
||||||
expected []*endpoint.Endpoint
|
ignoreHostnameAnnotation bool
|
||||||
|
expected []*endpoint.Endpoint
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
title: "IngressRouteTCP with hostname annotation",
|
title: "IngressRouteTCP with hostname annotation",
|
||||||
@ -1140,6 +1309,54 @@ func TestTraefikProxyOldIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "IngressRouteTCP ignoring annotation",
|
||||||
|
ingressRouteTCP: IngressRouteTCP{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: oldIngressrouteTCPGVR.GroupVersion().String(),
|
||||||
|
Kind: "IngressRouteTCP",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "ingressroutetcp-multi-host-annotations-match",
|
||||||
|
Namespace: defaultTraefikNamespace,
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "f.example.com",
|
||||||
|
"external-dns.alpha.kubernetes.io/target": "target.domain.tld",
|
||||||
|
"kubernetes.io/ingress.class": "traefik",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Spec: traefikIngressRouteTCPSpec{
|
||||||
|
Routes: []traefikRouteTCP{
|
||||||
|
{
|
||||||
|
Match: "HostSNI(`g.example.com`, `h.example.com`)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignoreHostnameAnnotation: true,
|
||||||
|
expected: []*endpoint.Endpoint{
|
||||||
|
{
|
||||||
|
DNSName: "g.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroutetcp/traefik/ingressroutetcp-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
DNSName: "h.example.com",
|
||||||
|
Targets: []string{"target.domain.tld"},
|
||||||
|
RecordType: endpoint.RecordTypeCNAME,
|
||||||
|
RecordTTL: 0,
|
||||||
|
Labels: endpoint.Labels{
|
||||||
|
"resource": "ingressroutetcp/traefik/ingressroutetcp-multi-host-annotations-match",
|
||||||
|
},
|
||||||
|
ProviderSpecific: endpoint.ProviderSpecific{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "IngressRouteTCP omit wildcard host sni",
|
title: "IngressRouteTCP omit wildcard host sni",
|
||||||
ingressRouteTCP: IngressRouteTCP{
|
ingressRouteTCP: IngressRouteTCP{
|
||||||
@ -1191,7 +1408,7 @@ func TestTraefikProxyOldIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
_, err = fakeDynamicClient.Resource(oldIngressrouteTCPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
_, err = fakeDynamicClient.Resource(oldIngressrouteTCPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik")
|
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik", ti.ignoreHostnameAnnotation)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, source)
|
assert.NotNil(t, source)
|
||||||
|
|
||||||
@ -1203,7 +1420,7 @@ func TestTraefikProxyOldIngressRouteTCPEndpoints(t *testing.T) {
|
|||||||
endpoints, err := source.Endpoints(context.Background())
|
endpoints, err := source.Endpoints(context.Background())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, endpoints, len(ti.expected))
|
assert.Len(t, endpoints, len(ti.expected))
|
||||||
assert.Equal(t, endpoints, ti.expected)
|
assert.Equal(t, ti.expected, endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1212,9 +1429,10 @@ func TestTraefikProxyOldIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
for _, ti := range []struct {
|
for _, ti := range []struct {
|
||||||
title string
|
title string
|
||||||
ingressRouteUDP IngressRouteUDP
|
ingressRouteUDP IngressRouteUDP
|
||||||
expected []*endpoint.Endpoint
|
ignoreHostnameAnnotation bool
|
||||||
|
expected []*endpoint.Endpoint
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
title: "IngressRouteTCP with hostname annotation",
|
title: "IngressRouteTCP with hostname annotation",
|
||||||
@ -1286,6 +1504,26 @@ func TestTraefikProxyOldIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "IngressRouteTCP ignoring hostname annotation",
|
||||||
|
ingressRouteUDP: IngressRouteUDP{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: oldIngressrouteUDPGVR.GroupVersion().String(),
|
||||||
|
Kind: "IngressRouteUDP",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "ingressrouteudp-annotation",
|
||||||
|
Namespace: defaultTraefikNamespace,
|
||||||
|
Annotations: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "a.example.com",
|
||||||
|
"external-dns.alpha.kubernetes.io/target": "target.domain.tld",
|
||||||
|
"kubernetes.io/ingress.class": "traefik",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ignoreHostnameAnnotation: true,
|
||||||
|
expected: nil,
|
||||||
|
},
|
||||||
} {
|
} {
|
||||||
ti := ti
|
ti := ti
|
||||||
t.Run(ti.title, func(t *testing.T) {
|
t.Run(ti.title, func(t *testing.T) {
|
||||||
@ -1312,7 +1550,7 @@ func TestTraefikProxyOldIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
_, err = fakeDynamicClient.Resource(oldIngressrouteUDPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
_, err = fakeDynamicClient.Resource(oldIngressrouteUDPGVR).Namespace(defaultTraefikNamespace).Create(context.Background(), &ir, metav1.CreateOptions{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik")
|
source, err := NewTraefikSource(context.TODO(), fakeDynamicClient, fakeKubernetesClient, defaultTraefikNamespace, "kubernetes.io/ingress.class=traefik", ti.ignoreHostnameAnnotation)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NotNil(t, source)
|
assert.NotNil(t, source)
|
||||||
|
|
||||||
@ -1324,7 +1562,7 @@ func TestTraefikProxyOldIngressRouteUDPEndpoints(t *testing.T) {
|
|||||||
endpoints, err := source.Endpoints(context.Background())
|
endpoints, err := source.Endpoints(context.Background())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Len(t, endpoints, len(ti.expected))
|
assert.Len(t, endpoints, len(ti.expected))
|
||||||
assert.Equal(t, endpoints, ti.expected)
|
assert.Equal(t, ti.expected, endpoints)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user