Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
cafe0f5
test(k8s): add Tier-1 KIND lineage smoke harness
TrevorBasinger Jul 10, 2026
7bde87d
feat(k8s): add Kubernetes Job execution backend
TrevorBasinger Jul 10, 2026
89cc0d7
feat(k8s): add distributed workload adapters and roar k8s attach
TrevorBasinger Jul 10, 2026
c15c67c
feat(k8s): add bundle-mode fallback and in-pod object-store I/O capture
TrevorBasinger Jul 10, 2026
9f1aa74
feat(k8s): capture ranged S3 reads as byte_ranges through fragments
TrevorBasinger Jul 13, 2026
3e4c711
feat(k8s): add mount-map rewriting and retry-chaos coverage
TrevorBasinger Jul 13, 2026
9a4d034
feat(k8s): validate operators live and delegate RayJob to the Ray bac…
TrevorBasinger Jul 14, 2026
44a11a7
fix(ray): capture pathlib I/O in workers and pin KubeRay e2e to ray 2.54
TrevorBasinger Jul 14, 2026
2170433
feat(k8s): add roar-runtime image and image-staged runtime mode
TrevorBasinger Jul 14, 2026
80ddc0a
feat(k8s): add mutating webhook injector for zero-touch lineage
TrevorBasinger Jul 14, 2026
a32f2a8
fix(ray): correct the 2.46 capture diagnosis and warn on unpatchable …
TrevorBasinger Jul 14, 2026
e7342fc
feat(k8s): opt-in roar-proxy S3 sidecar for hook-invisible clients
TrevorBasinger Jul 14, 2026
a43bb3e
feat(k8s): package the lineage webhook as a Helm chart
TrevorBasinger Jul 14, 2026
652fcd0
feat(fragments): renew expired fragment sessions on 403
TrevorBasinger Jul 14, 2026
951e1d4
feat(fragments): report undelivered batches instead of claiming streamed
TrevorBasinger Jul 14, 2026
487180b
fix(ray): stop duplicating roar env keys between Job and driver runti…
TrevorBasinger Jul 15, 2026
0e1cdfb
fix(k8s): merge 413-split fragment parts at reconstitution
TrevorBasinger Jul 15, 2026
25d7f96
fix(k8s,ray): resolve plan-time .roar at the project root; match kube…
TrevorBasinger Jul 15, 2026
c843de4
fix(k8s): parent RayJob ray tasks to the recorded submit job
TrevorBasinger Jul 15, 2026
e631e50
feat(k8s): webhook creates no resources before the rewrite; aged-Secr…
TrevorBasinger Jul 15, 2026
80c29c2
feat(k8s): pod-wrapper import probe; rayjob attach aliases
TrevorBasinger Jul 15, 2026
1378e2f
fix(k8s): preserve user RayJob runtime env during instrumentation
TrevorBasinger Jul 15, 2026
f01145b
fix(k8s): fall back to uninstrumented run when roar fails preflight
TrevorBasinger Jul 15, 2026
01dd9ff
fix(k8s): per-container bundle identity and multi-manifest submit guard
TrevorBasinger Jul 15, 2026
72f6df9
fix(fragments): owner-only session keys; drop query-string renewal
TrevorBasinger Jul 15, 2026
41cae18
fix(charts): ship the Secret-cleanup CronJob disabled by default
TrevorBasinger Jul 15, 2026
bd5bb07
fix(k8s): parse the kubectl subcommand structurally
TrevorBasinger Jul 16, 2026
274871c
fix(k8s): make roar k8s prepare mirror the managed rewrite config
TrevorBasinger Jul 16, 2026
f4ced18
fix(k8s): require exactly one wheel when building the runtime image
TrevorBasinger Jul 16, 2026
0e7ad68
docs(k8s): state the local-first boundary and structural matcher
TrevorBasinger Jul 16, 2026
86ad381
fix(k8s): isolate in-pod roar state per pod/container/attempt
TrevorBasinger Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
.roar
.ralph
dist
# roar-runtime image build needs the packaged wheel
!dist/roar_cli-*.whl
__pycache__
**/__pycache__
*.pyc
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -230,3 +230,6 @@ tests/benchmarks/results/
# Design docs — internal only, not for version control
docs/design/
scratch/

