rapp-playwright/manifests/workload.yaml
tegwick 1557742779 Wave-2 sizing: playwright request 65m/336Mi, CPU limit 2 (RPF-WP-0063-T01)
7d p95/peak 41.5/62.7m, 23.8% CFS throttled at the 1-core limit; the limit
doubles (rule: max(2x current, 1000m)). Deploy targets now use the live
server-side field manager rapp-playwright, which the default manager
conflicted with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 276069@bnt-lap001
Assistant-Session: 2e192b3d-b3e8-4403-94d4-d55a2c8b476c
2026-10-22 00:04:57 +02:00

177 lines
4.8 KiB
YAML

apiVersion: v1
kind: Namespace
metadata:
name: playwright
labels:
app.kubernetes.io/part-of: rapp-playwright
pod-security.kubernetes.io/enforce: restricted
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: playwright
namespace: playwright
automountServiceAccountToken: false
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: playwright-artifacts
namespace: playwright
spec:
accessModes: [ReadWriteOnce]
storageClassName: local-path
resources:
requests:
storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: playwright
namespace: playwright
labels:
app.kubernetes.io/name: playwright
app.kubernetes.io/part-of: rapp-playwright
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app.kubernetes.io/name: playwright
template:
metadata:
labels:
app.kubernetes.io/name: playwright
app.kubernetes.io/part-of: rapp-playwright
spec:
serviceAccountName: playwright
automountServiceAccountToken: false
terminationGracePeriodSeconds: 15
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: service
image: "${IMAGE_REFERENCE}"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
env:
- {name: HOST, value: "127.0.0.1"}
- {name: DATA_DIR, value: /data}
- {name: EXECUTION_LOCATION, value: railiance01/playwright}
- {name: RELEASE_ID, value: "${IMAGE_REFERENCE}"}
- {name: MAX_CONCURRENCY, value: "1"}
- {name: RETENTION_MS, value: "3600000"}
- {name: ALLOWED_ORIGINS, value: "https://onco.cc"}
- {name: CHROMIUM_SANDBOX, value: "false"}
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: [ALL]
resources:
requests:
cpu: 65m
memory: 336Mi
ephemeral-storage: 256Mi
limits:
cpu: "2"
memory: 1Gi
ephemeral-storage: 1Gi
volumeMounts:
- {name: data, mountPath: /data}
- {name: tmp, mountPath: /tmp}
- {name: shm, mountPath: /dev/shm}
startupProbe:
exec:
command: [node, -e, "fetch('http://127.0.0.1:8080/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
periodSeconds: 5
failureThreshold: 20
timeoutSeconds: 3
readinessProbe:
exec:
command: [node, -e, "fetch('http://127.0.0.1:8080/v1/preflight',{headers:{'X-Rapp-Protocol':'1'}}).then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
periodSeconds: 15
timeoutSeconds: 3
livenessProbe:
exec:
command: [node, -e, "fetch('http://127.0.0.1:8080/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
periodSeconds: 30
timeoutSeconds: 3
volumes:
- name: data
persistentVolumeClaim:
claimName: playwright-artifacts
- name: tmp
emptyDir:
sizeLimit: 512Mi
- name: shm
emptyDir:
medium: Memory
sizeLimit: 256Mi
---
apiVersion: v1
kind: Service
metadata:
name: playwright
namespace: playwright
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: playwright
ports:
- {name: http, port: 8080, targetPort: http}
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: playwright
namespace: playwright
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: playwright
policyTypes: [Ingress, Egress]
ingress: []
egress:
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- {protocol: UDP, port: 53}
- {protocol: TCP, port: 53}
- to:
- ipBlock:
cidr: 0.0.0.0/0
except: [0.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/4]
ports:
- {protocol: TCP, port: 443}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: playwright-consumer
namespace: playwright
rules:
- apiGroups: [""]
resources: [pods]
verbs: [get, list]
- apiGroups: [""]
resources: [pods/portforward]
verbs: [create]
- apiGroups: [apps]
resources: [deployments]
resourceNames: [playwright]
verbs: [get]