To define how applications should run, scale, and update within a Kubernetes cluster using declarative YAML manifests.
- Deploying containerized applications to K8s.
- Defining resource limits, replicas, and environment variables.
Create a deployment.yaml to manage your application's lifecycle.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-registry/my-app:1.2.3
ports:
- containerPort: 3000
envFrom:
- configMapRef:
name: my-app-config
- secretRef:
name: my-app-secrets
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 10Create a service.yaml to expose the application within the cluster.
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP # Internal exposure onlyDecouple configuration from the deployment.
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app-config
data:
NODE_ENV: "production"
LOG_LEVEL: "info"
---
# secret.yaml (values must be base64 encoded)
apiVersion: v1
kind: Secret
metadata:
name: my-app-secrets
type: Opaque
data:
DATABASE_URL: bXktZGItaG9zdC1jb25uZWN0aW9uLXN0cmluZw==Use kubectl to apply the manifests and check status.
# Apply all files in the directory
kubectl apply -f ./k8s/
# Check rollout status
kubectl rollout status deployment/my-app-deployment
# Get logs from a specific pod
kubectl logs -l app=my-app --tail=100
# Scale the deployment
kubectl scale deployment/my-app-deployment --replicas=5- Immutable Tags: Do not use the
latesttag; use specific versions or image SHAs to ensure reproducibility. - Resource Limits: Always set CPU and Memory requests and limits to prevent a single container from crashing the node.
- Probes: Implement both
liveness(restart if hung) andreadiness(don't send traffic until ready) probes. - Secrets Management: Do not commit raw
secret.yamlfiles to Git. Use tools like Sealed Secrets, External Secrets, or HashiCorp Vault.
Valid YAML files (deployment.yaml, service.yaml) that successfully launch the application in a cluster.