Heim > Backend-Entwicklung > Python-Tutorial > Erstellen eines Kubernetes-Clients für Google Kubernetes Engine (GKE) in Python

Erstellen eines Kubernetes-Clients für Google Kubernetes Engine (GKE) in Python

Susan Sarandon
Freigeben: 2024-11-28 06:54:15
Original
413 Leute haben es durchsucht

Building a Kubernetes Client for Google Kubernetes Engine (GKE) in Python

In diesem Blogbeitrag wird eine effektive Methode zum Erstellen eines Kubernetes-Clients für GKE in Python vorgestellt. Durch die Nutzung der Bibliotheken google-cloud-container, google-auth und kubernetes können Sie denselben Code für die Interaktion mit der Kubernetes-API verwenden, unabhängig davon, ob Ihre Anwendung lokal oder in Google Cloud ausgeführt wird. Diese Flexibilität entsteht durch die Verwendung von Application Default Credentials (ADC) zur Authentifizierung und dynamischen Erstellung der für Kubernetes-API-Interaktionen erforderlichen Anforderungen, sodass keine zusätzlichen Tools oder Konfigurationsdateien wie kubeconfig erforderlich sind.

Bei der lokalen Ausführung besteht ein gängiger Ansatz darin, den Befehl gcloud Container Clusters get-credentials zu verwenden, um eine kubeconfig-Datei zu generieren und mit der Kubernetes-API über kubectl zu interagieren. Während dieser Workflow für lokale Setups natürlich und effektiv ist, wird er in Umgebungen wie Cloud Run oder anderen Google Cloud-Diensten weniger praktisch.

Mit ADC können Sie den Zugriff auf die Kubernetes-API für GKE-Cluster optimieren, indem Sie den Kubernetes-Client dynamisch konfigurieren. Dieser Ansatz gewährleistet eine konsistente und effiziente Möglichkeit, eine Verbindung zu Ihrem Cluster herzustellen, ohne dass der Aufwand für die Verwaltung externer Konfigurationsdateien oder die Installation zusätzlicher Tools anfällt.


Voraussetzungen

1. Authentifizierung mit Google Cloud

Wenn Sie den Code lokal ausführen, authentifizieren Sie sich einfach mit dem folgenden Befehl:

gcloud auth application-default login
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Dadurch werden die Anmeldeinformationen Ihres Benutzerkontos als Standardanmeldeinformationen für die Anwendung (ADC) verwendet.

Wenn Sie den Code auf Google Cloud-Diensten wie Cloud Run ausführen, müssen Sie die Authentifizierung nicht manuell durchführen. Stellen Sie einfach sicher, dass dem Dienst ein ordnungsgemäß konfiguriertes Dienstkonto mit den erforderlichen Berechtigungen für den Zugriff auf den GKE-Cluster zugeordnet ist.


2. Sammeln Sie Ihre Cluster-Details

Bevor Sie das Skript ausführen, stellen Sie sicher, dass Sie über die folgenden Details verfügen:

  • Google Cloud-Projekt-ID: Die ID des Projekts, in dem Ihr GKE-Cluster gehostet wird.
  • Cluster-Standort: Die Region oder Zone, in der sich Ihr Cluster befindet (z. B. us-central1-a).
  • Clustername: Der Name des Kubernetes-Clusters, mit dem Sie eine Verbindung herstellen möchten.

Das Drehbuch

Unten finden Sie die Python-Funktion, die einen Kubernetes-Client für einen GKE-Cluster einrichtet.

gcloud auth application-default login
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie es funktioniert

1. Verbindung zum GKE-Cluster herstellen

Die Funktion get_k8s_client beginnt mit dem Abrufen von Clusterdetails aus GKE mithilfe der Google-Cloud-Container-Bibliothek. Diese Bibliothek interagiert mit dem GKE-Dienst und ermöglicht Ihnen das Abrufen von Informationen wie dem API-Endpunkt und der Zertifizierungsstelle (CA) des Clusters. Diese Details sind für die Konfiguration des Kubernetes-Clients unerlässlich.

from google.cloud import container_v1
import google.auth
import google.auth.transport.requests
from kubernetes import client as kubernetes_client
from tempfile import NamedTemporaryFile
import base64
import yaml

