livenessProbe好像没有被执行
livenessProbe seems not to be executed
部署内定义的容器有一个 livenessProbe
设置:根据定义,它调用远程端点并检查响应是否包含有用信息或空响应(这应触发 pod 的重启)。
整个定义如下(为了标记更清晰,我删除了进一步的检查):
apiVersion: apps/v1
kind: Deployment
metadata:
name: fc-backend-deployment
labels:
name: fc-backend-deployment
app: fc-test
spec:
replicas: 1
selector:
matchLabels:
name: fc-backend-pod
app: fc-test
template:
metadata:
name: fc-backend-pod
labels:
name: fc-backend-pod
app: fc-test
spec:
containers:
- name: fc-backend
image: localhost:5000/backend:1.3
ports:
- containerPort: 4044
env:
- name: NODE_ENV
value: "dev"
- name: REDIS_HOST
value: "redis"
livenessProbe:
exec:
command:
- curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats | head -c 30 > /app/out.log
initialDelaySeconds: 20
failureThreshold: 12
periodSeconds: 10
我也试过将命令放入数组中:
command: ["sh", "-c", "curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats", "|", "head", "-c", "30", ">", "/app/out.log"]
并分成不同的行:
- /bin/bash
- -c
- curl
- -X
- GET
- $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats
- |
- head
- -c
- "30"
- >
- /app/out.log
甚至像这样:
command:
- |
curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats | head -c 30 > /app/out.log
使用和不使用 (/bin/ba)sh -c
进行了所有尝试 - 结果相同。
但是,当您阅读本文时,您已经知道其中 none 有效。
我通过 exec
进入 运行ning 容器并尝试找到 /app/out.log
文件知道了它 - 在我查看目录内容时它不存在。看起来探测器从未执行过。
运行ning 容器中的命令 运行 工作正常:数据被提取并写入指定文件。
什么可能导致探测未被执行?
当使用 exec
类型的探测时,Kubernetes 将 而不是 运行 一个 shell 来处理命令,它只会 运行 直接命令。这意味着您只能使用一个命令,并且 |
字符被视为 curl
.
的另一个参数
要解决这个问题,你需要使用sh -c
来执行shell代码,类似下面的代码:
livenessProbe:
exec:
command:
- sh
- -c
- >-
curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats |
head -c 30 > /app/out.log
部署内定义的容器有一个 livenessProbe
设置:根据定义,它调用远程端点并检查响应是否包含有用信息或空响应(这应触发 pod 的重启)。
整个定义如下(为了标记更清晰,我删除了进一步的检查):
apiVersion: apps/v1
kind: Deployment
metadata:
name: fc-backend-deployment
labels:
name: fc-backend-deployment
app: fc-test
spec:
replicas: 1
selector:
matchLabels:
name: fc-backend-pod
app: fc-test
template:
metadata:
name: fc-backend-pod
labels:
name: fc-backend-pod
app: fc-test
spec:
containers:
- name: fc-backend
image: localhost:5000/backend:1.3
ports:
- containerPort: 4044
env:
- name: NODE_ENV
value: "dev"
- name: REDIS_HOST
value: "redis"
livenessProbe:
exec:
command:
- curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats | head -c 30 > /app/out.log
initialDelaySeconds: 20
failureThreshold: 12
periodSeconds: 10
我也试过将命令放入数组中:
command: ["sh", "-c", "curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats", "|", "head", "-c", "30", ">", "/app/out.log"]
并分成不同的行:
- /bin/bash
- -c
- curl
- -X
- GET
- $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats
- |
- head
- -c
- "30"
- >
- /app/out.log
甚至像这样:
command:
- |
curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats | head -c 30 > /app/out.log
使用和不使用 (/bin/ba)sh -c
进行了所有尝试 - 结果相同。
但是,当您阅读本文时,您已经知道其中 none 有效。
我通过 exec
进入 运行ning 容器并尝试找到 /app/out.log
文件知道了它 - 在我查看目录内容时它不存在。看起来探测器从未执行过。
运行ning 容器中的命令 运行 工作正常:数据被提取并写入指定文件。
什么可能导致探测未被执行?
当使用 exec
类型的探测时,Kubernetes 将 而不是 运行 一个 shell 来处理命令,它只会 运行 直接命令。这意味着您只能使用一个命令,并且 |
字符被视为 curl
.
要解决这个问题,你需要使用sh -c
来执行shell代码,类似下面的代码:
livenessProbe:
exec:
command:
- sh
- -c
- >-
curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats |
head -c 30 > /app/out.log