Volcengine Provider is a webhook-based provider built for ExternalDNS.
It bridges ExternalDNS and Volcengine DNS so that every DNS record
(create, update, delete) emitted by ExternalDNS is translated into the
corresponding Volcengine DNS API call through a lightweight webhook
server.
Security and privacy
This project takes security seriously.
For vulnerability reporting and supported versions, see SECURITY.md
Features
Webhook integration – dynamic DNS-record management via ExternalDNS
webhooks
Volcengine DNS native – all operations are forwarded to Volcengine
DNS service
Flexible configuration – configurable through files or environment
variables
Installation
Prerequisites
Helm 3.x installed
[Optional] Volcengine API key (AK/SK) and VPC information ready
[Optional] VKE IRSA ready
[Optional] Prepare Volcengine API AK SK
Volcengine API key (AK/SK) should be created with the following permissions:
If you need to use credentials from account 100000 to assume a role in account 100001, prepare a target role in account 100001 with permissions required by PrivateZone, then grant sts:AssumeRole to the source identity from account 100000 in the target role trust policy.
Note: when a role in account 100000 assumes a role in account 100001, the trust policy in account 100001 should explicitly include the role from account 100000, not only the account root. Example:
helm list -n kube-system
kubectl get pods -n kube-system -l app.kubernetes.io/name=external-dns
Helm parameters
Parameter
Description
Default
Required
userConfig.env.provider.credentialsProvider
Provider used to obtain Volcengine API credentials. Valid values: aksk (default) or irsa
aksk
yes
userConfig.env.provider.secretName
Kubernetes secret that contains Volcengine Access Key (access-key) and Secret Key (secret-key), must set if credentialsProvider=aksk
–
no
userConfig.env.provider.oidcRoleTrn
Volcengine OpenID Connect (OIDC) role to assume for API access, must set if credentialsProvider=irsa
–
no
userConfig.env.provider.roleTrn
Target role TRN used by STS AssumeRole after source credentials are resolved. For cross-account access, configure this as the target account role.
–
no
userConfig.env.provider.roleSessionName
Session name used when calling STS AssumeRole.
external-dns
no
userConfig.env.provider.durationSeconds
Session duration in seconds for STS AssumeRole.
provider default
no
userConfig.env.provider.vpc
Volcengine VPC identifier where the DNS zone is located.
–
yes
userConfig.env.provider.region
Volcengine region in which the DNS zone resides.
cn-beijing
yes
userConfig.env.provider.privatezoneEndpoint
Custom Volcengine OpenAPI privatezone endpoint (overrides built-in global endpoint).
open.volcengineapi.com
yes
userConfig.env.provider.stsEndpoint
Custom Volcengine OpenAPI sts endpoint (overrides built-in global endpoint).
sts.volcengineapi.com
yes
userConfig.args.controller.domainFilters
Limit possible target zones by a list of domain suffixes; specify multiple times or use comma-separated values (same as –domain-filter).
–
yes
userConfig.args.controller.policy
How DNS records are synchronized between source and provider. Valid values: sync (create/update/delete) and upsert-only (create/update, never delete) (same as –policy).
upsert-only
no
userConfig.args.controller.registry
Registry implementation used to keep track of DNS record ownership. Valid values: txt (default TXT registry) or noop (no ownership records) (same as –registry).
txt
no
userConfig.args.controller.txtOwnerId
Identifier used as the owner for TXT registry records; must be unique across concurrent ExternalDNS instances (same as –txt-owner-id).
–
no
userConfig.args.controller.txtPrefix
Prefix added to ownership TXT record names to avoid collisions with real DNS records (same as –txt-prefix).
externaldns-%{record_type}.
no
userConfig.args.controller.txtWildcardReplacement
Wildcard string replacement to use in TXT record names for wildcard * (same as –txt-wildcard-replacement).
wildcard
no
userConfig.args.provider.logLevel
Enable verbose debug logging in the Volcengine webhook provider.
info
no
publicConfig.image.controller.repository
Container image for the ExternalDNS controller.
registry.k8s.io/external-dns/external-dns
no
publicConfig.image.provider.repository
Container image for the Volcengine webhook provider.
volcengine/external-dns-volcengine-webhook
no
Tip: override defaults with –set or supply a custom values.yaml via -f.
When using cross-account authorization:
If credentialsProvider=aksk, secretName provides the source account credentials and roleTrn is the target account role.
If credentialsProvider=irsa, oidcRoleTrn is the source account role obtained through IRSA and roleTrn is the target account role.
In the target account role trust policy, explicitly include the source account role ARN/TRN when the source identity is a role.
Examples
external-dns support to reconcile LoadBalancer type service and ingress to dns record by default.
external-dns default reconcile policy is upsert-only.
Service(LoadBalancer Type)
kubectl apply -f example/service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
annotations:
external-dns.alpha.kubernetes.io/hostname: nginx.test.com. # expect to create record with hostname nginx.test.com
external-dns.alpha.kubernetes.io/ttl: "300" # expect to set ttl to 300
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer # LoadBalancer
Ingress
kubectl apply -f example/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
vke.volcengine.com/ingress-type: ingress-nginx
external-dns.alpha.kubernetes.io/ttl: "300" # expect to set ttl to 300
name: nginx-ingress-external
spec:
ingressClassName: nginx
rules:
- host: nginx-ingress-external.test.com # expect to create record with hostname nginx-ingress-external.test.com
http:
paths:
- backend:
service:
name: nginx-service
port:
number: 80
path: /path1
pathType: Prefix
- host: nginx-ingress-external2.test.com # expect to create record with hostname nginx-ingress-external2.test.com
http:
paths:
- backend:
service:
name: nginx-service
port:
number: 80
path: /path2
pathType: Prefix
Overview
Volcengine Provider is a webhook-based provider built for ExternalDNS. It bridges ExternalDNS and Volcengine DNS so that every DNS record (create, update, delete) emitted by ExternalDNS is translated into the corresponding Volcengine DNS API call through a lightweight webhook server.
Security and privacy
This project takes security seriously. For vulnerability reporting and supported versions, see SECURITY.md
Features
Installation
Prerequisites
[Optional] Prepare Volcengine API AK SK
Volcengine API key (AK/SK) should be created with the following permissions:
[Optional] Prepare VKE IRSA
https://www.volcengine.com/docs/6460/1324604
[Optional] Prepare cross-account AssumeRole
If you need to use credentials from account
100000to assume a role in account100001, prepare a target role in account100001with permissions required by PrivateZone, then grantsts:AssumeRoleto the source identity from account100000in the target role trust policy.Note: when a role in account
100000assumes a role in account100001, the trust policy in account100001should explicitly include the role from account100000, not only the account root. Example:Deploy with Helm
Export environment variables
[Optional] Create the Secret
Install the chart
Verify
Helm parameters
credentialsProvider=akskcredentialsProvider=irsaWhen using cross-account authorization:
credentialsProvider=aksk,secretNameprovides the source account credentials androleTrnis the target account role.credentialsProvider=irsa,oidcRoleTrnis the source account role obtained through IRSA androleTrnis the target account role.Examples
external-dns support to reconcile LoadBalancer type service and ingress to dns record by default.
external-dns default reconcile policy is upsert-only.
Service(LoadBalancer Type)
Ingress