# k8s e2e harness downloaded tooling
tests/backends/k8s/.tools/
14 changes: 14 additions & 0 deletions deploy/charts/roar-lineage-webhook/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: v2
name: roar-lineage-webhook
description: >-
Zero-touch ML training lineage for Kubernetes: a mutating admission
webhook that instruments Jobs, JobSets, PyTorchJobs, TrainJobs, and
RayJobs in opted-in namespaces with roar lineage capture.
type: application
version: 0.1.0
appVersion: "0.3.7"
keywords:
- lineage
- provenance
- ml
- admission-webhook
30 changes: 30 additions & 0 deletions deploy/charts/roar-lineage-webhook/templates/_helpers.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{{- define "roar-webhook.fullname" -}}
{{- printf "%s-roar-lineage-webhook" .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{- define "roar-webhook.labels" -}}
app.kubernetes.io/name: roar-lineage-webhook
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}

{{- define "roar-webhook.selectorLabels" -}}
app.kubernetes.io/name: roar-lineage-webhook
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end -}}

{{- define "roar-webhook.runtimeImage" -}}
{{- if .Values.injection.runtimeImage -}}
{{ .Values.injection.runtimeImage }}
{{- else -}}
{{ .Values.image.repository }}:{{ .Values.image.tag }}
{{- end -}}
{{- end -}}

