google-cloud-platform - 从 Node.js 云函数创建 Kubernetes 作业
问题描述
我需要从 Google Cloud Function 调用 Kubernetes 作业,但在https://github.com/googleapis/nodejs-cloud-container中没有找到任何合适的方法
解决方案
该客户端库用于管理您的 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
.
推荐阅读
- mysql - SQL 为每个 ID 选择最近的记录
- angularjs - 如何在 ui-router 链接中添加点击事件?
- codeigniter - HTTP 错误 404。在 codeigniter 上找不到请求的资源
- c# - 如何在 CADlib 中用折线画一个圆?
- java - 如何从客户端/本地窗口连接到 impala 服务器清除路边身份验证
- r - 在 R 中管理全局环境中的对象
- bash - 是否有一种工具可以逐行分析 bash 脚本的作用?
- c++ - 尝试使用标头导致错误:使用前的预期初始化程序
- sql - 难以理解逻辑。收入超过经理的员工。
- c# - .NET Core 中的 ConcurrentQueue.Count 非常慢