返回 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 <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
162 lines Plain Text