4.4 KiB
4.4 KiB
layout, title, date, categories, highlight
| layout | title | date | categories | highlight | |
|---|---|---|---|---|---|
| post | Step 1: K3d Cluster Architecture | 2025-12-28 09:00:00 -0400 |
|
true |
1. K3d Cluster Architecture
In a standard Docker setup, containers share the host's kernel and networking space directly. In Kubernetes, we introduce an abstraction layer: a Cluster. For this project, we use K3d, which packages K3s (a lightweight production-grade K8s distribution) into Docker containers.
Severed-Infra % tree
.
├── README.md
├── apps
│ ├── severed-blog-config.yaml
│ ├── severed-blog-hpa.yaml
│ ├── severed-blog-service.yaml
│ ├── severed-blog.yaml
│ └── severed-ingress.yaml
├── infra
│ ├── alloy-env.yaml
│ ├── alloy-setup.yaml
│ ├── dashboard
│ │ ├── dashboard-admin.yaml
│ │ ├── permanent-token.yaml
│ │ └── traefik-config.yaml
│ ├── observer
│ │ ├── adapter-values.yaml
│ │ ├── dashboard-json.yaml
│ │ ├── grafana-ingress.yaml
│ │ ├── grafana.yaml
│ │ ├── loki.yaml
│ │ └── prometheus.yaml
│ └── storage
│ └── openebs-sc.yaml
├── namespaces.yaml
└── scripts
├── README.md
├── access-hub.sh
├── deploy-all.sh
├── setup-grafana-creds.sh
└── tests
├── generated-202-404-blog.sh
└── stress-blog.sh
1.1 Multi-Node Simulation
- Server (Control Plane): The master node. Runs the API server, scheduler, and etcd.
- Agents (Workers): The worker nodes where our application pods run.
Setting up the environment
We map port 8080 to the internal Traefik LoadBalancer to access services via *.localhost.
k3d cluster create severed-cluster \
--agents 2 \
-p "8080:80@loadbalancer" \
-p "8443:443@loadbalancer"
1.2 Image Registry Lifecycle
Since our severed-blog image is local, we side-load it directly into the cluster's internal image store rather than pushing to Docker Hub.
docker build -t severed-blog:v0.3 .
k3d image import severed-blog:v0.3 -c severed-cluster
1.3 Namespaces & Storage
We partition the cluster into logical domains. We also install OpenEBS to provide dynamic storage provisioning (PersistentVolumes) for our databases.
namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
name: severed-apps
---
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
---
apiVersion: v1
kind: Namespace
metadata:
name: kubernetes-dashboard
---
apiVersion: v1
kind: Namespace
metadata:
name: openebs
infra/storage/openebs-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: severed-storage
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
1.4. Infrastructure Concepts Cheat Sheet
| Object | Docker Equivalent | Kubernetes Purpose |
|---|---|---|
| Node | The Host Machine | A physical or virtual server in the cluster. |
| Pod | A Container | The smallest deployable unit (can contain multiple containers). |
| Deployments | docker-compose up |
Manages the lifecycle and scaling of Pods. |
| Services | Network Aliases | Provides a stable DNS name/IP for a group of Pods. |
| HPA | Auto-Scaling Group | Automatically scales replicas based on traffic/load. |
| Ingress | Nginx Proxy / Traefik | Manages external access to Services via HTTP/HTTPS. |
| ConfigMap | docker run -v config:/etc... |
Decouples configuration files from the container image. |
| Secret | Environment Variables (Secure) | Stores sensitive data (passwords, tokens) encoded in Base64. |
| DaemonSet | mode: global (Swarm) |
Ensures one copy of a Pod runs on every Node (logs/monitoring). |
| StatefulSet | N/A | Manages apps requiring stable identities and storage (Databases). |