{"id":46530365,"url":"https://github.com/rackerlabs/external-dns-rackspace-webhook","last_synced_at":"2026-04-30T00:01:05.967Z","repository":{"id":304193246,"uuid":"786904676","full_name":"rackerlabs/external-dns-rackspace-webhook","owner":"rackerlabs","description":"k8s External DNS webhook to support Rackspace Cloud DNS","archived":false,"fork":false,"pushed_at":"2026-04-06T13:20:48.000Z","size":89,"stargazers_count":1,"open_issues_count":2,"forks_count":2,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-04-06T15:27:23.752Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rackerlabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-04-15T14:20:45.000Z","updated_at":"2026-04-06T10:57:58.000Z","dependencies_parsed_at":"2025-12-19T00:09:58.469Z","dependency_job_id":"49278c80-c40c-4240-94d9-7f3a6f187f12","html_url":"https://github.com/rackerlabs/external-dns-rackspace-webhook","commit_stats":null,"previous_names":["rackerlabs/external-dns-rackspace-webhook"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/rackerlabs/external-dns-rackspace-webhook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fexternal-dns-rackspace-webhook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fexternal-dns-rackspace-webhook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fexternal-dns-rackspace-webhook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fexternal-dns-rackspace-webhook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rackerlabs","download_url":"https://codeload.github.com/rackerlabs/external-dns-rackspace-webhook/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackerlabs%2Fexternal-dns-rackspace-webhook/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32448882,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"ssl_error","status_checked_at":"2026-04-29T22:10:49.234Z","response_time":110,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-06T22:03:17.793Z","updated_at":"2026-04-30T00:01:05.961Z","avatar_url":"https://github.com/rackerlabs.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# External DNS Rackspace Webhook\n\nA webhook provider for [External DNS](https://github.com/kubernetes-sigs/external-dns) that enables automatic DNS record management for Rackspace Cloud DNS.\n\n## Overview\n\nThis webhook integrates External DNS with Rackspace Cloud DNS, allowing Kubernetes services and ingresses to automatically create, update, and delete DNS records in your Rackspace-managed domains.\n\n## Features\n\n- **Automatic DNS Management**: Creates and manages DNS records based on Kubernetes services and ingresses\n- **Multiple Record Types**: Supports A, AAAA, CNAME, TXT, and other standard DNS record types\n- **Domain Filtering**: Configure which domains the webhook should manage\n- **TTL Management**: Configurable TTL values with automatic normalization (minimum 300s)\n- **Dry Run Mode**: Test changes without actually modifying DNS records\n- **Health Checks**: Built-in health endpoints for monitoring\n\n## Prerequisites\n\n- Kubernetes cluster\n- Helm 3.8.0 or higher\n- Rackspace Cloud DNS account with API access\n- Rackspace username and API key\n\n## Installation\n\nThe recommended installation method uses the official [external-dns Helm chart](https://kubernetes-sigs.github.io/external-dns/) from the kubernetes-sigs project, with this webhook running as a sidecar container.\n\n### 1. Add the external-dns Helm repository\n\n```bash\nhelm repo add external-dns https://kubernetes-sigs.github.io/external-dns/\nhelm repo update\n```\n\n### 2. Create a secret with your Rackspace credentials\n\n```bash\nkubectl create namespace external-dns\n\nkubectl create secret generic rackspace-credentials \\\n  --namespace external-dns \\\n  --from-literal=username=\"YOUR_USERNAME\" \\\n  --from-literal=api-key=\"YOUR_API_KEY\"\n```\n\n### 3. Create a values file\n\n```yaml\n# external-dns-rackspace-values.yaml\nprovider:\n  name: webhook\n  webhook:\n    image:\n      repository: ghcr.io/rackerlabs/external-dns-rackspace-webhook\n      tag: v0.2.2\n    env:\n      - name: RACKSPACE_USERNAME\n        valueFrom:\n          secretKeyRef:\n            name: rackspace-credentials\n            key: username\n      - name: RACKSPACE_API_KEY\n        valueFrom:\n          secretKeyRef:\n            name: rackspace-credentials\n            key: api-key\n      - name: LOG_LEVEL\n        value: info\n      - name: DRY_RUN\n        value: \"false\"\n    service:\n      port: 8888\n    livenessProbe:\n      httpGet:\n        path: /healthz\n        port: http-webhook\n      initialDelaySeconds: 10\n      periodSeconds: 10\n      timeoutSeconds: 5\n      failureThreshold: 2\n    readinessProbe:\n      httpGet:\n        path: /healthz\n        port: http-webhook\n      initialDelaySeconds: 5\n      periodSeconds: 10\n      timeoutSeconds: 5\n      failureThreshold: 6\n\nsources:\n  - service\n  - ingress\n\ndomainFilters:\n  - example.com   # replace with your domain(s)\n\npolicy: upsert-only\nlogLevel: info\n```\n\n\u003e **Note**: `service.port: 8888` must match the webhook's `PORT` env var (default `8888`). The chart uses this value to configure `--webhook-provider-url` automatically and to route health probe traffic.\n\n### 4. Install\n\n```bash\nhelm upgrade --install external-dns external-dns/external-dns \\\n  --namespace external-dns \\\n  -f external-dns-rackspace-values.yaml\n```\n\n### Upgrading\n\n```bash\nhelm upgrade external-dns external-dns/external-dns \\\n  --namespace external-dns \\\n  -f external-dns-rackspace-values.yaml\n```\n\n## Configuration\n\n### Webhook environment variables\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `RACKSPACE_USERNAME` | Yes | - | Rackspace account username |\n| `RACKSPACE_API_KEY` | Yes | - | Rackspace API key |\n| `RACKSPACE_TENANT_ID` | No | - | Rackspace tenant ID |\n| `DOMAIN_FILTER` | No | - | Comma-separated list of domains to manage |\n| `DRY_RUN` | No | `false` | Enable dry run mode (no actual changes) |\n| `LOG_LEVEL` | No | `info` | Log level (debug, info, warn, error) |\n| `PORT` | No | `8888` | HTTP server port |\n\n### Common external-dns chart values\n\nSee the [external-dns chart documentation](https://kubernetes-sigs.github.io/external-dns/latest/charts/external-dns/) for the full list. Commonly used values:\n\n| Value | Description |\n|-------|-------------|\n| `domainFilters` | List of domains to manage |\n| `policy` | `upsert-only` (safe default) or `sync` (enables deletions) |\n| `sources` | Kubernetes resource types to watch (`service`, `ingress`, `crd`, etc.) |\n| `interval` | Sync interval (default `1m`) |\n| `logLevel` | external-dns log level |\n| `resources` | CPU/memory limits for the external-dns container |\n| `provider.webhook.resources` | CPU/memory limits for the webhook sidecar |\n\n## Development\n\n### Building\n\n```bash\n# Build binary\nmake build\n\n# Build Docker image\nmake docker-build\n\n# Run tests\nmake test\n```\n\n### Running Locally\n\n```bash\nexport RACKSPACE_USERNAME=\"your-username\"\nexport RACKSPACE_API_KEY=\"your-api-key\"\nexport DOMAIN_FILTER=\"example.com\"\nmake run\n```\n\n## API Endpoints\n\n- `GET /` - Negotiation endpoint (returns domain filter)\n- `GET /records` - Retrieve all DNS records\n- `POST /records` - Apply DNS record changes\n- `POST /adjustEndpoints` - Normalize and validate endpoints\n- `GET /healthz` - Health check endpoint\n\n## Docker\n\n### Using Pre-built Image\n\n```bash\ndocker run -e RACKSPACE_USERNAME=user -e RACKSPACE_API_KEY=key \\\n  ghcr.io/rackerlabs/external-dns-rackspace-webhook:latest\n```\n\n### Building Your Own\n\n```bash\ndocker build -t external-dns-rackspace-webhook .\n```\n\n## Troubleshooting\n\n### Common Issues\n\n1. **Authentication Errors**: Verify your Rackspace username and API key\n2. **Domain Not Found**: Ensure the domain exists in your Rackspace Cloud DNS\n3. **Permission Denied**: Check that your API key has DNS management permissions\n4. **TTL Too Low**: The webhook enforces a minimum TTL of 300 seconds\n\n### external-dns Compatibility (SRV Records)\n\nSRV record support requires external-dns v0.21.0 or later:\n\n- **Versions prior to 0.21** do not include SRV in the TXT registry's `getSupportedTypes()`. This prevents the registry from matching `srv-` prefixed TXT ownership records to their SRV data records, causing all SRV records to appear unowned. external-dns will not update or delete them.\n\n- **Version 0.21.0** fixes the ownership matching but introduces contradictory SRV validation in the CRD source. The CRD validator rejects targets with a trailing dot, while `ValidateSRVRecord` requires one per RFC 2782. This makes it impossible to create SRV records via DNSEndpoint CRDs. See [kubernetes-sigs/external-dns#6357](https://github.com/kubernetes-sigs/external-dns/issues/6357) and the fix in [PR #6383](https://github.com/kubernetes-sigs/external-dns/pull/6383).\n\n### Debug Mode\n\nEnable debug logging by setting `LOG_LEVEL` in your values file:\n\n```yaml\nprovider:\n  webhook:\n    env:\n      - name: LOG_LEVEL\n        value: debug\nlogLevel: debug\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests if applicable\n5. Submit a pull request\n\n## License\n\nThis project is licensed under the terms specified in the LICENSE file.\n\n## Support\n\nFor issues and questions:\n- Create an issue in this repository\n- Check the External DNS documentation\n- Review Rackspace Cloud DNS API documentation","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frackerlabs%2Fexternal-dns-rackspace-webhook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frackerlabs%2Fexternal-dns-rackspace-webhook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frackerlabs%2Fexternal-dns-rackspace-webhook/lists"}