feat(ai): mcp-k8s через ToolHive (read-only RBAC)
Flate / Flate - Filter (pull_request) Successful in 5s
Flate / Flate (pull_request) Successful in 18s
Flate / Flate - Success (pull_request) Canceled after 0s

MCP-сервер k8s из реестра ToolHive: ghcr.io/stackloklabs/mkp/server:0.4.3, transport streamable-http.
Отдельный SA mcp-k8s и ClusterRole mcp-k8s-readonly (только get/list/watch).
Core-группа перечислена поимённо, чтобы не открывать secrets; остальные группы явным списком,
потому что apiGroups: [*] включает и core-группу. Наружу не выводим: без oidcConfigRef прокси
ToolHive неаутентифицирован.
This commit is contained in:
2026-09-17 23:10:17 +00:00
parent 0243dbfb9c
commit c4cf3ba798
6 changed files with 147 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
---
# Права MCP-сервера на API. Только чтение: mkp умеет и apply_resource, и
# delete_resource, и exec в поды — ограничение живёт исключительно здесь,
# поэтому список verbs закрыт чтением.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: mcp-k8s-readonly
rules:
# Core-группа перечислена поимённо: resources: ["*"] открыл бы и secrets,
# а cluster-secrets, токен Proxmox CSI и прочие креды агенту читать незачем.
- apiGroups: [""]
resources:
- configmaps
- endpoints
- events
- limitranges
- namespaces
- nodes
- persistentvolumeclaims
- persistentvolumes
- pods
- pods/log
- pods/status
- replicationcontrollers
- resourcequotas
- serviceaccounts
- services
verbs: ["get", "list", "watch"]
# Остальные группы перечислены явно, потому что apiGroups: ["*"] включает и
# core-группу — то есть снова открыл бы secrets. Список закрытый: не хватает
# группы — сервер просто не увидит её ресурсы, ничего не сломается.
- apiGroups:
- admissionregistration.k8s.io
- apiextensions.k8s.io
- apiregistration.k8s.io
- apps
- authentication.k8s.io
- authorization.k8s.io
- autoscaling
- batch
- certificates.k8s.io
- coordination.k8s.io
- discovery.k8s.io
- events.k8s.io
- flowcontrol.apiserver.k8s.io
- metrics.k8s.io
- networking.k8s.io
- node.k8s.io
- policy
- rbac.authorization.k8s.io
- scheduling.k8s.io
- storage.k8s.io
- acme.cert-manager.io
- cert-manager.io
- cilium.io
- dragonflydb.io
- external-secrets.io
- gateway.envoyproxy.io
- gateway.networking.k8s.io
- generators.external-secrets.io
- helm.toolkit.fluxcd.io
- image.toolkit.fluxcd.io
- kustomize.toolkit.fluxcd.io
- monitoring.coreos.com
- notification.toolkit.fluxcd.io
- snapshot.storage.k8s.io
- source.toolkit.fluxcd.io
- toolhive.stacklok.dev
resources: ["*"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: mcp-k8s-readonly
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: mcp-k8s-readonly
subjects:
- kind: ServiceAccount
name: mcp-k8s
namespace: ai