Не удалось получить токен из службы метаданных Google Compute Engine. Статус: 404

#google-cloud-platform #google-kubernetes-engine #gcloud #google-cloud-sql #cloud-sql-proxy

# #google-облачная платформа #google-kubernetes-engine #gcloud #google-cloud-sql #облако-sql-прокси

Вопрос:

Я пытаюсь настроить облачный SQL-прокси, работающий как sidecar в моем кластере GKE. Настройка выполняется с помощью Terraform. Я настроил идентификатор рабочей нагрузки, требуемые учетные записи служб и так далее. При запуске ./cloud_sql_proxy из кластера GKE ( kubectl run -it --image google/cloud-sdk:slim --serviceaccount ksa-name --namespace k8s-namespace workload-identity-test ) я получаю следующий вывод:

 root@workload-identity-test:/# ./cloud_sql_proxy -instances=project-id:europe-west4:db-instance=tcp:5432
2020/11/24 17:18:39 current FDs rlimit set to 1048576, wanted limit is 8500. Nothing to do here.
2020/11/24 17:18:40 GcloudConfig: error reading config: exit status 1; stderr was:
ERROR: (gcloud.config.config-helper) There was a problem refreshing your current auth tokens: ("Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/db-proxy@project-id.iam.gserviceaccount.com/token from the Google Compute Enginemetadata service. Status: 404 Response:nb'Unable to generate access token; IAM returned 404 Not Found: Requested entity was not found.\n'", <google_auth_httplib2._Response object at 0x7fc5575545f8>)
Please run:

  $ gcloud auth login

to obtain new credentials.

If you have already logged in with a different account:

    $ gcloud config set account ACCOUNT

to select an already authenticated account to use.
2020/11/24 17:18:41 GcloudConfig: error reading config: exit status 1; stderr was:
ERROR: (gcloud.config.config-helper) There was a problem refreshing your current auth tokens: ("Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/db-proxy@project-id.iam.gserviceaccount.com/token from the Google Compute Enginemetadata service. Status: 404 Response:nb'Unable to generate access token; IAM returned 404 Not Found: Requested entity was not found.\n'", <google_auth_httplib2._Response object at 0x7f06f72f45c0>)
Please run:

  $ gcloud auth login

to obtain new credentials.

If you have already logged in with a different account:

    $ gcloud config set account ACCOUNT

to select an already authenticated account to use.
2020/11/24 17:18:41 errors parsing config:
        Get "https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/europe-west4~db-instance?alt=jsonamp;prettyPrint=false": metadata: GCE metadata "instance/service-accounts/default/token?scopes=https://www.googleapis.com/auth/sqlservice.admin" not defined
 

Вот устранение неполадок, которые я сделал до сих пор:

 root@workload-identity-test:/# gcloud auth list
                   Credentialed Accounts
ACTIVE  ACCOUNT
*       db-proxy@project-id.iam.gserviceaccount.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
 
 λ gcloud container clusters describe mycluster --format="value(workloadIdentityConfig.workloadPool)"
project-id.svc.id.goog
 
 λ gcloud container node-pools describe mycluster-node-pool --cluster=mycluster --format="value(config.workloadMetadataConfig.mode)"
GKE_METADATA
 
 λ gcloud container node-pools describe mycluster-node-pool --cluster=mycluster--format="value(config.oauthScopes)"
https://www.googleapis.com/auth/monitoring;https://www.googleapis.com/auth/devstorage.read_only;https://www.googleapis.com/auth/logging.write;https://www.googleapis.com/auth/cloud-platform;https://www.googleapis.com/auth/userinfo.email;https://www.googleapis.com/auth/compute;https://www.googleapis.com/auth/sqlservice.admin
 
 λ kubectl describe serviceaccount --namespace k8s-namespace ksa-name
Name:                ksa-name
Namespace:           k8s-namespace
Labels:              <none>
Annotations:         iam.gke.io/gcp-service-account: db-proxy@project-id.iam.gserviceaccount.com
Image pull secrets:  <none>
Mountable secrets:   ksa-name-token-87n4t
Tokens:              ksa-name-token-87n4t
Events:              <none>
 
 λ gcloud iam service-accounts get-iam-policy db-proxy@project-id.iam.gserviceaccount.com
bindings:
- members:
  - serviceAccount:project-id.svc.id.goog[k8s-namespace/ksa-name]
  role: roles/iam.workloadIdentityUser
etag: BwW02zludbY=
version: 1
 
 λ kubectl get networkpolicy --namespace k8s-namespace
No resources found in k8s-namespace namespace.
 
 λ gcloud projects get-iam-policy project-id
