ホームページ バックエンド開発 Python チュートリアル Python で Google Kubernetes Engine (GKE) 用の Kubernetes クライアントを構築する

Python で Google Kubernetes Engine (GKE) 用の Kubernetes クライアントを構築する

Nov 28, 2024 am 06:54 AM

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

このブログ投稿では、Python で GKE 用の Kubernetes クライアントを作成する効果的な方法を紹介します。 google-cloud-container、google-auth、kubernetes ライブラリを活用すると、アプリケーションがローカルで実行されているか、Google Cloud 上で実行されているかに関係なく、同じコードを使用して Kubernetes API とやり取りできます。この柔軟性は、Application Default Credentials (ADC) を使用して Kubernetes API の対話に必要なリクエストを認証し、動的に構築することで実現され、追加のツールや kubeconfig などの構成ファイルが不要になります。

ローカルで実行する場合、一般的なアプローチは、gcloudcontainerclustersget-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 ライブラリは、Kubernetes API と直接ではなく、サービスとして GKE と対話するように設計されていることに注意することが重要です。たとえば、このライブラリを使用してクラスタ情報の取得、クラスタのアップグレード、またはメンテナンス ポリシーの構成を行うことはできますが、これは gcloudcontainerclusters コマンドで実行できることと同様ですが、Kubernetes API クライアントを直接取得するために使用することはできません。この違いが、この関数が必要なクラスタの詳細を GKE から取得した後に Kubernetes クライアントを個別に構築する理由です。


2. Google Cloud での認証

GKE および Kubernetes API と通信するために、この関数は Google Cloud のアプリケーションデフォルト認証情報 (ADC) を使用して認証します。認証プロセスの各ステップがどのように機能するかは次のとおりです:

google.auth.default()

この関数は、コードが実行されている環境の ADC を取得します。コンテキストに応じて、次のものが返される場合があります:

  • ユーザー アカウントの認証情報 (例: ローカル開発設定の gcloud auth application-default ログインから)。
  • サービス アカウントの認証情報 (例: Cloud Run などの Google Cloud 環境で実行する場合)。

利用可能な場合は関連するプロジェクト ID も返しますが、この場合は資格情報のみが使用されます。

google.auth.transport.requests.Request()

これにより、認証関連のネットワーク要求を処理するための HTTP 要求オブジェクトが作成されます。 Python のリクエスト ライブラリを内部で使用し、資格情報を更新したり、アクセス トークンをリクエストしたりするための標準化された方法を提供します。

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() を呼び出す前、トークン属性は None です。 fresh() が呼び出された後、認証情報には有効なアクセス トークンとその有効期限が設定されます。


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()
ログイン後にコピー
ログイン後にコピー

結論

このアプローチは、ローカルで実行されているのか、Cloud Run などの Google Cloud サービス上で実行されているのかに関係なく、同じコードを使用して Kubernetes API と対話する移植性を強調しています。アプリケーションのデフォルト認証情報 (ADC) を活用することで、事前に生成された構成ファイルや外部ツールに依存せずに、Kubernetes API クライアントを動的に生成する柔軟な方法を実証しました。これにより、さまざまな環境にシームレスに適応できるアプリケーションの構築が容易になり、開発と展開の両方のワークフローが簡素化されます。

以上がPython で Google Kubernetes Engine (GKE) 用の Kubernetes クライアントを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. C:比較されたアプリケーションとユースケース Python vs. C:比較されたアプリケーションとユースケース Apr 12, 2025 am 12:01 AM

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

Python:ゲーム、GUIなど Python:ゲーム、GUIなど Apr 13, 2025 am 12:14 AM

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

2時間のPython計画:現実的なアプローチ 2時間のPython計画:現実的なアプローチ Apr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Python vs. C:曲線と使いやすさの学習 Python vs. C:曲線と使いやすさの学習 Apr 19, 2025 am 12:20 AM

Pythonは学習と使用が簡単ですが、Cはより強力ですが複雑です。 1。Python構文は簡潔で初心者に適しています。動的なタイピングと自動メモリ管理により、使いやすくなりますが、ランタイムエラーを引き起こす可能性があります。 2.Cは、高性能アプリケーションに適した低レベルの制御と高度な機能を提供しますが、学習しきい値が高く、手動メモリとタイプの安全管理が必要です。

2時間でどのくらいのPythonを学ぶことができますか? 2時間でどのくらいのPythonを学ぶことができますか? Apr 09, 2025 pm 04:33 PM

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

Pythonと時間:勉強時間を最大限に活用する Pythonと時間:勉強時間を最大限に活用する Apr 14, 2025 am 12:02 AM

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

Python:自動化、スクリプト、およびタスク管理 Python:自動化、スクリプト、およびタスク管理 Apr 16, 2025 am 12:14 AM

Pythonは、自動化、スクリプト、およびタスク管理に優れています。 1)自動化:OSやShutilなどの標準ライブラリを介してファイルバックアップが実現されます。 2)スクリプトの書き込み:Psutilライブラリを使用してシステムリソースを監視します。 3)タスク管理:スケジュールライブラリを使用してタスクをスケジュールします。 Pythonの使いやすさと豊富なライブラリサポートにより、これらの分野で優先ツールになります。

Python:主要なアプリケーションの調査 Python:主要なアプリケーションの調査 Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

See all articles