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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 24 additions & 21 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,28 @@ function storageSidebar() {
};
}

function overviewSidebar() {
const generated = generateSidebar([{
documentRootPath: '/docs/',
scanStartPath: 'overview',
resolvePath: '/overview/',
capitalizeFirst: false,
useTitleFromFrontmatter: true,
useFolderLinkFromIndexFile: true,
useFolderTitleFromIndexFile: true,
sortMenusByFrontmatterOrder: true,
}]);
const items = generated['/overview/'].items.filter((i: any) => i.link !== 'index.md');
const showroomEntry = { text: 'Showroom', link: 'showroom/', base: '/' };
const overviewItems = [
{ text: 'About CobaltCore', items: [{ text: 'Overview', link: '/overview/' }, ...items.map((i: any) => ({ ...i, link: '/overview/' + i.link })), showroomEntry] },
];
return {
'/overview/': { items: overviewItems },
'/showroom/': { items: overviewItems },
};
}

function observabilitySidebar() {
const generated = generateSidebar([{
documentRootPath: '/docs/',
Expand Down Expand Up @@ -83,7 +105,7 @@ export default withMermaid({
// https://vitepress.dev/reference/default-theme-config
nav: [
{ text: 'Home', link: '/' },
{ text: 'Overview', link: '/overview/' },
{ text: 'About CobaltCore', link: '/overview/' },
{ text: 'Getting Started', link: '/getting-started/' },
{
text: 'Documentation',
Expand Down Expand Up @@ -135,16 +157,6 @@ export default withMermaid({
useFolderTitleFromIndexFile: true,
sortMenusByFrontmatterOrder: true,
},
{
documentRootPath: '/docs/',
scanStartPath: 'overview',
resolvePath: '/overview/',
capitalizeFirst: false,
useTitleFromFrontmatter: true,
useFolderLinkFromIndexFile: true,
useFolderTitleFromIndexFile: true,
sortMenusByFrontmatterOrder: true,
},
{
documentRootPath: '/docs/',
scanStartPath: 'getting-started',
Expand Down Expand Up @@ -185,16 +197,6 @@ export default withMermaid({
useFolderTitleFromIndexFile: true,
sortMenusByFrontmatterOrder: true,
},
{
documentRootPath: '/docs/',
scanStartPath: 'blog',
resolvePath: '/blog/',
capitalizeFirst: false,
useTitleFromFrontmatter: true,
useFolderLinkFromIndexFile: true,
useFolderTitleFromIndexFile: true,
sortMenusByFrontmatterOrder: true,
},
{
documentRootPath: '/docs/',
scanStartPath: 'community',
Expand All @@ -218,6 +220,7 @@ export default withMermaid({
]),
...storageSidebar(),
...observabilitySidebar(),
...overviewSidebar(),
},

socialLinks: [
Expand Down
54 changes: 54 additions & 0 deletions docs/.vitepress/theme/components/BlogPost.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<template>
<a :href="href" class="blog-post">
<div class="blog-post-meta" v-if="date">{{ date }}</div>
<div class="blog-post-title">{{ title }}</div>
<div class="blog-post-desc" v-if="description">{{ description }}</div>
</a>
</template>

<script setup>
defineProps({
href: String,
title: String,
description: String,
date: String,
})
</script>

<style scoped>
.blog-post {
display: block;
margin-top: 1.5rem;
border: 1px solid var(--vp-c-divider);
border-radius: 8px;
padding: 1.25rem 1.5rem;
margin-bottom: 1rem;
background: var(--vp-c-bg-soft);
text-decoration: none;
transition: border-color 0.2s, background 0.2s;
}

.blog-post:hover {
border-color: var(--vp-c-brand-1);
background: var(--vp-c-bg-elv);
}

.blog-post-meta {
font-size: 0.8rem;
color: var(--vp-c-text-3);
margin-bottom: 0.4rem;
}

.blog-post-title {
font-size: 1rem;
font-weight: 600;
color: var(--vp-c-text-1);
margin-bottom: 0.4rem;
}

.blog-post-desc {
font-size: 0.875rem;
color: var(--vp-c-text-2);
line-height: 1.6;
}
</style>
4 changes: 4 additions & 0 deletions docs/.vitepress/theme/index.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import DefaultTheme from 'vitepress/theme'
import Layout from './components/Layout.vue'
import BlogPost from './components/BlogPost.vue'
import './custom.css'

export default {
extends: DefaultTheme,
Layout,
enhanceApp({ app }) {
app.component('BlogPost', BlogPost)
},
}
12 changes: 6 additions & 6 deletions docs/blog/index.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
---
title: Blog
order: 1
---

# Blog

News, talks, and deep-dives from the CobaltCore project.

## Posts

- [Bridging CNCF and OpenInfra: Kubernetes as the Unified Control Plane for Sovereign Cloud](./bridging-cncf-openinfra-kubernetes-control-plane)
<BlogPost
href="/blog/bridging-cncf-openinfra-kubernetes-control-plane"
title="Bridging CNCF and OpenInfra: Kubernetes as the Unified Control Plane for Sovereign Cloud"
description="Michael Schmidt (SAP SE) on using Kubernetes as the unified control plane for sovereign cloud infrastructure. KubeCon + CloudNativeCon Europe 2026, Amsterdam."
date="2026-03-23"
/>
129 changes: 1 addition & 128 deletions docs/community/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,131 +2,4 @@
title: Community
---

<div class="community-hero">
<h1>Join the CobaltCore Community</h1>
<p>CobaltCore is an open source project built by operators, for operators. Whether you want to ask a question, report a bug, contribute code, or help shape the project's direction - you're welcome here.</p>
</div>

## Get connected

<div class="community-cards">
<div class="community-card">
<div class="card-icon">💬</div>
<h3>GitHub Discussions</h3>
<p>Ask questions, share ideas, and discuss CobaltCore with maintainers and other community members.</p>
<a href="https://github.com/orgs/cobaltcore-dev/discussions" class="card-link">Open a discussion →</a>
</div>
<div class="community-card">
<div class="card-icon">🐛</div>
<h3>Issues & Roadmap</h3>
<p>Browse open issues, report bugs, request features, and track what's being worked on.</p>
<a href="https://github.com/cobaltcore-dev/docs/issues" class="card-link">Browse issues →</a>
</div>
<div class="community-card">
<div class="card-icon">📋</div>
<h3>Community Meetings</h3>
<p>Regular community meetings to discuss development, proposals, and the project roadmap. All are welcome.</p>
<a href="https://github.com/cobaltcore-dev/cobaltcore/discussions" class="card-link">See discussions →</a>
</div>
</div>

## Contribute

CobaltCore welcomes contributions of all kinds - code, documentation, bug reports, and feedback.

### Before you start

- **Open an issue first** for any non-trivial change. Describe the problem or enhancement and indicate you'd like to work on it. The team will review and assign it if it's a good fit.
- **Claim existing issues** by commenting on them to avoid duplicated effort.

### How to contribute

1. Fork the relevant repository under [github.com/cobaltcore-dev](https://github.com/cobaltcore-dev)
2. Create a branch for your change
3. Submit a pull request - a maintainer will review it
4. Sign off your commits with a [Developer Certificate of Origin (DCO)](https://developercertificate.org/)

All contributions must be licensed under [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0).

For full contribution guidelines, see [CONTRIBUTING.md](https://github.com/cobaltcore-dev/docs/blob/main/CONTRIBUTING.md).

### Contributing to docs

The documentation lives in [github.com/cobaltcore-dev/docs](https://github.com/cobaltcore-dev/docs). Every page has an **Edit this page on GitHub** link at the bottom - the quickest way to suggest a fix or improvement.

## Code of Conduct

CobaltCore follows the [SAP Open Source Code of Conduct](https://github.com/SAP/.github/blob/main/CODE_OF_CONDUCT.md). We are committed to a welcoming and inclusive environment for everyone. To report instances of unacceptable behavior, please follow the reporting process described in the Code of Conduct.

## Governance

CobaltCore is a [Linux Foundation Europe](https://linuxfoundation.eu) project, co-funded by the European Union through the NextGenerationEU programme.

<style>
.community-hero {
padding: 2rem 0 1rem;
max-width: 680px;
}

.community-hero h1 {
font-size: 2rem;
font-weight: 700;
margin-bottom: 1rem;
}

.community-hero p {
font-size: 1.1rem;
color: var(--vp-c-text-2);
line-height: 1.7;
}

.community-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1.25rem;
margin: 1.5rem 0 2.5rem;
}

.community-card {
border: 1px solid var(--vp-c-divider);
border-radius: 8px;
padding: 1.5rem;
background: var(--vp-c-bg-soft);
display: flex;
flex-direction: column;
gap: 0.5rem;
}

.card-icon {
font-size: 1.75rem;
line-height: 1;
}

.community-card h3 {
font-size: 1rem;
font-weight: 600;
margin: 0;
border: none;
padding: 0;
}

.community-card p {
font-size: 0.9rem;
color: var(--vp-c-text-2);
line-height: 1.6;
margin: 0;
flex: 1;
}

.card-link {
font-size: 0.875rem;
font-weight: 500;
color: var(--vp-c-brand-1);
text-decoration: none;
margin-top: 0.25rem;
}

.card-link:hover {
text-decoration: underline;
}
</style>
# Community
42 changes: 3 additions & 39 deletions docs/overview/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ outline: deep

# Architecture

CobaltCore is organized as a layered stack. Each layer has a clear responsibility and depends only on the layers beneath it.

```
┌──────────────────────────────────────────────────────────┐
│ Management Aurora · Greenhouse · Cortex │
Expand All @@ -28,50 +26,16 @@ CobaltCore is organized as a layered stack. Each layer has a clear responsibilit

## Platform

The foundation. Kubernetes provides the control plane. IronCore handles bare metal discovery and lifecycle. Gardener manages cluster lifecycle (creating, upgrading, and deleting Kubernetes clusters). GardenLinux is the hardened Linux OS that runs on hypervisor nodes.

Everything above this layer runs as Kubernetes workloads.

## Compute, Storage, Networking

The infrastructure data plane - the raw execution environment for virtual machines and cloud services.

- **[Compute](/compute/)** - KVM hypervisors managed by a Kubernetes operator. VMs run on bare metal nodes via libvirt. The HA service monitors hypervisor health and triggers evacuation when nodes fail.
- **[Storage](/storage/)** - Ceph provides block (RBD), object (RGW), and file (CephFS) storage. Rook operates Ceph as a Kubernetes-native workload. Arbiter enables stretched clusters across two data centers. Chorus handles S3 object replication.
- **[Networking](/network/)** - OVN provides virtual networking for VMs. Neutron's OVN integration manages the control plane.
- **[Compute](/compute/)**
- **[Storage](/storage/)**
- **[Networking](/network/)**

## Observability

Cross-cutting. [Prysm](/observability/prysm) collects audit and operational
events. [Prometheus](/observability/prometheus) scrapes metrics from all
layers. [Perses](/observability/perses) provides dashboards.

## OpenStack

The cloud services layer. OpenStack APIs (Nova, Neutron, Cinder, Keystone, Glance) are deployed via Helm and connect to the compute, storage, and networking layers below. Users and applications interact with CobaltCore primarily through OpenStack APIs.

## Management

The operations and control plane UI. Aurora is the cloud management frontend. Greenhouse provides the monitoring and management umbrella. Cortex handles intelligent placement and scheduling of workloads across the cluster.

## Data flow: provisioning a VM

To ground the architecture, here is the path a VM takes from API call to running workload:

```mermaid
sequenceDiagram
participant User
participant Nova as OpenStack Nova
participant Cortex as Cortex (placement)
participant Hypervisor as KVM Hypervisor
participant Ceph as Ceph (storage)
participant OVN as OVN (networking)

User->>Nova: Create VM request
Nova->>Cortex: Request placement decision
Cortex-->>Nova: Target hypervisor node
Nova->>Hypervisor: Spawn VM via libvirt
Nova->>Ceph: Attach RBD volume
Nova->>OVN: Wire VM network port
Hypervisor-->>User: VM running
```
26 changes: 0 additions & 26 deletions docs/overview/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,9 @@ order: 1

# What is CobaltCore?

CobaltCore is an open source, opinionated OpenStack distribution built on Kubernetes. It brings cloud-native operations to traditional, non-containerized workloads - giving operators the automation, resilience, and observability of a modern platform without requiring their applications to change.

At its core, CobaltCore assembles proven open source technologies - Kubernetes, OpenStack, Ceph, OVN - into a coherent, production-ready distribution with a clear operational model. Instead of assembling and integrating these components yourself, you get a tested stack with sensible defaults, lifecycle management, and a consistent control plane.

## Who it's for

CobaltCore is for teams that:

- Run KVM-based virtual machines at scale and need automated provisioning, evacuation, and failover
- Want OpenStack's cloud APIs (Nova, Neutron, Cinder) managed declaratively through Kubernetes operators
- Need distributed Ceph storage with high availability across failure domains
- Are adopting Kubernetes as a foundation but still need to support traditional VM workloads

## Key capabilities

| Capability | How CobaltCore delivers it |
|---|---|
| Server discovery and provisioning | IronCore manages bare metal lifecycle; GardenLinux is deployed as the hypervisor OS |
| KVM hypervisor management | Kubernetes operators control hypervisor configuration, upgrades, and health |
| High availability for VMs | HA service monitors hypervisor health and triggers live migration or evacuation automatically |
| OpenStack cloud APIs | Nova, Neutron, Cinder, Keystone, and Glance deployed and managed via Helm |
| Distributed storage | Ceph managed by Rook, with Arbiter for stretched-cluster quorum |
| Observability | Prysm, Prometheus, and Perses provide metrics, alerting, and dashboards |
| Management UI | Aurora provides a cloud management frontend; Greenhouse is the monitoring umbrella |

## How to navigate these docs

- **[Getting Started](/getting-started/)** - start here if you want to deploy CobaltCore
- **[Architecture](/overview/architecture)** - understand how the layers fit together
- **[Why CobaltCore](/overview/why)** - the reasoning behind the design decisions
- **[Showroom](/showroom/)** - live examples and demos of CobaltCore in action
- Layer sections (**Platform**, **Compute**, **OpenStack**, **Storage**, **Networking**, **Observability**, **Management**) - deep-dive reference for each part of the stack.
Loading
Loading