首页 > 解决方案 > python应用程序调用kubernetes以编程方式创建pod

问题描述

我正在设计一个 Web 应用程序,用户可以在其中运行交易机器人。所以他们将登录,支付会员费用,然后他们将创建一个机器人,输入凭据并启动机器人。用户可以停止/启动交易机器人。

我正在尝试使用 kubernetes 来做到这一点,所以我会让一切都在 kubernetes 上运行。我将创建一个名为 bots 的命名空间,所有客户端的所有 bot 都将在此 bot 命名空间内运行。

堆栈是:python(django框架)+ mysql + aws + kubernetes

问题:有没有办法使用 python 以编程方式创建一个 pod?我想与应用程序代码集成。因此,当用户单击创建新机器人时,它将启动一个新的 pod,其中包含特定用户的所有参数。

基本上每个 pod 都是租户。但是一个租户可以有多个 Pod/机器人。那么怎么做呢?是否有任何 kubernetes python lib 可以做到这一点?我做了一些在线搜索,但没有找到任何东西。谢谢

标签: pythondjangoapiflaskkubernetes

解决方案


正如 Harsh Manvar 所指出的,您可以使用官方的 Kubernetes Python 客户端。这是一个允许执行此操作的简短功能。

from kubernetes import client, config, utils
from kubernetes.client.api import core_v1_api

config.load_incluster_config()
try:
    c = Configuration().get_default_copy()
except AttributeError:
    c = Configuration()
    c.assert_hostname = False
Configuration.set_default(c)
self.core_v1 = core_v1_api.CoreV1Api()

def open_pod(self, cmd: list, 
                   pod_name: str, 
                   namespace: str='bots', 
                   image: str=f'{repository}:{tag}', 
                   restartPolicy: str='Never', 
                   serviceAccountName: str='bots-service-account'):
    '''
    This method launches a pod in kubernetes cluster according to command
    '''
    
    api_response = None
    try:
        api_response = self.core_v1.read_namespaced_pod(name=pod_name,
                                                        namespace=namespace)
    except ApiException as e:
        if e.status != 404:
            print("Unknown error: %s" % e)
            exit(1)

    if not api_response:
        print(f'From {os.path.basename(__file__)}: Pod {pod_name} does not exist. Creating it...')
        # Create pod manifest
        pod_manifest = {
            'apiVersion': 'v1',
            'kind': 'Pod',
            'metadata': {
                'labels': {
                    'bot': current-bot
                },
                'name': pod_name
            },
            'spec': {
                'containers': [{
                    'image': image,
                    'pod-running-timeout': '5m0s',
                    'name': f'container',
                    'args': cmd,
                    'env': [
                        {'name': 'env_variable', 'value': env_value},
                    ]
                }],
                # 'imagePullSecrets': client.V1LocalObjectReference(name='regcred'), # together with a service-account, allows to access private repository docker image
                'restartPolicy': restartPolicy,
                'serviceAccountName': bots-service-account
            }
        }
        
        print(f'POD MANIFEST:\n{pod_manifest}')

        api_response = self.core_v1.create_namespaced_pod(body=pod_manifest,                                                          namespace=namespace)

        while True:
            api_response = self.core_v1.read_namespaced_pod(name=pod_name,
                                                            namespace=namespace)
            if api_response.status.phase != 'Pending':
                break
            time.sleep(0.01)
        
        print(f'From {os.path.basename(__file__)}: Pod {pod_name} in {namespace} created.')
        return pod_name

进一步研究,参考官方github repo中的例子:https ://github.com/kubernetes-client/python/tree/master/examples


推荐阅读