Network Egress & Domains¶
KubeManta is self-hosted and runs entirely inside your own Kubernetes cluster. It reaches a small, well-defined set of external domains — and most of those are optional and only contacted when you turn a feature on. This page lists every domain so your network team can allowlist (or block) them for approval on a corporate/firewalled network.
Minimal footprint
A default install with AI and external integrations left off needs only api.keygen.sh (licensing) and registry.kubemanta.com (image pulls), plus Docker Hub for the preflight image unless you mirror it (see Images your nodes pull). api.kubemanta.com is contacted only if you turn the update check on — it is off by default. An air-gapped install with an offline licence file contacts none of these.
Core domains¶
These support licensing, installation, and the optional update check.
| Domain | Purpose | Required? | When |
|---|---|---|---|
api.keygen.sh |
Licence validation, plus a machine heartbeat that keeps this cluster's activation alive. By default the heartbeat also reports the cluster's node count — numbers only, never node names, labels or workload data. The count is never used to charge you or to limit a feature. | Yes — unless air-gapped with an offline licence file, which makes no licensing call | Validation every 12 hours, heartbeat every 6 hours; the node count is sent at most once a day, and only when it changed |
registry.kubemanta.com |
Container image + Helm chart pulls | Yes | Install, upgrade, and image pulls |
api.kubemanta.com |
Update-check feed (latest available version) | No — off by default | Only when you turn the update check on: every 6 hours (cached) |
The node count can stay in your cluster
Set license.reportNodeCount=false in your Helm values (it sets LICENSE_METER_ENABLED=false on the agent, and survives every helm upgrade) and the heartbeat no longer carries the node count. Nothing else changes: licence validation and the heartbeat continue, every feature keeps working, and the figure is still calculated and shown to you in Admin → License.
The update check is opt-in
The update check is a convenience, not a requirement, and a default install never contacts api.kubemanta.com. To turn it on, set updates.checkEnabled=true in your Helm values or use the toggle in Admin → License. The endpoint it calls is GET https://api.kubemanta.com/version, which returns only the latest published version number — no cluster data is sent. Air-gapped installs keep it off regardless of either setting.
AI providers (optional)¶
Contacted only when you configure an AI provider that your data-residency settings allow: a provider not ticked under Allowed Providers (Admin → AI → Guardrails) is never called, and Local Only refuses every provider you do not host yourself. Which domain applies depends on the provider you choose. With Egress Control switched on (it is off by default), the AI path may reach only the hosts you allow.
| Provider | Domain |
|---|---|
| Anthropic | api.anthropic.com |
| OpenAI | api.openai.com |
| Google (Gemini) | generativelanguage.googleapis.com, www.googleapis.com |
| Groq | api.groq.com |
| Azure OpenAI | your Azure OpenAI resource endpoint |
| Ollama | your Ollama host (typically in-cluster / local) |
| Custom (OpenAI-compatible) | the base URL you configure |
Keeping cluster data in-network
Turn on Local Only in AI Guardrails (KUBEMANTA_AI_LOCAL_ONLY=true seeds it at first start) to refuse every provider you do not host yourself — pair it with an in-cluster Ollama and no cluster data leaves your network. See AI Guardrails.
Integrations (optional)¶
Contacted only if you configure the corresponding integration.
| Integration | Domain | Configured in |
|---|---|---|
| Slack alerts | hooks.slack.com (your webhook) |
Alerts → Integrations |
| Slack ChatOps (ask and approve from Slack, Socket Mode) | slack.com (Slack Web API), then a long-lived WebSocket to the *.slack.com address Slack hands back |
Alerts → Integrations |
| Telegram alerts | api.telegram.org |
Alerts → Integrations |
| Email alerts | your SMTP relay — the host and port you set (default port 587; SMTP, not HTTPS) | Alerts → Integrations |
| PagerDuty | events.pagerduty.com |
Alerts → Integrations |
| Datadog | api.datadoghq.com (or api.<your Datadog site>) |
Alerts → Integrations |
| CloudWatch alerts | Amazon SNS in the region you set (sns.<region>.amazonaws.com) |
Alerts → Integrations |
| Generic / audit webhook | the URL you provide | Alerts → Integrations |
| Incident tickets — Jira | the Jira address you set (e.g. your-site.atlassian.net) |
Alerts → Integrations |
| Incident tickets — Trello | api.trello.com |
Alerts → Integrations |
| AWS / GCP / Azure APIs | the cloud provider's API endpoints | Admin → Cloud (for cloud-network topology) |
| SSO | your identity provider — the OIDC issuer, SAML metadata URL or LDAP server you configure | Admin → Auth |
Database backup (persistence.replication) |
the S3-compatible bucket endpoint you set — the one feature that copies KubeManta's database out of the cluster; off by default | Helm values |
Container scanning (self-scan)¶
On-demand scans run as an in-cluster Trivy Job. Trivy does not ship its vulnerability database inside its image — each scan downloads it from an OCI registry:
| What | Default source | Override (your own mirror) |
|---|---|---|
| Vulnerability database | mirror.gcr.io/aquasec/trivy-db, falling back to ghcr.io/aquasecurity/trivy-db |
security.scanning.selfScan.dbRepository |
| Java database (jar scanning) | mirror.gcr.io/aquasec/trivy-java-db, falling back to ghcr.io/aquasecurity/trivy-java-db |
security.scanning.selfScan.javaDbRepository |
| Misconfiguration checks bundle | mirror.gcr.io/aquasec/trivy-checks |
security.scanning.selfScan.checksBundleRepository |
| The images being scanned | the registries your workloads already pull from | — |
ghcr.io serves layer data from pkg-containers.githubusercontent.com, so allow both if you allow it. On an air-gapped network a database mirror is required (see Air-gapped install). Reading reports from your own trivy-operator makes none of these requests, and security.scanning.enabled=false stops all of them.
Images your nodes pull¶
Your nodes, not KubeManta, pull these — include them on the node egress path. KubeManta's own images come from registry.kubemanta.com. A few components use public images from Docker Hub (docker.io) by default, each overridable with its Helm value:
| Image | When | Value |
|---|---|---|
python:3.12-alpine |
the pre-install/upgrade preflight check (on by default) | preflight.image, or preflight.enabled=false |
aquasec/trivy |
self-scan Jobs | security.scanning.selfScan.image |
haproxy |
only with the in-pod TLS proxy (tlsSidecar.enabled) |
tlsSidecar.image |
litestream/litestream |
only with database backup (persistence.replication.enabled) |
persistence.replication.image |
nicolaka/netshoot |
only for live network probes (Network Analyzer) | netAnalyzer.probeImage |
When an admin deploys the guided Prometheus (Admin → Observability), the nodes also pull quay.io/prometheus/prometheus and registry.k8s.io/kube-state-metrics/kube-state-metrics (metrics.prometheusDeploy.image, metrics.prometheusDeploy.ksmImage).
With global.installCertManager=true, the optional cert-manager subchart (v1.21.2) also pulls its five images from quay.io/jetstack (controller, webhook, cainjector, startupapicheck and the ACME solver).
Not external — in-cluster only¶
These are your own services on your cluster network; KubeManta connects to them over your internal network, not the public internet:
- Prometheus, Grafana, Alertmanager — your monitoring stack (Integrations).
Summary for a firewall request¶
# Always (default install) — none of these for air-gap with an offline licence file:
api.keygen.sh # licence validation 12h + heartbeat 6h (node count unless opted out)
registry.kubemanta.com
docker.io # preflight image (python:3.12-alpine) unless mirrored or disabled
api.kubemanta.com # only if you turn the update check on — off by default
# Only if you enable AI (and not local-only), the relevant provider host, e.g.:
api.anthropic.com # or api.openai.com / api.groq.com / ...
# Only if you enable alerting/cloud integrations, the relevant host(s), e.g.:
hooks.slack.com / api.telegram.org / <your SMTP relay>:587 / events.pagerduty.com
api.datadoghq.com / sns.<region>.amazonaws.com / <your cloud provider APIs>
# Only with Slack ChatOps (Socket Mode):
slack.com + *.slack.com # Web API + the WebSocket host Slack returns
# Only with self-scan (unless you mirror the Trivy databases):
mirror.gcr.io / ghcr.io / pkg-containers.githubusercontent.com / docker.io (aquasec/trivy)
# Only with incident tickets:
<your Jira address> or api.trello.com
# Only with SSO or database backup:
<your identity provider> / <your S3-compatible bucket endpoint>
# Only with live network probes, or the guided Prometheus deploy:
docker.io (nicolaka/netshoot) / quay.io / registry.k8s.io