Kubernetes-Pod, der auf der Google Compute Engine ausgeführt wird, kann nicht auf den Metadatendienst zugreifen

Kubernetes-Pod, der auf der Google Compute Engine ausgeführt wird, kann nicht auf den Metadatendienst zugreifen

Ich versuche, das Google Cloud Python SDK aus einem K8-Pod auszuführen, der auf der Google Compute Engine läuft. Der VM ist ein Dienstkonto zugeordnet, das ihr Zugriff auf den Secrets Manager gewährt. Ich kann vom Host aus auf den Secrets Manager zugreifen, aber wenn ich das Python SDK vom K8-Pod aus ausführe, wird bemängelt, dass ich nicht auf den Metadatendienst zugreifen kann.

>>> 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 wird nicht vom K8-Pod aufgelöst

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’

Der Host kann das Problem jedoch lösen

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.

Wie kann ich den Pod dazu bringen, metadata.google.internal aufzulösen?

Antwort1

Dies wird dadurch verursacht, dass der Kubernetes-Pod den DNS-Namen nicht in die richtige IP auflösen kann metadata.google.internal. Ihr Host-Rechner hat wahrscheinlich einen Eintrag, /etc/hostsder diese Domäne fest auf die IP codiert: 169.254.169.254.

Sie sollten in der Lage sein, dies in Ihrem Pod zu replizieren, indem Sie die /etc/hostsDatei ändern.

Denken Sie daran, dass dies nur auf VMs funktioniert, die auf GCP laufen. Außerhalb ist die IP-Adresse 169.254.169.254 nur eine weitere IP-Adresse ohne besondere Bedeutung.

BEARBEITEN: Habe gerade /etc/hosts auf einer meiner GCP-VMs überprüft und Folgendes gefunden:

$ 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

Versuchen Sie einfach, die letzte Zeile in Ihre Pods zu kopieren /etc/hosts.

Antwort2

Das Problem bestand darin, dass microk8s die Einträge von Hosts etc. nicht in die Pods kopierte. Als wir zu k3 wechselten, wurde das Problem behoben.

verwandte Informationen