从另一个容器启动 Kubernetes 集群上的一个容器

从另一个容器启动 Kubernetes 集群上的一个容器

我有两个docker容器如下:

  1. 用 Python 编写的 Web 服务器
  2. 执行计算活动然后终止的 Python 脚本

我希望能够让 Web 服务器启动容器二中包含的计算脚本。集群由 Kubernetes 控制。

我最初的想法是让 Web 服务器向 Kubernetes 发出信号来启动计算容器。但是,可能还有其他更好的方法来实现这一点。

还可以使用作业队列来排列 Kubernetes 轮询的作业并在需要时启动 pod。

有没有办法做到这一点?

答案1

我最初的想法是让 Web 服务器向 Kubernetes 发出信号来启动计算容器。但是,可能还有其他更好的方法来实现这一点。

实现这一目标的可能方法之一是:

  • 创建一个ServiceAccount
  • 分配特定权限给您ServiceAccount以支持您的工作量(列出作业、创建作业、删除作业等)
  • 绑定RoleServiceAccount
  • 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/Podweb-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

绑定RoleServiceAccount

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(您需要在同一个命名空间中有一个ServiceAccountRoleRoleBinding)!

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 库:

Github.com:Kubernetes 客户端:Python:示例

检查是否Job已安排并完成:

NAME          COMPLETIONS   DURATION   AGE
example-job   1/1           9s         10m

其他资源:

相关内容