Python或Node访问GKE kubectl

时间:2017-01-19 21:18:36

标签: python node.js kubernetes

我在GKE管理了一对(现在,但会增加)群集,直到现在已经可以根据需要手动启动。我已经开始使用自己的API,它可以接收按需为特定集群启动新资源的请求,但为了使其可扩展,我需要做一些比每次请求在集群之间切换更动态的事情。我找到了一个可以访问GKE的Google API python客户端的链接:

https://developers.google.com/api-client-library/python/apis/container/v1#system-requirements

我还发现了其他一些客户(特别是我正在密切关注的是来自godaddy的nodejs客户端)可以访问Kubernetes:

https://github.com/godaddy/kubernetes-client

Google API客户端似乎没有记录用于GKE / kubectl命令,而godaddy kubernetes-client必须访问单个群集主服务器,但无法在GKE上访问一个群集主服务器(没有首先启用kubectl代理)。所以我的问题是,如何在编程上以编程方式管理kubernetes,而无需在nodejs或python中使用命令行实用程序?

2 个答案:

答案 0 :(得分:0)

我知道这个问题已有两年了,但是希望这对某人有帮助。此处提供了适用于Node.js的更新的GKE API:https://cloud.google.com/nodejs/docs/reference/container/0.3.x/

在此处查看容器API的列表:https://developers.google.com/apis-explorer/#p/container/v1/

通过API连接后,您可以访问群集详细信息,其中包括用于通过标准API调用连接到主服务器的连接信息。

答案 1 :(得分:0)

I just posted an article on Medium with an example of how to do this

本文的第一部分概述了如何设置服务帐户,角色和凭据并将其作为环境变量加载。完成后,您可以运行以下python:

from kubernetes import client
import base64
from tempfile import NamedTemporaryFile
import os
import yaml
from os import path


def main():
    try:
        host_url = os.environ["HOST_URL"]
        cacert = os.environ["CACERT"]
        token = os.environ["TOKEN"]

        # Set the configuration
        configuration = client.Configuration()
        with NamedTemporaryFile(delete=False) as cert:
            cert.write(base64.b64decode(cacert))
            configuration.ssl_ca_cert = cert.name
        configuration.host = host_url
        configuration.verify_ssl = True
        configuration.debug = False
        configuration.api_key = {"authorization": "Bearer " + token}
        client.Configuration.set_default(configuration)

        # Prepare all the required properties in order to run the create_namespaced_job method
        # https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/BatchV1Api.md#create_namespaced_job
        v1 = client.BatchV1Api()
        with open(path.join(path.dirname(__file__), "job.yaml")) as f:
            body = yaml.safe_load(f)

        v1.create_namespaced_job(namespace="default", body=body, pretty=True)

        return f'Job created successfully', 200

    except Exception as e:
        return str(e), 500


if __name__ == '__main__':
    main()