Python or Node access to GKE kubectl

1/19/2017

I manage a couple (presently, but will increase) clusters at GKE and up till now have been ok launching things manually as needed. I've started working my own API that can take in requests to spin up new resources on-demand for a specific cluster but in order to make it scalable I need to do something more dynamic than switching between clusters with each request. I have found a link for a Google API python client that supposedly can access GKE:

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

I've also found several other clients (specifically one I was looking closely at was the nodejs client from godaddy) that can access Kubernetes:

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

The Google API Client doesn't appear to be documented for use with GKE/kubectl commands, and the godaddy kubernetes-client has to access a single cluster master but can't reach one at GKE (without a kubectl proxy enabled first). So my question is, how does one manage kubernetes on GKE programmatically without having to use the command-line utilities in either nodejs or python?

-- Alex Liffick
kubernetes
node.js
python

2 Answers

2/6/2019

I know this question is a couple of years old, but hopefully this helps someone. Newer GKE APIs are available for Node.js here: https://cloud.google.com/nodejs/docs/reference/container/0.3.x/

See list of container APIs here: https://developers.google.com/apis-explorer/#p/container/v1/

Once connected via the API, you can access cluster details, which includes the connectivity information for connecting to the master with standard API calls.

-- Derek Adams
Source: StackOverflow

6/18/2019

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

The first part of the article outlines how to setup the service account, roles and credentials and load them as Environmental variables. Once done, you could then run the following 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()
-- Jan Krynauw
Source: StackOverflow