diff --git a/clusters/pfv-k8s/infrastructure/kustomization.yaml b/clusters/pfv-k8s/infrastructure/kustomization.yaml index 6350500..9a51c81 100644 --- a/clusters/pfv-k8s/infrastructure/kustomization.yaml +++ b/clusters/pfv-k8s/infrastructure/kustomization.yaml @@ -2,4 +2,5 @@ # endpoint #800, storage, monitoring relays). Populated per ADR-0001/#702. apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization -resources: [] +resources: + - mcpjungle diff --git a/clusters/pfv-k8s/infrastructure/mcpjungle/deployment.yaml b/clusters/pfv-k8s/infrastructure/mcpjungle/deployment.yaml new file mode 100644 index 0000000..ed73b26 --- /dev/null +++ b/clusters/pfv-k8s/infrastructure/mcpjungle/deployment.yaml @@ -0,0 +1,66 @@ +# MCPJungle — self-hosted MCP gateway/registry (fleet AI-operator control point) +# Enterprise mode (default): admin/users, API tokens, tool groups, access control. +# SQLite on local-path PVC; single replica. Kept OFF the workstation node +# (dev-only rule) via required node affinity. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: mcpjungle + namespace: mcpjungle + labels: + app: mcpjungle +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: mcpjungle + template: + metadata: + labels: + app: mcpjungle + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: NotIn + values: [ultix-streaming] + containers: + - name: mcpjungle + image: ghcr.io/mcpjungle/mcpjungle@sha256:59940d2e3a586ab9a063cf24fa37460bc993686fa056729fd1ada25436123dd9 + args: ["start", "--enterprise"] + ports: + - containerPort: 8080 + name: http + env: + - name: SQLITE_DB_PATH + value: /data/mcpjungle.db + volumeMounts: + - name: data + mountPath: /data + readinessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 10 + livenessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 20 + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + memory: 512Mi + volumes: + - name: data + persistentVolumeClaim: + claimName: mcpjungle-data diff --git a/clusters/pfv-k8s/infrastructure/mcpjungle/kustomization.yaml b/clusters/pfv-k8s/infrastructure/mcpjungle/kustomization.yaml new file mode 100644 index 0000000..5516085 --- /dev/null +++ b/clusters/pfv-k8s/infrastructure/mcpjungle/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - namespace.yaml + - pvc.yaml + - deployment.yaml + - service.yaml diff --git a/clusters/pfv-k8s/infrastructure/mcpjungle/namespace.yaml b/clusters/pfv-k8s/infrastructure/mcpjungle/namespace.yaml new file mode 100644 index 0000000..fe479c5 --- /dev/null +++ b/clusters/pfv-k8s/infrastructure/mcpjungle/namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: mcpjungle + labels: + app.kubernetes.io/part-of: mcpjungle diff --git a/clusters/pfv-k8s/infrastructure/mcpjungle/pvc.yaml b/clusters/pfv-k8s/infrastructure/mcpjungle/pvc.yaml new file mode 100644 index 0000000..d91a21d --- /dev/null +++ b/clusters/pfv-k8s/infrastructure/mcpjungle/pvc.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mcpjungle-data + namespace: mcpjungle +spec: + accessModes: [ReadWriteOnce] + resources: + requests: + storage: 5Gi diff --git a/clusters/pfv-k8s/infrastructure/mcpjungle/service.yaml b/clusters/pfv-k8s/infrastructure/mcpjungle/service.yaml new file mode 100644 index 0000000..a2ad1ad --- /dev/null +++ b/clusters/pfv-k8s/infrastructure/mcpjungle/service.yaml @@ -0,0 +1,15 @@ +# Tailnet-reachable via any non-workstation node IP on NodePort 30800. +apiVersion: v1 +kind: Service +metadata: + name: mcpjungle + namespace: mcpjungle +spec: + type: NodePort + selector: + app: mcpjungle + ports: + - port: 8080 + targetPort: 8080 + nodePort: 30800 + name: http