gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:01:04 24 4
gpt4 key购买 nike

我有一个 Kubernetes Jobjob.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

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

最佳答案

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


Helm 示例:

Helm 简而言之是一种模板工具,可让您对 list (YAML 文件)进行模板化。这样,您就可以拥有多个具有不同名称和不同命令的 Jobs 实例。

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

您可以创建一个示例图表,您将对其进行修改以运行您的作业:

  • 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 获取 pod
NAME         READY   STATUS      RESTARTS   AGE
job1-2dcw5 0/1 Completed 0 82s
job2-9cv9k 0/1 Completed 0 82s

以及他们创建的输出:

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

其他资源:

关于docker - 如何运行创建多个容器并使用 k8s 在内部运行不同的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68264425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com