在部署中定义的容器具有一个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的情况下进行的--结果是一样的。
但是,当你读到这篇文章的时候,你已经知道这些都没有用了。
我知道这是通过exec'ing进入运行容器并试图找到/app/out.log文件--它在我看目录内容时没有出现,看起来探针从未执行过。
在运行中的容器中运行的命令工作得很好:数据会被获取并写入指定的文件。
是什么原因导致探测器不被执行?
发布于 2021-12-17 09:39:09
当使用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.loghttps://stackoverflow.com/questions/70386187
复制相似问题