如何在 OpenShift JSON 项目模板中参数化端口

How to parameterize ports in OpenShift JSON Project Template

我正在尝试在 OpenShift Origin 中创建自定义项目模板。 Service 配置具体如下所示:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "${NAME}",
    "annotations": {
      "description": "Exposes and load balances the node.js application pods"
    }
  },
  "spec": {
    "ports": [
      {
        "name": "web",
        "port": "${APPLICATION_PORT}",
        "targetPort": "${APPLICATION_PORT}",
        "protocol": "TCP"
      }
    ],
    "selector": {
      "name": "${NAME}"
    }
  }
},

其中,APPLICATION_PORT 作为用户参数提供:

"parameters": [
  {
    "name": "APPLICATION_PORT",
    "displayName": "Application Port",
    "description": "The exposed port that will route to the node.js application",
    "value": "8000"
  },

当我尝试使用此模板创建项目时,出现以下错误:

spec.ports[0].targetPort: Invalid value: "8000": must be an IANA_SVC_NAME (at most 15 characters, matching regex [a-z0-9]([a-z0-9-]*[a-z0-9])*...

对于 livenessreadiness 探测器中的 http 端口,我在 DeploymentConfig 中也遇到了类似的错误:

"readinessProbe": {
  "timeoutSeconds": 3,
  "initialDelaySeconds": 3,
  "httpGet": {
    "path": "/Info",
    "port": "${APPLICATION_ADMIN_PORT}"
  }
},
"livenessProbe": {
  "timeoutSeconds": 3,
  "initialDelaySeconds": 30,
  "httpGet": {
    "path": "/Info",
    "port": "${APPLICATION_ADMIN_PORT}"
  }
},

其中,APPLICATION_ADMIN_PORT 也是用户提供的。

错误:

spec.template.spec.containers[0].livenessProbe.httpGet.port: Invalid value: "8001": must be an IANA_SVC_NAME...

spec.template.spec.containers[0].readinessProbe.httpGet.port: Invalid value: "8001": must be an IANA_SVC_NAME...

我一直在关注 https://blog.openshift.com/part-2-creating-a-template-a-technical-walkthrough/ 以了解模板,不幸的是,它没有任何 ports 在任何地方被参数化的例子。

似乎 strings 不允许作为这些端口的值。是这样吗?参数化这些值的正确方法是什么? 我应该切换到 YAML 吗?

版本

OpenShift Master: v1.1.6-3-g9c5694f

Kubernetes Master: v1.2.0-36-g4a3f9c5

编辑 1:我在 YAML 格式中尝试了相同的配置,但得到了相同的错误。所以,JSON vs YAML 不是 的问题。

遗憾的是,目前无法参数化非字符串字段值:https://docs.openshift.org/latest/dev_guide/templates.html#writing-parameters

" 可以通过将值置于模板中的任何 字符串字段 中以 "${PARAMETER_NAME}" 形式的值来引用参数。"

模板正在被上传到 Kubernetes 的过程中,这个限制正在那里得到解决: https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/templates.md

该提案正在 Kubernetes 存储库的 PR 25622 和 25293 中实施。

编辑: 模板现在支持非字符串参数,如下所述:https://docs.openshift.org/latest/dev_guide/templates.html#writing-parameters

这可能是一种不好的做法,但我正在使用 sed 来替换 int 参数:

cat template.yaml | sed -e 's/PORT/8080/g' > proxy-template-subst.yaml

模板:

apiVersion: template.openshift.io/v1
kind: Template
objects:
- apiVersion: v1
  kind: Service
  metadata:
    name: ${NAME}
    namespace: ${NAMESPACE}
  spec:
    externalTrafficPolicy: Cluster
    ports:
      - name: ${NAME}-port
        port: PORT
        protocol: TCP
        targetPort: PORT
    sessionAffinity: None
    type: NodePort
  status:
    loadBalancer: {}
parameters:
- description: Desired service name
  name: NAME
  required: true
  value: need_real_value_here
- description: IP adress
  name: IP
  required: true
  value: need_real_value_here
- description: namespace where to deploy
  name: NAMESPACE
  required: true
  value: need_real_value_here

我不知道在 2016 年添加此 post 时此选项是否可用,但现在您可以使用 ${{PARAMETER_NAME}} 来参数化非字符串字段值。

  spec:
    externalTrafficPolicy: Cluster
    ports:
      - name: ${NAME}-port
        port: ${{PORT_PARAMETER}}
        protocol: TCP
        targetPort: ${{PORT_PARAMETER}}
    sessionAffinity: None