Add isolated Luau rule engine service
Build and publish rule engine / release (push) Failing after 1m34s

This commit is contained in:
Ein Anderssono
2026-10-20 11:24:52 +02:00
commit a85a49dfd5
16 changed files with 936 additions and 0 deletions
@@ -0,0 +1,6 @@
apiVersion: v2
name: ai-spel-rule-engine
description: Isolated, sandboxed Luau proposal evaluator
type: application
version: 0.1.0
appVersion: "0.1.0"
@@ -0,0 +1,100 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
minReadySeconds: {{ .Values.deployment.minReadySeconds }}
progressDeadlineSeconds: {{ .Values.deployment.progressDeadlineSeconds }}
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: {{ .Values.deployment.maxUnavailable }}
maxSurge: {{ .Values.deployment.maxSurge }}
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
automountServiceAccountToken: false
{{- with .Values.image.pullSecretName }}
imagePullSecrets:
- name: {{ . | quote }}
{{- end }}
containers:
- name: rule-engine
image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: health
containerPort: 8080
env:
- name: HEALTH_ADDR
value: "0.0.0.0:8080"
- name: NATS_URL
value: {{ .Values.nats.url | quote }}
- name: NATS_USERNAME
valueFrom:
secretKeyRef:
name: {{ .Values.nats.secretName }}
key: {{ .Values.nats.usernameKey }}
- name: NATS_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Values.nats.secretName }}
key: {{ .Values.nats.passwordKey }}
- name: NATS_QUEUE_GROUP
value: {{ .Values.nats.queueGroup | quote }}
- name: RULE_MAX_CONCURRENCY
value: {{ .Values.runtime.maxConcurrency | quote }}
readinessProbe:
httpGet:
path: /health/ready
port: health
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3
livenessProbe:
httpGet:
path: /health/live
port: health
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 3
resources: {{- toYaml .Values.resources | nindent 12 }}
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
capabilities:
drop: ["ALL"]
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
ports:
- name: health
port: {{ .Values.service.port }}
targetPort: health
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: {{ .Release.Name }}
spec:
minAvailable: 1
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
@@ -0,0 +1,30 @@
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: {{ .Release.Name }}
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
policyTypes: [Egress]
egress:
- to:
- podSelector:
matchLabels:
app.kubernetes.io/instance: ai-spel-nats
ports:
- protocol: TCP
port: 4222
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
- protocol: TCP
port: 53
@@ -0,0 +1,10 @@
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: {{ .Release.Name }}
spec:
minAvailable: 1
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
@@ -0,0 +1,27 @@
image:
repository: harbor.k3s.k0.nu/ai-spel/rule-engine
pullPolicy: Always
pullSecretName: harbor-pull
replicaCount: 2
deployment:
maxUnavailable: 0
maxSurge: 1
minReadySeconds: 5
progressDeadlineSeconds: 600
service:
port: 8080
nats:
url: nats://ai-spel-nats:4222
secretName: ai-spel-rule-engine-nats
usernameKey: username
passwordKey: password
queueGroup: ai-spel-rule-engine
runtime:
maxConcurrency: 8
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 1
memory: 384Mi