Самоуправляемые кластеры Kubernetes (kubeadm, k3s, OpenShift и локальные дистрибутивы) подписывают OIDC JSON Web Tokens (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-opus-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(next(block.text for block in message.content if block.type == "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?