apiVersion: apps/v1 kind: Deployment metadata: name: luncher namespace: luncher spec: replicas: 3 selector: matchLabels: app: luncher strategy: type: RollingUpdate rollingUpdate: maxSurge: 0 # nelze přidat extra pod — každý worker je obsazen maxUnavailable: 1 # nejdřív smaž starý pod, pak naplánuj nový template: metadata: labels: app: luncher annotations: reloader.stakater.com/auto: "true" spec: terminationGracePeriodSeconds: 30 # Rozmístit každý pod na jiný worker uzel affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: luncher topologyKey: kubernetes.io/hostname containers: - name: luncher image: luncher:ha-test imagePullPolicy: IfNotPresent ports: - containerPort: 3001 envFrom: - configMapRef: name: luncher-config - secretRef: name: luncher-secrets env: # POD_ID pro leader election scheduleru připomínek - name: POD_ID valueFrom: fieldRef: fieldPath: metadata.name resources: requests: cpu: 100m memory: 256Mi limits: cpu: 500m memory: 512Mi # Liveness — levná kontrola bez externích závislostí livenessProbe: httpGet: path: /api/health port: 3001 initialDelaySeconds: 10 periodSeconds: 10 failureThreshold: 3 # Readiness — kontroluje Redis; při shutdown vrací 503 readinessProbe: httpGet: path: /api/health/ready port: 3001 initialDelaySeconds: 10 periodSeconds: 5 failureThreshold: 2 # preStop sleep: dá čas kube-proxy a Traefiku odebrat endpoint # dřív než kontejner začne odmítat nová spojení lifecycle: preStop: exec: command: ["sleep", "5"]