refactor(ai): move ai namespace to base + main overlay - #1428
Merged
Conversation
Pure rename via migrate-ns.py, part of the flux/ -> clusters/main structural split (S13). flux-local build renders byte-identical leaf docs and normalized Kustomizations before/after; flux-local test --all-namespaces passes 118/118.
Aviator-Coding
force-pushed
the
fm/homeops-split-ns-lane3-s13
branch
from
August 24, 2026 02:19
0263598 to
7bb8ccf
Compare
Contributor
--- kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds HelmRelease: ai/agentgateway-crds
+++ kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds HelmRelease: ai/agentgateway-crds
@@ -1,56 +0,0 @@
----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway-crds
- kustomize.toolkit.fluxcd.io/name: agentgateway-crds
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: agentgateway-crds
- namespace: ai
-spec:
- chartRef:
- kind: OCIRepository
- name: agentgateway-crds
- driftDetection:
- mode: enabled
- install:
- crds: CreateReplace
- createNamespace: true
- replace: true
- strategy:
- name: RetryOnFailure
- retryInterval: 5m
- timeout: 10m
- interval: 1h
- maxHistory: 3
- postRenderers:
- - kustomize:
- patches:
- - patch: |-
- apiVersion: apiextensions.k8s.io/v1
- kind: CustomResourceDefinition
- metadata:
- name: _
- annotations:
- helm.sh/resource-policy: keep
- target:
- kind: CustomResourceDefinition
- rollback:
- cleanupOnFail: true
- force: true
- recreate: true
- test:
- enable: true
- uninstall:
- keepHistory: false
- upgrade:
- cleanupOnFail: true
- crds: CreateReplace
- remediation:
- remediateLastFailure: true
- retries: 2
- strategy: rollback
- strategy:
- name: RemediateOnFailure
-
--- kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds OCIRepository: ai/agentgateway-crds
+++ kubernetes/apps/ai/agentgateway/crds Kustomization: ai/agentgateway-crds OCIRepository: ai/agentgateway-crds
@@ -1,19 +0,0 @@
----
-apiVersion: source.toolkit.fluxcd.io/v1
-kind: OCIRepository
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway-crds
- kustomize.toolkit.fluxcd.io/name: agentgateway-crds
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: agentgateway-crds
- namespace: ai
-spec:
- interval: 5m
- layerSelector:
- mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
- operation: copy
- ref:
- tag: v1.4.1
- url: oci://cr.agentgateway.dev/charts/agentgateway-crds
-
--- kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds OCIRepository: ai/toolhive-operator-crds
+++ kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds OCIRepository: ai/toolhive-operator-crds
@@ -1,19 +0,0 @@
----
-apiVersion: source.toolkit.fluxcd.io/v1
-kind: OCIRepository
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-crds
- kustomize.toolkit.fluxcd.io/name: toolhive-crds
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: toolhive-operator-crds
- namespace: ai
-spec:
- interval: 15m
- layerSelector:
- mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
- operation: copy
- ref:
- tag: 0.42.0
- url: oci://ghcr.io/stacklok/toolhive/toolhive-operator-crds
-
--- kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds HelmRelease: ai/toolhive-operator-crds
+++ kubernetes/apps/ai/toolhive/crds Kustomization: ai/toolhive-crds HelmRelease: ai/toolhive-operator-crds
@@ -1,31 +0,0 @@
----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-crds
- kustomize.toolkit.fluxcd.io/name: toolhive-crds
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: toolhive-operator-crds
- namespace: ai
-spec:
- chartRef:
- kind: OCIRepository
- name: toolhive-operator-crds
- install:
- crds: CreateReplace
- strategy:
- name: RetryOnFailure
- interval: 30m
- rollback:
- cleanupOnFail: true
- recreate: true
- upgrade:
- cleanupOnFail: true
- crds: CreateReplace
- remediation:
- remediateLastFailure: true
- retries: 2
- strategy:
- name: RemediateOnFailure
-
--- kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/agentgateway-dashboard
+++ kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/agentgateway-dashboard
@@ -1,1213 +0,0 @@
----
-apiVersion: v1
-data:
- agentgateway.json: |
- {
- "annotations": {},
- "editable": true,
- "fiscalYearStartMonth": 0,
- "graphTooltip": 1,
- "links": [
- {
- "title": "LLM Cost",
- "type": "link",
- "url": "/d/ai-llm-cost"
- }
- ],
- "panels": [
- {
- "collapsed": false,
- "gridPos": {
- "h": 1,
- "w": 24,
- "x": 0,
- "y": 0
- },
- "id": 0,
- "panels": [],
- "title": "Overview",
- "type": "row"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "$datasource"
- },
- "fieldConfig": {
- "defaults": {
- "custom": {
- "fillOpacity": 10,
- "gradientMode": "opacity",
- "showPoints": "never"
- },
- "unit": "bytes"
- },
- "overrides": []
- },
- "gridPos": {
- "h": 10,
- "w": 12,
- "x": 0,
- "y": 1
- },
- "interval": "5s",
- "options": {
- "legend": {
- "calcs": [
- "last",
- "max",
- "mean"
- ],
- "displayMode": "table",
- "placement": "bottom",
- "showLegend": true,
- "sortBy": "Last",
- "sortDesc": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "asc"
- }
- },
- "repeatDirection": "h",
- "targets": [
- {
- "expr": "sum by (pod,namespace) (container_memory_working_set_bytes{image=\"\",namespace=~\"$namespace\"}) * on(pod, namespace) group_left(gateway_networking_k8s_io_gateway_name) group by (pod,namespace,gateway_networking_k8s_io_gateway_name) (agentgateway_build_info{namespace=~\"$namespace\",gateway_networking_k8s_io_gateway_name=~\"$gateway_name\"})",
- "legendFormat": "{{namespace}}/{{pod}}",
- "refId": ""
- }
- ],
- "title": "Memory",
- "transformations": [],
- "transparent": false,
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "$datasource"
- },
- "fieldConfig": {
- "defaults": {
- "custom": {
- "fillOpacity": 10,
- "gradientMode": "opacity",
- "showPoints": "never"
- }
- },
- "overrides": []
- },
- "gridPos": {
- "h": 10,
- "w": 12,
- "x": 12,
- "y": 1
- },
- "interval": "5s",
- "options": {
- "legend": {
- "calcs": [
- "last",
- "max",
- "mean"
- ],
- "displayMode": "table",
- "placement": "bottom",
- "showLegend": true,
- "sortBy": "Last",
- "sortDesc": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "asc"
- }
- },
- "repeatDirection": "h",
- "targets": [
- {
- "expr": "sum by (pod,namespace) (irate(container_cpu_usage_seconds_total{image=\"\",namespace=~\"$namespace\"}[$__rate_interval]) * on(pod, namespace) group_left(gateway_networking_k8s_io_gateway_name) group by (pod,namespace,gateway_networking_k8s_io_gateway_name) (agentgateway_build_info{namespace=~\"$namespace\",gateway_networking_k8s_io_gateway_name=~\"$gateway_name\"}))",
- "legendFormat": "{{namespace}}/{{pod}}",
- "refId": ""
- }
- ],
- "title": "CPU",
- "transformations": [],
- "transparent": false,
- "type": "timeseries"
- },
- {
- "collapsed": false,
- "gridPos": {
- "h": 1,
- "w": 24,
- "x": 0,
- "y": 11
- },
- "id": 0,
- "panels": [],
- "title": "Requests",
- "type": "row"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "$datasource"
- },
- "fieldConfig": {
- "defaults": {
- "custom": {
- "fillOpacity": 10,
- "gradientMode": "opacity",
- "showPoints": "never"
- },
- "unit": "reqps"
- },
- "overrides": []
- },
- "gridPos": {
- "h": 10,
- "w": 12,
- "x": 0,
- "y": 12
- },
- "interval": "5s",
- "options": {
- "legend": {
- "calcs": [
- "last",
- "max",
- "mean"
- ],
- "displayMode": "table",
- "placement": "bottom",
- "showLegend": true,
- "sortBy": "Last",
- "sortDesc": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "asc"
- }
- },
- "repeatDirection": "h",
- "targets": [
- {
- "expr": "sum by (pod,namespace) (rate(agentgateway_requests_total{namespace=~\"$namespace\",gateway=~\"$gateway\"}[$__rate_interval]))",
- "legendFormat": "{{namespace}}/{{pod}}",
- "refId": ""
- }
- ],
- "title": "Requests (by Pod)",
- "transformations": [],
- "transparent": false,
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "$datasource"
- },
- "fieldConfig": {
- "defaults": {
- "custom": {
- "fillOpacity": 10,
- "gradientMode": "opacity",
- "showPoints": "never"
- },
- "unit": "reqps"
- },
- "overrides": []
- },
- "gridPos": {
- "h": 10,
- "w": 12,
- "x": 12,
- "y": 12
- },
- "interval": "5s",
- "options": {
- "legend": {
- "calcs": [
- "last",
- "max",
- "mean"
- ],
- "displayMode": "table",
- "placement": "bottom",
- "showLegend": true,
- "sortBy": "Last",
- "sortDesc": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "asc"
- }
- },
- "repeatDirection": "h",
- "targets": [
- {
- "expr": "sum by (gateway) (rate(agentgateway_requests_total{namespace=~\"$namespace\",gateway=~\"$gateway\"}[$__rate_interval]))",
- "legendFormat": "{{gateway}}",
- "refId": ""
- }
- ],
- "title": "Requests (by Gateway)",
- "transformations": [],
- "transparent": false,
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "$datasource"
- },
- "fieldConfig": {
- "defaults": {
- "custom": {
- "fillOpacity": 10,
- "gradientMode": "opacity",
- "showPoints": "never"
- },
- "unit": "reqps"
- },
- "overrides": []
- },
- "gridPos": {
- "h": 10,
- "w": 12,
- "x": 0,
- "y": 22
- },
- "interval": "5s",
- "options": {
- "legend": {
- "calcs": [
- "last",
- "max",
- "mean"
- ],
- "displayMode": "table",
- "placement": "bottom",
- "showLegend": true,
- "sortBy": "Last",
- "sortDesc": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "asc"
- }
- },
- "repeatDirection": "h",
- "targets": [
- {
- "expr": "sum by (gateway,status) (rate(agentgateway_requests_total{namespace=~\"$namespace\",gateway=~\"$gateway\"}[$__rate_interval]))",
- "legendFormat": "{{gateway}}: {{status}}",
- "refId": ""
- }
- ],
- "title": "Requests (by Status)",
- "transformations": [],
- "transparent": false,
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "$datasource"
- },
- "fieldConfig": {
- "defaults": {
- "custom": {
- "fillOpacity": 10,
- "gradientMode": "opacity",
- "showPoints": "never"
- },
- "unit": "reqps"
- },
- "overrides": []
- },
- "gridPos": {
- "h": 10,
- "w": 12,
- "x": 12,
- "y": 22
- },
- "interval": "5s",
- "options": {
- "legend": {
- "calcs": [
- "last",
- "max",
- "mean"
- ],
- "displayMode": "table",
- "placement": "bottom",
- "showLegend": true,
- "sortBy": "Last",
- "sortDesc": true
- },
- "tooltip": {
- "mode": "single",
- "sort": "asc"
[Diff truncated by flux-local]
--- kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/llm-cost-dashboard
+++ kubernetes/apps/ai/agentgateway-dashboards/app Kustomization: ai/agentgateway-dashboards ConfigMap: ai/llm-cost-dashboard
@@ -1,251 +0,0 @@
----
-apiVersion: v1
-data:
- llm-cost.json: |
- {
- "annotations": {
- "list": []
- },
- "editable": true,
- "graphTooltip": 1,
- "id": null,
- "links": [
- {
- "title": "Agentgateway",
- "type": "link",
- "url": "/d/agentgateway"
- }
- ],
- "panels": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "fieldConfig": {
- "defaults": {
- "unit": "currencyUSD",
- "custom": {
- "drawStyle": "line",
- "fillOpacity": 15,
- "lineWidth": 2,
- "showPoints": "never"
- }
- },
- "overrides": []
- },
- "gridPos": {
- "h": 9,
- "w": 16,
- "x": 0,
- "y": 0
- },
- "id": 1,
- "options": {
- "legend": {
- "calcs": [
- "sum"
- ],
- "displayMode": "table",
- "placement": "right",
- "showLegend": true
- },
- "tooltip": {
- "mode": "multi",
- "sort": "desc"
- }
- },
- "targets": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "expr": "ai:gen_ai_cost_usd:rate5m * 3600",
- "legendFormat": "{{gen_ai_request_model}}",
- "refId": "A"
- }
- ],
- "title": "Estimated cost rate ($/hour) by model",
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "fieldConfig": {
- "defaults": {
- "unit": "currencyUSD",
- "decimals": 2
- },
- "overrides": []
- },
- "gridPos": {
- "h": 9,
- "w": 8,
- "x": 16,
- "y": 0
- },
- "id": 2,
- "options": {
- "reduceOptions": {
- "calcs": [
- "lastNotNull"
- ],
- "fields": "",
- "values": false
- },
- "textMode": "auto",
- "colorMode": "value",
- "graphMode": "area"
- },
- "targets": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "expr": "sum(sum by (gen_ai_request_model, gen_ai_token_type) (increase(agentgateway_gen_ai_client_token_usage_sum[$__range])) * on (gen_ai_request_model, gen_ai_token_type) group_left () ai:llm_token_price_per_million_usd) / 1e6",
- "legendFormat": "spend",
- "refId": "A"
- }
- ],
- "title": "Estimated spend (dashboard time range)",
- "type": "stat"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "fieldConfig": {
- "defaults": {
- "unit": "cps",
- "custom": {
- "drawStyle": "bars",
- "fillOpacity": 60,
- "stacking": {
- "mode": "normal"
- }
- }
- },
- "overrides": []
- },
- "gridPos": {
- "h": 9,
- "w": 16,
- "x": 0,
- "y": 9
- },
- "id": 3,
- "options": {
- "legend": {
- "calcs": [
- "mean"
- ],
- "displayMode": "table",
- "placement": "right",
- "showLegend": true
- },
- "tooltip": {
- "mode": "multi",
- "sort": "desc"
- }
- },
- "targets": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "expr": "ai:gen_ai_tokens:rate5m",
- "legendFormat": "{{gen_ai_request_model}} ({{gen_ai_token_type}})",
- "refId": "A"
- }
- ],
- "title": "Token rate by model (tokens/s)",
- "type": "timeseries"
- },
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "description": "Models consuming tokens that have NO row in the price table (kubernetes/apps/ai/agentgateway/app/rules/cost.yaml). Keep this panel empty.",
- "fieldConfig": {
- "defaults": {
- "unit": "cps"
- },
- "overrides": []
- },
- "gridPos": {
- "h": 9,
- "w": 8,
- "x": 16,
- "y": 9
- },
- "id": 4,
- "options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
- },
- "tooltip": {
- "mode": "multi",
- "sort": "desc"
- }
- },
- "targets": [
- {
- "datasource": {
- "type": "prometheus",
- "uid": "prometheus"
- },
- "expr": "ai:gen_ai_tokens_unpriced:rate5m",
- "legendFormat": "{{gen_ai_request_model}} ({{gen_ai_token_type}})",
- "refId": "A"
- }
- ],
- "title": "Unpriced models (should be empty)",
- "type": "timeseries"
- }
- ],
- "refresh": "1m",
- "schemaVersion": 39,
- "tags": [
- "ai",
- "llm",
- "cost"
- ],
- "templating": {
- "list": []
- },
- "time": {
- "from": "now-24h",
- "to": "now"
- },
- "timezone": "browser",
- "title": "LLM Cost",
- "uid": "ai-llm-cost",
- "version": 1
- }
-kind: ConfigMap
-metadata:
- annotations:
- config.kubernetes.io/origin: |
- configuredIn: kustomization.yaml
- configuredBy:
- apiVersion: builtin
- kind: ConfigMapGenerator
- grafana_folder: AI/ML
- labels:
- app.kubernetes.io/name: agentgateway-dashboards
- grafana_dashboard: 'true'
- kustomize.toolkit.fluxcd.io/name: agentgateway-dashboards
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: llm-cost-dashboard
- namespace: ai
-
--- kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui PersistentVolumeClaim: ai/comfyui-output
+++ kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui PersistentVolumeClaim: ai/comfyui-output
@@ -1,18 +0,0 @@
----
-apiVersion: v1
-kind: PersistentVolumeClaim
-metadata:
- labels:
- app.kubernetes.io/name: comfyui
- kustomize.toolkit.fluxcd.io/name: comfyui
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: comfyui-output
- namespace: ai
-spec:
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 25Gi
- storageClassName: ceph-filesystem-rwx
-
--- kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui HelmRelease: ai/comfyui
+++ kubernetes/apps/ai/comfyui/app Kustomization: ai/comfyui HelmRelease: ai/comfyui
@@ -1,178 +0,0 @@
----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
- labels:
- app.kubernetes.io/name: comfyui
- kustomize.toolkit.fluxcd.io/name: comfyui
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: comfyui
- namespace: ai
-spec:
- chartRef:
- kind: OCIRepository
- name: app-template
- install:
- crds: CreateReplace
- createNamespace: true
- remediation:
- retries: 3
- strategy:
- name: RetryOnFailure
- interval: 1h
- maxHistory: 2
- rollback:
- cleanupOnFail: true
- recreate: true
- suspend: true
- timeout: 20m
- uninstall:
- keepHistory: false
- upgrade:
- cleanupOnFail: true
- crds: CreateReplace
- remediation:
- remediateLastFailure: true
- retries: 2
- strategy:
- name: RemediateOnFailure
- values:
- controllers:
- comfyui:
- containers:
- app:
- args:
- - |
- cd /llm/ComfyUI && exec python3 main.py --listen 0.0.0.0 --port 8188
- command:
- - /bin/bash
- - -c
- env:
- ONEAPI_DEVICE_SELECTOR: level_zero:0
- ZES_ENABLE_SYSMAN: '1'
- image:
- repository: intel/llm-scaler-omni
- tag: 0.1.0-b7
- probes:
- liveness:
- custom: true
- enabled: true
- spec:
- failureThreshold: 4
- periodSeconds: 15
- tcpSocket:
- port: 8188
- timeoutSeconds: 5
- readiness:
- custom: true
- enabled: true
- spec:
- failureThreshold: 4
- periodSeconds: 15
- tcpSocket:
- port: 8188
- timeoutSeconds: 5
- startup:
- custom: true
- enabled: true
- spec:
- failureThreshold: 60
- periodSeconds: 10
- tcpSocket:
- port: 8188
- timeoutSeconds: 5
- resources:
- limits:
- gpu.intel.com/xe: 1
- memory: 32Gi
- requests:
- cpu: '1'
- gpu.intel.com/xe: 1
- memory: 8Gi
- securityContext:
- allowPrivilegeEscalation: false
- capabilities:
- drop:
- - ALL
- readOnlyRootFilesystem: false
- pod:
- terminationGracePeriodSeconds: 60
- replicas: 0
- strategy: Recreate
- persistence:
- custom-nodes:
- accessMode: ReadWriteOnce
- advancedMounts:
- comfyui:
- app:
- - path: /llm/ComfyUI/custom_nodes
- size: 10Gi
- storageClass: ceph-block
- type: persistentVolumeClaim
- dshm:
- advancedMounts:
- comfyui:
- app:
- - path: /dev/shm
- medium: Memory
- sizeLimit: 16Gi
- type: emptyDir
- input:
- accessMode: ReadWriteOnce
- advancedMounts:
- comfyui:
- app:
- - path: /llm/ComfyUI/input
- size: 5Gi
- storageClass: ceph-block
- type: persistentVolumeClaim
- models:
- accessMode: ReadWriteOnce
- advancedMounts:
- comfyui:
- app:
- - path: /llm/ComfyUI/models
- size: 100Gi
- storageClass: ceph-block
- type: persistentVolumeClaim
- output:
- advancedMounts:
- comfyui:
- app:
- - path: /llm/ComfyUI/output
- existingClaim: comfyui-output
- user:
- accessMode: ReadWriteOnce
- advancedMounts:
- comfyui:
- app:
- - path: /llm/ComfyUI/user
- size: 2Gi
- storageClass: ceph-block
- type: persistentVolumeClaim
- route:
- app:
- annotations:
- gatus.home-operations.com/endpoint: |-
- url: https://comfyui./
- conditions:
- # replicas: 0 is the default (parked). Envoy then returns 503;
- # 200 is healthy when scaled up for an image session.
- - "[STATUS] == any(200, 503)"
- group: ai
- gethomepage.dev/description: Intel Arc image generation (ComfyUI)
- gethomepage.dev/enabled: 'true'
- gethomepage.dev/group: LLM/Ai
- gethomepage.dev/name: ComfyUI
- hostnames:
- - '{{ .Release.Name }}.'
- parentRefs:
- - name: envoy-internal
- namespace: network
- sectionName: https
- service:
- app:
- ports:
- http:
- port: 8188
-
--- kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive OCIRepository: ai/toolhive-operator
+++ kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive OCIRepository: ai/toolhive-operator
@@ -1,19 +0,0 @@
----
-apiVersion: source.toolkit.fluxcd.io/v1
-kind: OCIRepository
-metadata:
- labels:
- app.kubernetes.io/name: toolhive
- kustomize.toolkit.fluxcd.io/name: toolhive
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: toolhive-operator
- namespace: ai
-spec:
- interval: 15m
- layerSelector:
- mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
- operation: copy
- ref:
- tag: 0.42.0
- url: oci://ghcr.io/stacklok/toolhive/toolhive-operator
-
--- kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive HelmRelease: ai/toolhive-operator
+++ kubernetes/apps/ai/toolhive/app Kustomization: ai/toolhive HelmRelease: ai/toolhive-operator
@@ -1,44 +0,0 @@
----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
- labels:
- app.kubernetes.io/name: toolhive
- kustomize.toolkit.fluxcd.io/name: toolhive
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: toolhive-operator
- namespace: ai
-spec:
- chartRef:
- kind: OCIRepository
- name: toolhive-operator
- install:
- crds: CreateReplace
- strategy:
- name: RetryOnFailure
- interval: 30m
- rollback:
- cleanupOnFail: true
- recreate: true
- upgrade:
- cleanupOnFail: true
- crds: CreateReplace
- remediation:
- remediateLastFailure: true
- retries: 2
- strategy:
- name: RemediateOnFailure
- values:
- operator:
- gc:
- gogc: 75
- gomemlimit: 450MiB
- replicaCount: 1
- resources:
- limits:
- cpu: 500m
- memory: 1Gi
- requests:
- cpu: 50m
- memory: 256Mi
-
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway
@@ -59,13 +59,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/agentgateway/app
+ path: ./kubernetes/apps/base/ai/agentgateway/app
postBuild:
substitute:
APP: agentgateway
substituteFrom:
- kind: Secret
name: cluster-secrets
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-crds
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-crds
@@ -35,13 +35,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/agentgateway/crds
+ path: ./kubernetes/apps/base/ai/agentgateway/crds
prune: true
retryInterval: 1m
sourceRef:
kind: GitRepository
name: flux-system
namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-dashboards
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentgateway-dashboards
@@ -35,13 +35,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/agentgateway-dashboards/app
+ path: ./kubernetes/apps/base/ai/agentgateway-dashboards/app
prune: true
retryInterval: 2m
sourceRef:
kind: GitRepository
name: flux-system
namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentmemory
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/agentmemory
@@ -9,13 +9,13 @@
namespace: ai
spec:
commonMetadata:
labels:
app.kubernetes.io/name: agentmemory
components:
- - ../../../../components/volsync
+ - ../../../../../components/volsync
deletionPolicy: WaitForTermination
dependsOn:
- name: onepassword-store
namespace: security
- name: vllm
namespace: ai
@@ -49,13 +49,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/agentmemory/app
+ path: ./kubernetes/apps/base/ai/agentmemory/app
postBuild:
substitute:
APP: agentmemory
CONFIG_TIMEZONE: America/New_York
VOLSYNC_CAPACITY: 5Gi
VOLSYNC_SCHEDULE_CEPH: 20 */4 * * *
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/comfyui
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/comfyui
@@ -35,13 +35,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/comfyui/app
+ path: ./kubernetes/apps/base/ai/comfyui/app
postBuild:
substitute:
APP: comfyui
substituteFrom:
- kind: Secret
name: cluster-secrets
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/hermes
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/hermes
@@ -9,13 +9,13 @@
namespace: ai
spec:
commonMetadata:
labels:
app.kubernetes.io/name: hermes
components:
- - ../../../../components/volsync
+ - ../../../../../components/volsync
deletionPolicy: WaitForTermination
dependsOn:
- name: onepassword-store
namespace: security
- name: agentgateway
namespace: ai
@@ -49,13 +49,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/hermes/app
+ path: ./kubernetes/apps/base/ai/hermes/app
postBuild:
substitute:
APP: hermes
CONFIG_TIMEZONE: America/New_York
VOLSYNC_CACHE_CAPACITY: 5Gi
VOLSYNC_CAPACITY: 25Gi
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/searxng
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/searxng
@@ -9,13 +9,13 @@
namespace: ai
spec:
commonMetadata:
labels:
app.kubernetes.io/name: searxng
components:
- - ../../../components/dragonfly
+ - ../../../../components/dragonfly
deletionPolicy: WaitForTermination
dependsOn:
- name: dragonfly-operator
namespace: database
- name: onepassword-store
namespace: security
@@ -47,13 +47,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/searxng
+ path: ./kubernetes/apps/base/ai/searxng
postBuild:
substitute:
APP: searxng
GATUS_GROUP: ai
substituteFrom:
- kind: Secret
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-crds
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-crds
@@ -35,13 +35,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/toolhive/crds
+ path: ./kubernetes/apps/base/ai/toolhive/crds
prune: true
retryInterval: 1m
sourceRef:
kind: GitRepository
name: flux-system
namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive
@@ -43,13 +43,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/toolhive/app
+ path: ./kubernetes/apps/base/ai/toolhive/app
prune: true
retryInterval: 1m
sourceRef:
kind: GitRepository
name: flux-system
namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-config
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-config
@@ -47,13 +47,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/toolhive/config
+ path: ./kubernetes/apps/base/ai/toolhive/config
postBuild:
substituteFrom:
- kind: Secret
name: cluster-secrets
prune: true
retryInterval: 1m
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-mcp-servers
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/toolhive-mcp-servers
@@ -89,13 +89,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/toolhive/mcp-servers
+ path: ./kubernetes/apps/base/ai/toolhive/mcp-servers
prune: true
retryInterval: 1m
sourceRef:
kind: GitRepository
name: flux-system
namespace: flux-system
--- kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/vllm
+++ kubernetes/apps/main Kustomization: flux-system/cluster-apps Kustomization: ai/vllm
@@ -43,13 +43,13 @@
remediation:
remediateLastFailure: true
retries: 2
target:
group: helm.toolkit.fluxcd.io
kind: HelmRelease
- path: ./kubernetes/apps/ai/vllm/app
+ path: ./kubernetes/apps/base/ai/vllm/app
postBuild:
substitute:
APP: vllm
GATUS_GROUP: ai
substituteFrom:
- kind: Secret
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config EmbeddingServer: ai/mcp-tools-embedding
+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config EmbeddingServer: ai/mcp-tools-embedding
@@ -1,17 +0,0 @@
----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: EmbeddingServer
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: mcp-tools-embedding
- namespace: ai
-spec:
- env:
- - name: HOSTNAME
- value: '::'
- image: ghcr.io/huggingface/text-embeddings-inference:cpu-latest@sha256:cb570aabbfa016b86684f576b5bd72d1ee96cc0b7a00b0ad221b298762b32157
- model: sentence-transformers/all-MiniLM-L6-v2
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config HTTPRoute: ai/mcp-gateway
+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config HTTPRoute: ai/mcp-gateway
@@ -1,28 +0,0 @@
----
-apiVersion: gateway.networking.k8s.io/v1
-kind: HTTPRoute
-metadata:
- annotations:
- external-dns.alpha.kubernetes.io/target: internal.${SECRET_DOMAIN}
- gethomepage.dev/description: Aggregated MCP tool gateway
- gethomepage.dev/enabled: 'true'
- gethomepage.dev/group: AI
- gethomepage.dev/name: ToolHive MCP
- labels:
- app.kubernetes.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: mcp-gateway
- namespace: ai
-spec:
- hostnames:
- - mcp.${SECRET_DOMAIN}
- parentRefs:
- - name: envoy-internal
- namespace: network
- sectionName: https
- rules:
- - backendRefs:
- - name: vmcp-mcp-gateway-internal
- port: 4483
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPTelemetryConfig: ai/prometheus
+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPTelemetryConfig: ai/prometheus
@@ -1,14 +0,0 @@
----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: MCPTelemetryConfig
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: prometheus
- namespace: ai
-spec:
- prometheus:
- enabled: true
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPGroup: ai/mcp-tools
+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config MCPGroup: ai/mcp-tools
@@ -1,13 +0,0 @@
----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: MCPGroup
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: mcp-tools
- namespace: ai
-spec:
- description: Optimized MCP tools for AI assistants
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config PodMonitor: ai/mcp-gateway-internal
+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config PodMonitor: ai/mcp-gateway-internal
@@ -1,23 +0,0 @@
----
-apiVersion: monitoring.coreos.com/v1
-kind: PodMonitor
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: mcp-gateway-internal
- namespace: ai
-spec:
- namespaceSelector:
- matchNames:
- - ai
- podMetricsEndpoints:
- - interval: 15s
- path: /metrics
- port: '8080'
- selector:
- matchLabels:
- app.kubernetes.io/instance: mcp-gateway-internal
- app.kubernetes.io/name: virtualmcpserver
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config VirtualMCPServer: ai/mcp-gateway-internal
+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config VirtualMCPServer: ai/mcp-gateway-internal
@@ -1,34 +0,0 @@
----
-apiVersion: toolhive.stacklok.dev/v1alpha1
-kind: VirtualMCPServer
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: mcp-gateway-internal
- namespace: ai
-spec:
- config:
- aggregation:
- conflictResolution: prefix
- conflictResolutionConfig:
- prefixFormat: '{workload}_'
- embeddingServerRef:
- name: mcp-tools-embedding
- groupRef:
- name: mcp-tools
- incomingAuth:
- type: anonymous
- outgoingAuth:
- source: discovered
- podTemplateSpec:
- spec:
- containers:
- - name: vmcp
- resources:
- limits:
- memory: 1Gi
- requests:
- memory: 256Mi
-
--- kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config GrafanaDashboard: ai/toolhive-mcp-gateway
+++ kubernetes/apps/ai/toolhive/config Kustomization: ai/toolhive-config GrafanaDashboard: ai/toolhive-mcp-gateway
@@ -1,17 +0,0 @@
----
-apiVersion: grafana.integreatly.org/v1beta1
-kind: GrafanaDashboard
-metadata:
- labels:
- app.kubernetes.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/name: toolhive-config
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: toolhive-mcp-gateway
- namespace: ai
-spec:
- allowCrossNamespaceImport: true
- instanceSelector:
- matchLabels:
- grafana.internal/instance: grafana
- url: https://raw.githubusercontent.com/stacklok/toolhive/main/examples/otel/grafana-dashboards/toolhive-mcp-grafana-dashboard-otel-scrape.json
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng ExternalSecret: ai/searxng
+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng ExternalSecret: ai/searxng
@@ -1,23 +0,0 @@
----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
- labels:
- app.kubernetes.io/name: searxng
- kustomize.toolkit.fluxcd.io/name: searxng
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: searxng
- namespace: ai
-spec:
- dataFrom:
- - extract:
- key: searxng
- secretStoreRef:
- kind: ClusterSecretStore
- name: onepassword
- target:
- name: searxng
- template:
- data:
- SEARXNG_SECRET: '{{ .SEARXNG_SECRET_KEY }}'
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng HelmRelease: ai/searxng
+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng HelmRelease: ai/searxng
@@ -1,130 +0,0 @@
----
-apiVersion: helm.toolkit.fluxcd.io/v2
-kind: HelmRelease
-metadata:
- labels:
- app.kubernetes.io/name: searxng
- kustomize.toolkit.fluxcd.io/name: searxng
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: searxng
- namespace: ai
-spec:
- chartRef:
- kind: OCIRepository
- name: app-template
- install:
- crds: CreateReplace
- remediation:
- retries: -1
- strategy:
- name: RetryOnFailure
- interval: 1h
- rollback:
- cleanupOnFail: true
- recreate: true
- upgrade:
- cleanupOnFail: true
- crds: CreateReplace
- remediation:
- remediateLastFailure: true
- retries: 2
- strategy:
- name: RemediateOnFailure
- values:
- controllers:
- searxng:
- annotations:
- reloader.stakater.com/auto: 'true'
- containers:
- main:
- env:
- SEARXNG_BASE_URL: https://search.
- SEARXNG_PORT: 8080
- SEARXNG_REDIS_URL: redis://searxng-dragonfly:6379
- UWSGI_THREADS: '2'
- UWSGI_WORKERS: '4'
- envFrom:
- - secretRef:
- name: searxng
- image:
- repository: ghcr.io/searxng/searxng
- tag: 2025.5.17-86373e7@sha256:2f45ccc0b330faa47d8706de883c6e583b38806e32b51172d93c381ce1d92f0b
- probes:
- liveness:
- custom: true
- enabled: true
- spec:
- failureThreshold: 3
- httpGet:
- path: /stats
- port: 8080
- initialDelaySeconds: 0
- periodSeconds: 10
- timeoutSeconds: 5
- readiness:
- custom: true
- enabled: true
- spec:
- failureThreshold: 3
- httpGet:
- path: /stats
- port: 8080
- initialDelaySeconds: 0
- periodSeconds: 10
- timeoutSeconds: 5
- resources:
- limits:
- memory: 2Gi
- requests:
- cpu: 10m
- memory: 512Mi
- securityContext:
- allowPrivilegeEscalation: false
- capabilities:
- add:
- - CHOWN
- - SETGID
- - SETUID
- - DAC_OVERRIDE
- drop:
- - ALL
- readOnlyRootFilesystem: true
- replicas: 1
- strategy: RollingUpdate
- persistence:
- config:
- globalMounts:
- - path: /etc/searxng/settings.yml
- readOnly: true
- subPath: settings.yml
- - path: /etc/searxng/limiter.toml
- readOnly: true
- subPath: limiter.toml
- name: searxng-configmap
- type: configMap
- tmpfs:
- enabled: true
- globalMounts:
- - path: /tmp
- type: emptyDir
- route:
- app:
- annotations:
- gatus.home-operations.com/endpoint: |-
- url: https://search./stats
- conditions:
- - "[STATUS] == 200"
- group: ai
- hostnames:
- - '{{ .Release.Name }}.'
- - search.
- parentRefs:
- - name: envoy-internal
- namespace: network
- sectionName: https
- service:
- app:
- ports:
- http:
- port: 8080
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-configmap
+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-configmap
@@ -1,115 +0,0 @@
----
-apiVersion: v1
-data:
- limiter.toml: |
- [real_ip]
-
- # Number of values to trust for X-Forwarded-For.
-
- x_for = 1
-
- # The prefix defines the number of leading bits in an address that are compared
- # to determine whether or not an address is part of a (client) network.
-
- ipv4_prefix = 32
- ipv6_prefix = 48
-
- [botdetection.ip_limit]
-
- # To get unlimited access in a local network, by default link-lokal addresses
- # (networks) are not monitored by the ip_limit
- filter_link_local = true
-
- # activate link_token method in the ip_limit method
- link_token = true
-
- [botdetection.ip_lists]
-
- # In the limiter, the ip_lists method has priority over all other methods -> if
- # an IP is in the pass_ip list, it has unrestricted access and it is also not
- # checked if e.g. the "user agent" suggests a bot (e.g. curl).
-
- block_ip = [
- ]
-
- pass_ip = [
- '192.168.0.0/16', # IPv4 private network
- '10.0.0.0/8', # IPv4 private network
- ]
-
- # Activate passlist of (hardcoded) IPs from the SearXNG organization,
- # e.g. `check.searx.space`.
- pass_searxng_org = false
- settings.yml: |
- ---
- use_default_settings: true
-
- server:
- limiter: true
- image_proxy: true
- method: GET # https://github.com/searxng/searxng/pull/3619
- public_instance: false
-
- search:
- autocomplete: brave
- favicon_resolver: duckduckgo
- languages:
- - all
- - en
- - en-US
- - pl
- - pl-PL
- formats:
- - html
- - json
-
- engines:
- - name: wolframalpha
- disabled: false
-
- general:
- instance_name: home-ops Search
-
- ui:
- default_theme: simple
- infinite_scroll: true
- query_in_title: true
- results_on_new_tab: true
- static_use_hash: true
- theme_args:
- simple_style: auto
-
- categories_as_tabs:
- general:
- images:
- videos:
- map:
-
- enabled_plugins:
- - Basic Calculator
- - Hash plugin
- - Open Access DOI rewrite
- - Self Informations
- - Tracker URL remover
- - Unit converter plugin
-
- hostnames:
- high_priority:
- - (.*)\/blog\/(.*)
- - (.*\.)?wikipedia.org$
- - (.*\.)?github.com$
- - (.*\.)?reddit.com$
- - (.*\.)?docker.com$
- - (.*\.)?archlinux.org$
- - (.*\.)?stackoverflow.com$
- - (.*\.)?askubuntu.com$
- - (.*\.)?superuser.com$
-kind: ConfigMap
-metadata:
- labels:
- app.kubernetes.io/name: searxng
- kustomize.toolkit.fluxcd.io/name: searxng
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: searxng-configmap
- namespace: ai
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng Dragonfly: ai/searxng-dragonfly
+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng Dragonfly: ai/searxng-dragonfly
@@ -1,34 +0,0 @@
----
-apiVersion: dragonflydb.io/v1alpha1
-kind: Dragonfly
-metadata:
- labels:
- app.kubernetes.io/name: searxng
- kustomize.toolkit.fluxcd.io/name: searxng
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: searxng-dragonfly
- namespace: ai
-spec:
- args:
- - --maxmemory=512Mi
- - --proactor_threads=2
- - --cluster_mode=emulated
- - --cache_mode=true
- - --default_lua_flags=allow-undeclared-keys
- image: ghcr.io/dragonflydb/dragonfly:v1.40.1
- replicas: 2
- resources:
- limits:
- cpu: 250m
- memory: 640Mi
- requests:
- cpu: 250m
- memory: 640Mi
- topologySpreadConstraints:
- - labelSelector:
- matchLabels:
- app.kubernetes.io/part-of: dragonfly
- maxSkew: 1
- topologyKey: kubernetes.io/hostname
- whenUnsatisfiable: DoNotSchedule
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng PodMonitor: ai/searxng-dragonfly
+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng PodMonitor: ai/searxng-dragonfly
@@ -1,20 +0,0 @@
----
-apiVersion: monitoring.coreos.com/v1
-kind: PodMonitor
-metadata:
- labels:
- app.kubernetes.io/name: searxng
- kustomize.toolkit.fluxcd.io/name: searxng
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: searxng-dragonfly
- namespace: ai
-spec:
- fallbackScrapeProtocol: PrometheusText0.0.4
- podMetricsEndpoints:
- - port: admin
- podTargetLabels:
- - app
- selector:
- matchLabels:
- app: searxng-dragonfly
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng NetworkPolicy: ai/searxng-dragonfly-allow-prometheus
+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng NetworkPolicy: ai/searxng-dragonfly-allow-prometheus
@@ -1,29 +0,0 @@
----
-apiVersion: networking.k8s.io/v1
-kind: NetworkPolicy
-metadata:
- labels:
- app.kubernetes.io/name: searxng
- kustomize.toolkit.fluxcd.io/name: searxng
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: searxng-dragonfly-allow-prometheus
- namespace: ai
-spec:
- ingress:
- - from:
- - namespaceSelector:
- matchLabels:
- kubernetes.io/metadata.name: monitoring
- podSelector:
- matchLabels:
- app.kubernetes.io/name: prometheus
- ports:
- - port: 9999
- protocol: TCP
- podSelector:
- matchLabels:
- app: searxng-dragonfly
- app.kubernetes.io/part-of: dragonfly
- policyTypes:
- - Ingress
-
--- kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-dragonfly-gatus-ep
+++ kubernetes/apps/ai/searxng Kustomization: ai/searxng ConfigMap: ai/searxng-dragonfly-gatus-ep
@@ -1,27 +0,0 @@
----
-apiVersion: v1
-data:
- config.yaml: |
- endpoints:
- - name: Redis (searxng)
- group: Services
- url: tcp://searxng-dragonfly.ai.svc.cluster.local:6379
- interval: 1m
- ui:
- hide-url: true
- hide-hostname: true
- conditions:
- - "[CONNECTED] == true"
- alerts:
- - type: pushover
- send-on-resolved: true
-kind: ConfigMap
-metadata:
- labels:
- app.kubernetes.io/name: searxng
- gatus.io/enabled: 'true'
- kustomize.toolkit.fluxcd.io/name: searxng
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: searxng-dragonfly-gatus-ep
- namespace: ai
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/anthropic-secret
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/anthropic-secret
@@ -1,24 +0,0 @@
----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: anthropic-secret
- namespace: ai
-spec:
- dataFrom:
- - extract:
- key: ai-keys
- refreshInterval: 1h
- secretStoreRef:
- kind: ClusterSecretStore
- name: onepassword
- target:
- name: anthropic-secret
- template:
- data:
- Authorization: '{{ .ANTHROPIC_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/anthropic
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/anthropic
@@ -1,25 +0,0 @@
----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: anthropic
- namespace: ai
-spec:
- ai:
- provider:
- anthropic: {}
- policies:
- ai:
- routes:
- '*': Passthrough
- /v1/chat/completions: Completions
- /v1/messages: Messages
- /v1/models: Passthrough
- auth:
- secretRef:
- name: anthropic-secret
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/openai-secret
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/openai-secret
@@ -1,24 +0,0 @@
----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: openai-secret
- namespace: ai
-spec:
- dataFrom:
- - extract:
- key: ai-keys
- refreshInterval: 1h
- secretStoreRef:
- kind: ClusterSecretStore
- name: onepassword
- target:
- name: openai-secret
- template:
- data:
- Authorization: '{{ .OPENAI_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/openai
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/openai
@@ -1,25 +0,0 @@
----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: openai
- namespace: ai
-spec:
- ai:
- provider:
- openai: {}
- policies:
- ai:
- routes:
- '*': Passthrough
- /v1/chat/completions: Completions
- /v1/embeddings: Passthrough
- /v1/models: Passthrough
- auth:
- secretRef:
- name: openai-secret
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/deepseek-secret
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/deepseek-secret
@@ -1,24 +0,0 @@
----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: deepseek-secret
- namespace: ai
-spec:
- dataFrom:
- - extract:
- key: ai-keys
- refreshInterval: 1h
- secretStoreRef:
- kind: ClusterSecretStore
- name: onepassword
- target:
- name: deepseek-secret
- template:
- data:
- Authorization: '{{ .DEEPSEEK_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/deepseek
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/deepseek
@@ -1,28 +0,0 @@
----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: deepseek
- namespace: ai
-spec:
- ai:
- provider:
- host: api.deepseek.com
- openai: {}
- port: 443
- policies:
- ai:
- routes:
- '*': Passthrough
- /v1/chat/completions: Completions
- /v1/embeddings: Passthrough
- /v1/models: Passthrough
- auth:
- secretRef:
- name: deepseek-secret
- tls: {}
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/mistral-secret
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/mistral-secret
@@ -1,24 +0,0 @@
----
-apiVersion: external-secrets.io/v1
-kind: ExternalSecret
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: mistral-secret
- namespace: ai
-spec:
- dataFrom:
- - extract:
- key: ai-keys
- refreshInterval: 1h
- secretStoreRef:
- kind: ClusterSecretStore
- name: onepassword
- target:
- name: mistral-secret
- template:
- data:
- Authorization: '{{ .MISTRAL_API_KEY }}'
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/mistral
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway AgentgatewayBackend: ai/mistral
@@ -1,28 +0,0 @@
----
-apiVersion: agentgateway.dev/v1alpha1
-kind: AgentgatewayBackend
-metadata:
- labels:
- app.kubernetes.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/name: agentgateway
- kustomize.toolkit.fluxcd.io/namespace: ai
- name: mistral
- namespace: ai
-spec:
- ai:
- provider:
- host: api.mistral.ai
- openai: {}
- port: 443
- policies:
- ai:
- routes:
- '*': Passthrough
- /v1/chat/completions: Completions
- /v1/embeddings: Passthrough
- /v1/models: Passthrough
- auth:
- secretRef:
- name: mistral-secret
- tls: {}
-
--- kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/gemini-secret
+++ kubernetes/apps/ai/agentgateway/app Kustomization: ai/agentgateway ExternalSecret: ai/gemini-secret
@@ -1,24 +0,0 @@
----
-apiVersion: external-secrets.io/v1
-kind: ExternalSec |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
Execute lane 3 of the home-ops flux/ -> kubernetes/clusters/main structural split, as SERIAL gated PRs, one stage per PR, in order S12 downloads (merged as PR #1425 and confirmed converged live), S13 ai, S14 monitoring. This is stage S13: move the ai namespace from the flat kubernetes/apps/ai layout to the base + kubernetes/apps/main/ai overlay shape established by the already-merged skeleton. Used migrate-ns.py (from the re-proved procedure in the round-2 refactor scout report, Q4 + appendix) to perform a deterministic, pure-rename move: kubernetes/apps/ai//ks.yaml -> kubernetes/apps/main/ai/.yaml, kubernetes/apps/ai/kustomization.yaml -> kubernetes/apps/main/ai/kustomization.yaml, everything else -> kubernetes/apps/base/ai/..., plus the four line-level path/components rewrites the script performs and dropping/adding the namespace from apps/kustomization.yaml and apps/main/kustomization.yaml. No YAML semantics beyond those mechanical rewrites should change. Gate proof performed before committing: flux-local build of kubernetes/clusters/main renders byte-identical leaf workload docs before/after (1763 leaf docs, empty diff) and byte-identical normalized Flux Kustomization CRs (116 unique Kustomizations, empty diff after normalizing away only the base/ path prefix and components depth changes); flux-local test --all-namespaces passed 118/118. This stage must not touch monitoring or any other namespace - monitoring (S14) is the next and final stage in this lane, gated on this PR merging first.
What Changed
ainamespace from the flatkubernetes/apps/ailayout intokubernetes/apps/base/ai(manifests) andkubernetes/apps/main/ai(Flux Kustomizations), with mechanicalspec.path/ components depth rewrites only../aifrom the inertkubernetes/apps/kustomization.yamllist and pointed the livekubernetes/apps/mainentry at./ai.AGENTS.md, and the Grafana agentgateway dashboard comment to the newbase/mainpaths.Risk Assessment
✅ Low: Pure mechanical rename/move of the ai namespace into base+main overlay shape; every non-100%-similarity file was individually verified to contain only the expected path/components rewrites with correct relative-depth arithmetic, no other namespace or semantics changed, and the top-level kustomization.yaml edits correctly drop/add the ai entry in place.
Testing
Targeted flux-local validation confirms the ai-namespace migration is a byte-identical mechanical rename: flux-local test --all-namespaces passed 118/118 on the target commit, and a full rendered-manifest diff between base and target commits across all 116 Kustomizations showed zero unexpected changes, only the two documented path/components rewrites, with no other namespace touched.
Evidence: flux-local test --all-namespaces --path kubernetes/clusters/main (target commit)
Evidence: Full-cluster rendered-manifest diff, base fe20338 vs target f555c97 (kustomize build via flux-local build kustomizations --all-namespaces, 61147 lines each side)
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
✅ **Review** - passed
✅ No issues found.
✅ **Test** - passed
✅ No issues found.
flux-local test --all-namespaces --path kubernetes/clusters/main --verboseon target commit f555c97e (118 passed)git diff --stat fe203388...f555c97eto confirm only kubernetes/apps/ai/, kubernetes/apps/base/ai/, kubernetes/apps/main/ai/**, kubernetes/apps/kustomization.yaml, kubernetes/apps/main/kustomization.yaml were touchedflux-local build kustomizations --path kubernetes/clusters/main --all-namespacesrendered independently against a temporary worktree at base commit fe203388 and against the target worktree, then diffed byte-for-byte (61147 lines each; 15-hunk/60-line diff, all mechanical path/components rewrites)Manual inspection of kubernetes/apps/main/ai/hermes.yaml (target) vs kubernetes/apps/ai/hermes/ks.yaml (base) confirming only thepath:andcomponents:lines changedgrep -c '^kind: Kustomization$'on both rendered outputs confirming 116 Kustomization objects in both base and target trees✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.