返回 ppt-master
09_api_spine.svg
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
198 lines Plain Text