首頁 > 後端開發 > Python教學 > 使用 Python 為 Google Kubernetes Engine (GKE) 建置 Kubernetes 用戶端

使用 Python 為 Google Kubernetes Engine (GKE) 建置 Kubernetes 用戶端

Susan Sarandon
發布: 2024-11-28 06:54:15
原創
446 人瀏覽過

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

這篇部落格文章介紹了一種使用 Python 為 GKE 建立 Kubernetes 客戶端的有效方法。透過利用 google-cloud-container、google-auth 和 kubernetes 庫,無論您的應用程式是在本地運行還是在 Google Cloud 上運行,您都可以使用相同的程式碼與 Kubernetes API 進行互動。這種靈活性來自於使用應用程式預設憑證(ADC)來驗證和動態建立 Kubernetes API 互動所需的請求,從而無需使用額外的工具或設定檔(如 kubeconfig)。

本地運行時,常見的方法是使用 gcloud 容器叢集 get-credentials 命令產生 kubeconfig 檔案並使用 kubectl 與 Kubernetes API 互動。雖然此工作流程對於本機設定來說是自然且有效的,但在 Cloud Run 或其他 Google Cloud 服務等環境中卻變得不太實用。

借助 ADC,您可以透過動態配置 Kubernetes 用戶端來簡化對 GKE 叢集的 Kubernetes API 的存取。這種方法可確保以一致、高效的方式連接到集群,而無需管理外部設定檔或安裝額外工具的開銷。


先決條件

1. 使用 Google Cloud 進行身份驗證

如果您在本地運行程式碼,只需使用以下命令進行身份驗證:

gcloud auth application-default login
登入後複製
登入後複製
登入後複製

這將使用您的使用者帳戶憑證作為應用程式預設憑證(ADC)。

如果您在 Cloud Run 等 Google Cloud 服務上執行程式碼,則無需手動處理驗證。只需確保服務具有正確配置的服務帳戶,並具有存取 GKE 叢集所需的權限。


2. 收集您的集群詳細信息

運行腳本之前,請確保您了解以下詳細資訊:

  • Google Cloud 專案 ID:託管 GKE 叢集的專案的 ID。
  • 群集位置:群集所在的區域或可用區(例如 us-central1-a)。
  • 叢集名稱:您要連接的 Kubernetes 叢集的名稱。

腳本

以下是為 GKE 叢集設定 Kubernetes 用戶端的 Python 函數。

gcloud auth application-default login
登入後複製
登入後複製
登入後複製

它是如何運作的

1. 連接GKE集群

get_k8s_client 函數首先使用 google-cloud-container 函式庫從 GKE 取得叢集詳細資訊。此程式庫與 GKE 服務交互,可讓您檢索叢集的 API 端點和憑證授權單位 (CA) 等資訊。這些詳細資訊對於配置 Kubernetes 客戶端至關重要。

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()
登入後複製
登入後複製

要注意的是,google-cloud-container 函式庫是為與 GKE 作為服務互動而設計的,而不是直接與 Kubernetes API 互動。例如,雖然您可以使用此程式庫檢索叢集資訊、升級叢集或設定維護策略(類似於使用 gcloud 容器叢集命令執行的操作),但您無法使用它直接取得 Kubernetes API 用戶端。這種差異就是為什麼該函數在從 GKE 獲取必要的叢集詳細資訊後單獨建置 Kubernetes 用戶端。


2. 使用 Google Cloud 進行身份驗證

為了與 GKE 和 Kubernetes API 交互,該函數使用 Google Cloud 的應用程式預設憑證 (ADC) 進行身份驗證。以下是身份驗證過程的每個步驟的工作原理:

google.auth.default()

此函數會擷取程式碼運行環境的 ADC。根據上下文,它可能會返回:

  • 使用者帳戶憑證(例如,來自本機開發設定中的 gcloud auth 應用程式預設登入)。
  • 服務帳戶憑證(例如,在 Cloud Run 等 Google Cloud 環境中執行時)。

它也會傳回關聯的項目 ID(如果可用),儘管在本例中僅使用憑證。

google.auth.transport.requests.Request()

這將建立一個 HTTP 請求對象,用於處理與驗證相關的網路請求。它在內部使用 Python 的 requests 庫,並提供標準化的方法來刷新憑證或請求存取令牌。

creds.refresh(auth_req)

當使用 google.auth.default() 擷取 ADC 時,憑證物件最初不包含存取權杖(至少在本機環境中)。 fresh() 方法明確取得存取權杖並將其附加到憑證對象,使其能夠對 API 請求進行身份驗證。

以下程式碼示範如何驗證此行為:

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()

# 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}")
登入後複製

在呼叫refresh()之前,token屬性為None。呼叫刷新()後,憑證將填入有效的存取權杖及其到期時間。


3.設定Kubernetes客戶端

Kubernetes 用戶端是使用叢集的 API 端點、CA 憑證的暫存檔案和刷新的承載令牌進行設定的。這確保客戶端可以安全地進行身份驗證並與叢集通訊。

gcloud auth application-default login
登入後複製
登入後複製
登入後複製

CA 憑證暫時儲存並由客戶端引用以進行安全 SSL 通訊。透過這些設置,Kubernetes 用戶端已完全配置並準備好與叢集互動。


範例輸出

這是 kube-system 命名空間的 YAML 輸出範例:

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()
登入後複製
登入後複製

結論

這種方法強調了使用相同程式碼與 Kubernetes API 互動的可移植性,無論是在本地運行還是在 Cloud Run 等 Google Cloud 服務上運行。透過利用應用程式預設憑證 (ADC),我們示範了一種靈活的方法來動態產生 Kubernetes API 用戶端,而無需依賴預先產生的設定檔或外部工具。這使得建立能夠無縫適應不同環境的應用程式變得容易,從而簡化了開發和部署工作流程。

以上是使用 Python 為 Google Kubernetes Engine (GKE) 建置 Kubernetes 用戶端的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板