尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

多租户Kubernetes集群AI Agent部署:Kata Containers隔离与安全实践

多租户Kubernetes集群AI Agent部署:Kata Containers隔离与安全实践 1. 为什么多租户场景下的 AI Agent 部署是个棘手问题做过 Kubernetes 集群运维的人都有一个共识单租户环境下的部署难度是“普通”多租户环境下的难度直接跳到“地狱”。原因不复杂——AI Agent 这类负载和传统的 Web 服务有本质区别。传统微服务是无状态的、请求响应式的、资源消耗可预测的而 AI Agent 往往需要持久化的会话上下文、可能执行任意代码、需要访问外部工具链、还会突发性地吃掉大量 CPU 和内存。我所在的团队从 2024 年底开始在一个共享 Kubernetes 集群上部署内部 AI Agent 平台集群同时承载着十几个业务团队的微服务。最初的方案很粗暴——每个 Agent 就是一个普通的 Deployment配上 ResourceQuota 和 NetworkPolicy 就上线了。结果两周内出了三次事故一次是某个 Agent 执行了一个死循环脚本把节点 CPU 打满影响了同节点上其他租户的核心业务一次是 Agent 的临时文件写满了节点磁盘还有一次是不同租户的 Agent 之间通过集群内网意外产生了数据泄露。这些教训让我意识到多租户 Kubernetes 集群上部署 AI Agent核心矛盾在于“隔离”和“效率”之间的平衡。隔离不够安全性和稳定性就是空谈隔离过度资源利用率直线下降成本扛不住。这篇文章就是把我踩过的坑、验证过的方案、以及最终落地的架构完整梳理出来适合正在做 AI Agent 平台建设的运维工程师、平台架构师以及需要在共享集群上跑不可信负载的团队参考。2. 整体架构设计与核心思路拆解2.1 隔离层级的选型逻辑在多租户集群里跑 AI Agent第一件事是确定隔离的粒度。Kubernetes 原生提供了几种隔离手段但它们的强度差异很大适用的场景也完全不同。Namespace 级别的隔离是最轻量的方案。通过 Namespace 配合 RBAC、ResourceQuota、NetworkPolicy可以实现基本的逻辑隔离。但这里有个关键问题Namespace 隔离的是 API 对象不是运行时。所有 Pod 共享同一个内核容器逃逸、侧信道攻击、资源争抢这些问题 Namespace 解决不了。对于“可信租户”之间的隔离Namespace 够用但对于执行不可信代码的 AI Agent这远远不够。RuntimeClass 配合沙箱运行时是中间方案。Kata Containers 是这里的主力选手它给每个 Pod 或 Pod 组提供一个轻量级虚拟机拥有独立的内核。这意味着即使 Agent 在容器内执行了恶意代码逃逸的难度也从“利用内核漏洞”变成了“突破虚拟机边界”量级完全不同。Kata 的启动开销比普通容器大通常在 200-500ms 左右但对于 AI Agent 这种生命周期通常以分钟甚至小时计的负载来说这个开销完全可以接受。进程级沙箱是另一个维度。像 gVisor 这样的方案在用户态实现了一个兼容层拦截系统调用。它的隔离强度介于普通容器和 Kata 之间启动速度快但兼容性偶尔会有问题——某些依赖特定系统调用的 AI 框架可能会跑不起来。我们最终的选型是Kata Containers 作为默认运行时配合 Namespace 做逻辑分组再叠加 NetworkPolicy 和 OPA Gatekeeper 做策略管控。这个组合的逻辑是Kata 解决运行时隔离的硬需求Namespace 解决多租户资源配额和权限管理的软需求NetworkPolicy 和 Gatekeeper 解决“租户之间不能互相串门”的策略问题。2.2 为什么不用“一个租户一个集群”有人可能会问既然多租户这么麻烦为什么不给每个租户单独开一个集群答案很简单——成本和运维复杂度。一个生产级 Kubernetes 集群的控制面成本etcd、apiserver、controller-manager 的高可用部署至少在 3 个节点以上加上监控、日志、Ingress 等基础设施每个集群的固定开销相当可观。如果有 20 个租户那就是 20 套控制面运维团队根本管不过来。共享集群的方案虽然技术上更复杂但资源利用率高、运维集中、成本可控。关键在于把隔离做扎实让租户之间“物理上共享、逻辑上独立”。2.3 AI Agent 的特殊负载特征设计架构之前必须搞清楚 AI Agent 和普通微服务的差异。我总结了几个关键点生命周期不确定有的 Agent 是常驻的比如客服机器人有的是按需启动的比如代码审查 Agent还有的是一次性的比如数据处理任务。这要求调度策略必须灵活。资源消耗波动大Agent 在推理时可能瞬间吃掉几个核的 CPU在等待外部 API 返回时又几乎不占资源。传统的 request/limit 静态配置很难适配。需要持久化存储Agent 的会话上下文、工具调用记录、中间结果都需要存储。但不同租户的数据必须严格隔离。网络访问模式复杂Agent 可能需要访问外部 API、内部工具服务、向量数据库等。网络策略必须精细到“哪个租户的哪个 Agent 能访问哪些服务”。这些特征决定了我们不能简单套用微服务的部署模板必须针对性地设计。3. 核心组件与实操要点解析3.1 Kata Containers 的部署与调优Kata Containers 的安装本身不复杂但在生产环境落地有几个关键决策点。第一个决策是使用哪种 Hypervisor。Kata 支持 QEMU、Cloud Hypervisor、Firecracker 等多种后端。QEMU 兼容性最好但开销最大Firecracker 启动最快但设备支持有限Cloud Hypervisor 是折中方案。我们的选择是 Cloud Hypervisor因为它在启动速度约 150ms和兼容性之间取得了不错的平衡。如果你的 Agent 需要 GPU 支持那 QEMU 是更稳妥的选择因为 Cloud Hypervisor 的 GPU 直通支持相对较新。安装 Kata 的核心步骤是# 添加 Kata 的 Helm 仓库 helm repo add kata-containers https://kata-containers.github.io/kata-containers helm repo update # 安装 Kata Deploy包含 RuntimeClass 定义 helm install kata-deploy kata-containers/kata-deploy \ --namespace kube-system \ --set runtimeClass.enabledtrue \ --set runtimeClass.namekata-clh \ --set hypervisorcloud-hypervisor安装完成后需要验证 RuntimeClass 是否可用kubectl get runtimeclass # 应该能看到 kata-clh 这个 RuntimeClass第二个决策是资源开销的评估。Kata 的每个 Pod 都会启动一个轻量级 VM这意味着每个 Pod 至少需要额外的 100-200MB 内存用于 VM 本身。如果你的集群有 1000 个 Agent Pod那就是 100-200GB 的额外内存开销。这个数字必须在容量规划阶段就算清楚。第三个决策是镜像管理。Kata 的 VM 需要自己的内核和 initrd 镜像这些镜像需要分发到每个节点上。在大规模集群里镜像分发的效率直接影响 Pod 的启动速度。我们的做法是使用 DaemonSet 预拉取 Kata 镜像并配置本地镜像缓存。注意Kata 的 VM 内核版本必须与宿主机的内核版本兼容。我们曾经遇到过宿主机升级内核后 Kata VM 无法启动的问题排查了半天才发现是内核模块不匹配。建议在升级宿主机内核前先在小规模节点上验证 Kata 的兼容性。3.2 多租户 Namespace 的设计规范Namespace 的设计看似简单但实际落地时有很多细节需要考虑。我们的规范是这样的每个租户分配一个顶级 Namespace命名格式为tenant-{租户ID}。在这个顶级 Namespace 下根据 Agent 的用途再划分二级 Namespace比如tenant-{租户ID}-prod、tenant-{租户ID}-dev、tenant-{租户ID}-sandbox。这样设计的好处是权限边界清晰——租户管理员只能管理自己顶级 Namespace 下的资源平台管理员则可以通过 ClusterRole 跨租户操作。ResourceQuota 的配置需要根据租户等级来定。我们分了三个等级租户等级CPU 配额内存配额Pod 数量上限存储配额基础版20 核40Gi50100Gi专业版100 核200Gi200500Gi企业版500 核1Ti10002Ti这些配额不是拍脑袋定的而是根据过去三个月的实际使用数据取 P95 值再上浮 30% 得出的。配额太紧会导致 Agent 频繁被驱逐太松则失去限制意义。NetworkPolicy 的默认策略是“拒绝所有入站和出站流量”然后按需开放。每个租户的 Agent 只能访问自己 Namespace 内的服务以及平台提供的共享服务如向量数据库、模型推理服务。跨租户访问必须通过平台审批后手动添加策略。3.3 沙箱环境下的存储隔离AI Agent 对存储的需求很特殊既需要持久化保存会话状态又需要临时空间执行代码、处理文件还需要共享存储多个 Agent 实例访问同一份数据。我们的方案是三层存储架构第一层是临时存储使用emptyDir挂载到 Agent 的/tmp和/workspace目录。这部分存储在 Pod 销毁后自动清理适合存放执行过程中的临时文件。关键是要设置sizeLimit防止 Agent 写满节点磁盘。我们一般设置为 10Gi超过后 Agent 会收到磁盘写入失败的报错而不是拖垮整个节点。第二层是持久化存储使用 PVC 配合 StorageClass 动态供给。每个租户的 PVC 必须使用独立的 StorageClass底层对接不同的存储后端或不同的加密密钥。这样即使存储系统出现漏洞租户之间的数据也不会互相泄露。我们用的是 Ceph RBD通过不同的 pool 来实现物理隔离。第三层是共享存储用于存放模型文件、公共数据集等。这部分使用 ReadOnlyMany 模式的 PVC挂载到所有需要的 Agent Pod 上。因为是只读的所以不存在并发写入的问题。实操心得Kata 的 VM 对存储性能有一定影响特别是小文件随机读写场景。我们实测下来Kata 下的 IOPS 比普通容器低约 15%-20%。如果你的 Agent 有高 IOPS 需求比如频繁读写向量索引建议把存储卷通过 virtio-fs 挂载而不是默认的 9p 协议。virtio-fs 的性能明显更好但需要较新版本的 Kata 支持。3.4 网络策略与租户隔离多租户环境下的网络隔离核心原则是“默认拒绝按需开放”。我们使用 Calico 作为 CNI配合 GlobalNetworkPolicy 实现集群级别的默认拒绝策略。apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: default-deny-all spec: selector: all() types: - Ingress - Egress这条策略会拒绝所有 Pod 的入站和出站流量。然后为每个租户创建允许策略apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-tenant-a-internal namespace: tenant-a spec: selector: all() types: - Ingress - Egress ingress: - from: - namespaceSelector: tenant a egress: - to: - namespaceSelector: tenant a - to: - namespaceSelector: platform shared ports: - 443 - 8080这里的关键是给 Namespace 打上标签然后在策略里通过标签选择器来匹配。这样新增租户时只需要打标签和创建对应的策略不需要修改全局配置。DNS 解析也需要特别注意。默认情况下Kubernetes 的 DNS 服务对所有 Pod 可见这意味着租户 A 的 Agent 可以通过 DNS 查询发现租户 B 的服务名称。虽然 NetworkPolicy 会阻止实际连接但服务发现本身就可能泄露信息。我们的做法是给每个租户部署独立的 CoreDNS 实例只解析本租户和共享服务的域名。4. 完整部署流程与关键环节实现4.1 环境准备与前置检查在开始部署之前需要确认集群满足以下条件Kubernetes 版本不低于 1.24RuntimeClass 的稳定版本要求节点支持硬件虚拟化Kata 需要 KVM节点内核版本不低于 5.10Cloud Hypervisor 的要求已安装 Calico 或 Cilium 作为 CNI已安装 OPA Gatekeeper 或 Kyverno 作为策略引擎检查节点是否支持虚拟化# 在每个节点上执行 grep -E vmx|svm /proc/cpuinfo # 如果有输出说明支持硬件虚拟化检查 KVM 模块是否加载lsmod | grep kvm # 应该能看到 kvm_intel 或 kvm_amd如果节点不支持硬件虚拟化Kata 会退回到软件模拟模式性能会大幅下降。这种情况下建议更换节点规格或者考虑使用 gVisor 作为替代方案。4.2 部署 Kata Containers 运行时Kata 的部署我们使用 Helm Chart但做了一些定制化配置。核心的 values.yaml 配置如下runtimeClass: enabled: true name: kata-clh hypervisor: cloud-hypervisor kata: resources: requests: memory: 256Mi cpu: 100m limits: memory: 512Mi cpu: 500m config: hypervisor: cloud-hypervisor: default_vcpus: 2 default_memory: 512 default_maxvcpus: 8 default_maxmemory: 4096这里有几个参数需要解释。default_vcpus和default_memory是每个 Kata VM 的默认配置也就是 Agent Pod 即使没有指定资源限制VM 也会占用这么多资源。default_maxvcpus和default_maxmemory是上限当 Pod 的 resource limit 超过默认值时Kata 会动态调整 VM 规格。部署完成后创建一个测试 Pod 验证 Kata 是否正常工作apiVersion: v1 kind: Pod metadata: name: kata-test spec: runtimeClassName: kata-clh containers: - name: test image: busybox command: [uname, -r]如果输出的内核版本与宿主机不同说明 Kata 的独立内核已经生效。4.3 租户 Namespace 与配额配置创建一个新租户的完整流程如下# 1. 创建顶级 Namespace kubectl create namespace tenant-demo # 2. 打标签 kubectl label namespace tenant-demo tenantdemo tierstandard # 3. 创建 ResourceQuota cat EOF | kubectl apply -f - apiVersion: v1 kind: ResourceQuota metadata: name: tenant-demo-quota namespace: tenant-demo spec: hard: requests.cpu: 20 requests.memory: 40Gi limits.cpu: 40 limits.memory: 80Gi pods: 50 persistentvolumeclaims: 20 requests.storage: 100Gi EOF # 4. 创建 LimitRange设置默认资源限制 cat EOF | kubectl apply -f - apiVersion: v1 kind: LimitRange metadata: name: tenant-demo-limits namespace: tenant-demo spec: limits: - default: cpu: 500m memory: 1Gi defaultRequest: cpu: 200m memory: 512Mi type: Container EOFLimitRange 很重要因为很多 AI Agent 框架在部署时不会显式指定资源限制。如果没有 LimitRange这些 Pod 会以 BestEffort 模式运行在节点资源紧张时最先被驱逐。设置合理的默认值可以避免这个问题。4.4 AI Agent 的部署模板一个典型的多租户 AI Agent Deployment 模板如下apiVersion: apps/v1 kind: Deployment metadata: name: agent-demo namespace: tenant-demo labels: tenant: demo app: ai-agent spec: replicas: 2 selector: matchLabels: app: ai-agent template: metadata: labels: tenant: demo app: ai-agent spec: runtimeClassName: kata-clh serviceAccountName: agent-sa securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 1000 containers: - name: agent image: registry.internal/ai-agent:latest resources: requests: cpu: 1 memory: 2Gi limits: cpu: 4 memory: 8Gi volumeMounts: - name: workspace mountPath: /workspace - name: tmp mountPath: /tmp env: - name: AGENT_TENANT_ID value: demo - name: AGENT_SANDBOX_MODE value: strict volumes: - name: workspace emptyDir: sizeLimit: 10Gi - name: tmp emptyDir: sizeLimit: 5Gi这个模板里有几个关键点。runtimeClassName: kata-clh指定了使用 Kata 运行时。securityContext强制非 root 用户运行配合 Kata 的 VM 隔离安全性大幅提升。emptyDir的sizeLimit防止 Agent 写满磁盘。环境变量AGENT_SANDBOX_MODE是给 Agent 框架用的告诉它在沙箱模式下运行禁用某些危险操作。4.5 策略引擎的规则配置OPA Gatekeeper 的规则用来强制实施平台的安全策略。我们配置了几条核心约束apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredRuntimeClass metadata: name: require-kata-runtime spec: match: kinds: - apiGroups: [apps] kinds: [Deployment, StatefulSet] namespaces: - tenant-* parameters: runtimeClass: kata-clh这条约束强制所有租户 Namespace 下的 Deployment 和 StatefulSet 必须使用 Kata 运行时。如果有租户尝试用默认运行时部署 Agent会被 Gatekeeper 直接拒绝。另一条重要的约束是禁止特权容器apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sPSPPrivilegedContainer metadata: name: deny-privileged spec: match: kinds: - apiGroups: [] kinds: [Pod] namespaces: - tenant-*还有一条是限制 HostPath 挂载apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sPSPHostFilesystem metadata: name: deny-hostpath spec: match: kinds: - apiGroups: [] kinds: [Pod] namespaces: - tenant-* parameters: allowedHostPaths: []这些策略组合起来基本堵住了租户通过 Kubernetes API 绕过隔离的常见路径。5. 常见问题与排查技巧实录5.1 Kata Pod 启动失败的排查路径Kata Pod 启动失败是最常见的问题表现通常是 Pod 卡在ContainerCreating状态。排查路径如下第一步查看 Pod 事件kubectl describe pod pod-name -n namespace如果看到Failed to create pod sandbox的错误说明 Kata 的 VM 创建失败。这时候需要登录到节点上查看 Kata 的日志# 查看 Kata runtime 日志 journalctl -u kata-containers -n 100 --no-pager # 查看 containerd 日志中与 Kata 相关的部分 journalctl -u containerd -n 200 --no-pager | grep kata常见的失败原因和解决方法错误信息原因解决方法failed to launch VM: no such file or directoryKata VM 内核镜像缺失重新安装 kata-deploy确保镜像分发到所有节点failed to create VM: permission denied节点上 KVM 设备权限不足检查/dev/kvm权限确保 containerd 用户有访问权限failed to start VM: timeout节点资源不足或虚拟化支持异常检查节点 CPU/内存使用率验证 KVM 模块加载状态failed to mount rootfs: invalid argument存储驱动不兼容检查 Kata 配置中的存储驱动设置尝试切换 virtio-fs踩坑记录我们曾经遇到过一个诡异的问题——Kata Pod 在部分节点上启动正常在另一部分节点上一直失败。排查后发现是这些节点的内核版本较旧缺少 Cloud Hypervisor 需要的vhost-vsock模块。加载模块后问题解决。建议在节点初始化脚本里统一检查并加载 Kata 所需的全部内核模块。5.2 资源争抢与调度优化多租户环境下资源争抢是另一个高频问题。表现是某些 Agent 的响应时间突然变长或者 Pod 被频繁驱逐。排查思路是先用kubectl top看整体资源使用情况然后定位到具体节点# 查看节点资源使用 kubectl top nodes # 查看特定节点上的 Pod 资源使用 kubectl top pods --all-namespaces --field-selector spec.nodeNamenode-name如果发现某个租户的 Agent 占用了大量资源可以通过 ResourceQuota 的used字段确认kubectl describe resourcequota -n tenant-demo调度优化的几个实用技巧使用 PodAntiAffinity 打散同一租户的 Agent避免同一租户的所有 Agent 集中在少数节点上导致节点故障时影响面过大。配置 PriorityClass给不同租户等级设置不同的优先级确保高等级租户的 Agent 在资源紧张时优先调度。启用 Descheduler定期重新平衡集群中的 Pod 分布避免资源碎片化。apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: tenant-enterprise value: 100000 globalDefault: false description: 企业版租户优先级5.3 网络策略不生效的排查NetworkPolicy 配置了但流量仍然能通这是另一个常见问题。排查步骤首先确认 CNI 是否支持 NetworkPolicy。Calico、Cilium、Weave Net 都支持但 Flannel 默认不支持。kubectl get pods -n kube-system | grep -E calico|cilium|weave然后检查策略是否正确匹配了目标 Pod# 查看策略详情 kubectl describe networkpolicy policy-name -n namespace # 确认 Pod 的标签是否与策略的 selector 匹配 kubectl get pods -n namespace --show-labels如果策略配置正确但流量仍然能通可能是 CNI 的策略执行顺序问题。Calico 的 GlobalNetworkPolicy 优先级高于 Namespace 级别的 NetworkPolicy如果全局策略中有允许规则可能会覆盖租户级别的拒绝规则。建议用calicoctl查看实际生效的策略calicoctl get networkpolicy --all-namespaces -o wide calicoctl get globalnetworkpolicy -o wide5.4 存储性能问题的定位Kata 环境下的存储性能问题比较隐蔽因为从 Pod 内部看一切正常只是速度慢。定位方法是做基准测试# 在 Pod 内执行 dd if/dev/zero of/workspace/testfile bs1M count1024 oflagdirect如果写入速度明显低于预期比如低于 100MB/s可能是存储驱动的问题。检查 Kata 配置中的default_memory和default_vcpusVM 规格太小会影响 IO 性能。另外9p 文件系统在大文件传输时性能较差切换到 virtio-fs 可以显著改善。6. 安全加固与持续运营6.1 镜像安全扫描多租户环境下租户可以自由推送镜像到平台镜像仓库。必须对镜像做安全扫描防止租户无意或有意地引入漏洞。我们的方案是在镜像仓库的 CI 流水线中集成 Trivy 扫描trivy image --severity HIGH,CRITICAL --exit-code 1 registry.internal/ai-agent:latest如果扫描发现高危漏洞镜像会被拒绝推送。同时在 Kubernetes 侧用 Kyverno 或 Gatekeeper 做准入控制只允许来自可信仓库且通过扫描的镜像运行。6.2 运行时安全监控Kata 提供了 VM 级别的隔离但 VM 内部的行为仍然需要监控。我们使用 Falco 来检测异常行为- rule: Unexpected outbound connection desc: Detect outbound connections to non-whitelisted destinations condition: outbound and not fd.sip in (allowed_ips) and container output: Unexpected outbound connection (command%proc.cmdline connection%fd.name user%user.name) priority: WARNINGFalco 的规则需要针对 AI Agent 的行为模式做定制。比如Agent 正常运行时可能会访问外部 API但不会尝试读取/etc/shadow或执行nc命令。这些异常行为都应该触发告警。6.3 租户行为审计每个租户的 API 操作都需要记录审计日志。Kubernetes 的审计日志功能可以记录所有 API 请求但数据量很大需要配合日志聚合系统使用。我们的做法是配置审计策略只记录与安全相关的操作创建 Pod、修改 NetworkPolicy、访问 Secret 等然后通过 Fluent Bit 收集到 Elasticsearch 中按租户维度建立索引。apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: RequestResponse resources: - group: resources: [pods, secrets, serviceaccounts] - group: networking.k8s.io resources: [networkpolicies] namespaces: [tenant-*] - level: Metadata resources: - group: resources: [configmaps] namespaces: [tenant-*]审计日志的保留周期至少 90 天满足合规要求。同时配置告警规则当某个租户在短时间内大量创建 Pod 或修改网络策略时自动通知平台管理员。6.4 容量规划与成本分摊多租户平台的运营离不开成本分摊。我们基于 Prometheus 收集的资源使用数据按租户维度计算实际消耗# 每个租户的 CPU 使用总量按小时平均 sum( rate(container_cpu_usage_seconds_total{namespace~tenant-.*}[1h]) ) by (namespace)内存、存储、网络流量的计算类似。这些数据每月汇总一次作为向租户收费的依据。同时容量规划也基于这些历史数据——如果某个租户的资源使用持续接近配额上限就需要提前沟通扩容。实操心得成本分摊的粒度不要太细否则计算复杂且容易引起争议。我们的做法是按“资源配额”而非“实际使用量”收费这样租户有动力优化自己的 Agent 资源使用平台侧的计算也简单。配额使用率超过 80% 时自动提醒租户超过 95% 时触发扩容流程。7. 一些实际运营中的体会这套架构从 2025 年初上线到现在已经稳定运行了一年多支撑了三十多个租户、上千个 AI Agent 实例。回过头看最大的体会是多租户隔离不是一次性工程而是持续运营的过程。新的攻击手法、新的 Agent 框架、新的业务需求都会不断挑战现有的隔离边界。几个我觉得值得分享的经验第一不要追求“零信任”的完美方案。理论上最安全的方案是每个 Agent 一个独立集群但成本和运维复杂度不可接受。实际落地时要在安全、成本、效率之间找平衡点。Kata Namespace NetworkPolicy 的组合已经能挡住 99% 的风险场景剩下的 1% 通过监控和审计来兜底。第二租户的“自觉性”不可依赖。我们遇到过租户为了图方便尝试用特权容器绕过限制也遇到过租户的 Agent 代码有 bug疯狂创建子进程把节点打挂。所以策略必须是强制的不能靠“约定”或“文档”来约束。第三性能开销要提前告知租户。Kata 的启动延迟和 IO 开销是客观存在的租户在迁移 Agent 到平台时会有感知。提前沟通清楚给出租户优化建议比如复用 Pod、减少小文件读写可以避免很多扯皮。第四文档和自助工具比人工支持更重要。租户多了之后平台团队不可能手把手教每个租户怎么部署。我们做了一套自助化的部署模板和检查清单租户按照模板配置90% 的问题可以自己解决。剩下的 10% 通过工单系统处理平台团队只负责审核和排障。这套方案不是终点Kubernetes 生态在快速演进Kata 和 gVisor 的能力也在持续增强。保持关注社区动态定期评估新方案才能让平台的安全性和效率始终保持在合理水平。
返回列表