Skip to content

Rebase on main - #420

Open
Felix-Stakater wants to merge 68 commits into
1.9from
main
Open

Rebase on main#420
Felix-Stakater wants to merge 68 commits into
1.9from
main

Conversation

@Felix-Stakater

Copy link
Copy Markdown
Contributor

No description provided.

msafwankarim and others added 30 commits August 12, 2026 18:56
MTO undersold itself: the entry pages listed features without saying what
the product is, and the Console — the thing both personas actually use —
was not part of the story at all.

- index.md: positioning statement + the six capability areas (Multi-Tenancy,
  Templates, FinOps, Hibernation, Extensions, Console) and the Tenant as the
  single object everything hangs off; split "Evaluating MTO" from "Running MTO"
  so prospects and customers see the seam.
- overview/how-it-works.md (new): the reconciliation path end to end, with a
  Mermaid sequence diagram (controllers reconcile, webhook enforces at write
  time) and a component diagram of the platform Pilot provisions.
- overview/benefits.md -> overview/why-mto.md: reframed as the business
  argument, including what MTO does not do.
- overview/key-features.md: "Key Capabilities", regrouped into the six areas
  with an anchor index.
- overview/use-cases.md: rewritten around the two tenancy shapes (multi-team,
  multi-customer) plus where MTO is not the right answer.
- console/overview.md: persona-led — administrators vs tenant users over the
  same objects, with a page map.
- theme_override/mkdocs.yml: nav for the new pages and redirects so the old
  benefits/about URLs keep working.
…uracy

Landing 2 of the docs overhaul. Overview now sells MTO honestly; these
are the pillars the docs previously left untold or described wrongly.

- concepts/extensions.md: rewritten around the four distinct extension
  mechanisms, because conflating them is what made this page confusing.
  The Extensions CR is genuinely ArgoCD-only (tenantName + argoCD);
  Vault is driven from IntegrationConfig.spec.integrations; DevWorkspace
  needs only namespace metadata; Mattermost is a companion operator
  triggered by a Tenant label. Adds a "choosing where to configure"
  decision list.
- console/showback.md: rewritten as the FinOps narrative — how the
  number is produced (sampled, aggregated, priced, stored), why the
  tenant boundary makes attribution correct without a tagging scheme,
  and what showback/chargeback are actually used for.
- overview/key-features.md: hibernation was described as per-tenant
  configuration. That was wrong as of MTO v1.7 — spec.hibernation left
  the Tenant CR and hibernation is now a ClusterResourceSupervisor
  targeting namespaces by label selector, in scheduled and instant modes.
- overview/how-it-works.md: same correction, ResourceSupervisor ->
  ClusterResourceSupervisor in both places.
- getting-started/uninstalling.md: repoint the onDeletePurgeAppProject
  anchor at the heading that now carries it (the extensions.md rewrite
  orphaned the old one and aborted the strict build).

Gates: mkdocs build --strict clean, vale clean, markdownlint clean on
all five files.
The OpenShift install guide enabled the console but never said how the
`mto` user gets administrator access, so a fresh install left the login
without visibility into tenants or the IntegrationConfig.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Added dividers between merged sections
Add an overview page to the Integrations section
Add the LGTM stack and Integrations overview pages
Adopt the agreed information architecture: five capability pillars, each an
Overview / Concepts / Guides triple, replacing the flat Concepts, Guides and
Integrations sections. The pillars are the same six capability areas the
Overview narrative already leads with, so nav and narrative now agree.

- Multi-Tenancy, Templates, FinOps, Hibernation and Extensions each gain a
  hand-written Overview stating the customer problem and what MTO provides.
- concepts/ splits: tenant/quota/integration-config to Multi-Tenancy,
  extensions to Extensions, architecture/terminology to Overview (both are
  product-wide, and merge.yaml already marks them as MTO-owned shared pages).
- guides/ splits: hibernate-tenant to Hibernation, the rest to Multi-Tenancy.
- integrations/ dissolves: ArgoCD, Vault, DevWorkspace and Mattermost to
  Extensions guides; AWS/Azure pricing to FinOps guides.
- New top-level Administration collects what running all pillars on one
  cluster makes an administrator responsible for, and absorbs the five
  non-API reference pages plus troubleshooting. Reference is now the merged
  generated API reference only, per the agreed tree.
- Release Notes becomes Changelog; Learn is added with the two pages that
  have content (the remaining comparison pages are still being written).

Every moved URL gets a redirect, so existing bookmarks and inbound links keep
working; the pre-restructure redirect targets are repointed at the new paths
rather than chained.

