Sample Kubernetes Deployment YAML File Examples
Ready-to-use deployment templates for common application scenarios
Last updated: November 2024
•
10 min read
Introduction
This collection provides production-ready Kubernetes deployment YAML examples for various application types. Each example includes essential configurations like resource limits, health checks, and environment variables.
Example 1: Simple Web Application
Basic deployment for a stateless web application:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
Example 2: Node.js Application with Environment Variables
Deployment with environment configuration and health checks:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-app
labels:
app: nodejs-app
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: nodejs-app
template:
metadata:
labels:
app: nodejs-app
spec:
containers:
- name: nodejs-app
image: node:18-alpine
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: "production"
- name: PORT
value: "3000"
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 10
periodSeconds: 5
Example 3: Python Flask Application
Deployment with ConfigMap and volume mounts:
apiVersion: apps/v1
kind: Deployment
metadata:
name: flask-app
labels:
app: flask-app
spec:
replicas: 3
selector:
matchLabels:
app: flask-app
template:
metadata:
labels:
app: flask-app
spec:
containers:
- name: flask-app
image: python:3.11-slim
command: ["python", "app.py"]
ports:
- containerPort: 5000
env:
- name: FLASK_ENV
value: "production"
- name: CONFIG_FILE
value: "/etc/config/app.conf"
envFrom:
- configMapRef:
name: flask-config
volumeMounts:
- name: config-volume
mountPath: /etc/config
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 5000
initialDelaySeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 5000
initialDelaySeconds: 10
volumes:
- name: config-volume
configMap:
name: flask-config
Example 4: PostgreSQL Database
Stateful database deployment with persistent storage:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-db
labels:
app: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:15-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: "mydb"
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: postgres-secret
key: username
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: postgres-storage
mountPath: /var/lib/postgresql/data
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
livenessProbe:
exec:
command:
- /bin/sh
- -c
- pg_isready -U postgres
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
exec:
command:
- /bin/sh
- -c
- pg_isready -U postgres
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc
Example 5: Multi-Container Pod (Sidecar Pattern)
Deployment with main application and logging sidecar:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-with-sidecar
labels:
app: main-app
spec:
replicas: 2
selector:
matchLabels:
app: main-app
template:
metadata:
labels:
app: main-app
spec:
containers:
- name: main-app
image: myapp:latest
ports:
- containerPort: 8080
volumeMounts:
- name: shared-logs
mountPath: /var/log/app
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
- name: log-processor
image: fluent/fluent-bit:latest
volumeMounts:
- name: shared-logs
mountPath: /var/log/app
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
volumes:
- name: shared-logs
emptyDir: {}
Example 6: Java Spring Boot Application
Enterprise Java application with JVM tuning:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-app
labels:
app: spring-boot-app
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
selector:
matchLabels:
app: spring-boot-app
template:
metadata:
labels:
app: spring-boot-app
spec:
containers:
- name: spring-boot-app
image: openjdk:17-jre-slim
ports:
- containerPort: 8080
env:
- name: JAVA_OPTS
value: "-Xms512m -Xmx1024m -XX:+UseG1GC"
- name: SPRING_PROFILES_ACTIVE
value: "production"
resources:
requests:
memory: "768Mi"
cpu: "500m"
limits:
memory: "1536Mi"
cpu: "1000m"
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 30
periodSeconds: 5
How to Use These Examples
- Copy the example that matches your use case
- Replace placeholder values (image names, ports, environment variables)
- Adjust resource limits based on your application requirements
- Create necessary ConfigMaps and Secrets referenced in the deployment
- Validate the YAML syntax using
kubectl apply --dry-run=client - Apply to your cluster:
kubectl apply -f deployment.yaml
Best Practices Applied
-
•
Resource limits defined to prevent resource exhaustion
-
•
Health probes configured for reliable pod lifecycle management
-
•
Secrets used for sensitive data instead of hardcoded values
-
•
Rolling update strategy configured for zero-downtime deployments
-
•
Appropriate replica counts for high availability