我有两个docker容器如下:
- 用 Python 编写的 Web 服务器
- 执行计算活动然后终止的 Python 脚本
我希望能够让 Web 服务器启动容器二中包含的计算脚本。集群由 Kubernetes 控制。
我最初的想法是让 Web 服务器向 Kubernetes 发出信号来启动计算容器。但是,可能还有其他更好的方法来实现这一点。
还可以使用作业队列来排列 Kubernetes 轮询的作业并在需要时启动 pod。
有没有办法做到这一点?
答案1
我最初的想法是让 Web 服务器向 Kubernetes 发出信号来启动计算容器。但是,可能还有其他更好的方法来实现这一点。
实现这一目标的可能方法之一是:
- 创建一个
ServiceAccount
。 - 分配特定权限给您
ServiceAccount
以支持您的工作量(列出作业、创建作业、删除作业等) - 绑定
Role
到ServiceAccount
web-server
使用之前创建的运行ServiceAccount
- 查询 Kubernetes API。
需要考虑的一些事项:
- 您将需要
kubectl
二进制或Kubernetes API Python library
内部的web-server
。 - 您需要考虑计算 Python 脚本结果的存储选项。
为了便于查看,我已将我提供的链接粘贴到评论中:
另外,我发现这篇文章也有类似的设置:
对于此类设置的示例:
创建一个ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: python-job-sa
这将与托管您的ServiceAccount
一起使用。Deployment/Pod
web-server
分配特定权限给你的ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: python-job-role
rules:
# This will give you access to jobs
- apiGroups: ["batch", "extensions"]
resources: ["jobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# This will give you access to pods
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
# This will give you access to pods logs
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
这Role
允许查询 Kubernetes API 以获取类似的资源Jobs
。
绑定Role
到ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: python-job-rolebinding
namespace: default
subjects:
- kind: ServiceAccount
name: python-job-sa
namespace: default
roleRef:
kind: Role
name: python-job-role
apiGroup: rbac.authorization.k8s.io
这RoleBinding
会将您绑定ServiceAccount
到您的Role
并允许与 Kubernetes API 进行通信。
一个提示!
为了隔离工作负载,您可以使用不同于的命名空间
default
(您需要在同一个命名空间中有一个ServiceAccount
、Role
和RoleBinding
)!
web-server
使用之前创建的运行ServiceAccount
为了例子/测试图像的用途google/cloud-sdk:latest
。它已经kubectl
安装python
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloud-sdk-job
spec:
selector:
matchLabels:
app: cloud-sdk-job
replicas: 1
template:
metadata:
labels:
app: cloud-sdk-job
spec:
serviceAccountName: python-job-sa # <-- IMPORTANT
containers:
- name: cloud-sdk
image: google/cloud-sdk:latest
command:
- sleep
- "infinity"
查询 Kubernetes API
查询应该由您完成web-server
,但为了举例说明,您可以执行运行Pod
并检查要运行的 python 脚本是否Job
正确运行:
$ kubectl exec -it WEB-SERVER-POD-NAME -- /bin/bash
免责声明!
google/cloud-sdk:latest
需要使用 pip 安装 kubernetes python api 库:
$ pip3 install kubernetes
生成的示例代码Job
:
from kubernetes import client, config
JOB_NAME = "example-job"
def create_job_object():
# Configureate Pod template container
container = client.V1Container(
name="pi",
image="perl",
command=["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"])
# Create and configurate a spec section
template = client.V1PodTemplateSpec(
metadata=client.V1ObjectMeta(labels={"app": "pi"}),
spec=client.V1PodSpec(restart_policy="Never", containers=[container]))
# Create the specification of deployment
spec = client.V1JobSpec(
template=template,
backoff_limit=4)
# Instantiate the job object
job = client.V1Job(
api_version="batch/v1",
kind="Job",
metadata=client.V1ObjectMeta(name=JOB_NAME),
spec=spec)
return job
def create_job(api_instance, job):
# Create job
api_response = api_instance.create_namespaced_job(
body=job,
namespace="default")
print("Job created. status='%s'" % str(api_response.status))
def main():
# Configs can be set in Configuration class directly or using helper
# utility. If no argument provided, the config will be loaded from
# default location.
# config.load_kube_config()
config.load_incluster_config() # <-- IMPORTANT
batch_v1 = client.BatchV1Api()
# Create a job object with client-python API. The job we
job = create_job_object()
create_job(batch_v1, job)
if __name__ == '__main__':
main()
上面的例子来自 Kubernetes Python API 库:
检查是否Job
已安排并完成:
NAME COMPLETIONS DURATION AGE
example-job 1/1 9s 10m
其他资源: