自行管理的 Kubernetes 叢集(kubeadm、k3s、OpenShift 以及本地部署的發行版)會透過投射的服務帳戶權杖為每個 Pod 簽署 OIDC「JSON Web Token」(JSON 網路權杖),即 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)。將服務帳戶權杖投射到您的 Pod 中,並設定您的聯合規則所預期的受眾(audience)和存留期。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 中註冊聯合簽發者、建立 Anthropic 服務帳戶,並建立聯合規則。請使用以下 Kubernetes 專屬的值。
聯合簽發者: 許多自行管理的叢集使用無法從公開網際網路存取的簽發者 URL,例如 https://kubernetes.default.svc.cluster.local。如果您的叢集屬於這種情況,請選擇 inline JWKS 來源並貼上叢集的金鑰。從叢集內部擷取這些金鑰:
kubectl get --raw /openid/v1/jwks然後使用回傳的 keys 陣列內容(而非外層的 {"keys": [...]} 包裝)來設定簽發者:
{
"name": "onprem-k8s",
"issuer_url": "https://kubernetes.default.svc.cluster.local",
"jwks_source": "inline",
"jwks_keys": [{ "kty": "RSA", "kid": "...", "n": "...", "e": "AQAB" }]
}在 inline 模式下,issuer_url 僅用於與 JWT 的 iss 宣告進行比對;Anthropic 絕不會嘗試連線至該 URL。如果您的簽發者可公開存取,請改用 "jwks_source": "discovery" 並省略 jwks_keys。
使用 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-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message.content[0].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?