Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .cursor/skills/documentation-routes/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: documentation-routes
description: Regenerates documentation route metadata. Use whenever creating, editing, moving, renaming, or deleting documentation content, or when changing the documentation navigation and redirects.
---

# Documentation Routes

After adding or updating any documentation content, run this command from the documentation repository root:

```bash
make routes
```

Run it for content-only edits as well as page additions, deletions, moves, navigation changes, and redirect changes.

Review `generated/routes.json` after the command finishes and include its relevant changes with the documentation update. If route generation fails, fix the failure and rerun `make routes` before completing the task.
184 changes: 94 additions & 90 deletions generated/routes.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@
"relPath": "/getting-started/advanced-config/sandboxing.md",
"lastmod": "2026-08-06T14:42:58.000Z"
},
"/getting-started/advanced-config/edge-configuration": {
"relPath": "/getting-started/advanced-config/edge-configuration.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/getting-started/advanced-config/network-configuration": {
"relPath": "/getting-started/advanced-config/network-configuration.md",
"lastmod": "2025-03-12T14:59:41.000Z"
Expand All @@ -105,11 +109,11 @@
},
"/api-reference/kubernetes/management-api-reference": {
"relPath": "/api-reference/kubernetes/management-api-reference.md",
"lastmod": "2026-08-13T15:31:21.000Z"
"lastmod": "2026-08-29T16:32:07.000Z"
},
"/api-reference/kubernetes/agent-api-reference": {
"relPath": "/api-reference/kubernetes/agent-api-reference.md",
"lastmod": "2026-08-11T20:00:52.000Z"
"lastmod": "2026-08-29T16:32:07.000Z"
},
"/api-reference/graphql": {
"relPath": "/api-reference/graphql.md",
Expand Down Expand Up @@ -141,7 +145,7 @@
},
"/plural-features/continuous-deployment/management-controller/deployment-settings": {
"relPath": "/plural-features/continuous-deployment/management-controller/deployment-settings.md",
"lastmod": "2026-08-06T14:42:58.000Z"
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/continuous-deployment/deployment-operator": {
"relPath": "/plural-features/continuous-deployment/deployment-operator/index.md",
Expand Down Expand Up @@ -173,11 +177,11 @@
},
"/plural-features/continuous-deployment/service-templating": {
"relPath": "/plural-features/continuous-deployment/service-templating/index.md",
"lastmod": "2026-08-29T16:19:38.379Z"
"lastmod": "2026-08-29T22:15:22.702Z"
},
"/plural-features/continuous-deployment/service-templating/supporting-liquid-filters": {
"relPath": "/plural-features/continuous-deployment/service-templating/supporting-liquid-filters.md",
"lastmod": "2026-08-29T16:19:38.402Z"
"lastmod": "2026-08-29T22:15:22.724Z"
},
"/plural-features/continuous-deployment/lua": {
"relPath": "/plural-features/continuous-deployment/lua.md",
Expand Down Expand Up @@ -271,29 +275,77 @@
"relPath": "/plural-features/service-catalog/contribution-program.md",
"lastmod": "2025-03-12T14:59:41.000Z"
},
"/plural-features/workbenches": {
"relPath": "/plural-features/workbenches/index.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/workbenches/configuration": {
"relPath": "/plural-features/workbenches/configuration.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/workbenches/coding-agent": {
"relPath": "/plural-features/workbenches/coding-agent.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/workbenches/tools": {
"relPath": "/plural-features/workbenches/tools.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/workbenches/tools/datadog": {
"relPath": "/plural-features/workbenches/tools/datadog.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/running-jobs": {
"relPath": "/plural-features/workbenches/running-jobs.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/workbenches/automation": {
"relPath": "/plural-features/workbenches/automation.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/workbenches/follow-up-automation": {
"relPath": "/plural-features/workbenches/follow-up-automation.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/use-cases": {
"relPath": "/plural-features/workbenches/use-cases.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/policy-management": {
"relPath": "/plural-features/policy-management/index.md",
"lastmod": "2026-08-29T16:31:45.000Z"
},
"/plural-features/policy-management/stack-policies": {
"relPath": "/plural-features/policy-management/stack-policies.md",
"lastmod": "2026-08-29T16:31:45.000Z"
},
"/plural-features/policy-management/workbench-policies": {
"relPath": "/plural-features/policy-management/workbench-policies.md",
"lastmod": "2026-08-29T16:31:45.000Z"
},
"/plural-features/policy-management/simulating-policies": {
"relPath": "/plural-features/policy-management/simulating-policies.md",
"lastmod": "2026-08-29T16:31:45.000Z"
},
"/plural-features/policy-management/common-use-cases": {
"relPath": "/plural-features/policy-management/common-use-cases.md",
"lastmod": "2026-08-29T16:31:45.000Z"
},
"/plural-features/kubernetes-dashboard": {
"relPath": "/plural-features/kubernetes-dashboard/index.md",
"lastmod": "2025-03-12T14:59:41.000Z"
},
"/plural-features/plural-ai": {
"relPath": "/plural-features/plural-ai/index.md",
"lastmod": "2025-03-12T14:59:41.000Z"
},
"/plural-features/plural-ai/setup": {
"relPath": "/plural-features/plural-ai/setup.md",
"lastmod": "2025-03-12T14:59:41.000Z"
},
"/plural-features/plural-ai/architecture": {
"relPath": "/plural-features/plural-ai/architecture.md",
"lastmod": "2025-03-12T14:59:41.000Z"
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/plural-ai/ai-agent": {
"relPath": "/plural-features/plural-ai/ai-agent/index.md",
"lastmod": "2026-03-04T02:33:39.000Z"
},
"/plural-features/plural-ai/ai-agent/configure-agent": {
"relPath": "/plural-features/plural-ai/ai-agent/configure-agent.md",
"lastmod": "2026-08-29T16:16:14.000Z"
"lastmod": "2026-08-29T16:31:45.000Z"
},
"/plural-features/plural-ai/ai-agent/remote-browser": {
"relPath": "/plural-features/plural-ai/ai-agent/remote-browser.md",
Expand All @@ -303,17 +355,9 @@
"relPath": "/plural-features/plural-ai/sentinels.md",
"lastmod": "2025-11-08T16:45:39.000Z"
},
"/plural-features/plural-ai/arch-diagram": {
"relPath": "/plural-features/plural-ai/arch-diagram.md",
"lastmod": "2026-01-05T19:58:20.000Z"
},
"/plural-features/plural-ai/cost": {
"relPath": "/plural-features/plural-ai/cost.md",
"lastmod": "2025-03-12T14:59:41.000Z"
},
"/plural-features/plural-ai/multi-model-configuration": {
"relPath": "/plural-features/plural-ai/multi-model-configuration.md",
"lastmod": "2025-10-15T00:52:41.000Z"
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/flows": {
"relPath": "/plural-features/flows/index.md",
Expand Down Expand Up @@ -343,62 +387,6 @@
"relPath": "/plural-features/flows/scm-webhooks-and-pr-linking.md",
"lastmod": "2025-05-27T02:01:02.000Z"
},
"/plural-features/workbenches": {
"relPath": "/plural-features/workbenches/index.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/configuration": {
"relPath": "/plural-features/workbenches/configuration.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/coding-agent": {
"relPath": "/plural-features/workbenches/coding-agent.md",
"lastmod": "2026-05-27T21:33:58.000Z"
},
"/plural-features/workbenches/tools": {
"relPath": "/plural-features/workbenches/tools.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/tools/datadog": {
"relPath": "/plural-features/workbenches/tools/datadog.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/running-jobs": {
"relPath": "/plural-features/workbenches/running-jobs.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/automation": {
"relPath": "/plural-features/workbenches/automation.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/follow-up-automation": {
"relPath": "/plural-features/workbenches/follow-up-automation.md",
"lastmod": "2026-08-06T15:20:26.000Z"
},
"/plural-features/workbenches/use-cases": {
"relPath": "/plural-features/workbenches/use-cases.md",
"lastmod": "2026-05-27T21:33:58.000Z"
},
"/plural-features/policy-management": {
"relPath": "/plural-features/policy-management/index.md",
"lastmod": "2026-08-29T16:16:14.000Z"
},
"/plural-features/policy-management/stack-policies": {
"relPath": "/plural-features/policy-management/stack-policies.md",
"lastmod": "2026-08-29T16:16:14.000Z"
},
"/plural-features/policy-management/workbench-policies": {
"relPath": "/plural-features/policy-management/workbench-policies.md",
"lastmod": "2026-08-29T16:16:14.000Z"
},
"/plural-features/policy-management/simulating-policies": {
"relPath": "/plural-features/policy-management/simulating-policies.md",
"lastmod": "2026-08-29T16:16:14.000Z"
},
"/plural-features/policy-management/common-use-cases": {
"relPath": "/plural-features/policy-management/common-use-cases.md",
"lastmod": "2026-08-29T16:16:14.000Z"
},
"/plural-features/observability": {
"relPath": "/plural-features/observability/index.md",
"lastmod": "2025-05-10T04:27:39.000Z"
Expand Down Expand Up @@ -593,7 +581,7 @@
},
"/plural-features/continuous-deployment/deployment-operator/deployment-settings": {
"relPath": "/plural-features/continuous-deployment/management-controller/deployment-settings.md",
"lastmod": "2026-08-06T14:42:58.000Z"
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/deployments/operator/git-service": {
"relPath": "/plural-features/continuous-deployment/git-service.md",
Expand Down Expand Up @@ -664,20 +652,36 @@
"lastmod": "2025-03-12T14:59:41.000Z"
},
"/ai/setup": {
"relPath": "/plural-features/plural-ai/setup.md",
"lastmod": "2025-03-12T14:59:41.000Z"
"relPath": "/plural-features/plural-ai/multi-model-configuration.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/plural-ai/setup": {
"relPath": "/plural-features/plural-ai/multi-model-configuration.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/ai/architecture": {
"relPath": "/plural-features/plural-ai/architecture.md",
"lastmod": "2025-03-12T14:59:41.000Z"
"relPath": "/plural-features/plural-ai/index.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/ai/cost": {
"relPath": "/plural-features/plural-ai/cost.md",
"lastmod": "2025-03-12T14:59:41.000Z"
"relPath": "/plural-features/plural-ai/index.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/plural-ai/architecture": {
"relPath": "/plural-features/plural-ai/index.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/plural-ai/arch-diagram": {
"relPath": "/plural-features/plural-ai/index.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/plural-features/plural-ai/cost": {
"relPath": "/plural-features/plural-ai/index.md",
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/ai/overview": {
"relPath": "/plural-features/plural-ai/index.md",
"lastmod": "2025-03-12T14:59:41.000Z"
"lastmod": "2026-08-29T22:15:14.000Z"
},
"/deployments/pr/crds": {
"relPath": "/plural-features/pr-automation/crds.md",
Expand Down Expand Up @@ -717,10 +721,10 @@
},
"/management-api-reference": {
"relPath": "/api-reference/kubernetes/management-api-reference.md",
"lastmod": "2026-08-13T15:31:21.000Z"
"lastmod": "2026-08-29T16:32:07.000Z"
},
"/agent-api-reference": {
"relPath": "/api-reference/kubernetes/agent-api-reference.md",
"lastmod": "2026-08-11T20:00:52.000Z"
"lastmod": "2026-08-29T16:32:07.000Z"
}
}
68 changes: 68 additions & 0 deletions pages/getting-started/advanced-config/edge-configuration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
title: Edge configuration
description: Configure Plural for large edge Kubernetes fleets
---

## Why Plural works at the edge

Plural uses a pull-based architecture designed for clusters with restricted or intermittent connectivity. Each workload cluster runs a lightweight deployment agent that initiates connections to the management plane. The management plane does not need inbound network access to the cluster, and deployment credentials remain on the edge device. See the [architecture overview](/overview/architecture) for the complete design.

![Plural's management-plane and workload-cluster architecture](/assets/deployments/architecture.png)

The architecture is built for scale:

* Agent communication is egress-only, so edge devices do not need public endpoints, inbound firewall rules, or a shared private network with the management plane.
* Plural's [Git-aware caching and distribution layer](/resources/architecture/gitops-architecture) fetches source repositories centrally, creates content-addressed deployment artifacts, and serves them through multiple cache levels. Agents normally fetch a small digest and download an artifact only when its content changes. This avoids multiplying source-control and management-plane traffic by the number of clusters.
* Plural has been deployed in production environments with more than 5,000 edge clusters.

For very large fleets, tune the agent to reduce background traffic and persist its caches locally.

## Reduce agent polling

Apply an `AgentConfiguration` named `default` on every edge cluster. The following configuration keeps only service and cluster heartbeat polling enabled, sets both to 20 minutes, disables the persistent websocket, and turns off other periodic agent tasks:

```yaml
apiVersion: deployments.plural.sh/v1alpha1
kind: AgentConfiguration
metadata:
name: default
spec:
servicePollInterval: "20m"
clusterPingInterval: "20m"
managedNamespacePollInterval: "0s"
compatibilityUploadInterval: "20m"
Comment thread
michaeljguarino marked this conversation as resolved.
stackPollInterval: "0s"
sentinelPollInterval: "0s"
pipelineGateInterval: "0s"
vulnerabilityReportUploadInterval: "0s"
disableWebsocket: true
```

Setting an interval to `"0s"` disables that task. This profile minimizes requests from each device, but it also disables Stack runs, Sentinel runs, pipeline gate evaluation, vulnerability report uploads, and managed namespace polling on those clusters. We also downtune other polls from their existing defaults, usually 2-3m to support higher scale, this can be toggled up and down based on total fleet, we've found there's usually little need to tune until you get around 1k clusters.

If an edge cluster needs any of those features, enable its corresponding interval rather than copying this profile unchanged. See [AgentConfiguration](/plural-features/continuous-deployment/deployment-operator/agent-configuration) for the complete field reference and verification steps.

## Enable durable agent caches

Configure the deployment operator chart for the whole fleet through the `DeploymentSettings` resource on the management cluster:

```yaml
apiVersion: deployments.plural.sh/v1alpha1
kind: DeploymentSettings
metadata:
name: global
namespace: plrl-deploy-operator
spec:
agentHelmValues:
cache:
hostPath:
enabled: true
```

This mounts a node-local directory into the deployment operator and enables its durable cache. Cached manifests and agent state survive same-node pod restarts and upgrades, reducing cold-start downloads and recomputation on edge devices.

{% callout severity="warning" %}
The cache uses node-local `hostPath` storage. It does not follow the pod to another node, so an agent scheduled elsewhere starts with an empty cache. Keep the agent replica count at `1` when `cache.hostPath.enabled` is enabled.
{% /callout %}

`DeploymentSettings.spec.agentHelmValues` supplies defaults to agents managed by Plural. Existing agents receive the values during their next agent chart update. See [DeploymentSettings](/plural-features/continuous-deployment/management-controller/deployment-settings#agenthelmvalues) for more details.
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ spec:
key: openai
```

For a complete AI configuration guide, see [Setup Plural AI](/plural-features/plural-ai/setup). For observability + AI together, see [Observability Configuration](/plural-features/observability).
For a complete AI configuration guide, see [Set Up and Configure Plural AI](/plural-features/plural-ai/multi-model-configuration). For observability + AI together, see [Observability Configuration](/plural-features/observability).

### `reconciliation`

Expand Down
Loading
Loading