Sign inSign up

contentwaysorg/poweradmin-operator

By contentwaysorg

•Updated 3 months ago

Kubernetes operator for managing DNS zones and records via the Poweradmin API.

Image
Networking
API management
Developer tools
0

200

contentwaysorg/poweradmin-operator repository overview

⁠poweradmin-operator

A Kubernetes operator for managing DNS zones and records via Poweradmin⁠. Built on top of poweradmin-go⁠.

⁠Features

  • DNSZone — create, update, and delete DNS zones in Poweradmin
  • DNSRecord — manage individual DNS records (A, AAAA, CNAME, MX, TXT, ...)
  • Per-namespace credentials — each namespace uses its own Poweradmin account via a Kubernetes Secret, making the operator safe for multi-tenant clusters
  • Finalizer-based cleanup — zones and records are deleted from Poweradmin before the Kubernetes resource is removed

⁠Installation

⁠Prerequisites
  • Kubernetes 1.28+
  • Helm 3.x
  • A running Poweradmin 4.3.0+ instance with API v2
⁠Install via Helm
helm install poweradmin-operator oci://registry-1.docker.io/contentwaysorg/poweradmin-operator-chart \
  --namespace poweradmin-operator \
  --create-namespace
⁠Create credentials per namespace

The operator reads Poweradmin credentials from a Secret named poweradmin-credentials (configurable) in the same namespace as the CR.

kubectl create secret generic poweradmin-credentials \
  --from-literal=POWERADMIN_URL=https://dns.example.com \
  --from-literal=POWERADMIN_API_KEY=your-api-key \
  --namespace default

⁠Quickstart

⁠Create a DNS zone
apiVersion: dns.contentways.org/v1alpha1
kind: DNSZone
metadata:
  name: example-org
  namespace: default
spec:
  name: example.org
  type: NATIVE
  nameservers:
    - ns1.example.org
    - ns2.example.org
kubectl apply -f dnszone.yaml
kubectl get dnszones
NAME          ZONE         TYPE     ID    READY
example-org   example.org  NATIVE   42    True
⁠Create a DNS record
apiVersion: dns.contentways.org/v1alpha1
kind: DNSRecord
metadata:
  name: www-example-org
  namespace: default
spec:
  zoneName: example.org
  name: www
  type: A
  content: 1.2.3.4
  ttl: 3600
kubectl apply -f dnsrecord.yaml
kubectl get dnsrecords
NAME              ZONE         NAME   TYPE   CONTENT   TTL    READY
www-example-org   example.org  www    A      1.2.3.4   3600   True

⁠API Reference

⁠DNSZone
FieldTypeRequiredDescription
spec.namestring✓DNS zone name (e.g. example.org)
spec.typestringZone type: NATIVE, MASTER, SLAVE (default: NATIVE)
spec.nameservers[]string✓Nameservers for the zone (e.g. ["ns1.example.org"])
spec.mastersstringMaster server IPs for SLAVE zones
Status fieldDescription
status.zoneIdNumeric ID assigned by Poweradmin
status.conditions[Ready]True when the zone is in sync
⁠DNSRecord
FieldTypeRequiredDescription
spec.zoneNamestring✓Name of the parent DNS zone
spec.namestring✓Record name (e.g. www)
spec.typestring✓Record type: A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR, SOA
spec.contentstring✓Record value
spec.ttlintegerTTL in seconds (default: 3600)
spec.priorityintegerPriority for MX/SRV records (default: 0)
spec.disabledbooleanDisable the record (default: false)
Status fieldDescription
status.recordIdNumeric ID assigned by Poweradmin
status.zoneIdNumeric ID of the parent zone
status.conditions[Ready]True when the record is in sync

⁠Helm Values

ValueDefaultDescription
image.repositorycontentwaysorg/poweradmin-operatorContainer image
image.tagChart appVersionImage tag
poweradmin.credentialsSecretNamepoweradmin-credentialsSecret name to look up per namespace
replicaCount1Number of operator replicas
leaderElection.enabledfalseEnable leader election for HA
crds.installtrueInstall CRDs as Helm hooks
metrics.enabledtrueExpose Prometheus metrics

⁠Multi-tenancy

Each namespace manages its own Poweradmin credentials — a DNSZone or DNSRecord in namespace team-a will use the Secret poweradmin-credentials from team-a, completely isolated from other namespaces.

namespace: team-a          namespace: team-b
  Secret → account-a         Secret → account-b
  DNSZone → zone-a.example   DNSZone → zone-b.example

⁠Development

# Run tests
make test

# Run locally against a kind cluster
kind create cluster --name poweradmin-operator
make install
POWERADMIN_URL=https://dns.example.com \
POWERADMIN_API_KEY=your-key \
make run

Pre-commit hooks are configured in .pre-commit-config.yaml⁠:

pip install pre-commit
pre-commit install

⁠License

Apache 2.0⁠ © 2026 Patrick Omland

Tag summary

Content type

Image

Digest

sha256:7049f578d…

Size

31.9 MB

Last updated

3 months ago

docker pull contentwaysorg/poweradmin-operator