def get_k8s_client(project_id: str, location: str, cluster_id: str) -> kubernetes_client.CoreV1Api:
    """
    Fetches a Kubernetes client for the specified GCP project, location, and cluster ID.

    Args:
        project_id (str): Google Cloud Project ID
        location (str): Location of the cluster (e.g., "us-central1-a")
        cluster_id (str): Name of the Kubernetes cluster

    Returns:
        kubernetes_client.CoreV1Api: Kubernetes CoreV1 API client
    """

    # Retrieve cluster information
    gke_cluster = container_v1.ClusterManagerClient().get_cluster(request={
        "name": f"projects/{project_id}/locations/{location}/clusters/{cluster_id}"
    })

    # Obtain Google authentication credentials
    creds, _ = google.auth.default()
    auth_req = google.auth.transport.requests.Request()
    # Refresh the token
    creds.refresh(auth_req)

    # Initialize the Kubernetes client configuration object
    configuration = kubernetes_client.Configuration()
    # Set the cluster endpoint
    configuration.host = f'https://{gke_cluster.endpoint}'

    # Write the cluster CA certificate to a temporary file
    with NamedTemporaryFile(delete=False) as ca_cert:
        ca_cert.write(base64.b64decode(gke_cluster.master_auth.cluster_ca_certificate))
        configuration.ssl_ca_cert = ca_cert.name

    # Set the authentication token
    configuration.api_key_prefix['authorization'] = 'Bearer'
    configuration.api_key['authorization'] = creds.token

    # Create and return the Kubernetes CoreV1 API client
    return kubernetes_client.CoreV1Api(kubernetes_client.ApiClient(configuration))


def main():
    project_id = "your-project-id"  # Google Cloud Project ID
    location = "your-cluster-location"  # Cluster region (e.g., "us-central1-a")
    cluster_id = "your-cluster-id"  # Cluster name

    # Retrieve the Kubernetes client
    core_v1_api = get_k8s_client(project_id, location, cluster_id)

    # Fetch the kube-system Namespace
    namespace = core_v1_api.read_namespace(name="kube-system")

    # Output the Namespace resource in YAML format
    yaml_output = yaml.dump(namespace.to_dict(), default_flow_style=False)
    print(yaml_output)

if __name__ == "__main__":
    main()
Nach dem Login kopieren
Nach dem Login kopieren

Es ist wichtig zu beachten, dass die Google-Cloud-Container-Bibliothek für die Interaktion mit GKE als Dienst und nicht direkt mit Kubernetes-APIs konzipiert ist. Während Sie diese Bibliothek beispielsweise verwenden können, um Cluster-Informationen abzurufen, Cluster zu aktualisieren oder Wartungsrichtlinien zu konfigurieren – ähnlich wie Sie dies mit dem Befehl „gcloud container clusters“ tun können – können Sie sie nicht verwenden, um einen Kubernetes-API-Client direkt abzurufen. Aufgrund dieser Unterscheidung erstellt die Funktion separat einen Kubernetes-Client, nachdem sie die erforderlichen Clusterdetails von GKE abgerufen hat.


2. Authentifizierung mit Google Cloud

Um mit GKE- und Kubernetes-APIs zu interagieren, verwendet die Funktion zur Authentifizierung die Application Default Credentials (ADC) von Google Cloud. So funktionieren die einzelnen Schritte des Authentifizierungsprozesses:

google.auth.default()

Diese Funktion ruft den ADC für die Umgebung ab, in der der Code ausgeführt wird. Je nach Kontext wird möglicherweise Folgendes zurückgegeben:

  • Benutzerkonto-Anmeldeinformationen (z. B. von der gcloud auth-Anwendungs-Standardanmeldung in einem lokalen Entwicklungs-Setup).
  • Anmeldeinformationen für das Dienstkonto (z. B. bei Ausführung in einer Google Cloud-Umgebung wie Cloud Run).

Es gibt auch die zugehörige Projekt-ID zurück, sofern verfügbar, obwohl in diesem Fall nur die Anmeldeinformationen verwendet werden.

google.auth.transport.requests.Request()

Dadurch wird ein HTTP-Anforderungsobjekt für die Verarbeitung authentifizierungsbezogener Netzwerkanforderungen erstellt. Es nutzt intern die Anforderungsbibliothek von Python und bietet eine standardisierte Möglichkeit, Anmeldeinformationen zu aktualisieren oder Zugriffstokens anzufordern.

creds.refresh(auth_req)

Wenn ADC mit google.auth.default() abgerufen wird, enthält das Anmeldeinformationsobjekt zunächst kein Zugriffstoken (zumindest in einer lokalen Umgebung). Die Methode „refresh()“ ruft explizit ein Zugriffstoken ab und hängt es an das Anmeldeinformationsobjekt an, sodass es API-Anfragen authentifizieren kann.

Der folgende Code zeigt, wie Sie dieses Verhalten überprüfen können:

gke_cluster = container_v1.ClusterManagerClient().get_cluster(request={
    "name": f"projects/{project_id}/locations/{location}/clusters/{cluster_id}"
})
Nach dem Login kopieren

Beispielausgabe:

# Obtain Google authentication credentials
creds, _ = google.auth.default()
auth_req = google.auth.transport.requests.Request()

