Selbstverwaltete Kubernetes-Cluster (kubeadm, k3s, OpenShift und On-Premises-Distributionen) signieren OIDC JSON Web Tokens (JWTs) für jeden Pod über projizierte Service-Account-Tokens. Der API-Server des Clusters fungiert als OIDC-Issuer, und der sub-Claim jedes Tokens folgt der Form system:serviceaccount:<namespace>:<service-account>. Du findest die Issuer-URL deines Clusters, indem du dessen Discovery-Dokument liest:
kubectl get --raw /.well-known/openid-configuration | jq -r .issuerDer Mechanismus auf dieser Seite (projiziertes Service-Account-Token, Cluster-API-Server als OIDC-Issuer) ist nativ in Kubernetes selbst enthalten und liegt daher jeder Kubernetes-Distribution zugrunde. Wenn du einen verwalteten Kubernetes-Dienst nutzt, zeigen dir die Cloud-Provider-Leitfäden, wo du die vom Provider verwaltete Issuer-URL findest: AWS (EKS), Google Cloud (GKE) oder Azure (AKS). Wenn dein Cluster SPIRE ausführt, ist der SPIRE OIDC Discovery Provider der Issuer und nicht der Cluster-API-Server; siehe SPIFFE. Für jede andere Distribution oder einen dort nicht aufgeführten verwalteten Provider folge diesem Leitfaden und verwende die Issuer-URL, die dein Cluster meldet.
--service-account-issuer auf dem API-Server konfiguriert ist. Die meisten Distributionen setzen dies standardmäßig; kubeadm-Cluster verwenden typischerweise https://kubernetes.default.svc.cluster.local. Dein Plattform-Team kann den Wert bestätigen, wenn du keinen direkten Zugriff auf die API-Server-Konfiguration hast.inline-Modus registrieren (behandelt in Anthropic konfigurieren).Projiziere ein Service-Account-Token in deinen Pod mit der Audience und Lebensdauer, die deine Federation Rule erwartet. Die serviceAccountToken-Projektion schreibt ein frisches JWT in den Mount-Pfad und rotiert es, bevor expirationSeconds abläuft.
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: trueDas für diesen Pod ausgestellte Token trägt sub: "system:serviceaccount:inference:inference-worker" und aud: ["https://api.anthropic.com"].
Öffne in der Claude Console Settings → Workload identity, klicke auf Connect workload und wähle die Kachel Kubernetes. Der Assistent führt dich durch die Registrierung des Issuers, die Erstellung eines Service Accounts und die Erstellung einer Federation Rule.
Der Assistent erstellt diese Ressourcen für dich. Verwende die folgenden Werte, unabhängig davon, ob du sie im Assistenten eingibst oder an die Admin API sendest:
Federation Issuer: Viele selbstverwaltete Cluster verwenden eine Issuer-URL wie https://kubernetes.default.svc.cluster.local, die nicht aus dem öffentlichen Internet erreichbar ist. Wenn das auf deinen Cluster zutrifft, wähle die inline-JWKS-Quelle und füge die Schlüssel des Clusters ein. Rufe sie aus dem Inneren des Clusters ab:
kubectl get --raw /openid/v1/jwksKonfiguriere dann den Issuer mit dem Inhalt des zurückgegebenen keys-Arrays (nicht mit dem umgebenden {"keys": [...]}-Wrapper):
{
"name": "onprem-k8s",
"issuer_url": "https://kubernetes.default.svc.cluster.local",
"jwks": {
"type": "inline",
"keys": [{ "kty": "RSA", "kid": "...", "n": "...", "e": "AQAB" }]
}
}Im inline-Modus wird die issuer_url nur mit dem iss-Claim des JWT verglichen; Anthropic versucht niemals, sie zu erreichen. Wenn dein Issuer öffentlich erreichbar ist, verwende stattdessen "jwks": {"type": "discovery"}.
Mit inline-Schlüsseln bist du dafür verantwortlich, den Issuer zu aktualisieren, wenn der Cluster seinen Service-Account-Signaturschlüssel rotiert. Rotation ist selten (typischerweise nur bei Cluster-Upgrades), aber Token-Austausche schlagen mit einem Signaturfehler fehl, bis du das neue JWKS überträgst.
Federation Rule: Gleiche den sub-Claim des Service Accounts und die Audience ab, die du auf dem projizierten Token gesetzt hast.
{
"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
}Sei so spezifisch, wie es der Workload erlaubt. Lockere subject_prefix nur dann auf system:serviceaccount:inference:* (das abschließende * macht daraus einen Präfix-Match), wenn jeder Service Account im Namespace demselben Anthropic Service Account zugeordnet werden soll. Füge die fdrl_...-ID der Regel zur Umgebungsvariable ANTHROPIC_FEDERATION_RULE_ID deines Pods hinzu.
Die Pod-Spezifikation in Kubernetes konfigurieren setzt ANTHROPIC_IDENTITY_TOKEN_FILE auf den projizierten Mount-Pfad, zusammen mit ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID und ANTHROPIC_WORKSPACE_ID. Wenn diese gesetzt sind, liest das SDK das Token bei jedem Austausch von der Festplatte und aktualisiert das Anthropic-Access-Token automatisch.
import anthropic
# Liest ANTHROPIC_IDENTITY_TOKEN_FILE, ANTHROPIC_FEDERATION_RULE_ID,
# ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID und ANTHROPIC_WORKSPACE_ID
# aus der Umgebung des Pods.
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"))Ein erfolgreicher Austausch gibt ein access_token zurück, das mit sk-ant-oat01- beginnt, sowie einen expires_in-Wert in Sekunden. Bei 400 invalid_grant siehe Fehlgeschlagenen Austausch beheben; die häufigste Ursache auf Kubernetes-Seite ist eine JWKS-Schlüssel-Diskrepanz (für den inline-Modus: rufe das JWKS mit kubectl get --raw /openid/v1/jwks erneut ab und aktualisiere den Issuer).
Ein subject_prefix von system:serviceaccount:* passt auf jeden Service Account im Cluster, sodass jeder Pod ein föderiertes Anthropic-Token erhalten kann. Ohne einen audience-Matcher passt die Regel auch auf die Default-Audience-Tokens des Clusters, die jeder Pod bereits projiziert hat.
Beschränke den match-Block der Regel auf den engsten Umfang, der zu deinem Anwendungsfall passt:
system:serviceaccount:<namespace>:<name> ohne abschließendes *.audience in der Regel und setze denselben Wert in der serviceAccountToken-Projektion des Pods, damit Default-Audience-Tokens abgelehnt werden.Was this page helpful?