# Tenants

> A complete Tenant combining the workload and networking best-practice baseline

> For the complete documentation index, see [llms.txt](https://projectcapsule.dev/llms.txt).
> The HTML version of this page is at https://projectcapsule.dev/docs/operating/best-practices/tenants/.

Use this complete Tenant as a starting point for application namespaces. It
combines the compatible baseline policies from [Workloads](/docs/operating/best-practices/workloads/)
and [Networking](/docs/operating/best-practices/networking/) into one ordered
`spec.rules` list. All namespaces in this Tenant receive the same baseline.

## Included Policies

| Area | Combined configuration |
|---|---|
| Resources | Default CPU, memory, and ephemeral-storage requests; remove CPU limits; match memory limits to requests; default ephemeral-storage limits. |
| Capacity | Share one illustrative quota across all Tenant namespaces. |
| QoS | Deny `BestEffort` after resource mutation. |
| Placement | Use the default scheduler, exclude control-plane nodes, deny control-plane and wildcard tolerations, and reject Pods created with `nodeName`. |
| Workload types | Deny DaemonSets. |
| Pod isolation | Set `hostUsers: false` and manage the namespace's Pod Security labels at `restricted`. |
| Images | Allow the approved registry path and require `Always` pull policy. |
| Priority | Default to and allow only `tenant-standard`. |
| Services | Allow only `ClusterIP` and deny every external IP. |
| Namespace trust | Deny adding or changing `company.com/system` on Tenant namespaces. |

## Before Applying

* Replace `solar`, `solar-owner`, and `registry.example.com/solar` with your
  Tenant, owner, and approved registry path. Publish immutable image references
  in that registry; the example's registry matcher does not require a digest.
* Size requests, storage defaults, and the shared quota from measured usage and
  available capacity. The numbers below illustrate a profile, not a universal
  production budget. There is deliberately no CPU-limit quota.
* Create the [non-preempting `tenant-standard` PriorityClass](/docs/operating/best-practices/workloads/#priorityclasses)
  before admitting workloads that use this Tenant. The Tenant references the
  class; it does not create it.
* Use Linux nodes with [user namespace support](/docs/operating/best-practices/workloads/#user-namespaces).
  Review kernel, runtime, and volume support before enabling `hostUsers: false`.
  For incompatible workloads, define a separate, reviewed namespace profile.
* Set all three Pod Security version labels to a version supported by your
  cluster. This example pins them to `v1.36`. Applications must supply security
  contexts that satisfy `restricted`; these rules do not generate those fields.

## Reference

Explore the ordered rules below. Select a card to open its documentation, or
view, copy, and download the complete Tenant YAML, including ownership and
PriorityClass settings.

<section class="tenant-example" aria-label="Tenant configuration example" data-tenant-example>
    <div class="tenant-example__toolbar">
      <div class="tenant-example__file">
        <span class="tenant-example__file-icon" aria-hidden="true">{ }</span>
        <div><strong>tenants.yaml</strong><span>Tenant · solar · 13 rules</span></div>
      </div>
      <div class="tenant-example__actions">
        <button type="button" class="btn btn-outline-primary btn-sm" data-copy-tenant hidden>Copy full YAML</button>
        <a class="btn btn-primary btn-sm" href="/docs/operating/best-practices/tenants.yaml" download="tenants.yaml">Download YAML</a>
      </div>
    </div>
    <p class="tenant-example__copy-status visually-hidden" role="status" data-copy-status></p>
    <details class="tenant-example__manifest">
      <summary>View complete Tenant YAML <span>Owners, priority settings, and all rules</span></summary>
      <pre tabindex="0" aria-label="Complete Tenant YAML"><code class="language-yaml" data-tenant-source>apiVersion: capsule.clastix.io/v1beta2
kind: Tenant
metadata:
  name: solar
spec:
  owners:
    - kind: User
      name: solar-owner
  # Default and allow the tenant-standard PriorityClass.
  priorityClasses:
    default: tenant-standard
    allowed: [tenant-standard]
  rules:

    # One shared budget across all namespaces in this Tenant.
    - quota:
        - name: application-budget
          hard:
            requests.cpu: &#34;20&#34;
            requests.memory: 40Gi
            limits.memory: 40Gi
            requests.ephemeral-storage: 100Gi
            limits.ephemeral-storage: 200Gi
            pods: &#34;100&#34;
            services: &#34;100&#34;

    # Apply placement and user-namespace settings on Pod creation.
    - mutate:
        - action: merge
          workloads:
            security:
              hostUsers: false
            placement:
              affinity:
                nodeAffinity:
                  requiredDuringSchedulingIgnoredDuringExecution:
                    nodeSelectorTerms:
                      - matchExpressions:
                          - key: node-role.kubernetes.io/control-plane
                            operator: DoesNotExist
                          - key: node-role.kubernetes.io/master
                            operator: DoesNotExist
      enforce:
        action: allow
        workloads:
          targets: [pod]
          placement:
            schedulers:
              - exact: [default-scheduler]

    # Defaults for application containers, sidecars, and init containers.
    - enforce:
        action: deny
        workloads:
          targets: [pod/containers, pod/initcontainers]
          resources:
            requests:
              cpu:
                policy: Default
                value: 250m
              memory:
                policy: Default
                value: 512Mi
              ephemeral-storage:
                policy: Default
                value: 1Gi
            limits:
              cpu:
                policy: Remove
              memory:
                policy: MatchRequest
              ephemeral-storage:
                policy: Default
                value: 2Gi

    # Normalize limits when a workload supplies Pod-level resources.
    - enforce:
        action: deny
        workloads:
          targets: [pod]
          resources:
            limits:
              cpu:
                policy: Remove
              memory:
                policy: MatchRequest

    # Deny BestEffort Pods after resource mutation.
    - enforce:
        action: deny
        workloads:
          targets: [pod]
          qosClasses: [BestEffort]

    # Reject control-plane and wildcard tolerations.
    - enforce:
        action: deny
        workloads:
          targets: [pod]
          placement:
            tolerations:
              - key:
                  exact:
                    - node-role.kubernetes.io/control-plane
                    - node-role.kubernetes.io/master
              - key: {exp: &#39;^$&#39;}
                operators: [Exists]

    # Check direct assignment only at creation; allow scheduler-bound updates.
    - enforce:
        action: deny
        conditions:
          - name: direct-node-assignment
            expression: &gt;-
              request.operation == &#39;CREATE&#39; &amp;&amp; has(object.spec.nodeName) &amp;&amp; object.spec.nodeName != &#39;&#39;
        workloads:
          targets: [pod]

    # Keep kind-level denials separate from workload property checks.
    - enforce:
        action: deny
        workloads:
          targets: [daemonset]

    # Allow approved images with Always pull policy.
    - enforce:
        action: allow
        workloads:
          targets:
            - pod/containers
            - pod/initcontainers
            - pod/ephemeralcontainers
            - pod/volumes
          registries:
            - exp: &#39;^registry\.example\.com/solar/.+$&#39;
              policy: [Always]

    # Allow only ClusterIP Services.
    - enforce:
        action: allow
        services:
          types: [ClusterIP]

    # Deny all Service external IPs.
    - enforce:
        action: deny
        services:
          externalIPs: {}

    # Apply and reconcile Pod Security labels on the Namespace itself.
    - enforce:
        action: allow
        metadata:
          - apiGroups: [v1]
            kinds: [Namespace]
            labels:
              pod-security.kubernetes.io/enforce:
                managed: restricted
                required: true
                values:
                  - exact: [restricted]
              pod-security.kubernetes.io/enforce-version:
                managed: v1.36
                required: true
                values:
                  - exact: [v1.36]
              pod-security.kubernetes.io/warn:
                managed: restricted
                required: true
                values:
                  - exact: [restricted]
              pod-security.kubernetes.io/warn-version:
                managed: v1.36
                required: true
                values:
                  - exact: [v1.36]
              pod-security.kubernetes.io/audit:
                managed: restricted
                required: true
                values:
                  - exact: [restricted]
              pod-security.kubernetes.io/audit-version:
                managed: v1.36
                required: true
                values:
                  - exact: [v1.36]

    # Reserve this trusted-platform label for administrator-managed namespaces.
    - enforce:
        action: deny
        metadata:
          - apiGroups: [v1]
            kinds: [Namespace]
            labels:
              company.com/system:
                values:
                  - exp: &#34;.*&#34;
</code></pre>
    </details>
    <div class="tenant-example__rule-heading"><span>Namespace rules</span><span>In declaration order</span></div>
    <div class="tenant-example__rules"><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-0" data-tenant-rule data-rule-index="0">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">01</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[0]</span>
                <h3 id="tenant-example-0-rule-0"><a class="tenant-rule__link" href="/docs/tenants/rules/#quotas">Shared resource budget</a></h3>
                <div class="tenant-rule__tags"><span>Quota</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">One shared budget across all namespaces in this Tenant.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Shared resource budget YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">quota</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span>- <span style="color:#062873;font-weight:bold">name</span>:<span style="color:#bbb"> </span>application-budget<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">hard</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">requests.cpu</span>:<span style="color:#bbb"> </span><span style="color:#4070a0">&#34;20&#34;</span><span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">requests.memory</span>:<span style="color:#bbb"> </span>40Gi<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">limits.memory</span>:<span style="color:#bbb"> </span>40Gi<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">requests.ephemeral-storage</span>:<span style="color:#bbb"> </span>100Gi<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">limits.ephemeral-storage</span>:<span style="color:#bbb"> </span>200Gi<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">pods</span>:<span style="color:#bbb"> </span><span style="color:#4070a0">&#34;100&#34;</span><span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">services</span>:<span style="color:#bbb"> </span><span style="color:#4070a0">&#34;100&#34;</span><span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-1" data-tenant-rule data-rule-index="1">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">02</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[1]</span>
                <h3 id="tenant-example-0-rule-1"><a class="tenant-rule__link" href="/docs/rules/mutate/workloads/#reference">Placement and user namespaces</a></h3>
                <div class="tenant-rule__tags"><span>Mutate</span><span>Enforce · allow</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Apply placement and user-namespace settings on Pod creation.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Placement and user namespaces YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">mutate</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span>- <span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>merge<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">security</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">hostUsers</span>:<span style="color:#bbb"> </span><span style="color:#007020;font-weight:bold">false</span><span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">placement</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">affinity</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">nodeAffinity</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span><span style="color:#062873;font-weight:bold">requiredDuringSchedulingIgnoredDuringExecution</span>:<span style="color:#bbb">
</span><span style="color:#bbb">                </span><span style="color:#062873;font-weight:bold">nodeSelectorTerms</span>:<span style="color:#bbb">
</span><span style="color:#bbb">                  </span>- <span style="color:#062873;font-weight:bold">matchExpressions</span>:<span style="color:#bbb">
</span><span style="color:#bbb">                      </span>- <span style="color:#062873;font-weight:bold">key</span>:<span style="color:#bbb"> </span>node-role.kubernetes.io/control-plane<span style="color:#bbb">
</span><span style="color:#bbb">                        </span><span style="color:#062873;font-weight:bold">operator</span>:<span style="color:#bbb"> </span>DoesNotExist<span style="color:#bbb">
</span><span style="color:#bbb">                      </span>- <span style="color:#062873;font-weight:bold">key</span>:<span style="color:#bbb"> </span>node-role.kubernetes.io/master<span style="color:#bbb">
</span><span style="color:#bbb">                        </span><span style="color:#062873;font-weight:bold">operator</span>:<span style="color:#bbb"> </span>DoesNotExist<span style="color:#bbb">
</span><span style="color:#bbb">  </span><span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>allow<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">targets</span>:<span style="color:#bbb"> </span>[pod]<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">placement</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">schedulers</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span>- <span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb"> </span>[default-scheduler]<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-2" data-tenant-rule data-rule-index="2">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">03</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[2]</span>
                <h3 id="tenant-example-0-rule-2"><a class="tenant-rule__link" href="/docs/rules/enforcement/workloads/#requests-and-limits">Container resource defaults</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Defaults for application containers, sidecars, and init containers.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Container resource defaults YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>deny<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">targets</span>:<span style="color:#bbb"> </span>[pod/containers, pod/initcontainers]<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">resources</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">requests</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">cpu</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>Default<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">value</span>:<span style="color:#bbb"> </span>250m<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">memory</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>Default<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">value</span>:<span style="color:#bbb"> </span>512Mi<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">ephemeral-storage</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>Default<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">value</span>:<span style="color:#bbb"> </span>1Gi<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">limits</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">cpu</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>Remove<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">memory</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>MatchRequest<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">ephemeral-storage</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>Default<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">value</span>:<span style="color:#bbb"> </span>2Gi<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-3" data-tenant-rule data-rule-index="3">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">04</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[3]</span>
                <h3 id="tenant-example-0-rule-3"><a class="tenant-rule__link" href="/docs/rules/enforcement/workloads/#targeting-resource-locations">Pod-level resource limits</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Normalize limits when a workload supplies Pod-level resources.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Pod-level resource limits YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>deny<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">targets</span>:<span style="color:#bbb"> </span>[pod]<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">resources</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">limits</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">cpu</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>Remove<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">memory</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>MatchRequest<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-4" data-tenant-rule data-rule-index="4">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">05</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[4]</span>
                <h3 id="tenant-example-0-rule-4"><a class="tenant-rule__link" href="/docs/rules/enforcement/workloads/#qos-classes">Reject BestEffort Pods</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Deny BestEffort Pods after resource mutation.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Reject BestEffort Pods YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>deny<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">targets</span>:<span style="color:#bbb"> </span>[pod]<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">qosClasses</span>:<span style="color:#bbb"> </span>[BestEffort]<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-5" data-tenant-rule data-rule-index="5">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">06</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[5]</span>
                <h3 id="tenant-example-0-rule-5"><a class="tenant-rule__link" href="/docs/rules/enforcement/workloads/#tolerations">Control-plane tolerations</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Reject control-plane and wildcard tolerations.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Control-plane tolerations YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>deny<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">targets</span>:<span style="color:#bbb"> </span>[pod]<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">placement</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">tolerations</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span>- <span style="color:#062873;font-weight:bold">key</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span><span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb">
</span><span style="color:#bbb">                </span>- node-role.kubernetes.io/control-plane<span style="color:#bbb">
</span><span style="color:#bbb">                </span>- node-role.kubernetes.io/master<span style="color:#bbb">
</span><span style="color:#bbb">          </span>- <span style="color:#062873;font-weight:bold">key</span>:<span style="color:#bbb"> </span>{<span style="color:#062873;font-weight:bold">exp</span>:<span style="color:#bbb"> </span><span style="color:#4070a0">&#39;^$&#39;</span>}<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">operators</span>:<span style="color:#bbb"> </span>[Exists]<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-6" data-tenant-rule data-rule-index="6">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">07</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[6]</span>
                <h3 id="tenant-example-0-rule-6"><a class="tenant-rule__link" href="/docs/rules/#enforcement-conditions">Prevent direct node assignment</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Check direct assignment only at creation; allow scheduler-bound updates.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Prevent direct node assignment YAML"><code class="language-yaml">- enforce:
    action: deny
    conditions:
      - name: direct-node-assignment
        expression: &gt;-
          request.operation == &#39;CREATE&#39; &amp;&amp; has(object.spec.nodeName) &amp;&amp; object.spec.nodeName != &#39;&#39;
    workloads:
      targets: [pod]
</code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-7" data-tenant-rule data-rule-index="7">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">08</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[7]</span>
                <h3 id="tenant-example-0-rule-7"><a class="tenant-rule__link" href="/docs/rules/enforcement/workloads/#deny-daemonsets">Block DaemonSets</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Keep kind-level denials separate from workload property checks.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Block DaemonSets YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>deny<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">targets</span>:<span style="color:#bbb"> </span>[daemonset]<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-8" data-tenant-rule data-rule-index="8">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">09</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[8]</span>
                <h3 id="tenant-example-0-rule-8"><a class="tenant-rule__link" href="/docs/rules/enforcement/workloads/#registries">Approved image registries</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · allow</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Allow approved images with Always pull policy.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Approved image registries YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>allow<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">workloads</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">targets</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span>- pod/containers<span style="color:#bbb">
</span><span style="color:#bbb">        </span>- pod/initcontainers<span style="color:#bbb">
</span><span style="color:#bbb">        </span>- pod/ephemeralcontainers<span style="color:#bbb">
</span><span style="color:#bbb">        </span>- pod/volumes<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">registries</span>:<span style="color:#bbb">
</span><span style="color:#bbb">        </span>- <span style="color:#062873;font-weight:bold">exp</span>:<span style="color:#bbb"> </span><span style="color:#4070a0">&#39;^registry\.example\.com/solar/.+$&#39;</span><span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">policy</span>:<span style="color:#bbb"> </span>[Always]<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-9" data-tenant-rule data-rule-index="9">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">10</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[9]</span>
                <h3 id="tenant-example-0-rule-9"><a class="tenant-rule__link" href="/docs/rules/enforcement/network/#types">ClusterIP Services only</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · allow</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Allow only ClusterIP Services.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="ClusterIP Services only YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>allow<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">services</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">types</span>:<span style="color:#bbb"> </span>[ClusterIP]<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-10" data-tenant-rule data-rule-index="10">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">11</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[10]</span>
                <h3 id="tenant-example-0-rule-10"><a class="tenant-rule__link" href="/docs/rules/enforcement/network/#denying-all-external-ips">Block external IPs</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Deny all Service external IPs.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Block external IPs YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>deny<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">services</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span><span style="color:#062873;font-weight:bold">externalIPs</span>:<span style="color:#bbb"> </span>{}<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-11" data-tenant-rule data-rule-index="11">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">12</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[11]</span>
                <h3 id="tenant-example-0-rule-11"><a class="tenant-rule__link" href="/docs/rules/enforcement/metadata/#managed">Restricted Pod Security labels</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · allow</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Apply and reconcile Pod Security labels on the Namespace itself.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Restricted Pod Security labels YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>allow<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">metadata</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span>- <span style="color:#062873;font-weight:bold">apiGroups</span>:<span style="color:#bbb"> </span>[v1]<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">kinds</span>:<span style="color:#bbb"> </span>[Namespace]<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">labels</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">pod-security.kubernetes.io/enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">managed</span>:<span style="color:#bbb"> </span>restricted<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">required</span>:<span style="color:#bbb"> </span><span style="color:#007020;font-weight:bold">true</span><span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">values</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span>- <span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb"> </span>[restricted]<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">pod-security.kubernetes.io/enforce-version</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">managed</span>:<span style="color:#bbb"> </span>v1.36<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">required</span>:<span style="color:#bbb"> </span><span style="color:#007020;font-weight:bold">true</span><span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">values</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span>- <span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb"> </span>[v1.36]<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">pod-security.kubernetes.io/warn</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">managed</span>:<span style="color:#bbb"> </span>restricted<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">required</span>:<span style="color:#bbb"> </span><span style="color:#007020;font-weight:bold">true</span><span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">values</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span>- <span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb"> </span>[restricted]<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">pod-security.kubernetes.io/warn-version</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">managed</span>:<span style="color:#bbb"> </span>v1.36<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">required</span>:<span style="color:#bbb"> </span><span style="color:#007020;font-weight:bold">true</span><span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">values</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span>- <span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb"> </span>[v1.36]<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">pod-security.kubernetes.io/audit</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">managed</span>:<span style="color:#bbb"> </span>restricted<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">required</span>:<span style="color:#bbb"> </span><span style="color:#007020;font-weight:bold">true</span><span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">values</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span>- <span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb"> </span>[restricted]<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">pod-security.kubernetes.io/audit-version</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">managed</span>:<span style="color:#bbb"> </span>v1.36<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">required</span>:<span style="color:#bbb"> </span><span style="color:#007020;font-weight:bold">true</span><span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">values</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span>- <span style="color:#062873;font-weight:bold">exact</span>:<span style="color:#bbb"> </span>[v1.36]<span style="color:#bbb">
</span></code></pre></div>
          </article><article class="tenant-rule" aria-labelledby="tenant-example-0-rule-12" data-tenant-rule data-rule-index="12">
            <header class="tenant-rule__header">
              <span class="tenant-rule__number" aria-hidden="true">13</span>
              <div class="tenant-rule__heading">
                <span class="tenant-rule__path">spec.rules[12]</span>
                <h3 id="tenant-example-0-rule-12"><a class="tenant-rule__link" href="/docs/rules/enforcement/metadata/#deny-metadata-values">Protect platform trust labels</a></h3>
                <div class="tenant-rule__tags"><span>Enforce · deny</span></div>
              </div>
              <span class="tenant-rule__arrow" aria-hidden="true">↗</span>
            </header>
            <p class="tenant-rule__description">Reserve this trusted-platform label for administrator-managed namespaces.</p>
            <div class="tenant-rule__body"><pre tabindex="0" aria-label="Protect platform trust labels YAML"><code class="language-yaml">- <span style="color:#062873;font-weight:bold">enforce</span>:<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">action</span>:<span style="color:#bbb"> </span>deny<span style="color:#bbb">
</span><span style="color:#bbb">    </span><span style="color:#062873;font-weight:bold">metadata</span>:<span style="color:#bbb">
</span><span style="color:#bbb">      </span>- <span style="color:#062873;font-weight:bold">apiGroups</span>:<span style="color:#bbb"> </span>[v1]<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">kinds</span>:<span style="color:#bbb"> </span>[Namespace]<span style="color:#bbb">
</span><span style="color:#bbb">        </span><span style="color:#062873;font-weight:bold">labels</span>:<span style="color:#bbb">
</span><span style="color:#bbb">          </span><span style="color:#062873;font-weight:bold">company.com/system</span>:<span style="color:#bbb">
</span><span style="color:#bbb">            </span><span style="color:#062873;font-weight:bold">values</span>:<span style="color:#bbb">
</span><span style="color:#bbb">              </span>- <span style="color:#062873;font-weight:bold">exp</span>:<span style="color:#bbb"> </span><span style="color:#4070a0">&#34;.*&#34;</span><span style="color:#bbb">
</span></code></pre></div>
          </article></div>
  </section><script src="/js/tenant-example.min.ba609845c5f8abce7462b58a893ae91f40e0ed8279486720f071a291c63d1482.js" defer></script>

## How the Policies Combine

Capsule applies mutations before validation. On Pod creation, the resource
rules supply missing requests and storage limits, remove CPU limits, and align
memory limits with requests. Explicit requests and storage limits survive the
`Default` policies. Placement mutation adds the control-plane exclusions and
sets `hostUsers: false`; enforcement then checks the resulting Pod.

The workload policies target Pods, including controller-created Pods. The
DaemonSet rule separately rejects the controller itself. Add explicit
[controller targets](/docs/rules/enforcement/workloads/#workload-targets) if
you also want resource or image checks on saved controller templates. Keep the
DaemonSet denial and conditional direct-assignment denial separate: adding
workload properties to a targets-only rule changes its meaning.

The quota rule generates `solar-application-budget`, a
[GlobalResourceQuota](/docs/resource-management/globalresourcequota/) shared
across this Tenant's namespaces. It bounds aggregate consumption; the resource
defaults do not impose maximum requests or reserve node capacity by themselves.
Retain capacity for failover and system services as described in
[capacity planning](/docs/operating/best-practices/workloads/#eviction-and-capacity-planning).

The restricted Pod Security labels are managed values. The platform-label
denial checks added or changed metadata; unchanged existing values are skipped
on updates. Remove any existing tenant-controlled `company.com/system` labels
before using them as a network trust boundary.

The memory-overcommit and ExternalName examples on the individual pages are
deliberate exceptions. Add them only under reviewed namespace selectors, with
the selecting labels under platform control. Review [rule order and scope](/docs/rules/#order-and-scope)
when composing further rules so a later decision does not unintentionally
relax the baseline.

## Complete the Platform Setup

Apply the [native NetworkPolicy GlobalTenantResource](/docs/operating/best-practices/networking/#native-networkpolicies-with-globaltenantresource)
alongside this Tenant. It distributes default-deny, same-Tenant, DNS, and
platform-ingress policies; NetworkPolicies are not embedded in this Tenant
manifest. Review its CNI requirements and the permissions needed to prevent
tenants from adding policies that widen access.

Use the [additional admission policies](/docs/operating/best-practices/admission-policies/)
for requirements such as PDB validation, `emptyDir.sizeLimit`, debugging access,
and certificate issuer restrictions. Those examples require their respective
admission mechanisms and are not installed by this Tenant.

Configure [authentication, registry mirrors, and secret management](/docs/operating/best-practices/)
at platform level. Review existing workloads and Services before rollout;
admission policies do not remove previously admitted resources.

---

Last modified October 21, 2026: chore: merge release branch (#165) (69f84ec)
