带有数组参数的 Openshift 模板

Eri*_*ric 4 openshift

我正在尝试为作业创建一个 Openshift 模板,该模板使用以下模板在模板参数中传递作业的命令行参数:

apiVersion: v1
kind: Template
metadata:
  name: test-template
objects:
  - apiVersion: batch/v2alpha1
    kind: Job
    metadata:
      name: "${JOB_NAME}"
    spec:
      parallelism: 1
      completions: 1
      autoSelector: true
      template:
        metadata:
          name: "${JOB_NAME}"
        spec:
          containers:
            - name: "app"
              image: "batch-poc/sample-job:latest"
              args: "${{JOB_ARGS}}"
parameters:
  - name: JOB_NAME
    description: "Job Name"
    required: true
  - name: JOB_ARGS
    description: "Job command line parameters"
Run Code Online (Sandbox Code Playgroud)

因为“args”需要是一个数组,所以我尝试使用 JSON 语法设置模板参数,例如从命令行:

oc process -o=yaml test-template -v=JOB_NAME=myjob,JOB_ARGS='["A","B"]'
Run Code Online (Sandbox Code Playgroud)

或通过 Spring Cloud Launcher OpenShift 客户端以编程方式:

OpenShiftClient client;
Map<String,String> templateParameters = new HashMap<String,String>();
templateParameters.put("JOB_NAME", jobId);
templateParameters.put("JOB_ARGS", "[ \"A\", \"B\", \"C\" ]");
KubernetesList processed = client.templates()
   .inNamespace(client.getNamespace())
   .withName("test-template")
   .process(templateParameters);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,它似乎都会失败,因为 Openshift 将第一个数组元素后面的逗号解释为分隔符,而不解析字符串的其余部分。

oc process命令将参数值设置为“[“A””并报告错误:““test-template”中的参数分配无效:“\“B\”]“”。

Java版本抛出异常:

          Error executing: GET at: https://kubernetes.default.svc/oapi/v1/namespaces/batch-poc/templates/test-template. Cause: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token\n at [Source: N/A; line: -1, column: -1] (through reference chain: io.fabric8.openshift.api.model.Template[\"objects\"]->java.util.ArrayList[0]->io.fabric8.kubernetes.api.model.Job[\"spec\"]->io.fabric8.kubernetes.api.model.JobSpec[\"template\"]->io.fabric8.kubernetes.api.model.PodTemplateSpec[\"spec\"]->io.fabric8.kubernetes.api.model.PodSpec[\"containers\"]->java.util.ArrayList[0]->io.fabric8.kubernetes.api.model.Container[\"args\"])
Run Code Online (Sandbox Code Playgroud)

我相信这是由于已知的 Openshift 问题造成的。

我想知道是否有人有解决方法或设置作业参数的替代方法?

有趣的是,如果我转到 OpenShift Web 控制台,单击“添加到项目”并选择测试模板,它会提示我输入 JOB_ARGS 参数的值。如果我在那里输入一个文本 JSON 数组,它就会起作用,所以我认为必须有一种方法可以以编程方式执行此操作。

小智 5

我们想出了如何去做;模板片段:

    spec:
    securityContext:
     supplementalGroups: "${{SUPPLEMENTAL_GROUPS}}"
parameters:
- description: Supplemental linux groups
  name: SUPPLEMENTAL_GROUPS
  value: "[14051, 14052, 48, 65533, 9050]"
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,`value` 必须是有效的 json。因此,如果您的列表是字符串数据(而不是数字),那么您需要确保正确的引用。这会将值识别为列表 `'["foo", "bar"]'`,但这会将值识别为字符串 `"['foo', 'bar']"` (2认同)