merge.yaml previously mapped both sub-operators' concepts/** and guides/**
into single flat Concepts and Guides sections, which no longer exist. Each
sub-operator now merges into its own pillar, so `under` needs a path -- five
pillars each own a section called Concepts. merge_docs.py gains
resolve_section(), which walks a slash-separated `under` and creates missing
levels, so a pillar whose Concepts or Guides come entirely from a sub-operator
does not need an empty section in mkdocs.yml. Sub-operator administration/**
is excluded: it documents standalone deployment, which does not apply here.

MkDocs' default exclude_docs drops a top-level /templates/ directory, which is
the Templates pillar; exclude_docs is overridden to keep only the dotfile rule.

Gates: mkdocs build --strict clean (57/57 screenshots staged), vale 0/0 on the
six new pages, markdownlint clean on them apart from MD060, which is not CI
enforced. tests/test_merge_docs.py 49 passed, including five new cases for
path-addressed `under`.
…ations

From the Overview drafts. Three gaps in the evaluator-facing layer:

- Deployment Models (new). The isolation architecture and the tenant
  operating model are separate decisions, and conflating them is what makes
  the "namespaces or clusters?" question circular. Covers shared, virtual and
  dedicated clusters plus hybrid platforms, says plainly that a virtual
  cluster answers a different question from MTO rather than competing with
  it, and carries the comparison table. Also states the limits honestly: MTO
  installs per cluster, does not federate, and has no fleet-wide view.
- Use Cases reorganised from two tenancy shapes to eight recognisable
  situations, so an evaluator finds themselves rather than a taxonomy:
  enterprise platform teams, service providers, development and test
  platforms, standardization, cost accountability, multi-tenant GitOps,
  shared secrets management, and IDP foundation. Keeps the Tenant example
  and the honest "not the right answer" section, adds "where MTO fits best".
- Why MTO gains the missing-abstraction argument up front: Kubernetes models
  each resource but has no concept of "this is Tenant A, and the platform
  services around the cluster must respect the same boundary".

Overview nav reordered to the reading path an evaluator actually takes:
what it is, why, what it does, how it works, how it is built, where it fits,
who it is for.

Secrets management now names OpenBao alongside Vault, following the OpenBao
extension merged to main.

Gates: mkdocs build --strict clean (57/57 screenshots), vale 0/0 on all three
files, markdownlint clean apart from MD060 (not CI enforced).
The Learn section was scaffolded filename-first: an index promising 15 pages,
one page written as the template, and 14 files that were empty or a bare
outline. This writes them and adds the section to the nav.

Concepts and architecture:

- Kubernetes Multi-Tenancy — models, soft against hard tenancy, failure modes
- Namespace-Based Multi-Tenancy — what a namespace does and does not isolate
- What is a Tenant in Kubernetes? — the abstraction Kubernetes lacks
- Tenant Lifecycle Management — onboarding through offboarding
- Multi-Tenant Kubernetes Architecture — the layers, and the anti-patterns
- How to Implement Kubernetes Multi-Tenancy — order of work, and which
  decisions are expensive to reverse

Comparisons, grouped by the layer each tool addresses rather than by name,
because most "MTO alternative" lists mix the two:

- Same layer, genuinely comparable: Capsule, HNC, Capsule Alternatives
- Isolation layer, complementary rather than competing: vCluster, Loft,
  Kamaji, HyperShift, KCP

The spine of every comparison is that isolation and the tenant operating
model are separate decisions — the same argument Deployment Models makes on
the product side. Claims about other projects are kept to durable
architectural facts rather than feature matrices that go stale, and each page
says plainly where MTO is not the answer.

Corrections to mto-vs-vcluster.md, the one page that already existed:

- It claimed MTO's FinOps includes budgets and alerts, in three places
  including a direct FAQ answer. Those are roadmap, not shipped, and nothing
  else in the docs describes them. Replaced with what MTO does provide —
  cost and usage analysis, showback, chargeback, capacity planning — and the
  FAQ now says explicitly that budgets and alerts are not part of the product
  today.
- "Excellent (100s-1000s tenants)" replaced with the architectural fact that
  supports it: no per-tenant control plane, so the bound is cluster capacity.
- MD026 and MD032 violations fixed.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060 (not
CI enforced), vale 0/0 across all 16 files.

Known follow-up: "Clastix" is not in the shared Stakater Vale vocabulary, so
CI will report it as a spelling error until it is added to
stakater/vale-package. It is a company name and correct as written.
The comparisons argued MTO's breadth unevenly. The same-layer pages (Capsule,
HNC) walked it capability by capability; the isolation-layer pages said
"governance is unsolved" without naming what a customer then has to buy or
build. Tenancy is the foundation the other pillars stand on, and a comparison
that stops at tenancy understates the decision.

- kubernetes-multi-tenancy-tools.md gains "What you assemble instead": a
  capability-by-capability table of what MTO includes against what has to be
  sourced and integrated otherwise — tenancy, standardization, cost, idle
  environments, GitOps tenancy, secrets tenancy, developer tooling, interface.
  The point it closes on is that the cost is not the first integration but the
  seventh, and keeping all of them agreeing about who a tenant is.
- vCluster, Kamaji and HyperShift each gain the same list, framed for what
  that isolation layer specifically leaves behind.
- Loft gets a narrower and more honest version: vCluster Platform genuinely
  covers self-service, templates and sleep mode, so only the organizational
  tenant, cost attributed to it, and GitOps tenancy remain.
- Capsule and HNC cross-link to the table rather than repeating it.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0 across all 16 files.
The docs repeatedly said MTO is for "tenants inside one organization's trust
boundary" and not the answer for untrusted tenants. That framing rules MTO out
of the service-provider and telecommunications case, which is one of its
strongest — and it is wrong, because it asks the wrong question first.

The question is not how much you trust a tenant. It is whether the tenant
holds cluster credentials at all:

- Tenants use kubectl — the cluster boundary is the boundary the tenant
  experiences, and trust decides the isolation model. Typical internally.
- Tenants use a product — a portal, an API or a logical control plane in
  front, no cluster credentials issued. The shared cluster is then an
  implementation detail behind the product rather than a boundary the customer
  is on the other side of, and MTO does the tenancy, quota, template, FinOps,
  hibernation and extension groundwork underneath.

The second shape is how most service providers and telecommunications
platforms serve entirely external customers from one shared cluster.

- deployment-models.md gains "When tenants never touch the cluster API" with a
  diagram of the stack and what MTO contributes beneath the product layer.
- why-mto.md, use-cases.md, namespace-based-multi-tenancy.md,
  kubernetes-multi-tenancy.md, multi-tenant-kubernetes-architecture.md and
  kubernetes-multi-tenancy-implementation.md have every "trust boundary" and
  "untrusted" claim requalified against credential-holding rather than trust.
- multi-tenant-kubernetes-architecture.md's Access model section now asks
  whether tenants reach the API at all before discussing how access is derived.
- mto-vs-vcluster.md carried the strongest version of the wrong claim in seven
  places, including "Best for: External / untrusted tenants" and "Not suitable
  for hostile multi-tenancy". All requalified.
- mto-vs-kamaji.md, mto-vs-hypershift.md and mto-vs-loft.md likewise.

mto-vs-kcp.md changes character as a result. The two are still rarely the same
decision, but they are frequently the same architecture: logical control planes
give each customer an isolated API surface, MTO governs the shared cluster the
workloads run on. That composition is now documented with a diagram, and the
page no longer reads as "these are unrelated".

Also corrects the remaining "where MTO is not the right answer" text so the
limit is stated precisely — a tenant holding cluster credentials that needs a
boundary a shared API server cannot give — and notes that even then MTO usually
applies inside the isolated cluster, which is itself shared by several teams.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0 across all 21 changed files.
Two independent model reviews converged on the same defect, and it was mine.
Every comparison page opened its description of MTO with tenancy as the
subject and the other five pillars in a subordinate clause:

- tools: "adds a Tenant abstraction... It also covers the layers most
  governance tooling leaves out"
- capsule: "covering the same tenant governance ground, plus the layers most
  platforms need next"
- capsule-alternatives: "and then continues into the areas Capsule leaves out"
- loft: "...standard metadata and templates — plus cost attribution,
  hibernation, and extension"

A skimmer who stops after the first sentence leaves with "tenancy operator",
which is the one outcome to avoid. All four now open with the six capability
areas and place tenancy as one of them: the foundation the other five stand
on, not the extent of the product.

Also from the reviews:

- mto-vs-vcluster.md still told external-customer buyers to leave, three
  commits after that was supposedly fixed. "Tenants are within the same
  organization", "MTO is for efficient internal multi-tenancy", "Use MTO for
  internal platforms", and a hybrid section reading "vCluster per customer".
  The earlier pass grepped for untrusted/hostile/trust-boundary and missed
  every instance phrased as "internal".
- That page also argued MTO's case almost entirely on vCluster's home ground
  — isolation, scale, ops efficiency — with FinOps the only non-tenancy pillar
  present. Added Standardization, Idle environment cost, Ecosystem
  integrations and Interface, so four more pillars appear where the comparison
  is actually made. Vault and OpenBao were previously not mentioned once.
- "Complexity: Low" contradicted how-it-works.md, which shows MTO installing
  PostgreSQL, Dex, Prometheus and OpenCost. Replaced with what is actually
  true of each.
- Console was absent from deployment-models.md entirely.
- mto-vs-capsule.md's "what you assemble instead" was three sentences and a
  link on a 190-line page. It is now the capability-by-capability table, in
  place, since it is the argument the page exists to make.
- index.md addresses the name directly: it describes where the product starts,
  not where it stops.

Honesty fixes the adversarial review surfaced:

- Hibernation was sold as "you stop paying for capacity nobody is using".
  That holds with a cluster autoscaler; on fixed on-premise capacity it
  releases headroom and defers the next purchase rather than reducing an
  invoice. Both why-mto.md and key-features.md now say so, and note that
  PersistentVolumeClaims keep costing while workloads sleep.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0 across all 22 changed files.
rasheedamir and others added 12 commits August 14, 2026 15:42
Buyers ask how MTO is priced and the page said only "contact sales". The
useful answer is not a number, it is the dimension the licence scales with —
buyers accept a stated metric and object to opacity.

Two shapes, described neutrally:

- An internal platform, where scale tracks the clusters you operate, so the
  licence follows the cluster. Stated plainly because it is settled practice
  today, and clarity here costs nothing.
- A platform you sell, where infrastructure is a poor measure because one large
  bare-metal cluster can carry a great many customers. Licensing is agreed
  against the scale of the service instead.

Deliberately concrete on the first and open on the second, since the model for
providers is not settled. Publishing a model that later changes reads as a
bait-and-switch, and is worse than saying less.

The framing throughout is proportionality — same product, same capabilities,
only the measure differs — rather than anything a provider could read as being
charged more for being able to afford it. The section closes with the four
facts to bring to a pricing conversation, which turns "it depends" into a
checklist and is the part that keeps it from reading as evasive.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0.
Removed at the product owner's request, and it was the wrong thing to add.

The heading framed the page around a sales conversation rather than around the
reader's question, which is what the editions and the licence measure are for.
The three links it carried — deployment models, comparisons, installation — are
already offered from the Overview pages, where a reader looking for them
actually is.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0.
Replaces the two-shapes framing with the actual rule: one Enterprise licence
per cluster MTO is installed on, whatever number of tenants, namespaces or
nodes that cluster carries.

The earlier section described internal platforms and provider platforms as
being measured differently. That was accurate about the open question and wrong
for the page. A buyer comparing products wants a rule they can put in a
spreadsheet, and anything that reads as "it depends" costs more deals than it
protects margin — particularly at a stage where the goal is more customers.

No hedging language about the model possibly changing. The docs are versioned
per release, so the statement is already scoped to the current version, and a
caveat would undo the simplicity that is the point of the change.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0.
The Slack channel link in pricing.md returns 403 to markdown-link-check. It is
not a dead link — Slack archive URLs require workspace membership, so an
unauthenticated checker can never reach one. It failed intermittently rather
than always because Slack's response varies under rate limiting, which is also
why retryOn429 does not help: the status is 403, not 429.

Added an ignore pattern for the workspace host rather than the single URL, so
any future channel link there is covered too. Scoped to
stakater-community.slack.com specifically, so a genuinely checkable slack.com
page would still be verified.

Deliberately not fixed by adding 403 to aliveStatusCodes, which would mask real
authorization failures across every other link in the docs.

Verified: markdown-link-check now reports the Slack URL as skipped and
pricing.md passes, and a run across all 29 markdown files this branch changes
reports no dead links.
"plugin" is a common noun, not part of the product name, so the H1 is
"kubectl-tenant plugin". The page's previous title was "kubectl plugin", all
lowercase, so the capital was something I introduced rather than a convention
being followed.

Also makes the section headings internally consistent: the page had "Why it
matters" alongside "How It Works", "Supported Resources" and "Output Formats".
The inherited headings are title case, so the one I added now matches them
rather than the other way round.

No anchor links point into this page, so nothing breaks.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0.
…nstall steps

Prompted by "Uninstall via OperatorHub UI on OpenShift" appearing as a nav
item. The label was the symptom; three problems sat underneath it.

The standalone uninstalling.md was a third copy of a procedure that already
exists in openshift.md, and the copies had drifted. openshift.md told readers
to set spec.onDelete.cleanNamespaces and spec.onDelete.cleanAppProject. Those
fields do not exist — the API reference, the Tenant concept page, the delete
guide and the ArgoCD integration all use onDeletePurgeNamespaces and
onDeletePurgeAppProject. Anyone following the OpenShift uninstall steps would
have set a field that does nothing and then lost the namespaces they were
trying to keep. Corrected.

uninstalling.md is now "Uninstalling MTO" and covers only what is
platform-independent: what to decide before removing the operator, disabling
the console and cost components so the stack MTO provisioned is removed by the
operator that created it, deleting the IntegrationConfig, and the consequences
of removing the CRDs. The platform-specific removal is a two-row table pointing
at the OperatorHub and Helm sections, since you uninstall the way you installed.
That also makes the nav label short and accurate rather than naming one
platform and one UI for a page every reader reaches.

Six cloud pages shared three generic titles — "MTO Installation Guide",
"MTO Preparation Guide" and "MTO Validation Guide", identical between AKS and
EKS. They are now self-describing ("Install MTO on AKS", "Prepare an EKS
Cluster for MTO"), so search results and direct links are distinguishable. Nav
keeps its short labels, which read better under an "On AKS" heading.

installation/overview.md was a page titled "Overview" inside a section titled
"Installation". It is now "Installing MTO", and it ends by pointing at creating
a first tenant — Getting Started previously stopped at "installed" and never
reached "working".

Also fixes three long-standing Vale term errors in the EKS pages, in files this
change already touches: "kube context" and "kube-system" are identifiers and
wanted backticks rather than a capital K.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060, vale
down to 1 pre-existing error repo-wide (release-notes.md).
…erence

Audit of my own previous commit, prompted by the reasonable question of whether
I had verified any of it. Three claims were wrong or unsupported.

1. Field path. I wrote spec.onDeletePurgeNamespaces. The API reference places
   onDeletePurgeNamespaces in the Namespaces type, and both concepts/tenant.md
   and guides/delete-tenant.md nest it under namespaces:, so the path is
   spec.namespaces.onDeletePurgeNamespaces. This is the same class of error I
   had just corrected in openshift.md — I replaced a wrong path with a
   different wrong path, in both files.

2. Removal behaviour. I wrote that disabling the console "removes the Console,
   Gateway, Dex, PostgreSQL, Prometheus and the FinOps components". The docs
   never say that. What integration-config.md does say is that the
   IntegrationConfig manages the resources behind the console GUI, and it lists
   them — including OpenCost and DexConfigOperator, which my sentence had
   dropped. Reworded to state what is documented and to keep the procedural
   advice, which came from the original page, without inventing a consequence.

3. CRD list. I listed Template among MTO's CRDs. The API reference defines
   Tenant, Quota, IntegrationConfig and Extensions; Template belongs to the
   Template Operator. Corrected to Extensions.

Verified as correct and left unchanged: argoCD.onDeletePurgeAppProject on the
Extensions resource, the false default on onDeletePurgeNamespaces, the
tenant-operator-config default name, and components.console / components.showback
as booleans.

Gates: mkdocs build --strict clean, vale 0/0 on the section.
The Console row asks "How do operators and tenants actually use all this?" and
answered with only half of it — the CLI was absent from the landing page
entirely, and from the "Running MTO" next steps, which listed Installation,
Create a Tenant, Console and Architecture.

Deliberately not a seventh capability row. The six areas are the positioning
spine, repeated in key-features.md, the tools page and four comparison pages,
and named in the prose directly above the table. The CLI is also not a
capability area — it is an interface, the same category as Console, and a much
smaller one: Console spans all six pillars, the plugin surfaces tenant-scoped
listing of five resource types. A visibly lighter seventh row would weaken a
table whose strength is that every row is a large customer problem.

So the Console row's answer now covers both interfaces, and the plugin gets its
own entry under Running MTO.
The page listed ArgoCD, Vault, the LGTM stack, Grafana, DevWorkspace and
Mattermost, but not OpenBao — which has its own page and its own nav entry, so
it was the one extension a reader could not find from the section overview.

Placed directly after Vault, since the two solve the same problem and a reader
comparing them should see them together.

The description is taken from the OpenBao page rather than written from
memory: a namespace per tenant holding its own secrets store, encryption keys
and certificate authority, with the policies and login roles to reach them.

Gates: mkdocs build --strict clean, markdownlint clean apart from MD060,
vale 0/0.
Document adding the default admin user to privileged users
@Felix-Stakater
Felix-Stakater requested a review from a team as a code owner August 17, 2026 09:42
Comment thread PR_DESCRIPTION.md
- **Builds nav** for the copied `.md` pages and nests it under an existing menu section (`under`), with folder titles taken from the sub-operator's own nav (falling back to title-case). With `flatten: true` the pages merge as **direct leaf entries** in the section (no operator wrapper, menu-flat); a `title` renames a single-file mapping (e.g. Template's API → one "Template Operator" entry). Splices only the `nav:` block of the combined `mkdocs.yml`, leaving the rest byte-for-byte.
- **Auto-groups duplicates**: when a page's filename appears in more than one source under the same flattened section (e.g. `argocd.md` in both MTO's own docs and Hibernation's), they're folded into a per-page folder titled by the page's H1 (→ `ArgoCD`), with one labelled leaf per source (`Multi-Tenant Operator`, `Hibernation Operator`). This is a rule, not a hand-maintained list — the labels come from operator titles and `site_title` (default: the mkdocs `site_name`).
- **Concatenates the API** (`concat_into` mapping mode): each operator's `reference/api.md` — plus MTO's own — merges into one **API Reference** page. Each source becomes an H2 section (`heading`, MTO's own labelled by `site_title`), its own headings demoted one level (code fences respected), so the in-page TOC lists `Tenant Operator` / `Template Operator` / `FinOps` / `Hibernation Operator`. Aggregated across operators by shared `concat_into`; one labelled leaf under `Reference`.
- **Rewrites links**: whitelisted targets → local relative links; anything else → the operator's published site (`live_url`, `directory`/`html` style), anchors preserved. Externalized links are logged.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
File types are normally capitalized. (FILE_EXTENSIONS_CASE[1])
Suggestions: HTML
URL: https://languagetool.org/insights/post/spelling-capital-letters/
Rule: https://community.languagetool.org/rule/show/FILE_EXTENSIONS_CASE?lang=en-US&subId=1
Category: CASING

```mermaid
flowchart LR
T["Tenant CRs"] --> M["Multi-Tenant Operator<br/>Grafana extension"]
C["GrafanaDatasource<br/>GrafanaDashboard<br/>GrafanaFolder"] --> M

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: M
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC

httpHeaderName1: "Authorization"
httpHeaderName2: "X-Scope-OrgID"
prometheusType: Mimir
httpMethod: POST

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: datasource
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC

"type": "timeseries",
"datasource": { "type": "loki", "uid": "loki-ds" },
"targets": [
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Unpaired symbol: ‘"’ seems to be missing (EN_UNPAIRED_QUOTES)
URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses
Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US
Category: PUNCTUATION

"datasource": { "type": "loki", "uid": "loki-ds" },
"targets": [
{
"datasource": { "type": "loki", "uid": "loki-ds" },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Unpaired symbol: ‘"’ seems to be missing (EN_UNPAIRED_QUOTES)
URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses
Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US
Category: PUNCTUATION

1. [Roles and Permissions](https://grafana.com/docs/grafana/latest/administration/roles-and-permissions/#organization-roles)
```bash
SECRET=grafana-admin-credentials # <grafana-instance-name>-admin-credentials
GF_USER=$(kubectl get secret "$SECRET" -n telemetry \

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Unpaired symbol: ‘'’ seems to be missing (EN_UNPAIRED_QUOTES)
URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses
Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US
Category: PUNCTUATION

```mermaid
flowchart TB
subgraph K["Kubernetes"]
T["<b>Tenant</b> resources"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Unpaired symbol: ‘"’ seems to be missing (EN_UNPAIRED_QUOTES)
URL: https://languagetool.org/insights/post/punctuation-guide/#what-are-parentheses
Rule: https://community.languagetool.org/rule/show/EN_UNPAIRED_QUOTES?lang=en-US
Category: PUNCTUATION


Where both an operator and a chart exist, either will do, and the choice can follow whatever a cluster already runs — on OpenShift that is usually the operator, since Red Hat ships its own Loki, Tempo and OpenTelemetry operators. Three components are narrower than that, for reasons worth knowing rather than working around:

- **Tempo** — both routes deploy Tempo, and both ship a gateway, but the two are not equivalent. The chart's is an nginx proxy offering basic authentication, which identifies a caller without tying it to a tenant. The operator's authenticates with OIDC and authorises per tenant, which is what the trace boundary depends on.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’. (EN_A_VS_AN)
Suggestions: a
URL: https://languagetool.org/insights/post/indefinite-articles/
Rule: https://community.languagetool.org/rule/show/EN_A_VS_AN?lang=en-US
Category: MISC

@github-actions

Copy link
Copy Markdown

@Felix-Stakater PR doc deploy will soon be available for review on https://stakater.github.io/mto-docs/main

@github-actions

Copy link
Copy Markdown

@SyedaFatimaKazmi PR doc deploy will soon be available for review on https://stakater.github.io/mto-docs/main

@github-actions

Copy link
Copy Markdown

@msafwankarim PR doc deploy will soon be available for review on https://stakater.github.io/mto-docs/main

rasheedamir and others added 2 commits August 19, 2026 17:46

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remaining comments which cannot be posted as a review comment to avoid GitHub Rate Limit

LanguageTool

[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: KCP
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC


[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: MTO
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC


[LanguageTool] reported by reviewdog 🐶
Possible agreement error. The noun ‘stand’ seems to be countable. (CD_NN[1])
Suggestions: stands
Rule: https://community.languagetool.org/rule/show/CD_NN?lang=en-US&subId=1
Category: GRAMMAR

MTO is a commercial platform from Stakater built on a single `Tenant` definition that drives six capability areas: **multi-tenancy**, **templates**, **FinOps**, **hibernation**, **extensions** into the surrounding ecosystem, and a **console** for both administrators and tenant users. Tenancy is the foundation the other five stand on, not the extent of the product.


[LanguageTool] reported by reviewdog 🐶
Use a comma before ‘so’ if it connects two independent clauses (unless they are closely connected and short). (COMMA_COMPOUND_SENTENCE_2[1])
Suggestions: , so
URL: https://languagetool.org/insights/post/comma-before-and/
Rule: https://community.languagetool.org/rule/show/COMMA_COMPOUND_SENTENCE_2?lang=en-US&subId=1
Category: PUNCTUATION

Both address this, and it is one of the closest comparisons between them. MTO hibernates workloads on a cron schedule or on demand, targeting namespaces by label so one schedule covers a whole tenant, and restores previous replica counts on wake. Loft's sleep mode pauses idle virtual clusters.


[LanguageTool] reported by reviewdog 🐶
Use a comma before ‘so’ if it connects two independent clauses (unless they are closely connected and short). (COMMA_COMPOUND_SENTENCE_2[3])
Suggestions: , so
URL: https://languagetool.org/insights/post/types-of-sentences/#compound-sentence
Rule: https://community.languagetool.org/rule/show/COMMA_COMPOUND_SENTENCE_2?lang=en-US&subId=3
Category: PUNCTUATION

MTO samples usage per namespace, rolls it up to the tenant, prices it — with provider pricing on public cloud — and stores the history so periods can be compared. Because every managed namespace carries its tenant label, attribution needs no separate convention.


[LanguageTool] reported by reviewdog 🐶
Did you mean “whom”? (IN_WHO[1])
Suggestions: whom
URL: https://www.grammar-monster.com/lessons/who_whom.htm
Rule: https://community.languagetool.org/rule/show/IN_WHO?lang=en-US&subId=1
Category: GRAMMAR

MTO includes all of these, built on the same tenant definition, which is why they agree with each other. Assembled separately they are six or seven products to source, integrate and keep aligned about who a tenant is. See [what you assemble instead](kubernetes-multi-tenancy-tools.md#what-you-assemble-instead).


[LanguageTool] reported by reviewdog 🐶
Did you mean “whom”? (IN_WHO[1])
Suggestions: whom
URL: https://www.grammar-monster.com/lessons/who_whom.htm
Rule: https://community.languagetool.org/rule/show/IN_WHO?lang=en-US&subId=1
Category: GRAMMAR

👉 Choose based on who holds cluster credentials, not on who the tenant is


[LanguageTool] reported by reviewdog 🐶
Use a comma before ‘so’ if it connects two independent clauses (unless they are closely connected and short). (COMMA_COMPOUND_SENTENCE_2[1])
Suggestions: , so
URL: https://languagetool.org/insights/post/comma-before-and/
Rule: https://community.languagetool.org/rule/show/COMMA_COMPOUND_SENTENCE_2?lang=en-US&subId=1
Category: PUNCTUATION

- **MTO** → Hibernation sleeps and wakes workloads on a schedule or on demand, targeted by label so one schedule covers a whole tenant


[LanguageTool] reported by reviewdog 🐶
Did you mean “whom”? (IN_WHO[1])
Suggestions: whom
URL: https://www.grammar-monster.com/lessons/who_whom.htm
Rule: https://community.languagetool.org/rule/show/IN_WHO?lang=en-US&subId=1
Category: GRAMMAR

MTO includes all of these, built on the same tenant definition, which is why they agree with each other. Assembled separately they are six or seven products to source, integrate and keep aligned about who a tenant is. See [what you assemble instead](kubernetes-multi-tenancy-tools.md#what-you-assemble-instead).


[LanguageTool] reported by reviewdog 🐶
This word is normally spelled as one. (EN_COMPOUNDS_HAND_WRITTEN)
Suggestions: handwritten
Rule: https://community.languagetool.org/rule/show/EN_COMPOUNDS_HAND_WRITTEN?lang=en-US
Category: MISC

Two questions, and the first is often skipped: **do tenants reach the Kubernetes API at all?** On internal platforms they usually do, and access should then be derived from tenant membership, with membership coming from your existing identity provider groups — hand-written role bindings per namespace are the most common source of stale permissions.


[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: Tenant
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC


[LanguageTool] reported by reviewdog 🐶
In American English, ‘afterward’ is the preferred variant. ‘Afterwards’ is more commonly used in British English and other dialects. (AFTERWARDS_US[1])
Suggestions: afterward
Rule: https://community.languagetool.org/rule/show/AFTERWARDS_US?lang=en-US&subId=1
Category: BRITISH_ENGLISH

**RBAC copied between namespaces.** It works on the day it is written and diverges immediately afterwards.


[LanguageTool] reported by reviewdog 🐶
In American English, ‘afterward’ is the preferred variant. ‘Afterwards’ is more commonly used in British English and other dialects. (AFTERWARDS_US[1])
Suggestions: afterward
Rule: https://community.languagetool.org/rule/show/AFTERWARDS_US?lang=en-US&subId=1
Category: BRITISH_ENGLISH

| Standards | Applied at creation, drift afterwards | Reconciled continuously |


[LanguageTool] reported by reviewdog 🐶
Consider removing “of” to be more concise (ALL_OF_THE[1])
Suggestions: all the
URL: https://languagetool.org/insights/post/wordiness/
Rule: https://community.languagetool.org/rule/show/ALL_OF_THE?lang=en-US&subId=1
Category: REDUNDANCY

If every new namespace is a request to the platform team, the platform team becomes the bottleneck. If namespaces are unrestricted, the allocation means nothing. The resolution is a budget at the tenant scope, shared across all of the tenant's namespaces, so the tenant can self-serve while the total stays capped.


[LanguageTool] reported by reviewdog 🐶
In American English, ‘afterward’ is the preferred variant. ‘Afterwards’ is more commonly used in British English and other dialects. (AFTERWARDS_US[1])
Suggestions: afterward
Rule: https://community.languagetool.org/rule/show/AFTERWARDS_US?lang=en-US&subId=1
Category: BRITISH_ENGLISH

- **Guardrails** — storage classes, ingress classes, priority classes, registries, service accounts and hostnames enforced at admission rather than reviewed afterwards.


[LanguageTool] reported by reviewdog 🐶
In American English, ‘afterward’ is the preferred variant. ‘Afterwards’ is more commonly used in British English and other dialects. (AFTERWARDS_US[1])
Suggestions: afterward
Rule: https://community.languagetool.org/rule/show/AFTERWARDS_US?lang=en-US&subId=1
Category: BRITISH_ENGLISH

Scripts handle creation. Lifecycle management is mostly about what happens afterwards: membership changing, standards evolving and drift accumulating. A script that runs once cannot correct a cluster that has moved since.


[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: Layer
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC


[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: MTO
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC


[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: Gateway
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC

Console --> Gateway


[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: OpenCost
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC

FinOpsOp --> OpenCost


[LanguageTool] reported by reviewdog 🐶
This word is normally spelled as one. (EN_COMPOUNDS_HAND_WRITTEN)
Suggestions: handwritten
Rule: https://community.languagetool.org/rule/show/EN_COMPOUNDS_HAND_WRITTEN?lang=en-US
Category: MISC

### Access control without hand-written RBAC


[LanguageTool] reported by reviewdog 🐶
Use a comma before “and” if it connects two independent clauses (unless they are closely connected and short). (COMMA_COMPOUND_SENTENCE_2[4])
Suggestions: , and
URL: https://languagetool.org/insights/post/types-of-sentences/#compound-sentence
Rule: https://community.languagetool.org/rule/show/COMMA_COMPOUND_SENTENCE_2?lang=en-US&subId=4
Category: PUNCTUATION

The effect shows up directly in showback. What it is worth depends on the infrastructure underneath: with a cluster autoscaler, freed requests allow nodes to be removed and the bill falls; on fixed capacity it releases headroom for other workloads and defers the next purchase. Hibernation scales workloads — PersistentVolumeClaims and their storage cost are untouched.


[LanguageTool] reported by reviewdog 🐶
This expression is normally spelled as one or with a hyphen. (EN_COMPOUNDS_TIME_SERVING)
Suggestions: time-serving, timeserving
Rule: https://community.languagetool.org/rule/show/EN_COMPOUNDS_TIME_SERVING?lang=en-US
Category: MISC

**The situation.** A platform team runs Kubernetes or OpenShift for many internal application teams. As adoption grows, the team becomes the manual coordinator of namespaces, access, quota, network boundaries, standard configuration, integrations and cost questions. Platform engineers spend their time serving requests instead of improving the platform.


[LanguageTool] reported by reviewdog 🐶
Possible typo: you repeated a word (ENGLISH_WORD_REPEAT_RULE)
Suggestions: MTO
Rule: https://community.languagetool.org/rule/show/ENGLISH_WORD_REPEAT_RULE?lang=en-US
Category: MISC

SS --> MTO["MTO"]


[LanguageTool] reported by reviewdog 🐶
Use a comma before “and” if it connects two independent clauses (unless they are closely connected and short). (COMMA_COMPOUND_SENTENCE_2[4])
Suggestions: , and
URL: https://languagetool.org/insights/post/types-of-sentences/#compound-sentence
Rule: https://community.languagetool.org/rule/show/COMMA_COMPOUND_SENTENCE_2?lang=en-US&subId=4
Category: PUNCTUATION

**Idle spend is removable.** Development, test and demo environments are idle most of the week. Hibernation puts them to sleep on a schedule and wakes them on demand, and showback shows the effect. What that is worth depends on your infrastructure: on public cloud with a cluster autoscaler, freed requests let nodes be removed and the bill falls; on fixed on-premise capacity it releases headroom for other workloads and defers the next hardware purchase rather than reducing an invoice.

Comment thread content/cli/overview.md
Tenant users work in ordinary `kubectl`. The problem is that Kubernetes gives them no way to see what they own.

## Overview
Ask a developer to list the storage classes their tenant may use, or the namespaces it owns, and Kubernetes offers two answers, both wrong. Without cluster-scoped `list` permission they see nothing. With it they see everything on the cluster — every other tenant's namespaces included — because RBAC on a cluster-scoped resource is all-or-nothing. There is no "list the ones that are mine".

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Consider adding a comma here to clarify the structure of the sentence. (PRP_COMMA[1])
Suggestions: it,
Rule: https://community.languagetool.org/rule/show/PRP_COMMA?lang=en-US&subId=1
Category: PUNCTUATION


1. **Sampled** — Prometheus and `kube-state-metrics` record actual resource usage and requests per namespace over time.
1. **Aggregated** — usage is rolled up to the tenant, because the tenant is the unit of ownership. Every namespace MTO manages already belongs to exactly one tenant.
1. **Priced** — OpenCost applies rates to the sampled usage. For public-cloud clusters, MTO can use provider pricing so the figures track what you are actually billed. See [AWS Pricing](../integrations/aws-pricing.md) and [Azure Pricing](../integrations/azure-pricing.md).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Use a comma before ‘so’ if it connects two independent clauses (unless they are closely connected and short). (COMMA_COMPOUND_SENTENCE_2[1])
Suggestions: , so
URL: https://languagetool.org/insights/post/comma-before-and/
Rule: https://community.languagetool.org/rule/show/COMMA_COMPOUND_SENTENCE_2?lang=en-US&subId=1
Category: PUNCTUATION

1. **Sampled** — Prometheus and `kube-state-metrics` record actual resource usage and requests per namespace over time.
1. **Aggregated** — usage is rolled up to the tenant, because the tenant is the unit of ownership. Every namespace MTO manages already belongs to exactly one tenant.
1. **Priced** — OpenCost applies rates to the sampled usage. For public-cloud clusters, MTO can use provider pricing so the figures track what you are actually billed. See [AWS Pricing](../integrations/aws-pricing.md) and [Azure Pricing](../integrations/azure-pricing.md).
1. **Stored** — results are written to MTO's PostgreSQL instance, so history survives Prometheus retention and you can compare this month against the last.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short). (COMMA_COMPOUND_SENTENCE[1])
Suggestions: , and
URL: https://languagetool.org/insights/post/types-of-sentences/#compound-sentence
Rule: https://community.languagetool.org/rule/show/COMMA_COMPOUND_SENTENCE?lang=en-US&subId=1
Category: PUNCTUATION


## Remove the IntegrationConfig

Delete the `IntegrationConfig` from the cluster. On OpenShift you can do this from `Search` → `IntegrationConfig` → `tenant-operator-config` → `Delete`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
A comma is probably missing here. (MISSING_COMMA_AFTER_INTRODUCTORY_PHRASE[1])
Suggestions: OpenShift,
URL: http://englishplus.com/grammar/00000074.htm
Rule: https://community.languagetool.org/rule/show/MISSING_COMMA_AFTER_INTRODUCTORY_PHRASE?lang=en-US&subId=1
Category: PUNCTUATION


The closest direct comparison. Same layer, same abstraction, wider scope.

MTO is a commercial platform from Stakater built on a single `Tenant` definition that drives six capability areas: **multi-tenancy**, **templates**, **FinOps**, **hibernation**, **extensions** into the surrounding ecosystem, and a **console** for both administrators and tenant users. Tenancy is the foundation the other five stand on, not the extent of the product.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Possible agreement error. The noun ‘stand’ seems to be countable. (CD_NN[1])
Suggestions: stands
Rule: https://community.languagetool.org/rule/show/CD_NN?lang=en-US&subId=1
Category: GRAMMAR

### Choose MTO when

- You need the tenant itself modelled, not only its namespaces
- Access should follow identity provider group membership without hand-written RBAC

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
This word is normally spelled as one. (EN_COMPOUNDS_HAND_WRITTEN)
Suggestions: handwritten
Rule: https://community.languagetool.org/rule/show/EN_COMPOUNDS_HAND_WRITTEN?lang=en-US
Category: MISC


### Operational surface

With MTO you operate one cluster. With Hypershift you operate a management cluster plus a fleet of hosted clusters — each with its own upgrades, monitoring and configuration drift.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
A comma is probably missing here. (MISSING_COMMA_AFTER_INTRODUCTORY_PHRASE[1])
Suggestions: MTO,
URL: http://englishplus.com/grammar/00000074.htm
Rule: https://community.languagetool.org/rule/show/MISSING_COMMA_AFTER_INTRODUCTORY_PHRASE?lang=en-US&subId=1
Category: PUNCTUATION

- **Secrets tenancy** — a path, policies and login roles per tenant, kept in step with membership
- **Interface** — something for tenant users that is not `kubectl` and YAML

MTO includes all of these, built on the same tenant definition, which is why they agree with each other. Assembled separately they are six or seven products to source, integrate and keep aligned about who a tenant is. See [what you assemble instead](kubernetes-multi-tenancy-tools.md#what-you-assemble-instead).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Did you mean “whom”? (IN_WHO[1])
Suggestions: whom
URL: https://www.grammar-monster.com/lessons/who_whom.htm
Rule: https://community.languagetool.org/rule/show/IN_WHO?lang=en-US&subId=1
Category: GRAMMAR


Kamaji reduces per-cluster overhead substantially compared with standalone clusters, but each tenant still has a control plane consuming management-cluster capacity and dedicated worker nodes.

### Operational surface

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
A comma is probably missing here. (MISSING_COMMA_AFTER_INTRODUCTORY_PHRASE[1])
Suggestions: MTO,
URL: http://englishplus.com/grammar/00000074.htm
Rule: https://community.languagetool.org/rule/show/MISSING_COMMA_AFTER_INTRODUCTORY_PHRASE?lang=en-US&subId=1
Category: PUNCTUATION

- **Secrets tenancy** — a path, policies and login roles per tenant, kept in step with membership
- **Interface** — something for tenant users that is not `kubectl` and YAML

MTO includes all of these, built on the same tenant definition, which is why they agree with each other. Assembled separately they are six or seven products to source, integrate and keep aligned about who a tenant is. See [what you assemble instead](kubernetes-multi-tenancy-tools.md#what-you-assemble-instead).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[LanguageTool] reported by reviewdog 🐶
Did you mean “whom”? (IN_WHO[1])
Suggestions: whom
URL: https://www.grammar-monster.com/lessons/who_whom.htm
Rule: https://community.languagetool.org/rule/show/IN_WHO?lang=en-US&subId=1
Category: GRAMMAR

@github-actions

Copy link
Copy Markdown

@msafwankarim PR doc deploy will soon be available for review on https://stakater.github.io/mto-docs/main

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants