client library 用于管理您的 GKE 集群。它并不意味着与 Kubernetes API 对话。
为此,有Kubernetes API client libraries。
nodejs 有一个,但由于我对 Python 更熟悉,我将在下面演示我是如何通过 GCP Cloud Functions 使用 Python Kubernetes API 客户端库成功应用您的用例的。
我已经处理了这个过程中稍微麻烦的部分。
您可以在常规终端中发出问题(如果已实施适当的身份验证和授权)gcloud container clusters get-credentials,您就可以使用kubectl 与集群的 Kubernetes API 进行通信。
我还没有找到使用 GKE API Python client library 获取集群凭据的等效方法,因此我已将 ~/.kube/config 文件上传到 Cloud Storage 存储桶,以便我们可以从 Cloud Function 下载它并随后与 Kubernetes 集群 API 交谈。
因此,让我们创建一个存储桶并将 kubeconfig 文件上传到其中(请注意,这远非理想的安全隐患,具体取决于相关存储桶的 IAM 策略和 ACL,但它适用于测试目的)。
MY_GCP_PROJECT=MY_GCP_PROJECT #edit accordingly
gsutil mb gs://$MY_GCP_PROJECT-configs # set location if more convenient, with '-l US' for example
gsutil cp ~/.kube/config gs://$MY_GCP_PROJECT-configs/kubeconfig
现在是云函数。
requirements.txt
google-cloud-storage
kubernetes
main.py
import tempfile
import json
from kubernetes import client as kubernetes_client, config as kubernetes_config
from google.cloud import storage
BUCKET, BLOB = "MY_GCP_PROJECT", "kubeconfig" #TODO EDIT accordingly
storage_client = storage.Client()
def download_gcs_object(name_bucket, name_blob):
bucket = storage_client.bucket(name_bucket)
blob = bucket.blob(name_blob)
tmp = tempfile.NamedTemporaryFile(delete=False)
blob.download_to_filename(tmp.name)
return tmp.name
def load_kube_config():
kubernetes_config.load_kube_config(config_file=download_gcs_object(BUCKET, BLOB))
def create_container_object_default():
return kubernetes_client.V1Container(name="pi", image="perl", command=["perl", "-Mbignum=bpi", "-wle", "print bpi(1000)"])
def create_job_object(container):
template = kubernetes_client.V1PodTemplateSpec(metadata=kubernetes_client.V1ObjectMeta(labels={"app": "pi"}), spec=kubernetes_client.V1PodSpec(restart_policy="Never", containers=[container]))
return kubernetes_client.V1Job(api_version="batch/v1", kind="Job", metadata=kubernetes_client.V1ObjectMeta(name="pi"), spec=kubernetes_client.V1JobSpec(template=template, backoff_limit=4))
load_kube_config()
kubernetes_api = kubernetes_client.BatchV1Api()
def hello_world(request):
job = create_job_object(create_container_object_default())
kubernetes_api.create_namespaced_job(body=job,namespace="default")
return json.dumps(job.to_dict())
这个 Job(例如取自 here)由一个带有容器(perl 映像)的 pod 组成,该容器使用 perl 来计算数字 pi 的前 999 位,因此只需修改容器对象(在本例中为 python 对象)信息以及作业本身的其他配置。
“云函数”中要执行的函数是hello_world。