ExternalDNS
ExternalDNS håller posterna i dina Frostmoln Hanterad DNS-zoner synkroniserade med Kubernetes-resurserna Ingress, Service och Gateway API — från vilket Kubernetes-kluster som helst. När du exponerar en arbetslast skapas, uppdateras och städas värdnamnets poster automatiskt; du redigerar aldrig DNS för hand.
Frostmoln levererar en webhook-leverantör som körs som en sidecar i external-dns-podden och översätter ExternalDNS planer till anrop mot Frostmolns DNS-API.
Pilot — DNS-åtkomst beviljas per tenant
ExternalDNS bygger på Hanterad DNS, som är en pilot-funktion som aktiveras per tenant. Om dns-rättigheten inte finns på din tenant ännu, se Hanterad DNS för hur du begär åtkomst.
Förutsättningar
- En Frostmoln DNS-zon för domänen du vill ha poster i — se Hanterad DNS för att skapa en.
dns-rättigheten på din tenant (samma pilotåtkomst som Hanterad DNS).- En tenant-API-nyckel (
fmk_...) som ägs av en användare i den tenanten. Skapa en i portalen under Inställningar → API-nycklar, eller med CLI:n — sefm account api-key.
Så fungerar det
- Poster — webhooken listar tenantens zoner och postuppsättningar och returnerar dem till ExternalDNS som ändpunkter (en postuppsättning = ett
(namn, typ)med alla sina värden). - Tillämpa — skapa och uppdatera går genom DNS-API:ets idempotenta upsert på samlingsnivå; borttagningar löses upp via postuppsättningens stabila ID.
- Domänfilter — som standard hämtar webhooken tenantens zonnamn vid start och hanterar bara dessa. Skapa en ny zon → starta om podden så att den plockas upp (eller ange
DOMAIN_FILTERuttryckligen). - Ägarskap — använd ExternalDNS standardregister för TXT (
--registry=txtmed--txt-owner-id=<kluster-id>) så att en post bara ändras av klustret som skapade den. TXT-postuppsättningar går oförändrade genom API:et.
Installera
På Frostmoln Hanterad Kubernetes är ExternalDNS med Frostmoln-webhooken ett klustertillägg med ett klick. Välj external-dns när du skapar klustret (portalen → Tillägg, eller addons: ["external-dns"] i API:et/Terraform-resursen) så installerar plattformen allt åt dig — namnrymden external-dns, RBAC, ExternalDNS-kontrollern och Frostmoln-webhook-sidecaren, med --txt-owner-id redan satt till klustrets id. Webhook-avbildningen tillhandahålls av plattformen och är förinstallerad på klusternoderna; du bygger, hämtar eller refererar aldrig till den själv.
Det enda steg som återstår för dig är API-nyckel-Secreten (nästa avsnitt): tills den finns väntar webhook-containern i CreateContainerConfigError. Skapa din DNS-zon först (eller starta om external-dns-Deploymenten efter att du skapat den), och se till att din tenant har rättigheten dns — utan den loggar webhooken 403 FEATURE_NOT_ENABLED.
Väljs när klustret skapas
Tillägget väljs när klustret skapas. För att lägga till ExternalDNS i ett befintligt kluster, återskapa det med tillägget valt — att lägga till i efterhand är planerat. ExternalDNS med Frostmoln-webhooken är för närvarande tillgängligt endast på Frostmoln Hanterad Kubernetes.
Hanterad Kubernetes: aktivera tillägget
På Frostmoln Hanterad Kubernetes är den enklaste vägen klustertillägget external-dns: välj det när klustret skapas (portalen → Tillägg, eller addons: ["external-dns"] i API:et/Terraform-resursen) så installerar plattformen allt i den här guiden — namnrymden external-dns, RBAC och Deploymenten, med --txt-owner-id redan satt till klustrets id.
Det enda manuella steget är API-nyckel-Secreten (nästa avsnitt): tills den finns väntar webhook-containern i CreateContainerConfigError. Skapa din DNS-zon först (eller starta om external-dns-Deploymenten efter att du skapat den), och se till att din tenant har rättigheten dns — utan den loggar webhooken 403 FEATURE_NOT_ENABLED.
Endast vid klusterskapande
Tillägget kan bara väljas när klustret skapas. På ett befintligt kluster, använd manifestet under Distribuera i stället.
Lagra API-nyckeln
Lägg tenant-API-nyckeln i en Secret som webhooken kan läsa:
kubectl create namespace external-dns # hoppa över om tillägget redan har skapat den
kubectl create secret generic frostmoln-dns \
--namespace external-dns \
--from-literal=api-key=fmk_...Distribuera
På Hanterad Kubernetes med tillägget aktiverat kan du hoppa över det här avsnittet — bara Secreten ovan behövs.
Manifestet nedan kör external-dns med Frostmoln-webhooken som en sidecar, plus ServiceAccount och RBAC som external-dns behöver. Ersätt <kluster-id> med ett värde som är unikt för detta kluster — det stämplar TXT-ägarskapsposterna så att flera kluster tryggt kan dela en zon. Podden deklarerar hela Pod Security-kontraktet restricted (Hanterad Kubernetes upprätthåller det klusterbrett; det explicita runAsUser är viktigt eftersom external-dns-avbildningen uppströms körs som root).
På Hanterad Kubernetes är webhook-avbildningen förinläst på dina noder, och den ligger i ett Frostmoln-internt register som ditt kluster inte når — så <webhook-image> är inte ditt val. Den måste vara en referens som redan finns på noderna; varje annat värde lämnar sidecaren i ImagePullBackOff. Läs av den från klustret och klistra in den ordagrant:
kubectl get nodes -o json \
| jq -r '.items[].status.images[]?.names[]?' \
| grep 'external-dns-frostmoln-webhook:' | sort -uMer än en referens betyder att din nodpool spänner över två nodavbildningsgenerationer: använd den som finns på varje nod, eller rulla om poolen så att de matchar. Ingen utdata alls betyder att avbildningen inte listas på en hårt belastad nod — prova en nod i taget (kubectl get node <name> -o json), eller kontakta supporten.
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]Tillämpa det:
kubectl apply -f external-dns.yamlWebhook-API:et lyssnar bara på poddens loopback — det är oautentiserat enligt kontrakt och avvisar varje annan bindningsadress — och FROSTMOLN_API_URL måste vara https. Båda upprätthålls vid start.
Konfiguration
Tillägget sätter förnuftiga standardvärden. För att justera webhook-sidecaren, redigera external-dns-Deploymenten och sätt dessa miljövariabler:
| Variabel | Standard | Beskrivning |
|---|---|---|
FROSTMOLN_API_KEY | — (obligatorisk) | Tenant-API-nyckel (fmk_...); tenanten måste ha dns-rättigheten |
FROSTMOLN_API_KEY_FILE | — | Läs nyckeln från en monterad fil i stället, för att hålla den utanför podens miljö |
FROSTMOLN_API_URL | https://api.frostmoln.cloud/api | Bas-URL för kund-API:et (måste vara https) |
FROSTMOLN_TENANT_ID | härleds från nyckeln | Åsidosättning av tenant |
DOMAIN_FILTER | dina zonnamn | Åsidosättning av kommaseparerat domänfilter |
ZONE_CACHE_TTL | 1m | Hur länge zonkatalogen cachas |
DRY_RUN | false | Logga ändringarna ExternalDNS skulle göra utan att tillämpa dem |
Anmärkningar och förbehåll
- Publika zoner avvisar privata mål och loopback-mål. En A/AAAA-post i en publik zon måste peka på en rutbar adress — en lastbalanserare eller en publik IP, inte en klusterintern IP. För interna namn, använd en privat (
vpcId) zon. - Delegera zonen innan du förväntar dig publik uppslagning. En zon svarar på internet först när din domän är delegerad till dess namnservrar — se Hanterad DNS → Delegera din domän.
- Nya zoner kräver en omstart av webhooken. Domänfiltret hämtas en gång vid start, så starta om external-dns-podden efter att du skapat en zon du vill att ExternalDNS ska hantera.
- TXT-ägarskap stöds inbyggt — behåll
--registry=txtmed ett stabilt--txt-owner-idså att flera kluster tryggt kan dela en zon.