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.internal
nombre DNS en la IP adecuada. Su máquina host probablemente tenga una entrada /etc/hosts
que codifique ese dominio en la IP: 169.254.169.254.
Deberías poder replicar eso en tu Pod modificando su /etc/hosts
archivo.
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ó.