首页 > 解决方案 > 从 Node.js 云函数创建 Kubernetes 作业

问题描述

我需要从 Google Cloud Function 调用 Kubernetes 作业,但在https://github.com/googleapis/nodejs-cloud-container中没有找到任何合适的方法

标签: google-cloud-platformgoogle-cloud-functionsgoogle-kubernetes-engine

解决方案


客户端库用于管理您的 GKE 集群。它并不意味着与 Kubernetes API 交谈。

为此,有Kubernetes API 客户端库

nodejs 有一个,但由于我对 Python 更加熟悉,我将在下面演示我是如何通过 GCP Cloud Functions 使用 Python Kubernetes API 客户端库来成功应用您的用例的。

我已经处理了这个过程中稍微麻烦的部分。

您将在常规终端中发布(假设已实施适当的身份验证和授权)gcloud container clusters get-credentials,并且您可以使用kubectl.

我还没有找到使用GKE API Python 客户端库获取集群凭据的等效方法,因此我已将~/.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

现在是云功能。

要求.txt

google-cloud-storage
kubernetes

主文件

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

此作业(作为示例取自此处)由一个带有容器(perl 映像)的 pod 组成,该容器使用 perl 来计算数字pi的前 999 位,因此只需相应地修改容器对象(在本例中为 python 对象)信息以及作业本身的其他配置。

在“云功能”中执行的功能是hello_world.


推荐阅读