{{- define "roar-webhook.tlsSecretName" -}}
{{- if .Values.tls.secretName -}}
{{ .Values.tls.secretName }}
{{- else -}}
{{ include "roar-webhook.fullname" . }}-tls
{{- end -}}
{{- end -}}
26 changes: 26 additions & 0 deletions deploy/charts/roar-lineage-webhook/templates/certificate.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{{- if .Values.certManager.enabled }}
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: {{ include "roar-webhook.fullname" . }}-selfsigned
namespace: {{ .Release.Namespace }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: {{ include "roar-webhook.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
spec:
secretName: {{ include "roar-webhook.tlsSecretName" . }}
dnsNames:
- {{ include "roar-webhook.fullname" . }}.{{ .Release.Namespace }}.svc
- {{ include "roar-webhook.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local
issuerRef:
name: {{ include "roar-webhook.fullname" . }}-selfsigned
{{- end }}
95 changes: 95 additions & 0 deletions deploy/charts/roar-lineage-webhook/templates/deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "roar-webhook.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
{{- include "roar-webhook.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "roar-webhook.selectorLabels" . | nindent 8 }}
spec:
serviceAccountName: {{ include "roar-webhook.fullname" . }}
containers:
- name: webhook
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
command:
- python
- -m
- roar.backends.k8s.webhook
- --port=8443
- --cert=/tls/tls.crt
- --key=/tls/tls.key
env:
- name: ROAR_WEBHOOK_GLAAS_URL
value: {{ required "glaas.url is required" .Values.glaas.url | quote }}
- name: ROAR_WEBHOOK_CLUSTER_GLAAS_URL
value: {{ required "glaas.clusterUrl is required" .Values.glaas.clusterUrl | quote }}
- name: ROAR_WEBHOOK_TRACER
value: {{ .Values.injection.tracer | quote }}
- name: ROAR_WEBHOOK_RUNTIME_SOURCE
value: {{ .Values.injection.runtimeSource | quote }}
- name: ROAR_WEBHOOK_RUNTIME_IMAGE
value: {{ include "roar-webhook.runtimeImage" . | quote }}
- name: ROAR_WEBHOOK_RUNTIME_REQUIREMENT
value: {{ .Values.injection.runtimeRequirement | quote }}
- name: ROAR_WEBHOOK_SESSION_TTL
value: {{ .Values.injection.sessionTtlSeconds | quote }}
{{- if .Values.injection.proxySidecar }}
- name: ROAR_WEBHOOK_PROXY_SIDECAR
value: "true"
- name: ROAR_WEBHOOK_PROXY_UPSTREAM
value: {{ .Values.injection.proxyUpstream | quote }}
{{- end }}
- name: ROAR_NO_TELEMETRY
value: "1"
ports:
- containerPort: 8443
volumeMounts:
- name: tls
mountPath: /tls
readOnly: true
readinessProbe:
httpGet:
path: /healthz
port: 8443
scheme: HTTPS
initialDelaySeconds: 2
periodSeconds: 3
{{- with .Values.resources }}
resources:
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
volumes:
- name: tls
secret:
secretName: {{ include "roar-webhook.tlsSecretName" . }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ include "roar-webhook.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
spec:
selector:
{{- include "roar-webhook.selectorLabels" . | nindent 4 }}
ports:
- port: 443
targetPort: 8443
34 changes: 34 additions & 0 deletions deploy/charts/roar-lineage-webhook/templates/rbac.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "roar-webhook.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "roar-webhook.fullname" . }}-secrets
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
rules:
# Fragment-session credential Secrets created in opted-in namespaces.
- apiGroups: [""]
resources: ["secrets"]
verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "roar-webhook.fullname" . }}-secrets
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "roar-webhook.fullname" . }}-secrets
subjects:
- kind: ServiceAccount
name: {{ include "roar-webhook.fullname" . }}
namespace: {{ .Release.Namespace }}
70 changes: 70 additions & 0 deletions deploy/charts/roar-lineage-webhook/templates/secret-cleanup.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{{- if .Values.secretCleanup.enabled }}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "roar-webhook.fullname" . }}-secret-cleanup
namespace: {{ .Release.Namespace }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ include "roar-webhook.fullname" . }}-secret-cleanup
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["list", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ include "roar-webhook.fullname" . }}-secret-cleanup
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ include "roar-webhook.fullname" . }}-secret-cleanup
subjects:
- kind: ServiceAccount
name: {{ include "roar-webhook.fullname" . }}-secret-cleanup
namespace: {{ .Release.Namespace }}
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: {{ include "roar-webhook.fullname" . }}-secret-cleanup
namespace: {{ .Release.Namespace }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
spec:
schedule: {{ .Values.secretCleanup.schedule | quote }}
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 3
jobTemplate:
spec:
backoffLimit: 1
ttlSecondsAfterFinished: 86400
template:
metadata:
labels:
{{- include "roar-webhook.selectorLabels" . | nindent 12 }}
spec:
serviceAccountName: {{ include "roar-webhook.fullname" . }}-secret-cleanup
restartPolicy: Never
containers:
- name: cleanup
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: ROAR_SECRET_MAX_AGE_SECONDS
value: {{ .Values.secretCleanup.maxAgeSeconds | quote }}
command:
- python
- -m
- roar.backends.k8s.secret_cleanup
{{- end }}
49 changes: 49 additions & 0 deletions deploy/charts/roar-lineage-webhook/templates/webhook.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: {{ include "roar-webhook.fullname" . }}
labels:
{{- include "roar-webhook.labels" . | nindent 4 }}
{{- if .Values.certManager.enabled }}
annotations:
cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include "roar-webhook.fullname" . }}
{{- end }}
webhooks:
- name: lineage.roar.glaas.ai
admissionReviewVersions: ["v1"]
sideEffects: NoneOnDryRun
failurePolicy: {{ .Values.webhook.failurePolicy }}
reinvocationPolicy: {{ .Values.webhook.reinvocationPolicy }}
timeoutSeconds: {{ .Values.webhook.timeoutSeconds }}
namespaceSelector:
matchLabels:
{{ .Values.namespaceSelector.key }}: {{ .Values.namespaceSelector.value }}
clientConfig:
service:
name: {{ include "roar-webhook.fullname" . }}
namespace: {{ .Release.Namespace }}
path: /mutate
{{- if not .Values.certManager.enabled }}
caBundle: {{ required "tls.caBundle is required unless certManager.enabled" .Values.tls.caBundle }}
{{- end }}
rules:
- apiGroups: ["batch"]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["jobs"]
- apiGroups: ["jobset.x-k8s.io"]
apiVersions: ["*"]
operations: ["CREATE"]
resources: ["jobsets"]
- apiGroups: ["kubeflow.org"]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pytorchjobs"]
- apiGroups: ["trainer.kubeflow.org"]
apiVersions: ["*"]
operations: ["CREATE"]
resources: ["trainjobs"]
- apiGroups: ["ray.io"]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["rayjobs"]
Loading
Loading