我如何 运行 使用 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
这样的模板工具,您可以在其中模板化工作负载的确切规范,然后使用不同的值对其进行迭代(参见示例)
- 使用关于工作队列主题的 Kubernetes 官方文档:
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
其他资源:
我有一个 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
这样的模板工具,您可以在其中模板化工作负载的确切规范,然后使用不同的值对其进行迭代(参见示例) - 使用关于工作队列主题的 Kubernetes 官方文档:
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 ofJobs
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 yourJobs
.
您还可以 运行 以上图表:
$ 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
其他资源: