fix(ai): mcp-k8s — containers/kubernetes-mcp-server вместо mkp
У mkp нет ни одного безопасного режима, только RBAC. У containers/kubernetes-mcp-server есть штатный --read-only, --toolsets и denied_resources, официальный гайд по read-only SA и чарт. Образ quay.io/containers/kubernetes_mcp_server:v0.0.66 с дайджестом (тег проверен в API quay). RBAC: вместо самодельного списка — встроенная view (secrets в неё не входят) + отдельный ClusterRole на кластерные объекты и метрики. Аргументы: --port 8080 --read-only --toolsets core.
This commit is contained in:
@@ -1,83 +1,46 @@
|
||||
---
|
||||
# Права 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"]
|
||||
---
|
||||
# Базовое чтение даём встроенной ролью view — её же рекомендует официальный гайд
|
||||
# containers/kubernetes-mcp-server (docs/getting-started-kubernetes.md). view
|
||||
# описывает namespaced-ресурсы и secrets в неё не входят, поэтому именно она, а не
|
||||
# самодельный список с resources: ["*"].
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: mcp-k8s-readonly
|
||||
name: mcp-k8s-view
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: mcp-k8s-readonly
|
||||
name: view
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: mcp-k8s
|
||||
namespace: ai
|
||||
---
|
||||
# view включает только namespaced-ресурсы, поэтому кластерные объекты и метрики
|
||||
# добавляем отдельно. Ни secrets, ни записи здесь нет.
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: mcp-k8s-cluster-read
|
||||
rules:
|
||||
- apiGroups: [""]
|
||||
resources: ["nodes", "namespaces", "persistentvolumes"]
|
||||
verbs: ["get", "list", "watch"]
|
||||
- apiGroups: ["storage.k8s.io"]
|
||||
resources: ["storageclasses", "volumeattachments", "csidrivers", "csistoragecapacities"]
|
||||
verbs: ["get", "list", "watch"]
|
||||
- apiGroups: ["metrics.k8s.io"]
|
||||
resources: ["*"]
|
||||
verbs: ["get", "list"]
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: mcp-k8s-cluster-read
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: mcp-k8s-cluster-read
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: mcp-k8s
|
||||
|
||||
Reference in New Issue
Block a user