Files
kandev/docs/diagrams/k8s.html
T
2026-09-03 23:12:45 +00:00

126 lines
12 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kandev Kubernetes placement</title>
<link href="https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700&family=Instrument+Serif:ital@0;1&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; }
:root { --paper:#0d0d10; --paper-2:#111114; --ink:#fff; --muted:#a1a1a1; --soft:#737373; --rule:rgba(255,255,255,.12); --accent:#6468f0; --accent-tint:rgba(100,104,240,.16); --link:#53eafd; --sans:'Figtree','Geist',system-ui,sans-serif; --serif:'Instrument Serif',serif; --mono:'Geist Mono',ui-monospace,monospace; }
body { margin:0; min-height:100vh; padding:32px 24px 40px; color:var(--ink); background:var(--paper); font-family:var(--sans); }
.frame { width:min(100%,1200px); margin:0 auto; }
.eyebrow { margin:0 0 8px; color:var(--soft); font:500 10px/1.4 var(--mono); letter-spacing:.18em; text-transform:uppercase; }
h1 { margin:0 0 8px; color:var(--ink); font:400 clamp(28px,4vw,36px)/1.1 var(--serif); letter-spacing:-.02em; }
.lede { max-width:72ch; margin:0 0 24px; color:var(--muted); font-size:14px; line-height:1.5; }
svg { display:block; width:100%; height:auto; }
</style>
</head>
<body>
<main class="frame">
<p class="eyebrow">Deployment · Kandev · doc-inline · balanced</p>
<h1>One control plane, optional task Pods</h1>
<p class="lede">The example keeps Kandev as one persistent control-plane Pod. Kubernetes-backed sessions are separate task Pods with their own workload identity.</p>
<svg viewBox="0 0 1200 680" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="k8s-title k8s-desc">
<title id="k8s-title">One control plane, optional task Pods</title>
<desc id="k8s-desc">A Kubernetes deployment view places a browser behind a ClusterIP service, one persistent Kandev control-plane Pod backed by a ReadWriteOnce PVC, optional task-session Pods with workload identity, and external provider APIs.</desc>
<defs>
<marker id="k8s-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#a1a1a1"/></marker>
<marker id="k8s-arrow-link" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#53eafd"/></marker>
<marker id="k8s-arrow-accent" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto"><polygon points="0 0, 8 3, 0 6" fill="#6468f0"/></marker>
</defs>
<rect width="1200" height="680" fill="#0d0d10"/>
<!-- Physical zones. -->
<rect x="40" y="88" width="220" height="472" rx="8" fill="#111114" stroke="rgba(255,255,255,0.12)" stroke-width="1" stroke-dasharray="4,4"/>
<rect x="280" y="88" width="620" height="472" rx="8" fill="#111114" stroke="rgba(255,255,255,0.12)" stroke-width="1" stroke-dasharray="4,4"/>
<rect x="920" y="88" width="240" height="472" rx="8" fill="#111114" stroke="rgba(255,255,255,0.12)" stroke-width="1" stroke-dasharray="4,4"/>
<rect x="56" y="92" width="64" height="14" rx="2" fill="#0d0d10"/>
<text x="88" y="102" text-anchor="middle" fill="#737373" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.14em">EDGE</text>
<rect x="296" y="92" width="128" height="14" rx="2" fill="#0d0d10"/>
<text x="360" y="102" text-anchor="middle" fill="#737373" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.14em">K8S CLUSTER</text>
<rect x="936" y="92" width="160" height="14" rx="2" fill="#0d0d10"/>
<text x="1016" y="102" text-anchor="middle" fill="#737373" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.14em">EXTERNAL SYSTEMS</text>
<!-- Arrows are behind infrastructure nodes. -->
<line x1="232" y1="196" x2="320" y2="196" stroke="#53eafd" stroke-width="1.2" marker-end="url(#k8s-arrow-link)"/>
<path d="M410 220 V272" fill="none" stroke="#a1a1a1" stroke-width="1.2" marker-end="url(#k8s-arrow)"/>
<path d="M440 400 V456" fill="none" stroke="#a1a1a1" stroke-width="1.2" marker-end="url(#k8s-arrow)"/>
<line x1="560" y1="336" x2="640" y2="336" stroke="#6468f0" stroke-width="1.4" marker-end="url(#k8s-arrow-accent)"/>
<line x1="860" y1="336" x2="952" y2="336" stroke="#53eafd" stroke-width="1.2" marker-end="url(#k8s-arrow-link)"/>
<rect x="240" y="178" width="72" height="12" rx="2" fill="#0d0d10"/>
<text x="276" y="187" text-anchor="middle" fill="#53eafd" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.06em">HTTPS:38429</text>
<rect x="420" y="232" width="64" height="12" rx="2" fill="#0d0d10"/>
<text x="452" y="241" fill="#a1a1a1" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.06em">PERSIST</text>
<rect x="448" y="418" width="64" height="12" rx="2" fill="#0d0d10"/>
<text x="480" y="427" fill="#a1a1a1" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.06em">SQLITE / DATA</text>
<rect x="568" y="318" width="64" height="12" rx="2" fill="#0d0d10"/>
<text x="600" y="327" text-anchor="middle" fill="#6468f0" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.06em">K8S API</text>
<rect x="868" y="318" width="80" height="12" rx="2" fill="#0d0d10"/>
<text x="908" y="327" text-anchor="middle" fill="#53eafd" font-size="8" font-family="'Geist Mono',monospace" letter-spacing="0.06em">HTTPS / GIT</text>
<g role="group" aria-label="Browser or CLI client">
<rect x="72" y="160" width="160" height="72" rx="6" fill="#111114" stroke="#404040" stroke-width="1"/>
<rect x="80" y="168" width="56" height="12" rx="2" fill="transparent" stroke="rgba(255,255,255,0.28)" stroke-width="0.8"/>
<text x="108" y="177" text-anchor="middle" fill="#a1a1a1" font-size="7" font-family="'Geist Mono',monospace" letter-spacing="0.08em">CLIENT</text>
<text x="152" y="198" text-anchor="middle" fill="#ffffff" font-size="14" font-weight="600" font-family="'Figtree','Geist',sans-serif">Browser / CLI</text>
<text x="152" y="218" text-anchor="middle" fill="#737373" font-size="9" font-family="'Geist Mono',monospace">HTTPS · WebSocket</text>
</g>
<g role="group" aria-label="Kubernetes ClusterIP service">
<rect x="320" y="160" width="180" height="60" rx="6" fill="#111114" stroke="#404040" stroke-width="1"/>
<rect x="328" y="168" width="64" height="12" rx="2" fill="transparent" stroke="rgba(255,255,255,0.28)" stroke-width="0.8"/>
<text x="360" y="177" text-anchor="middle" fill="#a1a1a1" font-size="7" font-family="'Geist Mono',monospace" letter-spacing="0.08em">SERVICE</text>
<text x="410" y="196" text-anchor="middle" fill="#ffffff" font-size="14" font-weight="600" font-family="'Figtree','Geist',sans-serif">ClusterIP</text>
</g>
<g role="group" aria-label="Persistent Kandev control plane Pod">
<rect x="320" y="272" width="240" height="128" rx="6" fill="rgba(100,104,240,0.16)" stroke="#6468f0" stroke-width="1.2"/>
<rect x="328" y="280" width="32" height="12" rx="2" fill="transparent" stroke="rgba(100,104,240,0.60)" stroke-width="0.8"/>
<text x="344" y="289" text-anchor="middle" fill="#6468f0" font-size="7" font-family="'Geist Mono',monospace" letter-spacing="0.08em">POD</text>
<rect x="512" y="280" width="32" height="12" rx="2" fill="transparent" stroke="rgba(100,104,240,0.60)" stroke-width="0.8"/>
<text x="528" y="289" text-anchor="middle" fill="#6468f0" font-size="8" font-family="'Geist Mono',monospace">x1</text>
<text x="440" y="314" text-anchor="middle" fill="#ffffff" font-size="16" font-weight="600" font-family="'Figtree','Geist',sans-serif">Kandev control plane</text>
<rect x="328" y="328" width="224" height="24" rx="4" fill="rgba(255,255,255,0.05)" stroke="#404040" stroke-width="0.8"/>
<text x="340" y="344" fill="#ffffff" font-size="12" font-family="'Figtree','Geist',sans-serif">kandev</text>
<text x="540" y="344" text-anchor="end" fill="#a1a1a1" font-size="9" font-family="'Geist Mono',monospace">vX.Y.Z</text>
<text x="440" y="376" text-anchor="middle" fill="#a1a1a1" font-size="9" font-family="'Geist Mono',monospace">API identity · persistent home</text>
</g>
<g role="group" aria-label="Kandev persistent data PVC">
<rect x="320" y="456" width="240" height="72" rx="6" fill="#111114" stroke="#404040" stroke-width="1"/>
<rect x="328" y="464" width="32" height="12" rx="2" fill="transparent" stroke="rgba(255,255,255,0.28)" stroke-width="0.8"/>
<text x="344" y="473" text-anchor="middle" fill="#a1a1a1" font-size="7" font-family="'Geist Mono',monospace" letter-spacing="0.08em">PVC</text>
<text x="440" y="494" text-anchor="middle" fill="#ffffff" font-size="14" font-weight="600" font-family="'Figtree','Geist',sans-serif">kandev-data</text>
<text x="440" y="514" text-anchor="middle" fill="#737373" font-size="9" font-family="'Geist Mono',monospace">10 GiB · ReadWriteOnce</text>
</g>
<g role="group" aria-label="Optional task session Pods">
<rect x="640" y="272" width="220" height="128" rx="6" fill="#111114" stroke="#404040" stroke-width="1"/>
<rect x="648" y="280" width="32" height="12" rx="2" fill="transparent" stroke="rgba(255,255,255,0.28)" stroke-width="0.8"/>
<text x="664" y="289" text-anchor="middle" fill="#a1a1a1" font-size="7" font-family="'Geist Mono',monospace" letter-spacing="0.08em">POD</text>
<rect x="812" y="280" width="32" height="12" rx="2" fill="transparent" stroke="rgba(255,255,255,0.28)" stroke-width="0.8"/>
<text x="828" y="289" text-anchor="middle" fill="#a1a1a1" font-size="8" font-family="'Geist Mono',monospace">xN</text>
<text x="750" y="314" text-anchor="middle" fill="#ffffff" font-size="16" font-weight="600" font-family="'Figtree','Geist',sans-serif">Task session</text>
<rect x="648" y="328" width="204" height="24" rx="4" fill="rgba(255,255,255,0.05)" stroke="#404040" stroke-width="0.8"/>
<text x="660" y="344" fill="#ffffff" font-size="12" font-family="'Figtree','Geist',sans-serif">agentctl + agent CLI</text>
<text x="840" y="344" text-anchor="end" fill="#a1a1a1" font-size="9" font-family="'Geist Mono',monospace">vX.Y.Z</text>
<text x="750" y="376" text-anchor="middle" fill="#a1a1a1" font-size="9" font-family="'Geist Mono',monospace">workload identity · opt-in RBAC</text>
</g>
<g role="group" aria-label="External provider and repository APIs">
<rect x="952" y="296" width="176" height="80" rx="6" fill="#111114" stroke="#404040" stroke-width="1"/>
<rect x="960" y="304" width="48" height="12" rx="2" fill="transparent" stroke="rgba(255,255,255,0.28)" stroke-width="0.8"/>
<text x="984" y="313" text-anchor="middle" fill="#a1a1a1" font-size="7" font-family="'Geist Mono',monospace" letter-spacing="0.08em">API</text>
<text x="1040" y="332" text-anchor="middle" fill="#ffffff" font-size="14" font-weight="600" font-family="'Figtree','Geist',sans-serif">Repos + providers</text>
<text x="1040" y="352" text-anchor="middle" fill="#737373" font-size="9" font-family="'Geist Mono',monospace">outbound access</text>
</g>
<line x1="40" y1="600" x2="1160" y2="600" stroke="rgba(255,255,255,0.12)" stroke-width="0.8"/>
<rect x="64" y="624" width="14" height="10" rx="2" fill="rgba(100,104,240,0.16)" stroke="#6468f0" stroke-width="1"/>
<text x="88" y="632" fill="#a1a1a1" font-size="9" font-family="'Geist Mono',monospace" letter-spacing="0.06em">CONTROL PLANE</text>
<line x1="280" y1="629" x2="312" y2="629" stroke="#53eafd" stroke-width="1.2" marker-end="url(#k8s-arrow-link)"/>
<text x="328" y="632" fill="#a1a1a1" font-size="9" font-family="'Geist Mono',monospace" letter-spacing="0.06em">NETWORK BOUNDARY</text>
<text x="600" y="632" fill="#737373" font-size="9" font-family="'Geist Mono',monospace" letter-spacing="0.06em">KEEP CONTROL PLANE AT ONE REPLICA</text>
</svg>
</main>
</body>
</html>