# [[Structure of a Kubernetes cluster]]
![[Structure of a Kubernetes cluster.svg]]
Here's how a [[Kubernetes]] cluster is structured, and the key components of a cluster.
![[structure-k8scluster.png]] [^testproj]
### [[Node pool]]
A node pool is a group of nodes that have the same configuration (same type of instance, same region). Grouping them together in a node pool lets you control them together.
### Node
A node is the virtual machine with the resources required to run the application. Nodes are not defined in a Kubernetes manifest file and need to be deployed separately.
### kubelet
kubelet is an agent on each node to make sure that the pods and containers are correctly assigned to the node and deployed in accordance with the manifest file.
### kube-proxy
The kube-proxy is a network proxy that controls and manages communication between pods according to rules in the manifest file.
### [[Pods]]
Pods are "containers for containers".
### Control plane
The control plane is a group of components that together manage the operation of the cluster.
#### API server
This server monitors the health of the cluster and takes action when the status of the cluster falls outside of the described environment. It can be accessed using REST calls via `kubectl`.
#### Controller manager
A controller manager detects changes in the status of the cluster. If the desired state is 3 replicas, and there are only 2 available, the controller starts up another. [^operator]
#### [[Ingress Controller]]
An ingress controller defines what types of inbound traffic a cluster allows.
#### Scheduler
Assigns new pods to nodes based on current resource availability.
#### etcd
Stores information about the current cluster status.
[^testproj]: Dey, S. (2021). _The fundamentals of kubernetes and its value for testing._ Accessed in April 2021 on [TestProject](https://blog.testproject.io/2021/02/23/the-fundamentals-of-kubernetes-and-its-value-for-testing/).
[^operator]: Müller, M. (2021). _[[Kubernetes Operators - what they are and why you would need them|Kubernetes operator: What they are and why you would need them]]_. DevOps Pro 2021 Conference.
%%
# Excalidraw Data
## Text Elements
## Drawing
```json
{
"type": "excalidraw",
"version": 2,
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.1.4",
"elements": [
{
"id": "4y8R7iOA",
"type": "text",
"x": 118.49495565891266,
"y": -333.44393157958984,
"width": 3.8599853515625,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"roundness": null,
"seed": 967149026,
"version": 2,
"versionNonce": 939059582,
"isDeleted": true,
"boundElements": null,
"updated": 1713723615080,
"link": null,
"locked": false,
"text": "",
"rawText": "",
"fontSize": 20,
"fontFamily": 4,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"originalText": "",
"lineHeight": 1.2
}
],
"appState": {
"theme": "dark",
"viewBackgroundColor": "#ffffff",
"currentItemStrokeColor": "#1e1e1e",
"currentItemBackgroundColor": "transparent",
"currentItemFillStyle": "solid",
"currentItemStrokeWidth": 2,
"currentItemStrokeStyle": "solid",
"currentItemRoughness": 1,
"currentItemOpacity": 100,
"currentItemFontFamily": 4,
"currentItemFontSize": 20,
"currentItemTextAlign": "left",
"currentItemStartArrowhead": null,
"currentItemEndArrowhead": "arrow",
"scrollX": 583.2388916015625,
"scrollY": 573.6323852539062,
"zoom": {
"value": 1
},
"currentItemRoundness": "round",
"gridSize": null,
"gridColor": {
"Bold": "#C9C9C9FF",
"Regular": "#EDEDEDFF"
},
"currentStrokeOptions": null,
"previousGridSize": null,
"frameRendering": {
"enabled": true,
"clip": true,
"name": true,
"outline": true
}
},
"files": {}
}
```
%%