1. 项目缘起:当AI智能体涌入Kubernetes,我们缺了什么?
最近半年,我所在的团队一直在探索如何将各类AI智能体(Agent)安全、高效地部署到Kubernetes集群中。从简单的任务调度器到复杂的多步推理工作流,我们尝试了各种框架和模式。但很快,一个比“如何运行”更根本的问题浮出水面:在一个动态、多租户的K8s环境里,我们如何知道“谁”在运行?如何信任它?以及,当我们需要调用某个特定能力的智能体时,又该如何精准地找到它?
这听起来像是服务发现(Service Discovery)和身份认证(Identity)的老问题,但AI智能体带来了全新的挑战。传统的K8s Service通过标签(Label)选择器来暴露一组Pod,其核心假设是后端实例是相对静态、功能同质的。而AI智能体往往是有状态的、能力异构的、生命周期多变的。一个负责代码审查的Agent和一个负责日志分析的Agent,虽然都是Pod,但它们的“身份”远不止一个IP地址或服务名那么简单。这个身份需要包含其能力描述、所属项目、版本、甚至其训练数据的哈希或模型指纹,以便调用方能够验证其可信度。
更棘手的是治理(Governance)。当成百上千个由不同团队、甚至不同供应商开发的AI智能体在集群中共存时,如何审计它们的调用链?如何实施基于能力的访问控制(比如,只有经过安全审计的“金融数据查询Agent”才能访问生产数据库)?如何确保一个声称是“最新版翻译Agent”的Pod,没有被恶意替换或篡改?
现有的K8s原生资源,如Service、ConfigMap、乃至新兴的ServiceEntry(Istio),都无法完整地承载这些元数据和安全诉求。我们需要的不是一个简单的服务注册中心,而是一个面向AI智能体的、可验证的信任层。这就是我们启动“Agent Name Service”(ANS)概念验证项目的核心动机。它不是一个要替代现有系统的庞然大物,而是一个轻量的、增量的信任层,旨在为Kubernetes中的AI智能体生态补上最关键的一块拼图。
2. ANS核心架构:一个基于声明式身份的信任三角
ANS的设计哲学非常明确:轻量、声明式、可验证。我们不希望引入一个中心化的、沉重的控制平面,而是充分利用Kubernetes已有的扩展能力和声明式API的理念。整个系统的核心围绕着三个关键概念构建,我称之为“信任三角”:身份声明(Identity Claim)、信任锚点(Trust Anchor)和发现端点(Discovery Endpoint)。
2.1 身份声明:从Pod到“可信智能体”
在K8s里,一个Pod最基本的身份是它的名称和命名空间。但这对于智能体来说远远不够。ANS引入了一个新的自定义资源定义(CRD):AgentIdentity。
apiVersion: ans.acme.corp/v1alpha1 kind: AgentIdentity metadata: name: code-review-agent-v1 namespace: platform-team spec: # 核心身份描述 agentRef: kind: Deployment name: code-review-agent namespace: platform-team capabilities: - name: "code_review" version: "1.2.0" description: "Static analysis and security vulnerability detection for Python/Go code." inputSchema: {...} # OpenAPI Schema 片段 outputSchema: {...} # 可验证的凭证 verifiableCredentials: - type: "ModelIntegrity" issuer: "internal-model-registry.acme.corp" claim: "sha256:abc123..." # 容器镜像中模型文件的哈希 proof: "jwt:eyJ..." # 由签发者签名的JWT - type: "SecurityAudit" issuer: "security-team.acme.corp" claim: "passed_penetration_test_v2" validUntil: "2024-12-31T23:59:59Z" # 治理元数据 owner: "platform-engineering@acme.corp" project: "devsecops-automation" lifecycleStage: "production"这个AgentIdentity资源就是智能体的“身份证”。它不直接控制Pod的创建,而是通过agentRef关联到实际的工作负载(Deployment、StatefulSet等)。capabilities字段是关键,它用结构化的方式描述了智能体能做什么,这比K8s Label的键值对更丰富、更机器可读。verifiableCredentials是信任的基石,它允许外部权威机构(如内部模型仓库、安全团队)为智能体的特定属性(如模型完整性、安全审计状态)背书,并生成密码学证明。
为什么选择CRD而不是Annotation?我们最初考虑过用Pod Annotation来存储这些信息。但CRD提供了更强的类型安全、独立的生命周期管理(智能体身份可以在Pod重建后依然存在)、以及更便捷的查询能力(通过K8s API)。更重要的是,它符合K8s的“资源即状态”哲学。
2.2 信任锚点:如何建立和传递信任
有了身份声明,接下来要解决“谁说了算”的问题。在零信任架构中,我们不能默认信任集群内的任何实体。ANS的信任模型基于公钥基础设施(PKI)的简化变体。
根信任锚(Root Trust Anchor):在集群初始化时,由集群管理员部署一个包含公钥的ConfigMap,或者更佳实践是使用K8s的
CertificateSigningRequest(CSR) API关联一个外部证书颁发机构(CA)。这个锚点对所有AgentIdentity中verifiableCredentials的签发者(issuer)进行认证。凭证签发者(Credential Issuers):像“内部模型仓库”、“安全团队”这些实体,它们需要向根信任锚证明自己的身份,并获得签发特定类型凭证的权限。在PoC中,我们通过为这些服务配置特定的ServiceAccount并绑定相应的RBAC角色来实现,其行为记录可通过K8s审计日志追踪。
凭证验证链:当一个服务(消费者)需要调用某个智能体时,它从ANS发现端点获取到目标
AgentIdentity。消费者并不需要完全理解所有凭证,它只需要验证两点:第一,凭证的签发者(issuer)是否在它信任的列表中(这个列表可以来自根信任锚);第二,凭证的签名(proof)是否有效。这个过程可以在消费者端离线完成,无需每次都查询中心化的授权服务。
这个设计的巧妙之处在于解耦。安全团队只负责签发“安全审计通过”的凭证,模型仓库只负责签发“模型哈希一致”的凭证。智能体的所有者负责将这些凭证收集起来,声明在自己的AgentIdentity中。而智能体的消费者,则可以根据自己的安全策略,决定需要哪些凭证才能建立信任(例如,“对于处理PII数据的智能体,必须同时具备‘安全审计’和‘数据加密认证’两张凭证”)。
2.3 发现端点:超越Kubernetes Service的智能查找
传统的服务发现(kubectl get svc或DNS查询)返回的是IP和端口。ANS的发现端点(一个简单的HTTP/gRPC服务)返回的是富语义的智能体身份信息。
发现端点提供两种主要查询模式:
- 精确发现:通过唯一的
AgentIdentity名称进行查询。这适用于已知确切身份的调用场景。 - 能力发现:这是更强大的功能。消费者可以提交一个“能力需求清单”进行查询。
发现端点会扫描所有{ "requiredCapabilities": [ {"name": "sentiment_analysis", "minVersion": "2.0.0"}, {"name": "chinese_language"} ], "requiredCredentials": [ {"type": "ModelIntegrity", "issuer": "trusted-model-hub"}, {"type": "DataPrivacy", "level": "gdpr_compliant"} ] }AgentIdentity,找出同时满足能力要求和凭证要求的智能体,并返回它们的访问端点(通常是关联的K8s Service地址)和完整的身份信息。
这个发现端点本身是无状态的,它通过监听K8s API Server,实时索引集群内所有的AgentIdentity资源。它的高可用可以通过简单的Deployment多副本来实现。为了性能,我们可以在内存中维护一个索引,按能力和凭证类型进行倒排,使得即使面对上千个智能体,查询也能在毫秒级返回。
3. 在Kubernetes中的集成与实践:从概念到运行
设计理念再美好,也需要落地。接下来,我将详细拆解如何将一个现有的AI智能体工作负载接入ANS体系,并展示一个完整的互操作流程。
3.1 准备工作:部署ANS控制平面组件
ANS的控制平面非常精简,主要由三部分组成:
- ANS Operator:这是一个标准的K8s Operator,负责管理
AgentIdentityCRD,并确保其状态与关联的工作负载一致(例如,当对应的Deployment被删除时,清理孤立的AgentIdentity)。使用Operator Framework(如Kubebuilder)开发,部署为一个Deployment。 - 发现端点服务(Discovery Endpoint Service):如前所述,一个提供查询API的服务。我们选择用Go编写,利用client-go库监听
AgentIdentity资源的变化。它通过ClusterIP Service暴露。 - 信任锚点配置:我们选择使用K8s的
ValidatingWebhookConfiguration和自签证书作为一个轻量级的起点。为简化PoC,我们预先将受信任的签发者公钥以ConfigMap形式挂载到发现端点和关键消费者Pod中。
部署清单大致如下:
# 1. 安装CRD kubectl apply -f deploy/crd/agentidentity.yaml # 2. 部署ANS Operator和RBAC配置 kubectl apply -f deploy/operator.yaml # 3. 部署发现端点 kubectl apply -f deploy/discovery-service.yaml # 4. 配置信任锚(示例:将一个已知公钥存入ConfigMap) kubectl create configmap ans-trust-anchors --from-file=public-key.pem=./keys/trusted-issuer.pub3.2 为你的AI智能体申领“身份证”
假设我们有一个已部署的“代码安全扫描智能体”,其Deployment名为code-scanner。接入ANS分为三步:
第一步:由智能体所有者创建AgentIdentity。
# code-scanner-identity.yaml apiVersion: ans.acme.corp/v1alpha1 kind: AgentIdentity metadata: name: prod-code-scanner namespace: ai-agents spec: agentRef: kind: Deployment name: code-scanner namespace: ai-agents capabilities: - name: "static_analysis" version: "3.1.0" description: "Detects security vulnerabilities (SQLi, XSS, etc.) in Java and Python code." inputSchema: type: object properties: repositoryUrl: type: string branch: type: string required: ["repositoryUrl"] verifiableCredentials: # 假设我们已经从内部安全扫描服务获取了一个签名的JWT凭证 - type: "SecurityScan" issuer: "internal-security-scanner.svc.cluster.local" claim: "severity_critical_zero" proof: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." # 实际的JWT令牌 owner: "appsec-team@acme.corp"应用这个YAML文件:kubectl apply -f code-scanner-identity.yaml。ANS Operator会验证agentRef引用的Deployment是否存在,并将该AgentIdentity标记为Bound状态。
第二步:获取可验证的凭证(关键步骤)。这是建立信任的核心。在我们的PoC中,我们模拟了一个“内部安全扫描服务”。该服务有一个独立的Pod,其ServiceAccount被授权使用特定的签名密钥。智能体部署后,流水线可以调用这个扫描服务的API,对智能体的容器镜像进行扫描。扫描通过后,该服务会签发一个包含扫描结果(如severity_critical_zero)并附有数字签名的JWT令牌。这个令牌就是verifiableCredentials中的proof。
第三步:更新Service以供发现。这步是可选的,但建议操作。为了能让发现端点将AgentIdentity解析为可访问的网络端点,最佳实践是确保智能体工作负载有一个同名的K8s Service。ANS发现端点会默认尝试查找<agentRef.name>这个Service。如果Service名称不同,可以在AgentIdentity的status字段或通过注解来指定。
3.3 消费者如何发现并调用一个可信智能体
现在,另一个团队想要在CI流水线中集成代码安全扫描。他们不需要知道智能体具体部署在哪里,只需要找到一个可信的、具备该能力的智能体。
第一步:查询发现端点。消费者Pod(或外部服务)可以向集群内的发现端点发起查询:
# 通过能力查找 curl -X POST http://ans-discovery.ai-system.svc.cluster.local/discover \ -H "Content-Type: application/json" \ -d '{ "requiredCapabilities": [{"name": "static_analysis", "minVersion": "3.0.0"}], "requiredCredentials": [{"type": "SecurityScan"}] }'第二步:处理发现结果。发现端点会返回一个JSON数组,包含匹配的智能体身份和访问信息:
[ { "identity": { "name": "prod-code-scanner", "namespace": "ai-agents", "capabilities": [...], "verifiableCredentials": [...] }, "endpoint": "http://code-scanner.ai-agents.svc.cluster.local:8080", "verified": true // 表示发现端点已初步验证凭证签名 } ]注意:发现端点返回的
verified: true仅代表它验证了凭证的签名有效性。消费者必须根据自身的安全策略,对凭证的具体声明(claim)进行二次校验。例如,安全策略可能要求SecurityScan凭证的claim必须是最近7天内签发的。
第三步:执行调用与验证。消费者可以选择verified为true且评分最高的智能体(未来可以加入健康状态、负载等指标)。在发起实际业务请求前,一个严谨的消费者应该:
- 从返回的
verifiableCredentials中提取出JWT令牌(proof)。 - 使用本地配置的、来自信任锚点的公钥,验证JWT的签名,确保凭证未被篡改。
- 检查JWT中的声明(如
issuer,claim,exp)是否符合自己的策略要求。
只有全部验证通过,消费者才向endpoint发起业务请求。这个过程虽然增加了少量开销,但实现了去中心化的、基于密码学的信任验证,避免了将所有信任决策依赖于一个中心化的网关。
4. 深入治理:策略引擎与可观测性增强
ANS提供的身份层,为更高级别的治理奠定了数据基础。在PoC中,我们探索了两个关键的治理扩展:动态策略执行和增强的可观测性。
4.1 基于OPA/Gatekeeper的策略执行
开放策略代理(OPA)和它的K8s原生项目Gatekeeper,是定义和执行集群策略的事实标准。结合ANS的AgentIdentity,我们可以实现精细化的治理规则。
例如,我们可以定义一个Gatekeeper约束模板(Constraint Template),禁止任何没有有效“数据隐私凭证”的智能体被挂载含有敏感数据的卷:
# 约束模板:require-data-credential-for-sensitive-volume apiVersion: templates.gatekeeper.io/v1beta1 kind: ConstraintTemplate metadata: name: requiredatacredentialforsensitivevolume spec: crd: spec: names: kind: RequireDataCredentialForSensitiveVolume targets: - target: admission.k8s.gatekeeper.sh rego: | package requiredatacredentialforsensitivevolume violation[{"msg": msg}] { # 1. 检查Pod是否挂载了标记为敏感的卷 input.review.object.kind == "Pod" volume := input.review.object.spec.volumes[_] volume.secret != null volume.secret.secretName == "prod-database-credentials" # 示例敏感密钥 # 2. 查找Pod对应的AgentIdentity(通过标签或所有者引用) identity := data.inventory.namespace[namespace][“agentidentities.ans.acme.corp/v1alpha1”][name] # 3. 检查Identity中是否包含所需的凭证 not cred := identity.spec.verifiableCredentials[_] cred.type == "DataPrivacy" cred.issuer == "compliance-team.acme.corp" # 4. 如果不满足,则生成违规信息 msg := sprintf("Pod %v uses sensitive volume but its AgentIdentity lacks required DataPrivacy credential", [input.review.object.metadata.name]) }然后创建一个约束实例:
apiVersion: constraints.gatekeeper.io/v1beta1 kind: RequireDataCredentialForSensitiveVolume metadata: name: require-data-cred-for-db-secret spec: match: namespaces: ["ai-agents"]当有人尝试部署一个挂载了prod-database-credentialsSecret但未关联合规AgentIdentity的Pod时,Gatekeeper会在准入阶段直接拒绝该请求。这实现了“基于身份的治理”,策略的触发条件从简单的资源属性,升级到了智能体可验证的信用属性。
4.2 可观测性:在链路追踪中注入身份信息
在微服务架构中,分布式追踪(如Jaeger、Zipkin)通过TraceID将一次请求的多个服务调用串联起来。对于AI智能体调用链,我们同样需要这种可见性,并且希望看到更丰富的身份信息。
ANS可以与OpenTelemetry这样的可观测性框架集成。在每个智能体的Pod中,注入一个OpenTelemetry Sidecar或直接在应用代码中集成SDK。在创建Span(代表一个工作单元)时,除了常规的标签,还可以将AgentIdentity中的关键信息添加进去,例如:
agent.identity.name:prod-code-scanneragent.capability:static_analysis@3.1.0agent.credential.security_scan:passed
这样,在追踪UI中查看一个CI流水线的调用链时,你不仅能看到它调用了service-a和service-b,还能清晰地看到它调用了**“具备安全扫描凭证的生产环境代码扫描智能体(v3.1.0)”**。当出现问题时(例如扫描结果异常),你可以快速定位到具体是哪个版本的哪个智能体,并查验其凭证状态,极大提升了排查效率。
这个集成的价值在于将运维数据(追踪、日志)与安全/信任数据(身份、凭证)关联了起来,为故障诊断、合规审计和安全事件调查提供了统一的上下文。
5. 概念验证的挑战、取舍与未来演进
在构建这个PoC的过程中,我们遇到了不少预料之中和预料之外的挑战,也做出了一些关键取舍。
挑战一:凭证的生命周期管理。verifiableCredentials中的JWT令牌会有过期时间。如何自动轮换?我们的方案是引入一个“凭证续订器”(Credential Renewer)作为DaemonSet运行。它监视所有AgentIdentity,在凭证过期前,调用相应的凭证签发者服务申请新的令牌,并更新AgentIdentity资源。这要求签发者服务提供续订API,并且更新操作需要被RBAC严格控制。
挑战二:性能与规模。发现端点的内存索引在智能体数量极大(数万)时可能成为瓶颈。下一步演进方向是引入分片索引或使用外部键值存储(如etcd的直接前缀查询)。此外,消费者端的JWT验证虽轻量,但在超高频调用场景下,可以考虑使用短期缓存的验证结果。
挑战三:跨集群与混合云场景。PoC聚焦于单个K8s集群。但在现实中,智能体可能分布在多个集群、甚至云厂商之间。ANS的架构可以扩展:每个集群部署自己的ANS实例,管理本集群的AgentIdentity。然后,通过一个全局的、更上层的“联邦发现服务”来聚合各集群的目录。信任锚点也需要升级,可能需要一个全局的、多集群认可的根CA体系。
关键取舍:深度集成 vs. 外部系统。我们曾讨论是否直接使用SPIFFE/SPIRE作为身份基础。SPIFFE提供了强大的、标准化的身份框架。但考虑到AI智能体身份信息的丰富性(能力描述、治理元数据)和我们需要深度集成K8s资源模型,最终决定基于CRD自建一层。ANS可以看作是SPIFFE在AI智能体领域的一个“特化实现”,未来完全有可能将AgentIdentity的verifiableCredentials与SPIFFE Verifiable Identity Document (SVID) 进行映射或融合。
未来演进方向:
- 标准化能力描述:
capabilities字段的Schema可以尝试对齐诸如MLflow Model Registry、OpenAI Function Calling等生态的标准,促进互操作性。 - 智能体市场与调度:结合能力发现,可以构建一个集群内的“智能体市场”。更高级的调度器可以根据任务需求(“需要图像识别和中文NLP”),自动选择并调度满足条件且可信的智能体实例。
- 策略即代码的深化:将更多的治理逻辑,如访问控制、资源配额、成本归属,与
AgentIdentity绑定,实现真正的“身份驱动治理”。
这个ANS的PoC项目让我们深刻认识到,在云原生AI时代,身份是新的边界。Kubernetes提供了卓越的“计算调度层”,而我们需要一个与之匹配的“智能体信任层”来管理其中的主体。ANS的探索只是一个开始,它的核心价值在于提出了一种基于声明式、可验证身份的治理范式,这或许能为未来多智能体系统的安全协作,打下第一块基石。