如何在 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])*...
对于 liveness
和 readiness
探测器中的 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
我正在尝试在 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])*...
对于 liveness
和 readiness
探测器中的 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