Files
scrum-manager/k8s/base/backend/deployment.yaml
tusuii 245301450c
Some checks failed
scrum-manager/pipeline/head There was a failure building this commit
fix: use maxSurge=0 rolling update to avoid CPU pressure on small cluster
During rolling updates with the default maxSurge=1, an extra surge pod was
created temporarily (3 pods instead of 2), causing all 3 nodes to report
"Insufficient CPU" and delaying scheduling past the Jenkins rollout timeout.

With maxSurge=0 / maxUnavailable=1, one old pod terminates first before a
new one starts — pod count stays at 2 throughout, no extra CPU needed.

Also increase Jenkins rollout timeout from 300s to 600s as a safety net
for CPU-constrained nodes that may still need extra scheduling time.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 00:10:04 +05:30

93 lines
2.7 KiB
YAML

apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
labels:
app.kubernetes.io/name: backend
app.kubernetes.io/component: api
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0 # Don't create extra pods during update — avoids CPU pressure
maxUnavailable: 1 # Terminate one old pod first, then start new one
selector:
matchLabels:
app.kubernetes.io/name: backend
app.kubernetes.io/component: api
template:
metadata:
labels:
app.kubernetes.io/name: backend
app.kubernetes.io/component: api
spec:
terminationGracePeriodSeconds: 15
initContainers:
- name: wait-for-mysql
image: busybox:1.36
command:
- sh
- -c
- |
echo "Waiting for MySQL TCP to be available..."
until nc -z mysql 3306; do
echo "MySQL not reachable yet, retrying in 3s..."
sleep 3
done
echo "MySQL TCP is up. Waiting 15s for full initialization..."
sleep 15
echo "Proceeding to start backend."
containers:
- name: backend
image: scrum-backend:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3001
name: http
env:
- name: DB_HOST
value: mysql
- name: DB_PORT
value: "3306"
- name: DB_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_USER
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: MYSQL_PASSWORD
- name: DB_NAME
valueFrom:
secretKeyRef:
name: mysql-secret
key: DB_NAME
- name: PORT
value: "3001"
resources:
requests:
cpu: 100m
memory: 128Mi # Request drives scheduling — keep low so pods fit on nodes
limits:
cpu: 500m
memory: 512Mi # Limit prevents OOMKill during startup spikes
livenessProbe:
httpGet:
path: /api/health
port: http
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
readinessProbe:
httpGet:
path: /api/health
port: http
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 5