├── .gitignore ├── README.md ├── client ├── package-lock.json ├── package.json ├── postcss.config.js ├── src │ ├── assets │ │ ├── Gif-Test-Placeholder.gif.OLD │ │ ├── d3.jpg │ │ ├── donuts.jpg │ │ ├── final-gif.gif │ │ ├── nemo-final-logo1.png │ │ ├── nemo-final-logo2.png │ │ ├── nemo-logo-placeholder-cropped.png │ │ └── table.jpg │ ├── components │ │ ├── App.jsx │ │ ├── ClusterStructure.jsx │ │ ├── Header.jsx │ │ ├── MainContainer.jsx │ │ ├── NavBar.jsx │ │ ├── NodeCharts.jsx │ │ ├── NodeContainer.jsx │ │ ├── NodeTable.jsx │ │ ├── PodCharts.jsx │ │ ├── PodContainer.jsx │ │ ├── PodTable.jsx │ │ └── Welcome.jsx │ ├── index.html │ ├── index.js │ └── style.scss ├── tailwind.config.js └── webpack.config.js └── server ├── Dockerfile ├── __tests__ ├── controllers │ └── metricServerController.test.js └── server.test.js ├── controllers ├── metricServerController.js └── metricServerController.ts ├── manifests ├── nemo-deployment.yaml ├── nemo-rbac.yaml ├── nemo-role-binding.yaml ├── nemo-role.yaml ├── nemo-service-account-secret.yaml ├── nemo-service-account.yaml └── nemo-service.yaml ├── package-lock.json ├── package.json ├── routes ├── metricServerRouter.js └── metricServerRouter.ts ├── server.js ├── server.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore all .env files 2 | .env 3 | 4 | # Ignore all node_modules folders 5 | node_modules/ 6 | 7 | # Ignore dist folder if appropriate 8 | dist/ 9 | 10 | # Ignore ds store 11 | **/.DS_Store 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
27 | Nemo provides Kubernetes cluster monitoring and data visualization in a simple and easy to understand user interface.
Check out our website here!
28 |
46 | # 47 | | 48 |
55 |
56 | Node Name
57 |
77 |
78 | |
79 | 80 | Node ID 81 | | 82 |
89 |
90 | Created
91 |
111 |
112 | |
113 | 114 | Internal IP 115 | | 116 |117 | External IP 118 | | 119 |
126 |
127 | CPU Capacity
128 |
148 |
149 | |
150 |
157 |
158 | CPU Usage
159 |
179 |
180 | |
181 |
188 |
189 | Memory Capacity
190 |
210 |
211 | |
212 |
219 |
220 | Memory Usage
221 |
241 |
242 | |
243 |
---|---|---|---|---|---|---|---|---|---|
{count++} | 249 |{node.NODE_NAME} | 250 |{node.UID} | 251 |252 | {((seconds) => 253 | seconds < 29 254 | ? "Just now" 255 | : seconds < 60 256 | ? "Less than a minute ago" 257 | : seconds < 3600 258 | ? `${Math.floor(seconds / 60)} minutes ago` 259 | : seconds < 86400 260 | ? `${Math.floor(seconds / 3600)} hours ago` 261 | : `${Math.floor(seconds / 86400)} days ago`)( 262 | (new Date() - new Date(node.CREATED_AT)) / 1000, 263 | )} 264 | | 265 |{node.IP_ADDRESSES[0].address} | 266 |{node.IP_ADDRESSES[1].address} | 267 |{node.CPU_CAPACITY + " Core(s)"} | 268 |269 | {node.CPU_REQUEST_TOTAL.toFixed(2) + " Core(s)"} 270 | | 271 |272 | {(node.MEMORY_CAPACITY / 1000000000).toFixed(2) + "GB"} 273 | | 274 |275 | {(node.MEMORY_REQUEST_TOTAL / 1000000000).toFixed(2) + "GB"} 276 | | 277 |
46 | # 47 | | 48 |
55 |
56 | Pod Name
57 |
77 |
78 | |
79 |
86 |
87 | Node Name
88 |
108 |
109 | |
110 | 111 | Pod ID 112 | | 113 |
120 |
121 | Container(s)
122 |
142 |
143 | |
144 |
151 |
152 | CPU Usage
153 |
173 |
174 | |
175 |
182 |
183 | CPU Usage %
184 |
204 |
205 | |
206 |
213 |
214 | Memory Usage
215 |
235 |
236 | |
237 |
244 |
245 | Memory Usage %
246 |
266 |
267 | |
268 |
---|---|---|---|---|---|---|---|---|
{count++} | 274 |{pod.POD_NAME} | 275 |{pod.NODE_NAME} | 276 |{pod.UID} | 277 |{pod.CONTAINER_COUNT} | 278 |279 | {pod.CPU_USAGE_CORES.toFixed(3) + " Core(s)"} 280 | | 281 |{pod.CPU_PERCENTAGE}% | 282 |283 | {(pod.MEMORY_USAGE_BYTES / 1000000).toFixed(2) + "MB"} 284 | | 285 |{pod.MEMORY_PERCENTAGE}% | 286 |