通过 helm 部署 kubernetes 作业

aaj*_*aaj 15 kubernetes kubernetes-helm

我是 helm 的新手,我尝试部署一些教程图表。有几个疑问:

  1. 我有一个需要部署的 Kubernetes 工作。是否可以通过 helm 部署作业?

  2. 此外,目前我的 kubernetes 作业是从我的自定义 docker 映像部署的,它运行一个 bash 脚本来完成该作业。我想将一些参数传递给此图表/作业,以便 bash 命令采用输入参数。这就是我决定转任掌舵的原因,因为它提供了更大的灵活性。那可能吗?

coo*_*ugh 12

您可以使用Helm Hooks来运行作业。根据您设置注释的方式,您可以运行不同类型的挂钩(安装前、安装后、删除前、删除后、升级前、升级后、回滚前、回滚后、crd -安装)。文档中的一个示例如下:

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}}"]
Run Code Online (Sandbox Code Playgroud)

您可以将参数作为secrets或传递configMaps给您的工作,就像传递给 pod 一样。


Man*_*a P 10

你可以使用头盔。Helm 在模板文件夹中安装所有 Kubernetes 资源,如 job、pods、configmaps、secrets。您可以通过 helm hooks 控制安装顺序。Helm 提供了与部署相关的预安装、安装后、预删除等钩子。如果预先安装了两个或多个作业,则将比较它们的重量以进行安装。

|-scripts/runjob.sh
|-templates/post-install.yaml
|-Chart.yaml
|-values.yaml
Run Code Online (Sandbox Code Playgroud)

很多时候您需要根据环境更改脚本中的变量。因此,除了在脚本中硬编码变量之外,您还可以通过将参数设置为自定义 docker 映像的环境变量来将参数传递给脚本。更改 values.yaml 中的值,而不是更改脚本中的值。

值.yaml

key1:
  someKey1: value1
key2:
  someKey2: value1
Run Code Online (Sandbox Code Playgroud)

安装后.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 }}
Run Code Online (Sandbox Code Playgroud)

运行作业.sh

# you can access the variable from env variable
echo $KEY1
echo $KEY2
# some stuff
Run Code Online (Sandbox Code Playgroud)


Don*_*aga 5

我也遇到过类似的情况,我有一份工作,我想向其传递各种论点。我最终做了这样的事情:

模板:

apiVersion: batch/v1
kind: Job
metadata:
  name: myJob
spec:
  template:
    spec:
      containers:
      - name: myJob
        image: myImage
        args: {{ .Values.args }}
Run Code Online (Sandbox Code Playgroud)

命令(powershell):

helm template helm-chart --set "args={arg1\, arg2\, arg3}" | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)