带有数组参数的Openshift模板

带有数组参数的Openshift模板,openshift,Openshift,我正在尝试为作业创建Openshift模板,该模板使用以下模板在模板参数中传递作业的命令行参数: apiVersion: v1 kind: Template metadata: name: test-template objects: - apiVersion: batch/v2alpha1 kind: Job metadata: name: "${JOB_NAME}" spec: parallelism: 1 completi

我正在尝试为作业创建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 web控制台,单击“添加到项目”并选择测试模板,它会提示我输入JOB_ARGS参数的值。如果我在那里输入一个文本JSON数组,它就可以工作,所以我想一定有一种方法可以通过编程实现;模板片段:

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

在本例中,我们有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文件应为环境文件。

您使用的是什么版本的OpenShift oc客户端?有一个问题是,较旧的
oc
版本如何解析嵌入逗号和其他特殊字符的值。另外,您是否尝试过对每个参数使用单独的
--param
选项(我认为
-v
必须被弃用,因为它不在帮助字符串中)?最后,它可能不会有任何帮助,因为不要相信它可能是一个JSON片段。它应该把整个东西当作一个字符串。哦,等等,你正在使用新的
${}
表单。我认为它仅限于文本值,不是任意的JSON片段。
oc版本
显示了oc v3.1.0.4。Per>参数可以是json/yaml值,方法是将值以${PARAMETER_NAME}的形式放置在模板中的任何字段中。web控制台正确地将参数解析为JSON,因此它在模板中是允许的。由于上面描述的逗号问题,我无法理解如何传递数组值。我做了一些调试,试图弄清楚openshift客户端是如何做的,它看起来像是在客户端上处理模板。您尝试过单独的参数吗。例如,
--param JOB_NAME=myjob--param JOB_ARGS='[“A”,“B”]'
OpenShift的服务器端版本是什么?我认为,
${{}}
语法和参数解析中的修复只在比您更新的
oc
版本中得到了修复。值得一提的是,
必须是有效的json。因此,如果列表是字符串数据(而不是数字),则需要确保正确引用。这将把值识别为一个列表
“[“foo”,“bar”]”
,但这将把值识别为一个字符串
“[“foo”,“bar”]”
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