# Inspect credentials before refreshing
print(f"Access Token (before refresh()): {creds.token}")
print(f"Token Expiry (before refresh()): {creds.expiry}")

# Refresh the token
creds.refresh(auth_req)

# Inspect credentials after refreshing
print(f"Access Token (after): {creds.token}")
print(f"Token Expiry (after): {creds.expiry}")
Nach dem Login kopieren

Vor dem Aufruf von „refresh()“ lautet das Token-Attribut „None“. Nachdem „refresh()“ aufgerufen wurde, werden die Anmeldeinformationen mit einem gültigen Zugriffstoken und seiner Ablaufzeit gefüllt.


3. Konfigurieren des Kubernetes-Clients

Der Kubernetes-Client wird mithilfe des API-Endpunkts des Clusters, einer temporären Datei für das CA-Zertifikat und dem aktualisierten Bearer-Token konfiguriert. Dadurch wird sichergestellt, dass sich der Client sicher authentifizieren und mit dem Cluster kommunizieren kann.

gcloud auth application-default login
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Das CA-Zertifikat wird vorübergehend gespeichert und vom Client für eine sichere SSL-Kommunikation referenziert. Mit diesen Einstellungen ist der Kubernetes-Client vollständig konfiguriert und bereit für die Interaktion mit dem Cluster.


Beispielausgabe

Hier ist ein Beispiel der YAML-Ausgabe für den kube-system-Namespace:

from google.cloud import container_v1
import google.auth
import google.auth.transport.requests
from kubernetes import client as kubernetes_client
from tempfile import NamedTemporaryFile
import base64
import yaml

def get_k8s_client(project_id: str, location: str, cluster_id: str) -> kubernetes_client.CoreV1Api:
    """
    Fetches a Kubernetes client for the specified GCP project, location, and cluster ID.

    Args:
        project_id (str): Google Cloud Project ID
        location (str): Location of the cluster (e.g., "us-central1-a")
        cluster_id (str): Name of the Kubernetes cluster

    Returns:
        kubernetes_client.CoreV1Api: Kubernetes CoreV1 API client
    """

    # Retrieve cluster information
    gke_cluster = container_v1.ClusterManagerClient().get_cluster(request={
        "name": f"projects/{project_id}/locations/{location}/clusters/{cluster_id}"
    })

    # Obtain Google authentication credentials
    creds, _ = google.auth.default()
    auth_req = google.auth.transport.requests.Request()
    # Refresh the token
    creds.refresh(auth_req)

    # Initialize the Kubernetes client configuration object
    configuration = kubernetes_client.Configuration()
    # Set the cluster endpoint
    configuration.host = f'https://{gke_cluster.endpoint}'

    # Write the cluster CA certificate to a temporary file
    with NamedTemporaryFile(delete=False) as ca_cert:
        ca_cert.write(base64.b64decode(gke_cluster.master_auth.cluster_ca_certificate))
        configuration.ssl_ca_cert = ca_cert.name

    # Set the authentication token
    configuration.api_key_prefix['authorization'] = 'Bearer'
    configuration.api_key['authorization'] = creds.token

    # Create and return the Kubernetes CoreV1 API client
    return kubernetes_client.CoreV1Api(kubernetes_client.ApiClient(configuration))


def main():
    project_id = "your-project-id"  # Google Cloud Project ID
    location = "your-cluster-location"  # Cluster region (e.g., "us-central1-a")
    cluster_id = "your-cluster-id"  # Cluster name

    # Retrieve the Kubernetes client
    core_v1_api = get_k8s_client(project_id, location, cluster_id)

    # Fetch the kube-system Namespace
    namespace = core_v1_api.read_namespace(name="kube-system")

    # Output the Namespace resource in YAML format
    yaml_output = yaml.dump(namespace.to_dict(), default_flow_style=False)
    print(yaml_output)

if __name__ == "__main__":
    main()
Nach dem Login kopieren
Nach dem Login kopieren

Abschluss

Dieser Ansatz unterstreicht die Portabilität der Verwendung desselben Codes für die Interaktion mit der Kubernetes-API, unabhängig davon, ob er lokal oder auf einem Google Cloud-Dienst wie Cloud Run ausgeführt wird. Durch die Nutzung von Application Default Credentials (ADC) haben wir eine flexible Methode zur dynamischen Generierung eines Kubernetes-API-Clients demonstriert, ohne auf vorgenerierte Konfigurationsdateien oder externe Tools angewiesen zu sein. Dadurch ist es einfach, Anwendungen zu erstellen, die sich nahtlos an verschiedene Umgebungen anpassen lassen, wodurch sowohl Entwicklungs- als auch Bereitstellungsabläufe vereinfacht werden.

Das obige ist der detaillierte Inhalt vonErstellen eines Kubernetes-Clients für Google Kubernetes Engine (GKE) in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage