| 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" width="1280" height="720"> |
| 2 | <defs> |
| 3 | <pattern id="bpGridMajor" x="0" y="0" width="40" height="40" patternUnits="userSpaceOnUse" data-pptx-pattern="lgGrid"> |
| 4 | <rect width="40" height="40" fill="#0E2A47"/> |
| 5 | <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#2D4A6B" stroke-width="0.6"/> |
| 6 | </pattern> |
| 7 | <pattern id="bpGridMinor" x="0" y="0" width="8" height="8" patternUnits="userSpaceOnUse" data-pptx-pattern="smGrid"> |
| 8 | <rect width="8" height="8" fill="#0E2A47"/> |
| 9 | <path d="M 8 0 L 0 0 0 8" fill="none" stroke="#1A3A5C" stroke-width="0.3"/> |
| 10 | </pattern> |
| 11 | <marker id="arrow09Cyan" markerWidth="10" markerHeight="10" refX="9" refY="5" orient="auto"> |
| 12 | <path d="M 0,0 L 10,5 L 0,10 Z" fill="#5BA3E0"/> |
| 13 | </marker> |
| 14 | <marker id="arrow09Amber" markerWidth="10" markerHeight="10" refX="9" refY="5" orient="auto"> |
| 15 | <path d="M 0,0 L 10,5 L 0,10 Z" fill="#FFB627"/> |
| 16 | </marker> |
| 17 | <radialGradient id="apiGlow" cx="50%" cy="50%" r="50%"> |
| 18 | <stop offset="0%" stop-color="#FFB627" stop-opacity="0.25"/> |
| 19 | <stop offset="100%" stop-color="#FFB627" stop-opacity="0"/> |
| 20 | </radialGradient> |
| 21 | </defs> |
| 22 | |
| 23 | <g id="bg"> |
| 24 | <rect width="1280" height="720" fill="#0E2A47"/> |
| 25 | <rect width="1280" height="720" fill="url(#bpGridMinor)" opacity="0.4"/> |
| 26 | <rect width="1280" height="720" fill="url(#bpGridMajor)" opacity="0.6"/> |
| 27 | </g> |
| 28 | |
| 29 | <g id="header"> |
| 30 | <text x="60" y="42" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="30" font-weight="bold" fill="#F0F4F8">Every Line Crosses the API Server</text> |
| 31 | <text x="1220" y="42" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#A0B8D0" text-anchor="end">P09 / 10</text> |
| 32 | <line x1="60" y1="58" x2="1220" y2="58" stroke="#2D4A6B" stroke-width="0.5"/> |
| 33 | <text x="60" y="78" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="13" fill="#6B85A3">NO COMPONENT TALKS DIRECTLY TO ANOTHER — ALL FLOWS GO THROUGH kube-apiserver</text> |
| 34 | </g> |
| 35 | |
| 36 | <g id="lane-labels"> |
| 37 | <text x="180" y="115" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#5BA3E0" text-anchor="middle">CLIENTS / WATCHERS</text> |
| 38 | <text x="640" y="115" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#FFB627" text-anchor="middle">SPINE</text> |
| 39 | <text x="1100" y="115" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#5BA3E0" text-anchor="middle">PERSISTENCE</text> |
| 40 | <line x1="60" y1="125" x2="1220" y2="125" stroke="#2D4A6B" stroke-width="0.5"/> |
| 41 | </g> |
| 42 | |
| 43 | <g id="cli-kubectl"> |
| 44 | <rect x="80" y="155" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 45 | <rect x="80" y="155" width="4" height="56" fill="#5BA3E0"/> |
| 46 | <use data-icon="tabler-outline/terminal" x="96" y="170" width="24" height="24" fill="#5BA3E0" stroke-width="1.5"/> |
| 47 | <text x="130" y="180" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kubectl</text> |
| 48 | <text x="130" y="198" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">CLI · scripts · CI/CD</text> |
| 49 | </g> |
| 50 | <g id="cli-sched"> |
| 51 | <rect x="80" y="225" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 52 | <rect x="80" y="225" width="4" height="56" fill="#5BA3E0"/> |
| 53 | <use data-icon="tabler-outline/settings" x="96" y="240" width="24" height="24" fill="#5BA3E0" stroke-width="1.5"/> |
| 54 | <text x="130" y="250" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kube-scheduler</text> |
| 55 | <text x="130" y="268" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">picks node for Pod</text> |
| 56 | </g> |
| 57 | <g id="cli-ctrl"> |
| 58 | <rect x="80" y="295" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 59 | <rect x="80" y="295" width="4" height="56" fill="#5BA3E0"/> |
| 60 | <use data-icon="tabler-outline/refresh" x="96" y="310" width="24" height="24" fill="#5BA3E0" stroke-width="1.5"/> |
| 61 | <text x="130" y="320" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#F0F4F8" font-weight="bold">controller-mgr</text> |
| 62 | <text x="130" y="338" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">reconcile loops</text> |
| 63 | </g> |
| 64 | <g id="cli-kubelet"> |
| 65 | <rect x="80" y="365" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 66 | <rect x="80" y="365" width="4" height="56" fill="#5BA3E0"/> |
| 67 | <use data-icon="tabler-outline/cube" x="96" y="380" width="24" height="24" fill="#5BA3E0" stroke-width="1.5"/> |
| 68 | <text x="130" y="390" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kubelet (node)</text> |
| 69 | <text x="130" y="408" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">node-side agent · ≥1 per node</text> |
| 70 | </g> |
| 71 | <g id="cli-proxy"> |
| 72 | <rect x="80" y="435" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 73 | <rect x="80" y="435" width="4" height="56" fill="#5BA3E0"/> |
| 74 | <use data-icon="tabler-outline/route" x="96" y="450" width="24" height="24" fill="#5BA3E0" stroke-width="1.5"/> |
| 75 | <text x="130" y="460" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kube-proxy</text> |
| 76 | <text x="130" y="478" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">Service rule programmer</text> |
| 77 | </g> |
| 78 | <g id="cli-cloud"> |
| 79 | <rect x="80" y="505" width="200" height="56" fill="#0E2A47" stroke="#3E7AB8" stroke-width="1.2" stroke-dasharray="4 3"/> |
| 80 | <rect x="80" y="505" width="4" height="56" fill="#3E7AB8"/> |
| 81 | <use data-icon="tabler-outline/cloud" x="96" y="520" width="24" height="24" fill="#3E7AB8" stroke-width="1.5"/> |
| 82 | <text x="130" y="530" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#A0B8D0" font-weight="bold">cloud-ctrl-mgr</text> |
| 83 | <text x="130" y="548" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#6B85A3">optional · cloud only</text> |
| 84 | </g> |
| 85 | |
| 86 | <g id="api-spine"> |
| 87 | <circle cx="640" cy="360" r="180" fill="url(#apiGlow)"/> |
| 88 | <rect x="540" y="180" width="200" height="360" fill="#0E2A47" stroke="#FFB627" stroke-width="2"/> |
| 89 | <rect x="540" y="180" width="200" height="36" fill="#FFB627"/> |
| 90 | <text x="640" y="204" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#0E2A47" text-anchor="middle" font-weight="bold">★ SPINE</text> |
| 91 | <text x="640" y="245" font-family="Consolas, 'Courier New', monospace" font-size="16" fill="#FFB627" text-anchor="middle" font-weight="bold">kube-apiserver</text> |
| 92 | <line x1="560" y1="263" x2="720" y2="263" stroke="#FFB627" stroke-width="0.5"/> |
| 93 | <text x="640" y="290" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="12" fill="#F0F4F8" text-anchor="middle">REST API surface</text> |
| 94 | <text x="640" y="310" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• authn / authz</text> |
| 95 | <text x="640" y="328" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• admission webhooks</text> |
| 96 | <text x="640" y="346" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• validation</text> |
| 97 | <text x="640" y="364" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• mutation</text> |
| 98 | <line x1="560" y1="380" x2="720" y2="380" stroke="#FFB627" stroke-width="0.5"/> |
| 99 | <text x="640" y="406" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#FFB627" text-anchor="middle">scales horizontally</text> |
| 100 | <text x="640" y="424" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">N replicas behind LB</text> |
| 101 | <line x1="560" y1="445" x2="720" y2="445" stroke="#FFB627" stroke-width="0.5"/> |
| 102 | <text x="640" y="471" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#7FD99F" text-anchor="middle">watch · long-poll</text> |
| 103 | <text x="640" y="489" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#7FD99F" text-anchor="middle">+ list streams</text> |
| 104 | <text x="640" y="513" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#6B85A3" text-anchor="middle">every component watches</text> |
| 105 | <text x="640" y="528" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#6B85A3" text-anchor="middle">to drive its reconcile loop</text> |
| 106 | </g> |
| 107 | |
| 108 | <g id="persistence-column"> |
| 109 | <rect x="1000" y="290" width="200" height="140" fill="#0E2A47" stroke="#FFB627" stroke-width="2"/> |
| 110 | <rect x="1000" y="290" width="200" height="30" fill="#FFB627"/> |
| 111 | <text x="1100" y="310" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#0E2A47" text-anchor="middle" font-weight="bold">SOLE STORAGE</text> |
| 112 | <use data-icon="tabler-outline/database" x="1018" y="335" width="34" height="34" fill="#FFB627" stroke-width="1.5"/> |
| 113 | <text x="1100" y="358" font-family="Consolas, 'Courier New', monospace" font-size="16" fill="#FFB627" text-anchor="middle" font-weight="bold">etcd</text> |
| 114 | <text x="1100" y="380" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#F0F4F8" text-anchor="middle">Raft K/V cluster</text> |
| 115 | <text x="1100" y="398" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">all cluster state</text> |
| 116 | <line x1="1018" y1="410" x2="1182" y2="410" stroke="#FFB627" stroke-width="0.4"/> |
| 117 | <text x="1100" y="424" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0" text-anchor="middle">3 or 5 members · odd</text> |
| 118 | </g> |
| 119 | |
| 120 | <g id="watch-arrows"> |
| 121 | <line x1="280" y1="183" x2="540" y2="218" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 122 | <text x="295" y="173" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">POST · PUT</text> |
| 123 | <line x1="280" y1="253" x2="540" y2="263" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 124 | <text x="305" y="244" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch unscheduled</text> |
| 125 | <line x1="540" y1="290" x2="280" y2="270" stroke="#7FD99F" stroke-width="1.2" marker-end="url(#arrow09Cyan)"/> |
| 126 | <text x="338" y="285" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#7FD99F">bind decision</text> |
| 127 | |
| 128 | <line x1="280" y1="323" x2="540" y2="333" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 129 | <text x="320" y="316" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch + patch</text> |
| 130 | |
| 131 | <line x1="280" y1="393" x2="540" y2="403" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 132 | <text x="320" y="386" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch pods/node</text> |
| 133 | <line x1="540" y1="425" x2="280" y2="420" stroke="#7FD99F" stroke-width="1.2" marker-end="url(#arrow09Cyan)"/> |
| 134 | <text x="380" y="418" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#7FD99F">report status</text> |
| 135 | |
| 136 | <line x1="280" y1="463" x2="540" y2="475" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 137 | <text x="318" y="456" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch services</text> |
| 138 | |
| 139 | <line x1="280" y1="533" x2="540" y2="510" stroke="#3E7AB8" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#arrow09Cyan)"/> |
| 140 | <text x="320" y="523" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#3E7AB8">cloud sync (optional)</text> |
| 141 | |
| 142 | <line x1="740" y1="345" x2="1000" y2="345" stroke="#FFB627" stroke-width="2" marker-end="url(#arrow09Amber)"/> |
| 143 | <line x1="1000" y1="375" x2="740" y2="375" stroke="#FFB627" stroke-width="2" marker-end="url(#arrow09Amber)"/> |
| 144 | <text x="870" y="335" font-family="Consolas, 'Courier New', monospace" font-size="10" fill="#FFB627" text-anchor="middle" font-weight="bold">gRPC · write</text> |
| 145 | <text x="870" y="395" font-family="Consolas, 'Courier New', monospace" font-size="10" fill="#FFB627" text-anchor="middle" font-weight="bold">gRPC · read</text> |
| 146 | </g> |
| 147 | |
| 148 | <g id="bottom-takeaway"> |
| 149 | <rect x="60" y="588" width="1160" height="74" fill="#1A3A5C" fill-opacity="0.6" stroke="#FFB627" stroke-width="1"/> |
| 150 | <use data-icon="tabler-outline/route" x="76" y="608" width="32" height="32" fill="#FFB627" stroke-width="1.5"/> |
| 151 | <text x="120" y="615" font-family="Consolas, 'Courier New', monospace" font-size="13" fill="#FFB627" font-weight="bold">WHY THIS MATTERS</text> |
| 152 | <text x="120" y="638" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="13" fill="#F0F4F8">API-mediation makes Kubernetes <tspan fill="#FFB627" font-weight="bold">pluggable</tspan> (any controller can join the loop by watching the API), <tspan fill="#FFB627" font-weight="bold">observable</tspan> (every state change is an API event), and <tspan fill="#FFB627" font-weight="bold">auditable</tspan>.</text> |
| 153 | <text x="120" y="656" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="12" fill="#A0B8D0">The constraint <tspan font-family="Consolas, 'Courier New', monospace" fill="#FFB627">"all roads through apiserver"</tspan> is the architecture, not an inconvenience.</text> |
| 154 | </g> |
| 155 | |
| 156 | <g id="footer"> |
| 157 | <line x1="60" y1="680" x2="1220" y2="680" stroke="#2D4A6B" stroke-width="0.5"/> |
| 158 | <text x="60" y="700" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#6B85A3">K8S-ARCH-2026 · DRAWING 09 OF 10 · API SPINE</text> |
| 159 | <text x="1220" y="700" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#6B85A3" text-anchor="end">SHEET 09 OF 10</text> |
| 160 | </g> |
| 161 | </svg> |
| 162 |