python - python应用程序调用kubernetes以编程方式创建pod
问题描述
我正在设计一个 Web 应用程序,用户可以在其中运行交易机器人。所以他们将登录,支付会员费用,然后他们将创建一个机器人,输入凭据并启动机器人。用户可以停止/启动交易机器人。
我正在尝试使用 kubernetes 来做到这一点,所以我会让一切都在 kubernetes 上运行。我将创建一个名为 bots 的命名空间,所有客户端的所有 bot 都将在此 bot 命名空间内运行。
堆栈是:python(django框架)+ mysql + aws + kubernetes
问题:有没有办法使用 python 以编程方式创建一个 pod?我想与应用程序代码集成。因此,当用户单击创建新机器人时,它将启动一个新的 pod,其中包含特定用户的所有参数。
基本上每个 pod 都是租户。但是一个租户可以有多个 Pod/机器人。那么怎么做呢?是否有任何 kubernetes python lib 可以做到这一点?我做了一些在线搜索,但没有找到任何东西。谢谢
解决方案
正如 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
推荐阅读
- ruby-on-rails - 使用 Papertrail 的 attribute_name_was
- python - 在 Django 中将 JWT 与自定义用户模型一起使用时遇到问题
- javascript - 如何使用 JQuery 从 RSS 提要中提取图像?
- visual-studio - 在 IISExpress 上启动 localhost:远程设备或资源不接受连接
- android - 片段的新活动?
- node.js - 我想通过单击按钮向订阅我的网页的用户发送电子邮件
- php - PHP Composer Autoload 找不到类错误
- powerbi - 如何将来自两个查询的汇总数据加入 DAX Power BI 中的新表中
- javascript - Javascript - 简单的 OOP 封装
- sql - oracle选择数据集中没有返回的日期