自管理的 Kubernetes 集群(kubeadm、k3s、OpenShift 以及本地部署的发行版)通过投射的服务账号令牌为每个 pod 签发 OIDC JSON Web Token(JWT)。集群的 API 服务器充当 OIDC 颁发者,每个令牌的 sub 声明遵循 system:serviceaccount:<namespace>:<service-account> 的形式。您可以通过读取集群的发现文档来找到其颁发者 URL:
kubectl get --raw /.well-known/openid-configuration | jq -r .issuer本页所述的机制(投射的服务账号令牌、集群 API 服务器作为 OIDC 颁发者)是 Kubernetes 本身的原生机制,因此它是所有 Kubernetes 发行版的基础。如果您使用托管的 Kubernetes 服务,云提供商指南会介绍在哪里找到由提供商管理的颁发者 URL:AWS (EKS)、Google Cloud (GKE) 或 Azure (AKS)。如果您的集群运行 SPIRE,则颁发者是 SPIRE OIDC Discovery Provider 而不是集群 API 服务器;请参阅 SPIFFE。对于其他任何发行版或未在此列出的托管提供商,请按照本指南操作,并使用您的集群报告的颁发者 URL。
--service-account-issuer 标志的 Kubernetes 集群。大多数发行版默认设置此项;kubeadm 集群通常使用 https://kubernetes.default.svc.cluster.local。如果您无法直接访问 API 服务器配置,您的平台团队可以确认该值。inline 模式注册它(在配置 Anthropic 中介绍)。使用您的联合规则所期望的受众(audience)和有效期,将服务账号令牌投射到您的 pod 中。serviceAccountToken 投射会将新的 JWT 写入挂载路径,并在 expirationSeconds 到期之前进行轮换。
apiVersion: v1
kind: Pod
metadata:
name: inference-worker
namespace: inference
spec:
serviceAccountName: inference-worker
volumes:
- name: anthropic-token
projected:
sources:
- serviceAccountToken:
audience: https://api.anthropic.com
expirationSeconds: 3600
path: token
containers:
- name: app
image: your-registry/inference-worker:latest
env:
- name: ANTHROPIC_IDENTITY_TOKEN_FILE
value: /var/run/secrets/anthropic.com/token
- name: ANTHROPIC_FEDERATION_RULE_ID
value: fdrl_...
- name: ANTHROPIC_ORGANIZATION_ID
value: 00000000-0000-0000-0000-000000000000
- name: ANTHROPIC_SERVICE_ACCOUNT_ID
value: svac_...
- name: ANTHROPIC_WORKSPACE_ID # required when the rule covers multiple workspaces
value: wrkspc_...
volumeMounts:
- name: anthropic-token
mountPath: /var/run/secrets/anthropic.com
readOnly: true为此 pod 签发的令牌携带 sub: "system:serviceaccount:inference:inference-worker" 和 aud: ["https://api.anthropic.com"]。
在 Claude Console 中,打开 Settings → Workload identity,点击 Connect workload,然后选择 Kubernetes 磁贴。向导将引导您完成注册颁发者、创建服务账号和创建联合规则的过程。
向导会为您创建这些资源。无论您是在向导中输入这些值,还是将其发送到 Admin API,请使用以下值:
联合颁发者: 许多自管理集群使用诸如 https://kubernetes.default.svc.cluster.local 之类的颁发者 URL,该 URL 无法从公共互联网访问。如果您的集群属于这种情况,请选择 inline JWKS 来源并粘贴集群的密钥。从集群内部获取它们:
kubectl get --raw /openid/v1/jwks然后使用返回的 keys 数组的内容(而不是外层的 {"keys": [...]} 包装)来配置颁发者:
{
"name": "onprem-k8s",
"issuer_url": "https://kubernetes.default.svc.cluster.local",
"jwks": {
"type": "inline",
"keys": [{ "kty": "RSA", "kid": "...", "n": "...", "e": "AQAB" }]
}
}在 inline 模式下,issuer_url 仅与 JWT 的 iss 声明进行比较;Anthropic 从不尝试访问它。如果您的颁发者可以公开访问,请改用 "jwks": {"type": "discovery"}。
使用 inline 密钥时,当集群轮换其服务账号签名密钥时,您需要负责更新颁发者。轮换很少发生(通常仅在集群升级期间),但在您推送新的 JWKS 之前,令牌交换会因签名错误而失败。
联合规则: 匹配服务账号的 sub 声明以及您在投射令牌上设置的受众。
{
"name": "onprem-inference",
"issuer_id": "fdis_...",
"match": {
"subject_prefix": "system:serviceaccount:inference:inference-worker",
"audience": "https://api.anthropic.com"
},
"target": {
"type": "service_account",
"service_account_id": "svac_..."
},
"workspace_id": "wrkspc_...",
"oauth_scope": "workspace:developer",
"token_lifetime_seconds": 600
}在工作负载允许的范围内尽可能具体。仅当命名空间中的每个服务账号都应映射到同一个 Anthropic 服务账号时,才将 subject_prefix 放宽为 system:serviceaccount:inference:*(末尾的 * 使其成为前缀匹配)。将规则的 fdrl_... ID 添加到您 pod 的 ANTHROPIC_FEDERATION_RULE_ID 环境变量中。
配置 Kubernetes 中的 pod 规范将 ANTHROPIC_IDENTITY_TOKEN_FILE 设置为投射的挂载路径,同时还设置了 ANTHROPIC_FEDERATION_RULE_ID、ANTHROPIC_ORGANIZATION_ID、ANTHROPIC_SERVICE_ACCOUNT_ID 和 ANTHROPIC_WORKSPACE_ID。有了这些配置,SDK 会在每次交换时从磁盘读取令牌,并自动刷新 Anthropic 访问令牌。
import anthropic
# 读取 ANTHROPIC_IDENTITY_TOKEN_FILE、ANTHROPIC_FEDERATION_RULE_ID、
# ANTHROPIC_ORGANIZATION_ID、ANTHROPIC_SERVICE_ACCOUNT_ID 和 ANTHROPIC_WORKSPACE_ID,
# 这些值均读取自 pod 的环境。
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(next(block.text for block in message.content if block.type == "text"))成功的交换会返回一个以 sk-ant-oat01- 开头的 access_token 和一个以秒为单位的 expires_in 值。如果出现 400 invalid_grant,请参阅排查失败的交换;Kubernetes 侧最常见的原因是 JWKS 密钥不匹配(对于 inline 模式,请使用 kubectl get --raw /openid/v1/jwks 重新获取并更新颁发者)。
subject_prefix 为 system:serviceaccount:* 会匹配集群中的每个服务账号,因此任何 pod 都可以获取联合的 Anthropic 令牌。如果没有 audience 匹配器,该规则还会匹配集群的默认受众令牌,而每个 pod 都已经投射了这些令牌。
将规则的 match 块锁定到适合您用例的最窄范围:
system:serviceaccount:<namespace>:<name> 值,末尾不带 *。audience,并在 pod 的 serviceAccountToken 投射上设置相同的值,以便拒绝默认受众令牌。Was this page helpful?