Getting Started
This guide walks you through installing SRE Portal and creating your first portal with DNS discovery.
Prerequisites
- A Kubernetes cluster (v1.28+)
kubectlconfigured to access the cluster- (Optional) Go 1.25+ and Docker for building from source
Install CRDs
Install the Custom Resource Definitions into the cluster:
make installThis applies the generated CRD manifests from config/crd/bases/.
Deploy the Operator
Using Helm
Add the chart and install it into its own namespace:
helm install sreportal oci://ghcr.io/golgoth31/charts/sreportal \
--namespace sreportal-system \
--create-namespaceTo customise settings, create a values.yaml file and pass it with -f:
helm install sreportal oci://ghcr.io/golgoth31/charts/sreportal \
--namespace sreportal-system \
--create-namespace \
-f values.yamlUsing Kustomize
kubectl apply -k config/defaultBuilding from Source
Build and push the container image, then deploy:
make docker-build IMG=<registry>/<image>:<tag>
make docker-push IMG=<registry>/<image>:<tag>
make deploy IMG=<registry>/<image>:<tag>Verify
kubectl get pods -n sreportal-systemYou should see the sreportal-controller-manager pod running.
Quick Start
Once the operator is running, a default Portal named main is created automatically. You can start discovering DNS records right away.
1. Create a Portal
The operator creates a main portal on startup. To add another portal:
apiVersion: sreportal.io/v1alpha1
kind: Portal
metadata:
name: production
namespace: sreportal-system
spec:
title: "Production Services"
subPath: "production"2. Create a DNS Resource
A DNS resource links manual DNS entries to a portal:
apiVersion: sreportal.io/v1alpha1
kind: DNS
metadata:
name: dns-sample
namespace: default
spec:
portalRef: main
groups:
- name: APIs
description: Backend API services
entries:
- fqdn: api.example.com
description: Main API endpoint
- fqdn: graphql.example.com
description: GraphQL API
- name: Monitoring
description: Observability tools
entries:
- fqdn: grafana.example.com
description: Grafana dashboards3. Annotate Services for Auto-Discovery
The operator discovers DNS records from Kubernetes resources that have the external-dns.alpha.kubernetes.io/hostname annotation:
apiVersion: v1
kind: Service
metadata:
name: my-web-app
namespace: default
annotations:
external-dns.alpha.kubernetes.io/hostname: "myapp.example.com"
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: my-web-appBy default, discovered endpoints are routed to the main portal. Use the sreportal.io/portal annotation to route to a different portal (see Annotations).
4. (Optional) Create a Remote Portal
A remote portal fetches DNS data from another SRE Portal instance instead of the local cluster. Set spec.remote.url to the base URL of the remote instance:
apiVersion: sreportal.io/v1alpha1
kind: Portal
metadata:
name: remote-cluster
namespace: sreportal-system
spec:
title: "Remote Cluster"
subPath: "remote-cluster"
remote:
url: "https://sreportal.other-cluster.example.com"
portal: "main" # optional: defaults to the main portal of the remote instanceThe operator syncs with the remote portal every 5 minutes. Fetched FQDNs appear with source remote and sync status is tracked in status.remoteSync.
TLS Configuration
You can configure TLS settings for remote portal connections via spec.remote.tls:
# Self-signed certificate (skip verification)
spec:
remote:
url: "https://sreportal.dev.example.com"
tls:
insecureSkipVerify: true
---
# Custom CA + mTLS client certificate
spec:
remote:
url: "https://sreportal.corp.example.com"
tls:
caSecretRef:
name: remote-portal-ca # Secret with "ca.crt" key
certSecretRef:
name: remote-portal-client-cert # Secret with "tls.crt" and "tls.key" keysThe referenced Secrets must exist in the same namespace as the Portal resource.
Note:
spec.remotecannot be set on themainportal (spec.main: true).
5. (Optional) Track Releases
Release CRs let you record deployment events. Each CR stores entries for a single day (named release-YYYY-MM-DD). You can add releases via the gRPC AddRelease RPC or by creating CRs directly:
apiVersion: sreportal.io/v1alpha1
kind: Release
metadata:
name: release-2026-03-21
namespace: sreportal-system
spec:
entries:
- type: deployment
version: v2.1.0
origin: ci/cd
date: "2026-03-21T14:30:00Z"
author: alice
message: "Deploy new payment service"
link: "https://github.com/example/repo/pull/42"Releases are displayed on the main portal’s Releases page in the web UI. The MCP releases server exposes list_releases for read-only access.
6. Access the Web UI
The web dashboard is served by the operator on port 8090. Forward the port to your local machine:
kubectl port-forward -n sreportal-system svc/sreportal-web-mcp-service 8090:8090Open http://localhost:8090 in your browser. The default route redirects to /main/links, showing all FQDNs for the main portal.
Running Locally
For development, you can run the operator against your current kubeconfig:
make runThis starts the controller, gRPC API, and web server locally. See Development for more details.
Next Steps
- Architecture – understand CRD relationships and controller patterns
- Configuration – customize sources, grouping rules, and timing
- Annotations – route endpoints to portals and assign groups