Skip to content

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ä — katso fm 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_FILTER nimenomaisesti).
  • Omistajuus — käytä ExternalDNS:n oletusarvoista TXT-rekisteriä (--registry=txt ja --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:

bash
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:

bash
kubectl get nodes -o json \
  | jq -r '.items[].status.images[]?.names[]?' \
  | grep 'external-dns-frostmoln-webhook:' | sort -u

Useampi 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.

yaml
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:

bash
kubectl apply -f external-dns.yaml

Webhook-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:

MuuttujaOletusKuvaus
FROSTMOLN_API_KEY— (pakollinen)Tenant-API-avain (fmk_...); tenantilla on oltava dns-käyttöoikeus
FROSTMOLN_API_KEY_FILELue avain sen sijaan liitetystä tiedostosta, jotta se pysyy poin ympäristön ulkopuolella
FROSTMOLN_API_URLhttps://api.frostmoln.cloud/apiAsiakas-API:n perus-URL (oltava https)
FROSTMOLN_TENANT_IDjohdetaan avaimestaTenantin ohitus
DOMAIN_FILTERvyöhykenimesiPilkulla erotellun verkkotunnussuodattimen ohitus
ZONE_CACHE_TTL1mKuinka kauan vyöhykeluetteloa pidetään välimuistissa
DRY_RUNfalseKirjaa 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=txt vakaalla --txt-owner-id-arvolla, jotta useat klusterit voivat turvallisesti jakaa vyöhykkeen.

Liittyvät