我是新手,我曾尝试部署一些教程图表。有几个查询:
1)我有一个需要部署的kubernets作业。是否可以通过掌舵部署工作?
2)另外,当前我的kubernetes作业是从我的自定义docker映像部署的,并且它运行bash脚本来完成该作业。我想向此图表/作业传递一些参数,以便bash命令采用输入参数。这就是我决定掌舵的原因,因为它提供了更大的灵活性。有可能吗?
答案 0 :(得分:2)
您可以使用Helm Hooks
运行作业。根据您设置注释的方式,您可以运行不同类型的挂钩(预安装,后安装,预删除,后删除,升级前,升级后,还原前,还原后,crd -安装)。来自doc的示例如下:
apiVersion: batch/v1
kind: Job
metadata:
name: "{{.Release.Name}}"
labels:
app.kubernetes.io/managed-by: {{.Release.Service | quote }}
app.kubernetes.io/instance: {{.Release.Name | quote }}
helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
annotations:
# This is what defines this resource as a hook. Without this line, the
# job is considered part of the release.
"helm.sh/hook": post-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
metadata:
name: "{{.Release.Name}}"
labels:
app.kubernetes.io/managed-by: {{.Release.Service | quote }}
app.kubernetes.io/instance: {{.Release.Name | quote }}
helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: "alpine:3.3"
command: ["/bin/sleep","{{default "10" .Values.sleepyTime}}"]
您可以将参数以secrets
或configMaps
的形式传递给工作,就像传递给pod一样。
答案 1 :(得分:2)
我有一个类似的场景,我有一份工作,我想向其传递各种参数。我最终做了这样的事情:
模板:
apiVersion: batch/v1
kind: Job
metadata:
name: myJob
spec:
template:
spec:
containers:
- name: myJob
image: myImage
args: {{ .Values.args }}
命令(powershell):
helm template helm-chart --set "args={arg1\, arg2\, arg3}" | kubectl apply -f -
答案 2 :(得分:0)
您可以使用头盔。 Helm将所有kubernetes资源安装在template文件夹内,例如job,pods,configmaps,secrets。您可以通过头盔挂钩控制安装顺序。 Helm提供了与部署相关的挂钩,如安装前,安装后,预删除。如果预先安装了两个或多个作业,则将比较它们的权重进行安装。
|-scripts/runjob.sh
|-templates/post-install.yaml
|-Chart.yaml
|-values.yaml
很多时候,您需要根据环境更改脚本中的变量。因此,除了在脚本中对变量进行硬编码之外,您还可以通过将参数设置为自定义Docker映像的环境变量来将参数传递给脚本。更改values.yaml中的值,而不是更改脚本中的值。
values.yaml
key1:
someKey1: value1
key2:
someKey2: value1
post-install.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: post-install-job
labels:
provider: stackoverflow
microservice: {{ template "name" . }}
release: "{{ .Release.Name }}"
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
annotations:
"helm.sh/hook": pre-install,pre-upgrade,pre-rollback
"helm.sh/hook-delete-policy": before-hook-creation
"helm.sh/hook-weight": "3"
spec:
template:
metadata:
name: "{{.Release.Name}}"
labels:
provider: stackoverflow
microservice: {{ template "name" . }}
release: "{{ .Release.Name }}"
app: {{ template "fullname" . }}
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: "custom-docker-image:v1"
command: ["/bin/sh", "-c", {{ .Files.Get "scripts/runjob.sh" | quote }} ]
env:
#setting KEY1 as environment variable in the container,value of KEY1 in container is value1(read from values.yaml)
- name: KEY1
value: {{ .Values.key1.someKey1 }}
- name: KEY2
value: {{ .Values.key2.someKey2 }}
runjob.sh
# you can access the variable from env variable
echo $KEY1
echo $KEY2
# some stuff