使用数组参数的Openshift模板

时间:2017-04-06 19:04:19

标签: openshift

我正在尝试为Job创建一个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"

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

oc process -o=yaml test-template -v=JOB_NAME=myjob,JOB_ARGS='["A","B"]'

或以编程方式通过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);

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

oc process命令将参数值设置为&#39; [&#34; A&#34;&#39;并报告错误:&#34;&#34;测试模板&#34;:&#34; \&#34; B \&#34;]&#34;&#34;。< / p>

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\"])

我认为这是由于known Openshift issue

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

有趣的是,如果我转到OpenShift Web控制台,请点击“添加到项目”按钮。并选择test-template,它会提示我输入JOB_ARGS参数的值。如果我在那里输入一个文字JSON数组,它可以工作,所以我认为必须有一种方法可以通过编程方式完成。

2 个答案:

答案 0 :(得分:2)

我们研究了如何做;模板代码段:

    spec:
    securityContext:
     supplementalGroups: "${{SUPPLEMENTAL_GROUPS}}"
parameters:
- description: Supplemental linux groups
  name: SUPPLEMENTAL_GROUPS
  value: "[14051, 14052, 48, 65533, 9050]"

答案 1 :(得分:0)

在我们的例子中,我们有3个文件: -环境配置, -模板yaml -运行oc进程的sh文件。

工作案例如下:

环境文件:

#-- CORS  ---------------------------------------------------------
cors_origins='["*"]'
cors_acceptable_headers='["*","Authorization"]'

模板yaml:

- apiVersion: configuration.konghq.com/v1
  kind: KongPlugin
  metadata:
    name: plugin-common-cors
    annotations:
      kubernetes.io/ingress.class: ${ingress_class}
  config:
    origins: "${{origins}}"
    headers: "${{acceptable_headers}}"
    credentials: true
    max_age: 3600
  plugin: cors

运行oc的sh文件:

if [ -f templates/kong-plugins-template.yaml ]; then
    echo "++ Applying Global Plugin Template ..."
    oc process -f templates/kong-plugins-template.yaml \
      -p ingress_class="${kong_ingress_class}" \
      -p origins=${cors_origins} \
      -p acceptable_headers=${cors_acceptable_headers} \
      -p request_per_second=${kong_throttling_request_per_second:-100} \
      -p request_per_minute=${kong_throttling_request_per_minute:-2000} \
      -p rate_limit_by="${kong_throttling_limit_by:-ip}" \
      -o yaml \
      > yaml.tmp && \
    cat yaml.tmp | oc $param_mode -f -
    [ $? -ne 0 ] && [ "$param_mode" != "delete" ] && exit 1
    rm -f *.tmp
fi

sh文件应读取环境文件。