| 1 | <?xml version='1.0' encoding='UTF-8'?> |
| 2 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" width="1280" height="720"> |
| 3 | <defs> |
| 4 | <pattern id="bpGridMajor" x="0" y="0" width="40" height="40" patternUnits="userSpaceOnUse" data-pptx-pattern="lgGrid"> |
| 5 | <rect width="40" height="40" fill="#0E2A47" /> |
| 6 | <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#2D4A6B" stroke-width="0.6" /> |
| 7 | </pattern> |
| 8 | <pattern id="bpGridMinor" x="0" y="0" width="8" height="8" patternUnits="userSpaceOnUse" data-pptx-pattern="smGrid"> |
| 9 | <rect width="8" height="8" fill="#0E2A47" /> |
| 10 | <path d="M 8 0 L 0 0 0 8" fill="none" stroke="#1A3A5C" stroke-width="0.3" /> |
| 11 | </pattern> |
| 12 | <radialGradient id="hubGlow" cx="50%" cy="50%" r="50%"> |
| 13 | <stop offset="0%" stop-color="#FFB627" stop-opacity="0.25" /> |
| 14 | <stop offset="100%" stop-color="#FFB627" stop-opacity="0" /> |
| 15 | </radialGradient> |
| 16 | </defs> |
| 17 | |
| 18 | <g id="bg"> |
| 19 | <rect width="1280" height="720" fill="#0E2A47" /> |
| 20 | <rect width="1280" height="720" fill="url(#bpGridMinor)" opacity="0.4" /> |
| 21 | <rect width="1280" height="720" fill="url(#bpGridMajor)" opacity="0.6" /> |
| 22 | </g> |
| 23 | |
| 24 | <g id="header"> |
| 25 | <text x="60" y="42" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="30" font-weight="bold" fill="#F0F4F8">The Control Plane: Five Components</text> |
| 26 | <text x="1220" y="42" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#A0B8D0" text-anchor="end">P03 / 10</text> |
| 27 | <line x1="60" y1="58" x2="1220" y2="58" stroke="#2D4A6B" stroke-width="0.5" /> |
| 28 | <text x="60" y="78" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="13" fill="#6B85A3">ONE HUB · ONE PERSISTENT STORE · THREE SATELLITE LOOPS · ONE OPTIONAL CLOUD ADAPTER</text> |
| 29 | </g> |
| 30 | |
| 31 | <g id="orbit-rings"> |
| 32 | <circle cx="640" cy="410" r="220" fill="none" stroke="#3E7AB8" stroke-width="0.5" stroke-dasharray="2 6" opacity="0.4" /> |
| 33 | <circle cx="640" cy="410" r="160" fill="none" stroke="#3E7AB8" stroke-width="0.6" stroke-dasharray="4 4" opacity="0.5" /> |
| 34 | <circle cx="640" cy="410" r="270" fill="none" stroke="#3E7AB8" stroke-width="0.4" stroke-dasharray="1 5" opacity="0.3" /> |
| 35 | </g> |
| 36 | |
| 37 | <g id="spokes"> |
| 38 | <line x1="640" y1="410" x2="640" y2="200" stroke="#FFB627" stroke-width="1.5" /> |
| 39 | <line x1="640" y1="410" x2="855" y2="290" stroke="#5BA3E0" stroke-width="1.2" /> |
| 40 | <line x1="640" y1="410" x2="855" y2="530" stroke="#5BA3E0" stroke-width="1.2" /> |
| 41 | <line x1="640" y1="410" x2="425" y2="530" stroke="#5BA3E0" stroke-width="1.2" /> |
| 42 | <line x1="640" y1="410" x2="425" y2="290" stroke="#3E7AB8" stroke-width="1.2" stroke-dasharray="4 3" /> |
| 43 | </g> |
| 44 | |
| 45 | <g id="hub-apiserver"> |
| 46 | <circle cx="640" cy="410" r="110" fill="url(#hubGlow)" /> |
| 47 | <polygon points="640,330 700,365 700,455 640,490 580,455 580,365" fill="#0E2A47" stroke="#FFB627" stroke-width="2" /> |
| 48 | <line x1="640" y1="330" x2="640" y2="410" stroke="#FFB627" stroke-width="1.2" /> |
| 49 | <line x1="640" y1="410" x2="580" y2="365" stroke="#FFB627" stroke-width="1.2" /> |
| 50 | <line x1="640" y1="410" x2="700" y2="365" stroke="#FFB627" stroke-width="1.2" /> |
| 51 | <text x="640" y="430" font-family="Consolas, 'Courier New', monospace" font-size="14" fill="#FFB627" text-anchor="middle" font-weight="bold">kube-apiserver</text> |
| 52 | <text x="640" y="450" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#F0F4F8" text-anchor="middle">REST + admission</text> |
| 53 | <text x="640" y="466" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#F0F4F8" text-anchor="middle">+ validation</text> |
| 54 | <text x="640" y="484" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#A0B8D0" text-anchor="middle">HUB · scales horizontally</text> |
| 55 | </g> |
| 56 | |
| 57 | <g id="spoke-etcd"> |
| 58 | <rect x="540" y="148" width="200" height="84" fill="#0E2A47" stroke="#FFB627" stroke-width="1.8" /> |
| 59 | <rect x="540" y="148" width="6" height="84" fill="#FFB627" /> |
| 60 | <!-- icon: tabler-outline/database --> |
| 61 | <g transform="translate(556.0, 166.0) scale(0.9166666666666666)" fill="none" stroke="#FFB627" stroke-width="1.5"> |
| 62 | <path d="M4 6a8 3 0 1 0 16 0a8 3 0 1 0 -16 0" /> |
| 63 | <path d="M4 6v6a8 3 0 0 0 16 0v-6" /> |
| 64 | <path d="M4 12v6a8 3 0 0 0 16 0v-6" /> |
| 65 | </g> |
| 66 | <text x="588" y="184" font-family="Consolas, 'Courier New', monospace" font-size="14" fill="#F0F4F8" font-weight="bold">etcd</text> |
| 67 | <text x="556" y="206" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">Distributed K/V store</text> |
| 68 | <text x="556" y="222" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">Raft · all cluster state</text> |
| 69 | <line x1="640" y1="232" x2="640" y2="280" stroke="#FFB627" stroke-width="1" stroke-dasharray="2 3" /> |
| 70 | <text x="660" y="260" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#FFB627">↕ only direct talker</text> |
| 71 | </g> |
| 72 | |
| 73 | <g id="spoke-scheduler"> |
| 74 | <rect x="800" y="248" width="220" height="84" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.5" /> |
| 75 | <rect x="800" y="248" width="6" height="84" fill="#5BA3E0" /> |
| 76 | <!-- icon: tabler-outline/settings --> |
| 77 | <g transform="translate(816.0, 266.0) scale(0.9166666666666666)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 78 | <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" /> |
| 79 | <path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" /> |
| 80 | </g> |
| 81 | <text x="848" y="284" font-family="Consolas, 'Courier New', monospace" font-size="13" fill="#F0F4F8" font-weight="bold">kube-scheduler</text> |
| 82 | <text x="816" y="306" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">filter → score → bind</text> |
| 83 | <text x="816" y="322" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">picks node per Pod</text> |
| 84 | </g> |
| 85 | |
| 86 | <g id="spoke-controller"> |
| 87 | <rect x="800" y="488" width="220" height="84" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.5" /> |
| 88 | <rect x="800" y="488" width="6" height="84" fill="#5BA3E0" /> |
| 89 | <!-- icon: tabler-outline/refresh --> |
| 90 | <g transform="translate(816.0, 506.0) scale(0.9166666666666666)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 91 | <path d="M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4" /> |
| 92 | <path d="M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4" /> |
| 93 | </g> |
| 94 | <text x="848" y="524" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">controller-manager</text> |
| 95 | <text x="816" y="546" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">N reconcile loops</text> |
| 96 | <text x="816" y="562" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">watch · diff · act</text> |
| 97 | </g> |
| 98 | |
| 99 | <g id="spoke-cloud"> |
| 100 | <rect x="260" y="248" width="200" height="84" fill="#0E2A47" stroke="#3E7AB8" stroke-width="1.5" stroke-dasharray="5 3" /> |
| 101 | <rect x="260" y="248" width="6" height="84" fill="#3E7AB8" /> |
| 102 | <!-- icon: tabler-outline/cloud --> |
| 103 | <g transform="translate(276.0, 266.0) scale(0.9166666666666666)" fill="none" stroke="#3E7AB8" stroke-width="1.5"> |
| 104 | <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" /> |
| 105 | </g> |
| 106 | <text x="308" y="284" font-family="Consolas, 'Courier New', monospace" font-size="12" fill="#F0F4F8" font-weight="bold">cloud-ctrl-mgr</text> |
| 107 | <text x="276" y="306" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">LB · routes · nodes</text> |
| 108 | <text x="276" y="322" font-family="Consolas, 'Courier New', monospace" font-size="10" fill="#6B85A3">optional · cloud only</text> |
| 109 | </g> |
| 110 | |
| 111 | <g id="spoke-kubectl"> |
| 112 | <rect x="260" y="488" width="200" height="84" fill="#0E2A47" stroke="#5BA3E0" stroke-width="1.5" /> |
| 113 | <rect x="260" y="488" width="6" height="84" fill="#5BA3E0" /> |
| 114 | <!-- icon: tabler-outline/terminal --> |
| 115 | <g transform="translate(276.0, 506.0) scale(0.9166666666666666)" fill="none" stroke="#5BA3E0" stroke-width="1.5"> |
| 116 | <path d="M5 7l5 5l-5 5" /> |
| 117 | <path d="M12 19l7 0" /> |
| 118 | </g> |
| 119 | <text x="308" y="524" font-family="Consolas, 'Courier New', monospace" font-size="13" fill="#F0F4F8" font-weight="bold">kubectl / clients</text> |
| 120 | <text x="276" y="546" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">CLI · operators · CI</text> |
| 121 | <text x="276" y="562" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="11" fill="#A0B8D0">HTTPS REST</text> |
| 122 | </g> |
| 123 | |
| 124 | <g id="annotations"> |
| 125 | <line x1="75" y1="148" x2="120" y2="148" stroke="#FFB627" stroke-width="0.8" /> |
| 126 | <line x1="75" y1="148" x2="75" y2="232" stroke="#FFB627" stroke-width="0.8" /> |
| 127 | <text x="75" y="143" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#FFB627">PERSISTENCE</text> |
| 128 | |
| 129 | <line x1="1080" y1="290" x2="1140" y2="290" stroke="#5BA3E0" stroke-width="0.8" /> |
| 130 | <line x1="1140" y1="290" x2="1140" y2="530" stroke="#5BA3E0" stroke-width="0.8" /> |
| 131 | <line x1="1080" y1="530" x2="1140" y2="530" stroke="#5BA3E0" stroke-width="0.8" /> |
| 132 | <text x="1148" y="394" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#5BA3E0">RECONCILE</text> |
| 133 | <text x="1148" y="410" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#5BA3E0">LOOPS</text> |
| 134 | |
| 135 | <line x1="140" y1="290" x2="200" y2="290" stroke="#3E7AB8" stroke-width="0.8" /> |
| 136 | <line x1="140" y1="290" x2="140" y2="332" stroke="#3E7AB8" stroke-width="0.8" /> |
| 137 | <text x="80" y="316" font-family="Consolas, 'Courier New', monospace" font-size="9" fill="#3E7AB8">CLOUD GLUE</text> |
| 138 | </g> |
| 139 | |
| 140 | <g id="key-fact"> |
| 141 | <rect x="60" y="615" width="1160" height="40" fill="#1A3A5C" fill-opacity="0.6" stroke="#FFB627" stroke-width="0.8" /> |
| 142 | <!-- icon: tabler-outline/info-circle --> |
| 143 | <g transform="translate(76.0, 624.0) scale(0.9166666666666666)" fill="none" stroke="#FFB627" stroke-width="1.5"> |
| 144 | <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" /> |
| 145 | <path d="M12 9h.01" /> |
| 146 | <path d="M11 12h1v4h1" /> |
| 147 | </g> |
| 148 | <text x="108" y="640" font-family="Arial, 'Microsoft YaHei', sans-serif" font-size="13" fill="#F0F4F8">Every state transition flows through <tspan font-family="Consolas, 'Courier New', monospace" fill="#FFB627" font-weight="bold">kube-apiserver</tspan>; only the apiserver talks to <tspan font-family="Consolas, 'Courier New', monospace" fill="#FFB627" font-weight="bold">etcd</tspan>. Every other component is a watcher of the API surface.</text> |
| 149 | </g> |
| 150 | |
| 151 | <g id="footer"> |
| 152 | <line x1="60" y1="680" x2="1220" y2="680" stroke="#2D4A6B" stroke-width="0.5" /> |
| 153 | <text x="60" y="700" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#6B85A3">K8S-ARCH-2026 · DRAWING 03 OF 10 · CONTROL PLANE</text> |
| 154 | <text x="1220" y="700" font-family="Consolas, 'Courier New', monospace" font-size="11" fill="#6B85A3" text-anchor="end">SHEET 03 OF 10</text> |
| 155 | </g> |
| 156 | </svg> |