El pod de Kubernetes que se ejecuta en el motor informático de Google no puede acceder al servicio de metadatos

El pod de Kubernetes que se ejecuta en el motor informático de Google no puede acceder al servicio de metadatos

Estoy intentando ejecutar Google Cloud Python SDK desde dentro de un pod k8, ejecutándose en Google Compute Engine. Hay una cuenta de servicio adjunta a la VM, que le da acceso al administrador de secretos. Puedo acceder al administrador de secretos desde el host, sin embargo, al ejecutar Python SDK desde el pod k8 me quejo de que no puedo acceder al servicio de metadatos.

>>> secret_id = 'unskript_test'
>>> name = client.secret_path(project_id, secret_id)
>>> response = client.get_secret(request={"name": name})
Traceback (most recent call last):
  File "/opt/conda/lib/python3.7/site-packages/google/api_core/grpc_helpers.py", line 67, in error_remapped_callable
    return callable_(*args, **kwargs)
  File "/opt/conda/lib/python3.7/site-packages/grpc/_channel.py", line 946, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/opt/conda/lib/python3.7/site-packages/grpc/_channel.py", line 849, in _end_unary_response_blocking
    raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
    status = StatusCode.UNAVAILABLE
    details = "Getting metadata from plugin failed with error: Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Compute Engine Metadata server unavailable"
    debug_error_string = "{"created":"@1630634901.103779641","description":"Getting metadata from plugin failed with error: Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Compute Engine Metadata server unavailable","file":"src/core/lib/security/credentials/plugin/plugin_credentials.cc","file_line":90,"grpc_status":14}"
>

metadata.google.internal no se resuelve desde el pod k8

jovyan@jovyan-25ca6c8c-157d-49e5-9366-f9d57fcb7a9f:~$ wget http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true
--2021-09-03 02:11:19--  http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true
Resolving metadata.google.internal (metadata.google.internal)... failed: Name or service not known.
wget: unable to resolve host address ‘metadata.google.internal’

Sin embargo, el anfitrión puede resolverlo.

ubuntu@gcp-test-proxy:~$ wget http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true
--2021-09-03 02:11:27--  http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true
Resolving metadata.google.internal (metadata.google.internal)... 169.254.169.254
Connecting to metadata.google.internal (metadata.google.internal)|169.254.169.254|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2021-09-03 02:11:27 ERROR 403: Forbidden.

¿Cómo puedo hacer que el pod resuelva metadata.google.internal?

Respuesta1

Esto se debe a que el pod de Kubernetes no puede resolver el metadata.google.internalnombre DNS en la IP adecuada. Su máquina host probablemente tenga una entrada /etc/hostsque codifique ese dominio en la IP: 169.254.169.254.

Deberías poder replicar eso en tu Pod modificando su /etc/hostsarchivo.

Solo recuerde que esto solo funcionará en máquinas virtuales que se ejecutan en GCP. En el exterior, la dirección IP 169.254.169.254 es simplemente otra dirección IP que no tiene ningún significado especial.

EDITAR: Acabo de verificar /etc/hosts en una de mis máquinas virtuales de GCP y esto es lo que encontré:

$ cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
169.254.169.254 metadata.google.internal metadata

Así que intenta copiar esa última línea en tus pods /etc/hosts.

Respuesta2

El problema era que los microk8 no copiaban la entrada de los hosts, etc., a los pods. Una vez que nos mudamos a k3, se resolvió.

información relacionada