Самоуправляемые кластеры Kubernetes (kubeadm, k3s, OpenShift и локальные дистрибутивы) подписывают OIDC «JSON Web Tokens» (веб-токены 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 на API-сервере. Большинство дистрибутивов устанавливают его по умолчанию; кластеры kubeadm обычно используют https://kubernetes.default.svc.cluster.local. Ваша платформенная команда может подтвердить значение, если у вас нет прямого доступа к конфигурации API-сервера.inline (описано в разделе Настройка Anthropic).Спроецируйте токен сервисного аккаунта в ваш под с аудиторией и сроком действия, которые ожидает ваше правило федерации. Проекция 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Токен, выпущенный для этого пода, содержит sub: "system:serviceaccount:inference:inference-worker" и aud: ["https://api.anthropic.com"].
В Claude Console откройте Settings → Workload identity, нажмите Connect workload и выберите плитку Kubernetes. Мастер проведёт вас через регистрацию издателя, создание сервисного аккаунта и создание правила федерации.
Мастер создаёт эти ресурсы за вас. Используйте следующие значения независимо от того, вводите ли вы их в мастере или отправляете в Admin API:
Издатель федерации: Многие самоуправляемые кластеры используют URL издателя, такой как https://kubernetes.default.svc.cluster.local, который недоступен из публичного интернета. Если это относится к вашему кластеру, выберите источник JWKS inline и вставьте ключи кластера. Получите их изнутри кластера:
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 только сравнивается с утверждением iss в JWT; 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
}Будьте настолько конкретны, насколько позволяет рабочая нагрузка. Ослабляйте subject_prefix до system:serviceaccount:inference:* (завершающий * делает его префиксным сопоставлением) только в том случае, если каждый сервисный аккаунт в пространстве имён должен сопоставляться с одним и тем же сервисным аккаунтом Anthropic. Добавьте идентификатор правила fdrl_... в переменную окружения ANTHROPIC_FEDERATION_RULE_ID вашего пода.
Спецификация пода в разделе Настройка Kubernetes устанавливает 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
# из окружения пода.
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)Успешный обмен возвращает access_token, начинающийся с sk-ant-oat01-, и значение expires_in в секундах. При ошибке 400 invalid_grant см. Устранение неполадок при неудачном обмене; наиболее частая причина со стороны Kubernetes — несоответствие ключей JWKS (для режима inline повторно получите их с помощью kubectl get --raw /openid/v1/jwks и обновите издателя).
Значение subject_prefix, равное system:serviceaccount:*, соответствует каждому сервисному аккаунту в кластере, поэтому любой под может получить федеративный токен Anthropic. Без сопоставителя audience правило также соответствует токенам с аудиторией по умолчанию кластера, которые уже спроецированы в каждый под.
Ограничьте блок match правила до самой узкой области, подходящей для вашего сценария использования:
system:serviceaccount:<namespace>:<name> без завершающего *.audience в правиле и задавайте то же значение в проекции serviceAccountToken пода, чтобы токены с аудиторией по умолчанию отклонялись.Was this page helpful?