Самоуправляемые кластеры 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"].
Следуйте пошаговому руководству по настройке, чтобы зарегистрировать эмитент федерации, создать сервисный аккаунт Anthropic и создать правило федерации в Claude Console. Используйте следующие значения, специфичные для Kubernetes.
Эмитент федерации: Многие самоуправляемые кластеры используют 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_source": "inline",
"jwks_keys": [{ "kty": "RSA", "kid": "...", "n": "...", "e": "AQAB" }]
}В режиме inline значение issuer_url только сравнивается с утверждением iss в JWT; Anthropic никогда не пытается обратиться по этому адресу. Если ваш эмитент публично доступен, используйте вместо этого "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
}Будьте настолько конкретны, насколько позволяет рабочая нагрузка. Ослабляйте 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?