我如何 运行 使用 k8s 在内部创建多个容器和 运行 不同的命令

How do I run create multiple container and run different command inside using k8s

我有一个 Kubernetes Job, job.yaml :

---
apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace
---
apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
  namespace: my-namespace
spec:
  template:
    spec:
      containers:
      - name: my-container
        image: gcr.io/project-id/my-image:latest
        command: ["sh", "run-vpn-script.sh", "/to/download/this"] # need to run this multiple times
        securityContext:
          privileged: true
          allowPrivilegeEscalation: true
      restartPolicy: Never

我需要 运行 command 不同的参数。 运行 我有 30 个参数。我不确定这里最好的解决方案是什么。我正在考虑在 运行 所有参数的循环中创建容器。我怎样才能做到这一点?我想同时 运行 commands 或容器。

如果你想多次运行相同的命令,你可以多次部署相同的 YAML,只需更改 名称

您可以使用 sed 命令替换 YAML 中的值,并将这些 YAML 应用于集群以创建容器。

示例job.yaml

---
apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace
---
apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
  namespace: my-namespace
spec:
  template:
    spec:
      containers:
      - name: my-container
        image: gcr.io/project-id/my-image:latest
        command: COMMAND # need to run this multiple times
        securityContext:
          privileged: true
          allowPrivilegeEscalation: true
      restartPolicy: Never

命令:

'job.yaml | sed -i "s,COMMAND,["sh", "run-vpn-script.sh", "/to/download/this"],"

因此上述命令将替换YAML中的所有值,您可以将YAML应用于集群以创建容器。同样你可以申请其他变量。

您可以根据需要在 YAML 中设置的命令中传递不同的参数。

您还可以使用 命令部署多个作业

kubectl create job test-job --from=cronjob/a-cronjob

https://www.mankier.com/1/kubectl-create-job

根据需要将其他参数传递到命令中。

如果你不只是想 运行 POD 你也可以试试

kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>

https://jamesdefabia.github.io/docs/user-guide/kubectl/kubectl_run/

简单来说,您想要 运行 多个命令,以下是在 pod 中执行多个命令的示例格式:

command: ["/bin/bash","-c","touch /foo && echo 'here' && ls /"]

当我们将此逻辑应用于您对两种不同操作的要求时

 command: ["sh", "-c", "run-vpn-script.sh /to/download/this && run-vpn-script.sh /to/download/another"] 

除了其他答案中提出的解决方案之外,您还可以采用以下一些方法:


Helm 示例:

Helm 简而言之是一个模板工具,可让您模板化您的清单(YAML 文件)。这样你就可以有多个 Jobs 的实例,它们具有不同的名称和不同的命令。

假设您已经按照以下指南安装了 Helm

您可以创建一个示例图表,将其修改为 运行 您的 Jobs:

  • helm create chart-name

您需要删除 chart-name/templates/ 中的所有内容并清除 chart-name/values.yaml 文件。

之后,您可以创建 values.yaml 文件,您将对其进行迭代:

jobs:
  - name: job1
    command: ['"perl",  "-Mbignum=bpi", "-wle", "print bpi(3)"']
    image: perl
  - name: job2
    command: ['"perl",  "-Mbignum=bpi", "-wle", "print bpi(20)"']
    image: perl
  • templates/job.yaml
{{- range $jobs := .Values.jobs }}
apiVersion: batch/v1
kind: Job
metadata:
  name: {{ $jobs.name }}
  namespace: default # <-- FOR EXAMPLE PURPOSES ONLY!
spec:
  template:
    spec:
      containers:
      - name: my-container
        image: {{ $jobs.image }}
        command: {{ $jobs.command }}
        securityContext:
          privileged: true
          allowPrivilegeEscalation: true
      restartPolicy: Never
---
{{- end }}

如果您创建了上述文件,您可以运行以下命令预先应用到集群:

  • $ helm template .(在 chart-name 文件夹内)
---
# Source: chart-name/templates/job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job1
  namespace: default
spec:
  template:
    spec:
      containers:
      - name: my-container
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(3)"]
        securityContext:
          privileged: true
          allowPrivilegeEscalation: true
      restartPolicy: Never
---
# Source: chart-name/templates/job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job2
  namespace: default
spec:
  template:
    spec:
      containers:
      - name: my-container
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(20)"]
        securityContext:
          privileged: true
          allowPrivilegeEscalation: true
      restartPolicy: Never

A side note #1!

This example will create X amount of Jobs where each one will be separate from the other. Please refer to the documentation on data persistency if the files that are downloaded are needed to be stored persistently (example: GKE).

A side note #2!

You can also add your namespace definition in the templates (templates/namespace.yaml) so it will be created before running your Jobs.

您还可以 运行 以上图表:

  • $ helm install chart-name .(在 chart-name 文件夹内)

之后您应该会看到 2 个 Jobs 已完成:

  • $ kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job1-2dcw5   0/1     Completed   0          82s
job2-9cv9k   0/1     Completed   0          82s

以及他们创建的输出:

  • $ echo "one:"; kubectl logs job1-2dcw5; echo "two:"; kubectl logs job2-9cv9k
one:
3.14
two:
3.1415926535897932385

其他资源: