Создать задание Kubernetes из облачной функции Node.js - PullRequest
0 голосов
/ 22 сентября 2019

Мне нужно вызвать задание Kubernetes из облачной функции Google, но не нашел подходящего метода в https://github.com/googleapis/nodejs-cloud-container

1 Ответ

1 голос
/ 24 сентября 2019

Это клиентская библиотека предназначена для управления кластером GKE.Он не предназначен для общения с API Kubernetes.

Для этого есть клиентские библиотеки API Kubernetes .

Существует одна для nodejs, но, как яболее свободно знаком с Python. Ниже я собираюсь продемонстрировать, как я делал это с клиентской библиотекой API Python Kubernetes через GCP Cloud Functions для успешного применения вашего варианта использования.

Я имел дело с несколько громоздкой частью этогоprocess.

Вы выпустите в обычном терминале (при условии надлежащей аутентификации и авторизации) gcloud container clusters get-credentials, и вы сможете взаимодействовать с API-интерфейсом Kubernetes кластера с помощью kubectl.

Я пока не нашел эквивалентного метода для получения учетных данных для кластера с использованием клиентской библиотеки Python GKE API , поэтому я загрузил файл ~/.kube/config в корзину Cloud Storage, так чточто мы можем загрузить его из Облачной функции и затем поговорить с API кластера Kubernetes.

Итак, давайте создадим корзину и загрузим файл 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

Теперь для функции облака.

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

Это задание (в качестве примера взято из здесь ) состоит из модуля сконтейнер (изображение perl), который использует perl для вычисления первых 999 цифр числа pi , поэтому просто измените информацию об объекте контейнера (в данном случае об объекте python) вместе с другими конфигурациями для самого задания.

Функция, выполняемая в «облачной функции»: hello_world.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...