apiVersion: v1 kind: Service metadata: name: scraper-worker namespace: dispensary-scraper labels: app: scraper-worker spec: clusterIP: None # Headless service required for StatefulSet selector: app: scraper-worker ports: - port: 3010 name: http --- apiVersion: apps/v1 kind: StatefulSet metadata: name: scraper-worker namespace: dispensary-scraper spec: serviceName: scraper-worker replicas: 8 podManagementPolicy: Parallel # Start all pods at once updateStrategy: type: OnDelete # Pods only update when manually deleted - no automatic restarts selector: matchLabels: app: scraper-worker template: metadata: labels: app: scraper-worker spec: terminationGracePeriodSeconds: 60 imagePullSecrets: - name: regcred containers: - name: worker image: code.cannabrands.app/creationshop/dispensary-scraper:latest imagePullPolicy: Always command: ["node"] args: ["dist/tasks/task-worker.js"] env: - name: WORKER_MODE value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MAX_CONCURRENT_TASKS value: "50" - name: API_BASE_URL value: http://scraper - name: NODE_OPTIONS value: --max-old-space-size=1500 envFrom: - configMapRef: name: scraper-config - secretRef: name: scraper-secrets resources: requests: cpu: 100m memory: 1Gi limits: cpu: 500m memory: 2Gi livenessProbe: exec: command: - /bin/sh - -c - pgrep -f 'task-worker' > /dev/null initialDelaySeconds: 10 periodSeconds: 30 failureThreshold: 3