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

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 までご連絡ください。
Pythonを使用してテキストファイルのZIPF配布を見つける方法Pythonを使用してテキストファイルのZIPF配布を見つける方法Mar 05, 2025 am 09:58 AM

このチュートリアルでは、Pythonを使用してZIPFの法則の統計的概念を処理する方法を示し、法律の処理時にPythonの読み取りおよび並べ替えの効率性を示します。 ZIPF分布という用語が何を意味するのか疑問に思うかもしれません。この用語を理解するには、まずZIPFの法律を定義する必要があります。心配しないでください、私は指示を簡素化しようとします。 ZIPFの法則 ZIPFの法則は単に意味します。大きな自然言語のコーパスでは、最も頻繁に発生する単語は、2番目の頻繁な単語のほぼ2倍の頻度で表示されます。 例を見てみましょう。アメリカ英語の茶色のコーパスを見ると、最も頻繁な言葉は「thであることに気付くでしょう。

Pythonでファイルをダウンロードする方法Pythonでファイルをダウンロードする方法Mar 01, 2025 am 10:03 AM

Pythonは、インターネットからファイルをダウンロードするさまざまな方法を提供します。これは、urllibパッケージまたはリクエストライブラリを使用してHTTPを介してダウンロードできます。このチュートリアルでは、これらのライブラリを使用してPythonからURLからファイルをダウンロードする方法を説明します。 ライブラリをリクエストします リクエストは、Pythonで最も人気のあるライブラリの1つです。クエリ文字列をURLに手動で追加したり、POSTデータのエンコードをフォームに追加せずに、HTTP/1.1リクエストを送信できます。 リクエストライブラリは、以下を含む多くの機能を実行できます フォームデータを追加します マルチパートファイルを追加します Python応答データにアクセスします リクエストを行います 頭

HTMLを解析するために美しいスープを使用するにはどうすればよいですか?HTMLを解析するために美しいスープを使用するにはどうすればよいですか?Mar 10, 2025 pm 06:54 PM

この記事では、Pythonライブラリである美しいスープを使用してHTMLを解析する方法について説明します。 find()、find_all()、select()、およびget_text()などの一般的な方法は、データ抽出、多様なHTML構造とエラーの処理、および代替案(SEL

Pythonでの画像フィルタリングPythonでの画像フィルタリングMar 03, 2025 am 09:44 AM

ノイズの多い画像を扱うことは、特に携帯電話や低解像度のカメラの写真でよくある問題です。 このチュートリアルでは、OpenCVを使用してPythonの画像フィルタリング手法を調査して、この問題に取り組みます。 画像フィルタリング:強力なツール 画像フィルター

Pythonを使用してPDFドキュメントの操作方法Pythonを使用してPDFドキュメントの操作方法Mar 02, 2025 am 09:54 AM

PDFファイルは、クロスプラットフォームの互換性に人気があり、オペレーティングシステム、読み取りデバイス、ソフトウェア間でコンテンツとレイアウトが一貫しています。ただし、Python Plansing Plain Text Filesとは異なり、PDFファイルは、より複雑な構造を持つバイナリファイルであり、フォント、色、画像などの要素を含んでいます。 幸いなことに、Pythonの外部モジュールでPDFファイルを処理することは難しくありません。この記事では、PYPDF2モジュールを使用して、PDFファイルを開き、ページを印刷し、テキストを抽出する方法を示します。 PDFファイルの作成と編集については、私からの別のチュートリアルを参照してください。 準備 コアは、外部モジュールPYPDF2を使用することにあります。まず、PIPを使用してインストールします。 ピップはpです

DjangoアプリケーションでRedisを使用してキャッシュする方法DjangoアプリケーションでRedisを使用してキャッシュする方法Mar 02, 2025 am 10:10 AM

このチュートリアルでは、Redisキャッシングを活用して、特にDjangoフレームワーク内でPythonアプリケーションのパフォーマンスを向上させる方法を示しています。 Redisのインストール、Django構成、およびパフォーマンスの比較をカバーして、Beneを強調します

Natural Language Toolkit(NLTK)の紹介Natural Language Toolkit(NLTK)の紹介Mar 01, 2025 am 10:05 AM

自然言語処理(NLP)は、人間の言語の自動または半自動処理です。 NLPは言語学と密接に関連しており、認知科学、心理学、生理学、数学の研究とのリンクがあります。コンピューターサイエンスで

TensorflowまたはPytorchで深い学習を実行する方法は?TensorflowまたはPytorchで深い学習を実行する方法は?Mar 10, 2025 pm 06:52 PM

この記事では、深い学習のためにTensorflowとPytorchを比較しています。 関連する手順、データの準備、モデルの構築、トレーニング、評価、展開について詳しく説明しています。 特に計算グラップに関して、フレームワーク間の重要な違い

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

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

SublimeText3 Mac版

SublimeText3 Mac版

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

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、