Add tech_docs/kubernetes.md

This commit is contained in:
2024-06-26 23:40:00 +00:00
parent c14a288a40
commit b7d57dc64a

139
tech_docs/kubernetes.md Normal file
View File

@@ -0,0 +1,139 @@
Certainly! I'll simplify the project and provide clearer documentation for both the Docker Compose and Kubernetes approaches. We'll use a simple web application with a Redis cache as our example.
Let's start with the Docker Compose version:
```yaml
version: '3'
services:
# Web application service
web:
image: nginx:alpine # Using the official Nginx image
ports:
- "80:80" # Mapping host port 80 to container port 80
environment:
- REDIS_HOST=redis # Environment variable to connect to Redis
depends_on:
- redis # Ensures redis service is started before web
# Redis cache service
redis:
image: redis:alpine # Using the official Redis image
ports:
- "6379:6379" # Exposing Redis port (usually not needed in production)
# No volumes defined for simplicity
```
Now, let's create the equivalent setup using Kubernetes resources:
```yaml
---
# Web application deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
env:
- name: REDIS_HOST
value: redis # Points to the Redis service name
---
# Web application service (for external access)
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: LoadBalancer # Exposes the service externally
---
# Redis deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379
---
# Redis service (for internal access)
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
app: redis
ports:
- port: 6379
```
Now, let me explain the key differences and similarities between these two approaches:
1. Structure:
- Docker Compose: All services are defined in a single YAML file.
- Kubernetes: Resources are typically split into separate YAML files (combined here for simplicity).
2. Service Definition:
- Docker Compose: Services are defined under the `services` key.
- Kubernetes: Services are split into Deployments (for container specs) and Services (for networking).
3. Networking:
- Docker Compose: Uses the `ports` key to map container ports to host ports.
- Kubernetes: Uses Service resources to expose deployments, with `LoadBalancer` type for external access.
4. Environment Variables:
- Docker Compose: Directly specified under the `environment` key.
- Kubernetes: Defined in the container spec under the `env` key.
5. Dependencies:
- Docker Compose: Uses `depends_on` to specify service dependencies.
- Kubernetes: Doesn't have a direct equivalent; often handled through readiness probes or init containers (not shown in this simple example).
6. Scaling:
- Docker Compose: Typically runs on a single host, limiting scaling options.
- Kubernetes: Can easily scale by changing the `replicas` field in Deployments.
Both configurations achieve the same basic setup: a web service connected to a Redis cache. The Kubernetes version offers more flexibility for scaling and managing the application across multiple nodes, while the Docker Compose version is simpler for local development or single-host deployments.
Would you like me to elaborate on any specific aspect of these configurations?