diff --git a/app/kubernetes-operator/page.tsx b/app/kubernetes-operator/page.tsx new file mode 100644 index 0000000..22d2436 --- /dev/null +++ b/app/kubernetes-operator/page.tsx @@ -0,0 +1,408 @@ +import { getMetadata } from "../services/metadataService"; +import { + documentdbKubernetesOperatorDocsUrl, + documentdbKubernetesOperatorGitHubUrl, +} from "../services/externalLinks"; + +type OperatorBenefitIcon = "cluster" | "globe" | "replication" | "shield" | "terminal"; + +const operatorBenefits = [ + { + title: "Local first", + description: "Start on kind or minikube, then scale out.", + icon: "cluster" as const, + }, + { + title: "Hybrid and multi-cloud", + description: "Keep one operator model across cloud and on-prem clusters.", + icon: "globe" as const, + }, + { + title: "Cross-cluster replication", + description: "Replicate across clusters and promote when needed.", + icon: "replication" as const, + }, + { + title: "HA, backup, and TLS", + description: "Add failover, backups, and secure connectivity.", + icon: "shield" as const, + }, + { + title: "Day-2 tooling", + description: "Use the kubectl plugin for status and promotion tasks.", + icon: "terminal" as const, + }, +] as const; + +function OperatorBenefitGlyph({ icon }: { icon: OperatorBenefitIcon }) { + switch (icon) { + case "cluster": + return ( + + + + + + + ); + case "globe": + return ( + + + + ); + case "replication": + return ( + + + + ); + case "shield": + return ( + + + + ); + case "terminal": + return ( + + + + ); + } +} + +const setupSteps = [ + { + step: "01", + title: "Prepare the cluster", + description: + "Use kind or minikube locally, or a Kubernetes 1.35+ cluster such as AKS, EKS, or GKE.", + }, + { + step: "02", + title: "Install the operator", + description: + "Deploy the operator so it can reconcile DocumentDB resources and manage cluster lifecycle operations.", + }, + { + step: "03", + title: "Create a DocumentDB resource", + description: + "Apply a DocumentDB custom resource to start locally or grow into replicated topologies as your environment expands.", + }, +] as const; + +const operatorHighlights = [ + "kind + minikube quickstart", + "AKS / EKS / GKE", + "Hybrid / on-prem guide", + "Cross-cluster replication", + "Backup + ScheduledBackup resources", + "kubectl plugin for operator workflows", + "TLS-aware deployment model", +] as const; + +const bestFitScenarios = [ + "Teams starting on local clusters and growing toward managed Kubernetes.", + "Platform teams spanning cloud and on-prem Kubernetes environments.", + "Operators that need cross-cluster replication and promotion workflows.", +] as const; + +export const metadata = getMetadata({ + title: "DocumentDB Kubernetes Operator", + description: + "Learn how the DocumentDB Kubernetes Operator takes DocumentDB from local Kubernetes clusters to hybrid and multi-cloud topologies with replication, HA, backups, and TLS.", + extraKeywords: [ + "Kubernetes", + "operator", + "Helm", + "multi-cloud", + "hybrid", + "on-prem", + "cross-cluster replication", + "high availability", + "backup", + "TLS", + ], +}); + +export default function KubernetesOperatorPage() { + return ( +
+
+
+
+
+
+

+ Operator preview +

+

+ DocumentDB Kubernetes Operator +

+

+ Start on kind or minikube. Expand to{" "} + hybrid and multi-cloud Kubernetes. +

+

+ Install with Helm, manage with custom resources, and extend to + documented cross-cluster replication, failover, backups, and + TLS. +

+ +
+ +
+
+ + Where it fits + +

+ Built for local, hybrid, and multi-cluster paths +

+

+ Use the operator when one cluster is not enough and you want a + consistent Kubernetes operating model. +

+
+ +
    + {bestFitScenarios.map((item) => ( +
  • + + + + + +

    {item}

    +
  • + ))} +
+ +
+

+ Operator highlights +

+
+ {operatorHighlights.map((item) => ( + + {item} + + ))} +
+

+ Preview status +

+

+ The operator is still in preview. Use this page to assess the + fit, then follow the quick start or multi-cluster guides. +

+
+
+
+
+
+ +
+
+
+

+ What the operator adds +

+

+ A better fit for Kubernetes-based DocumentDB environments +

+

+ Choose the operator when one cluster is not enough and you want + the same operating model across local, hybrid, and multi-cloud + environments. +

+
+ +
+ {operatorBenefits.map((item) => ( +
+
+ +
+

{item.title}

+

+ {item.description} +

+
+ ))} +
+
+
+ +
+
+
+

+ Setup at a glance +

+

+ The operator flow in three steps +

+

+ Use this page to understand the path. Use the docs for commands, + topology setup, and current support details. +

+
+ +
+ {setupSteps.map((item) => ( +
+ + {item.step} + +

+ {item.title} +

+

+ {item.description} +

+
+ ))} +
+ +
+
+
+

+ What to expect before you start +

+

+ The operator currently targets Kubernetes 1.35+ and depends on + cert-manager and CloudNativePG. Cross-cluster topologies also + require network connectivity between clusters. +

+
+ + Open quick start + +
+
+
+
+ +
+
+

+ Next step +

+

+ Start local, then expand +

+

+ Use the quick start for a local cluster. Then continue with the + hybrid and multi-cloud guides. +

+
+ + Open quick start + + + GitHub repository + +
+
+
+
+ ); +} diff --git a/app/page.tsx b/app/page.tsx index b49681c..aba0ef9 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,6 +1,7 @@ import Image from "next/image"; import Link from "next/link"; import CommandSnippet from "./components/CommandSnippet"; +import { documentdbKubernetesOperatorDocsUrl } from "./services/externalLinks"; import { withBasePath } from "./services/sitePath"; type CapabilityIconName = @@ -26,7 +27,26 @@ const quickStartSteps = [ }, { step: "03", - description: "Continue with the docs or prebuilt packages.", + description: "Continue with the docs or Linux packages for the setup you need.", + }, +]; + +const kubernetesOperatorEntryPoints = [ + { + title: "Local clusters", + description: "Start on kind or minikube for local Kubernetes development.", + }, + { + title: "Hybrid and multi-cloud", + description: "Use documented AKS, EKS, GKE, and on-prem deployment guides.", + }, + { + title: "Replication and resilience", + description: "Extend to cross-cluster replication, HA, backups, and TLS.", + }, + { + title: "Day-2 operations", + description: "Use the kubectl plugin for status, events, and promotion.", }, ]; @@ -578,6 +598,68 @@ export default function Home() { +
+
+
+

+ Operator preview +

+

+ DocumentDB Kubernetes Operator +

+

+ Run DocumentDB on Kubernetes—from kind and minikube to{" "} + hybrid and multi-cloud deployments. +

+
+ +
+ {kubernetesOperatorEntryPoints.map((item) => ( +
+

+ {item.title} +

+

+ {item.description} +

+
+ ))} +
+ +
+
+
+

+ Preview with local, hybrid, and multi-cluster paths +

+

+ The operator is still in preview. Start with the overview, then + follow the quick start or multi-cluster guides. +

+
+ +
+ + Read operator overview + + + Open quick start + +
+
+
+
+
+

diff --git a/app/services/articleService.ts b/app/services/articleService.ts index 49991c8..1f79758 100644 --- a/app/services/articleService.ts +++ b/app/services/articleService.ts @@ -109,7 +109,7 @@ function splitPrebuiltNavigation(section: string, links: Link[]): Link[] { const isPrebuiltPackages = (link: Link) => link.link.includes('prebuilt-packages') || /pre-built packages/i.test(link.title); - const dockerAndLinuxLinks: Link[] = [ + const gettingStartedQuickLinks: Link[] = [ { title: 'Docker', link: '/docs/getting-started/docker', @@ -123,11 +123,11 @@ function splitPrebuiltNavigation(section: string, links: Link[]): Link[] { const gettingStartedIndex = filteredLinks.find((link) => link.link === 'index.md'); if (!gettingStartedIndex) { - return [...dockerAndLinuxLinks, ...filteredLinks]; + return [...gettingStartedQuickLinks, ...filteredLinks]; } const remainingLinks = filteredLinks.filter((link) => link !== gettingStartedIndex); - return [gettingStartedIndex, ...dockerAndLinuxLinks, ...remainingLinks]; + return [gettingStartedIndex, ...gettingStartedQuickLinks, ...remainingLinks]; } function updateGettingStartedIndexContent(content: string): string { diff --git a/app/services/externalLinks.ts b/app/services/externalLinks.ts new file mode 100644 index 0000000..eab069c --- /dev/null +++ b/app/services/externalLinks.ts @@ -0,0 +1,5 @@ +export const documentdbKubernetesOperatorDocsUrl = + 'https://documentdb.io/documentdb-kubernetes-operator/preview/'; + +export const documentdbKubernetesOperatorGitHubUrl = + 'https://github.com/documentdb/documentdb-kubernetes-operator'; diff --git a/articles/content.yml b/articles/content.yml index 8514350..c3c5065 100644 --- a/articles/content.yml +++ b/articles/content.yml @@ -4,6 +4,8 @@ landing: links: - title: Getting Started with DocumentDB link: /docs/getting-started + - title: DocumentDB Kubernetes Operator (Preview) + link: /kubernetes-operator - title: API Reference link: /docs/reference - title: Postgres Extension API @@ -11,4 +13,4 @@ landing: - title: DocumentDB Local link: /docs/documentdb-local - title: Architecture under the hood - link: /docs/architecture \ No newline at end of file + link: /docs/architecture