带有秘密的 livenessProbe 在 kubernetes 中不起作用
livenessProbe with secret not working in kubernetes
我正在尝试在我的 kubernetes 部署 yaml 文件中传递 livenessProbe 来执行我的应用程序的运行状况。所以,我创建了一个带有令牌值的秘密并按如下方式传递
livenessProbe:
httpGet:
path: test/actuator/health
port: 9001
httpHeaders:
- name: Authorization
valueFrom:
secretKeyRef:
name: actuator-token
value: token
但我收到以下错误
error: error validating "deployment.yaml": error validating data: [ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): unknown field "valueFrom" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): missing required field "value" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].readinessProbe.httpGet.httpHeaders): invalid type for io.k8s.api.core.v1.HTTPGetAction.httpHeaders: got "map", expected "array"]; if you choose to ignore these errors, turn validation off with --validate=false
请提出建议并感谢您的帮助。
另外让我们知道他们是否有更好的处理令牌的方法,因为我不想直接在我的部署 yaml 文件中提供令牌值。
httpHeaders
只支持value
和name
字段不处理valueFrom
$ kubectl explain pod.spec.containers.livenessProbe.httpGet.httpHeaders
KIND: Pod
VERSION: v1
RESOURCE: httpHeaders <[]Object>
DESCRIPTION:
Custom headers to set in the request. HTTP allows repeated headers.
HTTPHeader describes a custom header to be used in HTTP probes
FIELDS:
name <string> -required-
The header field name
value <string> -required-
The header field value
您可以尝试使用 env 变量,例如。
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: MY_SECRET
valueFrom:
secretKeyRef:
name: actuator-token
key: token
livenessProbe:
httpGet:
path: test/actuator/health
port: 9001
httpHeaders:
- name: Authorization
value: $SECRET
不确定@DT 的回答是否有效,没有关于该功能的文档。
我也做了一些测试,下面的例子对我不起作用:
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: TOKEN
value: '12345'
livenessProbe:
httpGet:
path: /v1/health
port: 80
httpHeaders:
- name: Authorization
value: Apikey $TOKEN
我的应用程序收到 401,因为它无法用环境变量替换 header 值。我什至尝试了许多其他带有 single/double 引号和方括号的选项,其中 none 有效。
否则,您可以使用 exec
而不是 httpGet
,但它需要在您的 docker 图像中安装 curl。
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: TOKEN
value: '12345'
livenessProbe:
exec:
command:
- bash
- -c
- 'curl --fail http://localhost/v1/health --header "Authorization: Apikey $TOKEN"'
initialDelaySeconds: 30
periodSeconds: 15
如果你想从你的秘密中使用 valueFrom
,你不需要解码容器内的变量。我已经解码了
如果您无法将 curl 包添加到图像中,最好考虑根据您的应用程序开发的语言编写自定义脚本。这是js的例子:
https://blog.sixeyed.com/docker-healthchecks-why-not-to-use-curl-or-iwr/
另外,查看这个问题,有类似的答案How to use basic authentication in a HTTP liveness probe in Kubernetes?
我正在尝试在我的 kubernetes 部署 yaml 文件中传递 livenessProbe 来执行我的应用程序的运行状况。所以,我创建了一个带有令牌值的秘密并按如下方式传递
livenessProbe:
httpGet:
path: test/actuator/health
port: 9001
httpHeaders:
- name: Authorization
valueFrom:
secretKeyRef:
name: actuator-token
value: token
但我收到以下错误
error: error validating "deployment.yaml": error validating data: [ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): unknown field "valueFrom" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): missing required field "value" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].readinessProbe.httpGet.httpHeaders): invalid type for io.k8s.api.core.v1.HTTPGetAction.httpHeaders: got "map", expected "array"]; if you choose to ignore these errors, turn validation off with --validate=false
请提出建议并感谢您的帮助。
另外让我们知道他们是否有更好的处理令牌的方法,因为我不想直接在我的部署 yaml 文件中提供令牌值。
httpHeaders
只支持value
和name
字段不处理valueFrom
$ kubectl explain pod.spec.containers.livenessProbe.httpGet.httpHeaders
KIND: Pod
VERSION: v1
RESOURCE: httpHeaders <[]Object>
DESCRIPTION:
Custom headers to set in the request. HTTP allows repeated headers.
HTTPHeader describes a custom header to be used in HTTP probes
FIELDS:
name <string> -required-
The header field name
value <string> -required-
The header field value
您可以尝试使用 env 变量,例如。
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: MY_SECRET
valueFrom:
secretKeyRef:
name: actuator-token
key: token
livenessProbe:
httpGet:
path: test/actuator/health
port: 9001
httpHeaders:
- name: Authorization
value: $SECRET
不确定@DT 的回答是否有效,没有关于该功能的文档。
我也做了一些测试,下面的例子对我不起作用:
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: TOKEN
value: '12345'
livenessProbe:
httpGet:
path: /v1/health
port: 80
httpHeaders:
- name: Authorization
value: Apikey $TOKEN
我的应用程序收到 401,因为它无法用环境变量替换 header 值。我什至尝试了许多其他带有 single/double 引号和方括号的选项,其中 none 有效。
否则,您可以使用 exec
而不是 httpGet
,但它需要在您的 docker 图像中安装 curl。
spec:
containers:
- name: mycontainer
image: myimage
env:
- name: TOKEN
value: '12345'
livenessProbe:
exec:
command:
- bash
- -c
- 'curl --fail http://localhost/v1/health --header "Authorization: Apikey $TOKEN"'
initialDelaySeconds: 30
periodSeconds: 15
如果你想从你的秘密中使用 valueFrom
,你不需要解码容器内的变量。我已经解码了
如果您无法将 curl 包添加到图像中,最好考虑根据您的应用程序开发的语言编写自定义脚本。这是js的例子: https://blog.sixeyed.com/docker-healthchecks-why-not-to-use-curl-or-iwr/
另外,查看这个问题,有类似的答案How to use basic authentication in a HTTP liveness probe in Kubernetes?