【问题标题】:python app to call kubernetes to create pod programmaticallypython应用程序调用kubernetes以编程方式创建pod
【发布时间】:2021-06-01 12:07:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • Kubernetes 文档中的Reference 页面包含指向受支持的 Python 客户端库和 Kubernetes API 对象规范的链接。

标签: python django api flask kubernetes


【解决方案1】:

正如 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

【讨论】:

    【解决方案2】:

    您可以使用官方 Python Kubernetes 客户端以编程方式跨集群创建和管理 POD。

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

    您可以保留一个 YAML 文件并根据要求将值替换为 Deployment NamePorts 并将文件应用到集群,它将创建具有基础的 POD图片。

    【讨论】:

    • 其实我已经查过这个kubernetes客户端但是没找到创建pod的方法,也没找到create/apply部署函数
    猜你喜欢
    • 2021-12-11
    • 2011-09-09
    • 2018-02-21
    • 1970-01-01
    • 2011-07-14
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多