1

用例:

我希望能够从第一份工作停止的地方重新运行一份工作。我正在使用 Helm 部署到 Kubernetes。

我有将第一份工作的状态保存在 ConfigMap 中的想法。定义 ConfigMap 的 ConfigMap yaml 与作业一起打包,并与 Helm 同时部署。

apiVersion: v1
kind: ConfigMap
metadata:
  name: NameOfMyConfigMap
data:
  someKey: someValue
  MY_STATE: state      <---- See below as to whether this should be included or not

该作业使用 ConfigMap 中设置的 ENV 变量运行:

env:
  - name: MY_STATE
    valueFrom:
      configMapKeyRef:
        name:  NameOfMyConfigMap
        key: MY_STATE

该作业运行一个脚本,查看是否设置了 $MY_STATE,如果未设置,则该作业是第一次运行,否则该作业将关闭已经运行的第一个作业,将第一个作业的状态保存到 MY_STATE ConfigMap 变量并使用保存的状态再次启动作业。

如果我没有在初始 ConfigMap 定义中声明 MY_STATE 键,那么作业的第一次运行将失败,因为上面的 ENV 定义找不到 ConfigMap 变量。

如果我确实MY_STATE: ""在 ConfigMap 定义中声明了值 ( ),那么第一个部署将起作用。但是,如果我重新部署作业,helm upgrade那么我在定义中输入的值是否不会覆盖现有 ConfigMap 中的现有值?

在同一作业的运行之间存储状态的最佳方法是什么?

4

1 回答 1

2

您是否尝试过使用卷?在这种情况下,使用 helm upgrade 时不应覆盖它。

像这样的例子可以吗?(来自 https://groups.google.com/forum/#!msg/kubernetes-users/v2806ezEdPk/1geJCO8-AQAJ

apiVersion: batch/v1
kind: Job
metadata:
  name: keystore-configmap-job
spec:
  template:
    metadata:
      name: keystore-configmap
    spec:
      containers:
        - name: keystore
          image: ubuntu
          volumeMounts:
            - name: keystore-configmap-volume
              mountPath: /config-base64
          command: [ "sh", "-c", "cat /config-base64/keystore.jks | base64 --decode | sha256sum" ]

      restartPolicy: Never

      volumes:
      - name: keystore-configmap-volume
        configMap:
          name: keystore-configmap
于 2017-06-01T07:58:55.633 回答