ExternalDNS
ExternalDNS pitää Frostmoln Hallittu DNS -vyöhykkeidesi tietueet synkronoituina Kubernetes-resurssien Ingress, Service ja Gateway API kanssa — mistä tahansa Kubernetes-klusterista. Kun julkaiset työkuorman, sen isäntänimen tietueet luodaan, päivitetään ja siivotaan automaattisesti; et koskaan muokkaa DNS:ää käsin.
Frostmoln toimittaa webhook-tarjoajan, joka toimii sivuvaununa (sidecar) external-dns-podissa ja kääntää ExternalDNS:n suunnitelmat kutsuiksi Frostmolnin DNS-API:a vasten.
Pilotti — DNS-käyttöoikeus myönnetään tenant-kohtaisesti
ExternalDNS rakentuu Hallitun DNS:n päälle, joka on tenant-kohtaisesti käyttöön otettava pilotti-ominaisuus. Jos dns-käyttöoikeutta ei ole vielä tenantillasi, katso kohdasta Hallittu DNS, miten pyydät käyttöoikeutta.
Edellytykset
- Frostmoln DNS -vyöhyke verkkotunnukselle, johon haluat tietueita — katso Hallittu DNS luodaksesi sellaisen.
dns-käyttöoikeus tenantillasi (sama pilottikäyttöoikeus kuin Hallitulla DNS:llä).- Tenant-API-avain (
fmk_...), jonka omistaa kyseisen tenantin käyttäjä. Luo sellainen portaalissa kohdassa Asetukset → API-avaimet tai CLI:llä — katsofm account api-key.
Näin se toimii
- Tietueet — webhook listaa tenantin vyöhykkeet ja tietuejoukot ja palauttaa ne ExternalDNS:lle päätepisteinä (yksi tietuejoukko = yksi
(nimi, tyyppi)kaikkine arvoineen). - Käyttöönotto — luonnit ja päivitykset menevät DNS-API:n idempotentin, kokoelmatason upsertin kautta; poistot ratkaistaan tietuejoukon pysyvän ID:n kautta.
- Verkkotunnussuodatin — oletuksena webhook hakee tenantin vyöhykenimet käynnistyksessä ja hallitsee vain niitä. Luo uusi vyöhyke → käynnistä podi uudelleen, jotta se poimitaan mukaan (tai aseta
DOMAIN_FILTERnimenomaisesti). - Omistajuus — käytä ExternalDNS:n oletusarvoista TXT-rekisteriä (
--registry=txtja--txt-owner-id=<klusteri-id>), jotta tietuetta muuttaa vain sen luonut klusteri. TXT-tietuejoukot kulkevat API:n läpi muuttumattomina.
Asennus
Frostmoln Hallittu Kubernetes -ympäristössä ExternalDNS Frostmoln-webhookilla on yhden klikkauksen klusterilisäosa. Valitse external-dns klusteria luotaessa (portaali → Lisäosat, tai addons: ["external-dns"] API:ssa/Terraform-resurssissa), niin alusta asentaa kaiken puolestasi — external-dns-nimiavaruuden, RBAC:n, ExternalDNS-ohjaimen ja Frostmoln-webhook-sivuvaunun, ja --txt-owner-id on valmiiksi asetettu klusterin id:ksi. Alusta tarjoaa webhook-vedoksen ja se on esiasennettu klusterin solmuihin; et koskaan rakenna, hae tai viittaa siihen itse.
Ainoa sinulle jäävä vaihe on API-avain-Secret (seuraava osio): kunnes se on olemassa, webhook-kontti odottaa tilassa CreateContainerConfigError. Luo DNS-vyöhykkeesi ensin (tai käynnistä external-dns-Deployment uudelleen sen luomisen jälkeen), ja varmista että tenantillasi on dns-oikeus — ilman sitä webhook lokittaa 403 FEATURE_NOT_ENABLED.
Valitaan klusteria luotaessa
Lisäosa valitaan klusteria luotaessa. Lisätäksesi ExternalDNS:n olemassa olevaan klusteriin, luo se uudelleen lisäosa valittuna — jälkikäteen lisääminen on suunnitteilla. ExternalDNS Frostmoln-webhookilla on tällä hetkellä saatavilla vain Frostmoln Hallitussa Kubernetesissa.
Hallittu Kubernetes: ota lisäosa käyttöön
Frostmoln Hallittu Kubernetes -ympäristössä helpoin tapa on external-dns-klusterilisäosa: valitse se klusteria luotaessa (portaali → Lisäosat, tai addons: ["external-dns"] API:ssa/Terraform-resurssissa), niin alusta asentaa kaiken tässä oppaassa kuvatun — external-dns-nimiavaruuden, RBAC:n ja Deploymentin, ja --txt-owner-id on valmiiksi asetettu klusterin id:ksi.
Ainoa manuaalinen vaihe on API-avain-Secret (seuraava osio): kunnes se on olemassa, webhook-kontti odottaa tilassa CreateContainerConfigError. Luo DNS-vyöhykkeesi ensin (tai käynnistä external-dns-Deployment uudelleen sen luomisen jälkeen), ja varmista että tenantillasi on dns-oikeus — ilman sitä webhook lokittaa 403 FEATURE_NOT_ENABLED.
Vain klusteria luotaessa
Lisäosan voi valita vain klusteria luotaessa. Olemassa olevassa klusterissa käytä sen sijaan manifestia kohdassa Ota käyttöön.
Tallenna API-avain
Laita tenant-API-avain Secretiin, jota webhook voi lukea:
kubectl create namespace external-dns # ohita, jos lisäosa on jo luonut sen
kubectl create secret generic frostmoln-dns \
--namespace external-dns \
--from-literal=api-key=fmk_...Ota käyttöön
Hallitussa Kubernetesissa lisäosan kanssa voit ohittaa tämän osion — vain yllä oleva Secret tarvitaan.
Alla oleva manifesti suorittaa external-dns:n Frostmoln-webhookin kanssa sivuvaununa sekä ServiceAccountin ja RBAC:n, joita external-dns tarvitsee. Korvaa <klusteri-id> arvolla, joka on yksilöllinen tälle klusterille — se leimaa TXT-omistajuustietueet, jotta useat klusterit voivat turvallisesti jakaa vyöhykkeen. Podi määrittelee koko restricted-Pod Security -sopimuksen (Hallittu Kubernetes valvoo sitä koko klusterissa; eksplisiittinen runAsUser on tärkeä, koska ylävirran external-dns-vedos toimii root-käyttäjänä).
Hallitussa Kubernetesissa alusta esilataa webhook-vedoksen solmuihisi, ja vedos sijaitsee Frostmolnin sisäisessä rekisterissä, johon klusterisi ei yllä — joten <webhook-image> ei ole sinun valintasi. Sen on oltava viite, joka on jo solmuissa; mikä tahansa muu arvo jättää sivuvaunun tilaan ImagePullBackOff. Lue se klusterista ja liitä se sellaisenaan:
kubectl get nodes -o json \
| jq -r '.items[].status.images[]?.names[]?' \
| grep 'external-dns-frostmoln-webhook:' | sort -uUseampi kuin yksi viite tarkoittaa, että solmuvarantosi kattaa kaksi solmuvedossukupolvea: käytä sitä, joka on jokaisessa solmussa, tai päivitä varanto niin että ne täsmäävät. Jos tulostetta ei tule lainkaan, vedosta ei ole listattu kuormitetussa solmussa — kokeile yhtä solmua kerrallaan (kubectl get node <name> -o json) tai ota yhteyttä tukeen.
apiVersion: v1
kind: ServiceAccount
metadata:
name: external-dns
namespace: external-dns
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: external-dns
rules:
- apiGroups: ['']
resources: ['services', 'endpoints', 'pods', 'nodes']
verbs: ['get', 'watch', 'list']
- apiGroups: ['discovery.k8s.io']
resources: ['endpointslices']
verbs: ['get', 'watch', 'list']
- apiGroups: ['extensions', 'networking.k8s.io']
resources: ['ingresses']
verbs: ['get', 'watch', 'list']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: external-dns
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: external-dns
subjects:
- kind: ServiceAccount
name: external-dns
namespace: external-dns
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: external-dns
namespace: external-dns
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: external-dns
template:
metadata:
labels:
app: external-dns
spec:
serviceAccountName: external-dns
securityContext:
runAsNonRoot: true
runAsUser: 65532
runAsGroup: 65532
seccompProfile:
type: RuntimeDefault
containers:
- name: external-dns
image: registry.k8s.io/external-dns/external-dns:v0.21.0
args:
- --source=ingress
- --source=service
- --provider=webhook
- --registry=txt
- --txt-owner-id=<cluster-id>
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
- name: frostmoln-webhook
image: <webhook-image>
imagePullPolicy: IfNotPresent
env:
- name: FROSTMOLN_API_KEY
valueFrom:
secretKeyRef:
name: frostmoln-dns
key: api-key
ports:
- containerPort: 8080
name: http
livenessProbe:
httpGet:
path: /healthz
port: http
readinessProbe:
httpGet:
path: /healthz
port: http
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]Ota se käyttöön:
kubectl apply -f external-dns.yamlWebhook-API kuuntelee vain podin loopback-osoitetta — se on sopimuksen mukaan todentamaton ja hylkää minkä tahansa muun sidontaosoitteen — ja FROSTMOLN_API_URL:n on oltava https. Molemmat pakotetaan käynnistyksessä.
Konfigurointi
Lisäosa asettaa järkevät oletusarvot. Säätääksesi webhook-sivuvaunua, muokkaa external-dns-Deploymentia ja aseta nämä ympäristömuuttujat:
| Muuttuja | Oletus | Kuvaus |
|---|---|---|
FROSTMOLN_API_KEY | — (pakollinen) | Tenant-API-avain (fmk_...); tenantilla on oltava dns-käyttöoikeus |
FROSTMOLN_API_KEY_FILE | — | Lue avain sen sijaan liitetystä tiedostosta, jotta se pysyy poin ympäristön ulkopuolella |
FROSTMOLN_API_URL | https://api.frostmoln.cloud/api | Asiakas-API:n perus-URL (oltava https) |
FROSTMOLN_TENANT_ID | johdetaan avaimesta | Tenantin ohitus |
DOMAIN_FILTER | vyöhykenimesi | Pilkulla erotellun verkkotunnussuodattimen ohitus |
ZONE_CACHE_TTL | 1m | Kuinka kauan vyöhykeluetteloa pidetään välimuistissa |
DRY_RUN | false | Kirjaa muutokset, jotka ExternalDNS tekisi, ottamatta niitä käyttöön |
Huomautukset ja varaukset
- Julkiset vyöhykkeet hylkäävät yksityiset ja loopback-kohteet. Julkisen vyöhykkeen A/AAAA-tietueen on osoitettava reititettävään osoitteeseen — kuormantasaajaan tai julkiseen IP:hen, ei klusterin sisäiseen IP:hen. Sisäisille nimille käytä yksityistä (
vpcId) vyöhykettä. - Delegoi vyöhyke ennen kuin odotat julkista nimenselvitystä. Vyöhyke vastaa internetissä vasta, kun verkkotunnuksesi on delegoitu sen nimipalvelimiin — katso Hallittu DNS → Delegoi verkkotunnuksesi.
- Uudet vyöhykkeet vaativat webhookin uudelleenkäynnistyksen. Verkkotunnussuodatin haetaan kerran käynnistyksessä, joten käynnistä external-dns-podi uudelleen luotuasi vyöhykkeen, jota haluat ExternalDNS:n hallitsevan.
- TXT-omistajuutta tuetaan natiivisti — pidä
--registry=txtvakaalla--txt-owner-id-arvolla, jotta useat klusterit voivat turvallisesti jakaa vyöhykkeen.