| 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 | <!-- icon: tabler-outline/terminal --> |
| 47 | <g transform="translate(96.0, 170.0)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 48 | <path d="M5 7l5 5l-5 5" /> |
| 49 | <path d="M12 19l7 0" /> |
| 50 | </g> |
| 51 | <text x="130" y="180" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kubectl</text> |
| 52 | <text x="130" y="198" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">CLI · scripts · CI/CD</text> |
| 53 | </g> |
| 54 | <g id="cli-sched"> |
| 55 | <rect x="80" y="225" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 56 | <rect x="80" y="225" width="4" height="56" fill="#5BA3E0"/> |
| 57 | <!-- icon: tabler-outline/settings --> |
| 58 | <g transform="translate(96.0, 240.0)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 59 | <path d="M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065" /> |
| 60 | <path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" /> |
| 61 | </g> |
| 62 | <text x="130" y="250" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kube-scheduler</text> |
| 63 | <text x="130" y="268" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">picks node for Pod</text> |
| 64 | </g> |
| 65 | <g id="cli-ctrl"> |
| 66 | <rect x="80" y="295" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 67 | <rect x="80" y="295" width="4" height="56" fill="#5BA3E0"/> |
| 68 | <!-- icon: tabler-outline/refresh --> |
| 69 | <g transform="translate(96.0, 310.0)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 70 | <path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4" /> |
| 71 | <path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4" /> |
| 72 | </g> |
| 73 | <text x="130" y="320" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#F0F4F8" font-weight="bold">controller-mgr</text> |
| 74 | <text x="130" y="338" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">reconcile loops</text> |
| 75 | </g> |
| 76 | <g id="cli-kubelet"> |
| 77 | <rect x="80" y="365" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 78 | <rect x="80" y="365" width="4" height="56" fill="#5BA3E0"/> |
| 79 | <!-- icon: tabler-outline/cube --> |
| 80 | <g transform="translate(96.0, 380.0)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 81 | <path d="M21 16.008v-8.018a1.98 1.98 0 0 0 -1 -1.717l-7 -4.008a2.016 2.016 0 0 0 -2 0l-7 4.008c-.619 .355 -1 1.01 -1 1.718v8.018c0 .709 .381 1.363 1 1.717l7 4.008a2.016 2.016 0 0 0 2 0l7 -4.008c.619 -.355 1 -1.01 1 -1.718" /> |
| 82 | <path d="M12 22v-10" /> |
| 83 | <path d="M12 12l8.73 -5.04" /> |
| 84 | <path d="M3.27 6.96l8.73 5.04" /> |
| 85 | </g> |
| 86 | <text x="130" y="390" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kubelet (node)</text> |
| 87 | <text x="130" y="408" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">node-side agent · ≥1 per node</text> |
| 88 | </g> |
| 89 | <g id="cli-proxy"> |
| 90 | <rect x="80" y="435" width="200" height="56" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.3"/> |
| 91 | <rect x="80" y="435" width="4" height="56" fill="#5BA3E0"/> |
| 92 | <!-- icon: tabler-outline/route --> |
| 93 | <g transform="translate(96.0, 450.0)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 94 | <path d="M3 19a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /> |
| 95 | <path d="M19 7a2 2 0 1 0 0 -4a2 2 0 0 0 0 4" /> |
| 96 | <path d="M11 19h5.5a3.5 3.5 0 0 0 0 -7h-8a3.5 3.5 0 0 1 0 -7h4.5" /> |
| 97 | </g> |
| 98 | <text x="130" y="460" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">kube-proxy</text> |
| 99 | <text x="130" y="478" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#A0B8D0">Service rule programmer</text> |
| 100 | </g> |
| 101 | <g id="cli-cloud"> |
| 102 | <rect x="80" y="505" width="200" height="56" fill="#0E2A47" stroke="#3E7AB8" stroke-width="1.2" stroke-dasharray="4 3"/> |
| 103 | <rect x="80" y="505" width="4" height="56" fill="#3E7AB8"/> |
| 104 | <!-- icon: tabler-outline/cloud --> |
| 105 | <g transform="translate(96.0, 520.0)" fill="none" stroke="#3E7AB8" stroke-width="1.5"> |
| 106 | <path d="M6.657 18c-2.572 0 -4.657 -2.007 -4.657 -4.483c0 -2.475 2.085 -4.482 4.657 -4.482c.393 -1.762 1.794 -3.2 3.675 -3.773c1.88 -.572 3.956 -.193 5.444 1c1.488 1.19 2.162 3.007 1.77 4.769h.99c1.913 0 3.464 1.56 3.464 3.486c0 1.927 -1.551 3.487 -3.465 3.487h-11.878" /> |
| 107 | </g> |
| 108 | <text x="130" y="530" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#A0B8D0" font-weight="bold">cloud-ctrl-mgr</text> |
| 109 | <text x="130" y="548" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#6B85A3">optional · cloud only</text> |
| 110 | </g> |
| 111 | |
| 112 | <g id="api-spine"> |
| 113 | <circle cx="640" cy="360" r="180" fill="url(#apiGlow)"/> |
| 114 | <rect x="540" y="180" width="200" height="360" fill="#0E2A47" stroke="#FFB627" stroke-width="2"/> |
| 115 | <rect x="540" y="180" width="200" height="36" fill="#FFB627"/> |
| 116 | <text x="640" y="204" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#0E2A47" text-anchor="middle" font-weight="bold">★ SPINE</text> |
| 117 | <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> |
| 118 | <line x1="560" y1="263" x2="720" y2="263" stroke="#FFB627" stroke-width="0.5"/> |
| 119 | <text x="640" y="290" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="12" fill="#F0F4F8" text-anchor="middle">REST API surface</text> |
| 120 | <text x="640" y="310" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• authn / authz</text> |
| 121 | <text x="640" y="328" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• admission webhooks</text> |
| 122 | <text x="640" y="346" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• validation</text> |
| 123 | <text x="640" y="364" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">• mutation</text> |
| 124 | <line x1="560" y1="380" x2="720" y2="380" stroke="#FFB627" stroke-width="0.5"/> |
| 125 | <text x="640" y="406" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#FFB627" text-anchor="middle">scales horizontally</text> |
| 126 | <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> |
| 127 | <line x1="560" y1="445" x2="720" y2="445" stroke="#FFB627" stroke-width="0.5"/> |
| 128 | <text x="640" y="471" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#7FD99F" text-anchor="middle">watch · long-poll</text> |
| 129 | <text x="640" y="489" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#7FD99F" text-anchor="middle">+ list streams</text> |
| 130 | <text x="640" y="513" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="10" fill="#6B85A3" text-anchor="middle">every component watches</text> |
| 131 | <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> |
| 132 | </g> |
| 133 | |
| 134 | <g id="persistence-column"> |
| 135 | <rect x="1000" y="290" width="200" height="140" fill="#0E2A47" stroke="#FFB627" stroke-width="2"/> |
| 136 | <rect x="1000" y="290" width="200" height="30" fill="#FFB627"/> |
| 137 | <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> |
| 138 | <!-- icon: tabler-outline/database --> |
| 139 | <g transform="translate(1018.0, 335.0) scale(1.4166666666666667)" fill="none" stroke="#FFB627" stroke-width="1.5"> |
| 140 | <path d="M4 6a8 3 0 1 0 16 0a8 3 0 1 0 -16 0" /> |
| 141 | <path d="M4 6v6a8 3 0 0 0 16 0v-6" /> |
| 142 | <path d="M4 12v6a8 3 0 0 0 16 0v-6" /> |
| 143 | </g> |
| 144 | <text x="1100" y="358" font-family="Consolas, 'Courier New', monospace" font-size="16" fill="#FFB627" text-anchor="middle" font-weight="bold">etcd</text> |
| 145 | <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> |
| 146 | <text x="1100" y="398" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0" text-anchor="middle">all cluster state</text> |
| 147 | <line x1="1018" y1="410" x2="1182" y2="410" stroke="#FFB627" stroke-width="0.4"/> |
| 148 | <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> |
| 149 | </g> |
| 150 | |
| 151 | <g id="watch-arrows"> |
| 152 | <line x1="280" y1="183" x2="540" y2="218" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 153 | <text x="295" y="173" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">POST · PUT</text> |
| 154 | <line x1="280" y1="253" x2="540" y2="263" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 155 | <text x="305" y="244" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch unscheduled</text> |
| 156 | <line x1="540" y1="290" x2="280" y2="270" stroke="#7FD99F" stroke-width="1.2" marker-end="url(#arrow09Cyan)"/> |
| 157 | <text x="338" y="285" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#7FD99F">bind decision</text> |
| 158 | |
| 159 | <line x1="280" y1="323" x2="540" y2="333" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 160 | <text x="320" y="316" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch + patch</text> |
| 161 | |
| 162 | <line x1="280" y1="393" x2="540" y2="403" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 163 | <text x="320" y="386" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch pods/node</text> |
| 164 | <line x1="540" y1="425" x2="280" y2="420" stroke="#7FD99F" stroke-width="1.2" marker-end="url(#arrow09Cyan)"/> |
| 165 | <text x="380" y="418" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#7FD99F">report status</text> |
| 166 | |
| 167 | <line x1="280" y1="463" x2="540" y2="475" stroke="#5BA3E0" stroke-width="1.5" marker-end="url(#arrow09Cyan)"/> |
| 168 | <text x="318" y="456" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0">watch services</text> |
| 169 | |
| 170 | <line x1="280" y1="533" x2="540" y2="510" stroke="#3E7AB8" stroke-width="1.2" stroke-dasharray="4 3" marker-end="url(#arrow09Cyan)"/> |
| 171 | <text x="320" y="523" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#3E7AB8">cloud sync (optional)</text> |
| 172 | |
| 173 | <line x1="740" y1="345" x2="1000" y2="345" stroke="#FFB627" stroke-width="2" marker-end="url(#arrow09Amber)"/> |
| 174 | <line x1="1000" y1="375" x2="740" y2="375" stroke="#FFB627" stroke-width="2" marker-end="url(#arrow09Amber)"/> |
| 175 | <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> |
| 176 | <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> |
| 177 | </g> |
| 178 | |
| 179 | <g id="bottom-takeaway"> |
| 180 | <rect x="60" y="588" width="1160" height="74" fill="#1A3A5C" fill-opacity="0.6" stroke="#FFB627" stroke-width="1"/> |
| 181 | <!-- icon: tabler-outline/route --> |
| 182 | <g transform="translate(76.0, 608.0) scale(1.3333333333333333)" fill="none" stroke="#FFB627" stroke-width="1.5"> |
| 183 | <path d="M3 19a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /> |
| 184 | <path d="M19 7a2 2 0 1 0 0 -4a2 2 0 0 0 0 4" /> |
| 185 | <path d="M11 19h5.5a3.5 3.5 0 0 0 0 -7h-8a3.5 3.5 0 0 1 0 -7h4.5" /> |
| 186 | </g> |
| 187 | <text x="120" y="615" font-family="Consolas, 'Courier New', monospace" font-size="13" fill="#FFB627" font-weight="bold">WHY THIS MATTERS</text> |
| 188 | <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> |
| 189 | <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> |
| 190 | </g> |
| 191 | |
| 192 | <g id="footer"> |
| 193 | <line x1="60" y1="680" x2="1220" y2="680" stroke="#2D4A6B" stroke-width="0.5"/> |
| 194 | <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> |
| 195 | <text x="1220" y="700" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#6B85A3" text-anchor="end">SHEET 09 OF 10</text> |
| 196 | </g> |
| 197 | </svg> |
| 198 |