Namespace nex: Brücke zu appsrv08, Zugang für nex-admin, Pull-Secret
ci / test (push) Failing after 22s

Vorbereitung für Agenten im Cluster (nex-Spec 2026-10-19, D259/D263/D265):
Services ohne Selector auf die Host-Ports von appsrv08, ServiceAccount mit
Role nur für den Namespace nex, Pull-Secret aus einer Datei auf ops.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Robert Rapp
2026-10-19 13:45:18 +02:00
co-authored by Claude Fable 5.1
parent 02adb2f4b2
commit 31f6435c2f
5 changed files with 232 additions and 0 deletions
+1
View File
@@ -10,6 +10,7 @@ Ausgerollt von ops mit `kubectl` (Rolle `k3s-apps`, Playbook `playbooks/k3s.yml`
| `nex-speech/` | NEX-Sprachdienste auf gpu-pve52 (Playbook `playbooks/nex-speech-k3s.yml`) |
| `nex-searxng/` | NEX-Websuche SearXNG, NodePort 30880 (Playbook `playbooks/nex-searxng-k3s.yml`), Einstellungen aus dem nex-Repo |
| `portainer/` | Portainer CE 2.45.1 auf der Dienst-VM k3s, Datenbank von appsrv08 übernommen (Playbook `playbooks/portainer-k3s.yml` mit Rollback BE→CE), NodePort 30779 |
| `nex/` | Namespace nex für Agenten im Cluster: Brücke zu den NEX-Diensten auf appsrv08 (Services ohne Selector), Zugang für nex-admin (ServiceAccount, Role), Pull-Secret Gitea (Playbook `playbooks/nex-k3s.yml`); nex-Spec 2026-10-19 |
| `rustdesk/` | RustDesk-Server hbbs/hbbr, Service LoadBalancer 21115–21119 auf jeder Knoten-Adresse (Playbook `playbooks/rustdesk-k3s.yml`), Schlüssel im Secret `rustdesk-keys` |
Portainer: Umgebung „Kubernetes → Agent“, Adresse `<IP eines Knotens>:30778`.
+57
View File
@@ -0,0 +1,57 @@
# Zugang von nex-admin (läuft auf appsrv08) zum Namespace nex: Agenten als Deployment/PVC/Secret/Service anlegen,
# exec, Logs, Skalieren (nex-Spec 2026-10-19 Cluster-Agenten, D265). Kein cluster-admin, nur dieser Namespace.
# Token: Secret nex-admin-token (Typ service-account-token, dauerhaft); playbooks/nex-k3s.yml legt es als Datei auf
# ops ab (/root/.config/knaster/nex-admin-k8s.token) – von dort in die Stack-Variable NEX_ADMIN_K8S_TOKEN.
apiVersion: v1
kind: ServiceAccount
metadata:
name: nex-admin
namespace: nex
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: nex-admin
namespace: nex
rules:
- apiGroups: [""]
resources: [pods, pods/log]
verbs: [get, list, watch, create, delete]
- apiGroups: [""]
resources: [pods/exec]
verbs: [create, get]
- apiGroups: [""]
resources: [services, persistentvolumeclaims, secrets]
verbs: [get, list, create, update, patch, delete]
- apiGroups: [""]
resources: [endpoints, events]
verbs: [get, list]
- apiGroups: [apps]
resources: [deployments, deployments/scale]
verbs: [get, list, watch, create, update, patch, delete]
- apiGroups: [metrics.k8s.io]
resources: [pods]
verbs: [get, list]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: nex-admin
namespace: nex
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: nex-admin
subjects:
- kind: ServiceAccount
name: nex-admin
namespace: nex
---
apiVersion: v1
kind: Secret
metadata:
name: nex-admin-token
namespace: nex
annotations:
kubernetes.io/service-account.name: nex-admin
type: kubernetes.io/service-account-token
+87
View File
@@ -0,0 +1,87 @@
# Brücke zu den NEX-Diensten auf appsrv08 (nex-Spec 2026-10-19 Cluster-Agenten, D259).
# Die Agenten-Pods im Namespace nex sprechen dieselben Namen wie die Container im Docker-Netz llm-internal auf
# appsrv08 (nex-router, nex-know, nex-access, grp-mcp-intern); hier zeigen Services ohne Selector mit festen
# Endpoints auf die Host-Ports von appsrv08 (nur auf 192.168.100.29 veröffentlicht, Stacks nex und grp-mcp-intern).
# Zieht ein Dienst in den Cluster (Weg 3), ersetzt sein echter Service den Eintrag – der Name bleibt.
# LiteLLM bleibt ohne Brücke: Agenten sprechen nur den Router, der Router LiteLLM (nex AGENTS.md: kein Pfad an
# LiteLLM vorbei, und kein zusätzlicher Host-Port dafür).
apiVersion: v1
kind: Service
metadata:
name: nex-router
namespace: nex
labels: {knaster.app: nex-bridge}
spec:
ports:
- {name: http, port: 4100, targetPort: 4100}
---
apiVersion: v1
kind: Endpoints
metadata:
name: nex-router
namespace: nex
labels: {knaster.app: nex-bridge}
subsets:
- addresses: [{ip: 192.168.100.29}]
ports: [{name: http, port: 4100}]
---
apiVersion: v1
kind: Service
metadata:
name: nex-know
namespace: nex
labels: {knaster.app: nex-bridge}
spec:
ports:
- {name: http, port: 4200, targetPort: 4200}
---
apiVersion: v1
kind: Endpoints
metadata:
name: nex-know
namespace: nex
labels: {knaster.app: nex-bridge}
subsets:
- addresses: [{ip: 192.168.100.29}]
ports: [{name: http, port: 4200}]
---
apiVersion: v1
kind: Service
metadata:
name: nex-access
namespace: nex
labels: {knaster.app: nex-bridge}
spec:
ports:
- {name: http, port: 4300, targetPort: 4300}
---
apiVersion: v1
kind: Endpoints
metadata:
name: nex-access
namespace: nex
labels: {knaster.app: nex-bridge}
subsets:
- addresses: [{ip: 192.168.100.29}]
ports: [{name: http, port: 4300}]
---
# GRP-MCP (Rolle projektleitung): Stack grp-mcp-intern auf appsrv08, Dienst gateway, Container-Port 8790
apiVersion: v1
kind: Service
metadata:
name: grp-mcp-intern
namespace: nex
labels: {knaster.app: nex-bridge}
spec:
ports:
- {name: http, port: 8790, targetPort: 8790}
---
apiVersion: v1
kind: Endpoints
metadata:
name: grp-mcp-intern
namespace: nex
labels: {knaster.app: nex-bridge}
subsets:
- addresses: [{ip: 192.168.100.29}]
ports: [{name: http, port: 8790}]