A Kubernetes Helm chart for deploying the ESDDNS operator - an automated dynamic DNS updater for Kubernetes clusters using the Gandi.net API.
ESDDNS Operator is a Kopf-based Kubernetes operator that:
helm repo add esddns https://your-helm-repo-url
helm repo update
helm install esddns-operator esddns/esddns-operator \
--namespace esddns-system \
--create-namespace \
--set gandi.apiKey=<your-gandi-api-key> \
--set global.domain=yourdomain.com
kubectl get all -n esddns-system
kubectl logs -n esddns-system -l app=esddns-operator
gandi.apiKey - Your Gandi.net API key (required for DNS updates)global.domain - Target domain for DNS updates (e.g., yourdomain.com)# Change domain and DNS settings
global:
domain: yourdomain.com
recordName: "@" # @ for root domain
recordTTL: 300 # TTL in seconds
# Use ClusterIP service instead of LoadBalancer
service:
type: ClusterIP
# Development mode with debug logging
environment: development
# Disable monitoring
monitoring:
enabled: false
# Disable web service, operator only
service:
enabled: false
See values.yaml for all available options including:
kubectl get svc -n esddns-system esddns-service
Wait for the EXTERNAL-IP to be assigned (may take a few minutes on cloud providers).
EXTERNAL_IP=$(kubectl get svc -n esddns-system esddns-service \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}')
curl http://$EXTERNAL_IP/
kubectl logs -n esddns-system -l app=esddns-operator -f
kubectl port-forward -n esddns-system daemonset/esddns-operator-daemon 8080:8080
curl http://localhost:8080/metrics
helm install esddns-operator esddns/esddns-operator \
--set environment=production \
--set gandi.apiKey=<key>
helm install esddns-operator esddns/esddns-operator \
--set environment=development \
--set gandi.apiKey=<key>
The chart includes ServiceMonitor and PrometheusRules for Prometheus Operator:
helm install esddns-operator esddns/esddns-operator \
--set monitoring.enabled=true \
--set monitoring.serviceMonitor.enabled=true \
--set monitoring.prometheusRules.enabled=true \
--set gandi.apiKey=<key>
dns_updates_total - Successful DNS updatesdns_update_failures_total - Failed DNS updatesdns_update_duration_seconds - Time to update DNSlast_dns_update_timestamp - Last update timecurrent_wan_ip_info - Current WAN IPwan_ip_changes_total - IP change eventsThe chart includes pre-configured alerts for:
helm upgrade esddns-operator esddns/esddns-operator \
--set gandi.apiKey=<new-key> \
-n esddns-system
helm uninstall esddns-operator -n esddns-system
kubectl delete namespace esddns-system
# Check service status
kubectl describe svc -n esddns-system esddns-service
# Check events
kubectl get events -n esddns-system --sort-by='.lastTimestamp'
# Check operator logs
kubectl logs -n esddns-system -l app=esddns-operator -f
# Verify API key is set
kubectl get secret -n esddns-system esddns-gandi-credentials
# Check metrics
kubectl port-forward -n esddns-system daemonset/esddns-operator-daemon 8080:8080
curl http://localhost:8080/metrics
# Check pod status
kubectl describe pod -n esddns-system -l app=esddns-operator
# Check logs
kubectl logs -n esddns-system -l app=esddns-operator --previous
helm install esddns-operator esddns/esddns-operator \
--set service.type=LoadBalancer \
--set gandi.apiKey=<key>
# Creates AWS Network Load Balancer
helm install esddns-operator esddns/esddns-operator \
--set service.type=LoadBalancer \
--set gandi.apiKey=<key>
# Creates Google Cloud Load Balancer
helm install esddns-operator esddns/esddns-operator \
--set service.type=LoadBalancer \
--set gandi.apiKey=<key>
# Creates Azure Load Balancer
helm install esddns-operator esddns/esddns-operator \
--set service.type=NodePort \
--set gandi.apiKey=<key>
# Exposes service on node port (default: 80)
For Production:
sealed-secrets or sops# Using sealed-secrets
helm install esddns-operator esddns/esddns-operator \
--set gandi.apiKey= \
-f sealed-secret-values.yaml
The chart includes minimal RBAC permissions:
For additional security, apply network policies:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: esddns-operator
namespace: esddns-system
spec:
podSelector:
matchLabels:
app: esddns-operator
policyTypes:
- Ingress
- Egress
egress:
- to:
- namespaceSelector: {}
MIT - See LICENSE file for details
Contributions are welcome! Please see GitHub repository for contribution guidelines.