Kubernetes REST API call using python

10/22/2018

I'm looking for a way to find a pod by name, and run REST call using python. I thought of using port forwarding and kubernetes client

Can someone share a code sample or any other way to do it?

Here is what I started to do:

from kubernetes import client, config 
config.load_kube_config(config_file="my file") client = client.CoreV1Api() 
pods = client.list_namespaced_pod(namespace="my namespace") # loop pods to 
#find my pod

Next I thought of using:

stream(client.connect_get_namespaced_pod_portforward_with_http_info ...

In kubectl command line tool I do the following: 1. List pods 2. Open port forward 3. Use curl to perform the REST call

I want to do the same in python

-- Ori N
kubernetes
python

2 Answers

10/22/2018

List all the pods:

from kubernetes import client, config

# Configs can be set in Configuration class directly or using helper utility
config.load_kube_config()

v1 = client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))

then in the for loop above you can check your pod name , if it matches then return.

-- Ijaz Ahmad Khan
Source: StackOverflow

7/15/2019

Calling your pod using kubernetes API is very un Kubernetes or container Like. You are coupling a microservice (or service) with a deployment technology. You should configure a service and call it using a standard Python call to Rest API.

If you are calling from inside the cluster use the service name for the URL domain If you are calling from outside the cluster use the cluster ip e.g. using docker http://localhost:8000/ with the same code different arg, make sure you configure the service to expose the port outside correctly.

like so:

#!/usr/bin/env python
import sys
import json
import requests


def call_service(outside_call=True, protocol='http', domain='localhost',     service_name='whisperer', service_port='8002', index='hello', payload=None, headers=None):

    if outside_call:

        url = f'{protocol}://{domain}:{service_port}/{index}'
    else:
        url = f'{protocol}://{service_name}:{service_port}/{index}'

    try:
        g = requests.get(url=url)
        print(f'a is: {g}')

        r = requests.post(f'{url}', data=json.dumps(payload), headers=headers)

        print(f'The text returned from the server: {r.text}')

        return r.text
        # return json.loads(r.content)
        except Exception as e:
            raise Exception(f"Error occurred while trying to call service: {e}")


if __name__ == "__main__":

    args = sys.argv
    l = len(args)

    if l > 1:

        outside_call = True if args[1] == 'true' else False
    else:
        outside_call = False

    a = call_service(payload={'key': 'value'}, outside_call=outside_call)

    print(f'a is: {a}')
-- Rubber Duck
Source: StackOverflow