bindings:
- members:
  - serviceAccount:db-proxy@project-id.iam.gserviceaccount.com
  role: roles/cloudsql.editor
 

Ожидаемый результат (я запустил это в другом кластере и впоследствии изменил конфигурацию, не могу найти, где моя ошибка):

 root@workload-identity-test:~# ./cloud_sql_proxy -instances=project-id:europe-west4:db-instance-2=tcp:5432
2020/11/24 18:09:54 current FDs rlimit set to 1048576, wanted limit is 8500. Nothing to do here.
2020/11/24 18:09:56 Listening on 127.0.0.1:5432 for project-id:europe-west4:db-instance-2
2020/11/24 18:09:56 Ready for new connections
 

Что я делаю не так? Как мне устранить неполадки или выполнить дальнейшую отладку?

Комментарии:

1. До сих пор мне удавалось преодолеть проблему, создав учетную запись службы с другим именем. Изменилось только имя, больше ничего. Если я удалю db-proxy@project-id.iam.gserviceaccount.com , а затем снова использую имя, проблема по-прежнему сохраняется.

2. Ваша проблема решена? Если да, не могли бы вы опубликовать процедуру, которой вы следовали, в качестве решения и принять ее.

Ответ №1:

Это может быть связано с тем, что учетная запись службы не была включена при создании кластера Kubernetes или не была настроена должным образом. Попробуйте проверить, отключена ли учетная запись службы, и включить, если это так.Вы также можете попытаться создать новую учетную запись службы и изменить учетную запись службы в модулях.Или, наконец, попробуйте предоставить учетные данные gcloud команде при запуске.

Комментарии:

1. Учетная запись помечена как «активная». Предоставление учетных данных — это вариант, но гораздо менее выгодный.

2. создание новой учетной записи службы решило эту проблему для меня

Ответ №2:

Не могли бы вы подтвердить, что ‘db-proxy@project-id.iam.gserviceaccount.com «это правильный счет? Возможно, я неправильно читаю, но, похоже, при попытке обновить токен авторизации для этой учетной записи возникает ошибка, и ошибка заключается в том, что учетная запись не существует.

Комментарии:

1. gcloud iam service-accounts get-iam-policy db-proxy@project-id.iam.gserviceaccount.com возвращает действительный ответ. Насколько я понимаю, это означает, что учетная запись существует. Я также могу найти его в пользовательском интерфейсе.

Ответ №3:

Сегодня я столкнулся с аналогичной ошибкой и обнаружил, что это связано с тем, что GSA находится в проекте, отличном от кластера GKE. Похоже, что привязка iam.workloadIdentityUser должна быть между учетными записями в одном проекте.

Итак, это сработало:

 gcloud iam service-accounts create custom-metrics-adapter 
    --project ${PLATFORM_PROJECT_ID}

gcloud iam service-accounts add-iam-policy-binding 
    "${GSA_NAME}@${PLATFORM_PROJECT_ID}.iam.gserviceaccount.com" 
    --member "serviceAccount:${PLATFORM_PROJECT_ID}.svc.id.goog[${KSA_NAMESPACE}/${KSA_NAME}]" 
    --role "roles/iam.workloadIdentityUser" 
    --project ${PLATFORM_PROJECT_ID}
 

с

 apiVersion: v1
kind: ServiceAccount
metadata:
  name: ${KSA_NAME}
  namespace: ${KSA_NAMESPACE}
  annotations:
    iam.gke.io/gcp-service-account: ${GSA_NAME}${PLATFORM_PROJECT_ID}.iam.gserviceaccount.com
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example
  namespace: ${KSA_NAMESPACE}
spec:
  template:
    spec:
      serviceAccountName: ${KSA_NAME}
# Deployment spec truncated for clarity
 

Не уверен, поможет ли это вам, но, возможно, это поможет кому-то еще, кто найдет это, выполнив поиск в строке ошибки:

Не удалось получить http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/${GSA_NAME}@${DIFFERENT_PROJECT_ID}.iam.gserviceaccount.com/token из сервиса Google Compute Enginemetadata. Статус: 404 Ответ: nb’Unable для генерации токена доступа; IAM вернул 404 Not Found: запрошенный объект не найден.

Ответ №4:

Я смог решить проблему, создав учетную запись службы с другим именем. Изменилось только имя, больше ничего. Если я удалю db-proxy@project-id.iam.gserviceaccount.com , а затем снова использую имя, проблема по-прежнему сохраняется. Я не смог найти никакой другой ссылки на указанную учетную запись. Проблема больше не возникала после моего комментария 30 ноября ’20.