我正在尝试将非常标准的SELECT 1
命令作为readiness
探测命令执行。我已经看过很多关于 Postgres、root 用户和 Kubernetes 的帖子,但我仍然无法正确理解,尽管这可能是微不足道的。
POSTGRES_USER=postgres
我在我的 Postgres StatefulSet 清单的配置清单中定义了 ENV 变量POSTGRES_DB=mydb
。
我知道我必须使用bash
来执行命令,因为 ENV 变量没有被插值。
以下所有命令都以FATAL失败,角色“root”
bash -c pg_isready -U $POSTGRES_USER -p 5432 -> FATAL
bash -c psql -w -U $POSTGRES_USER -d $POSTGRES_DB -c 'SELECT 1;' -> FATAL
# bash doesn't read ENV ?
bash -c psql -w -U $POSTGRES_USER -d mydb -c 'SELECT 1;' -> FATAL
# maybe current user from host? "me" from "whoami"
bash -c psql -w -U me -d postgres -c 'SELECT 1;' -> FATAL
然后我执行命令以检查是否bash
获取 ENV 变量-> NO
kubectl exec -it pg-dep-0 -- bash -c psql -U $POSTGRES_USER -d $POSTGRES_DB -c 'SELECT 1;' -> FATAL
kubectl exec -it pg-dep-0 -- bash -c psql -U $POSTGRES_USER -d $POSTGRES_DB -c 'SELECT 1;' -> FATAL
kubectl exec -it pg-dep-0 -- psql -U $POSTGRES_USER -d $POSTGRES_DB -c 'SELECT 1;' -> FATAL
但:
kubectl exec -it pg-dep-0 -- psql -U postgres -c 'SELECT 1;' <-- correct
kubectl exec -it pg-dep-0 -- sh
/ # echo $POSTGRES_USER
postgres <-- correct
成功,没有 bash 但没有 ENV 变量。
最后,直接设置值而不使用bash
with psql -U postgres -c 'SELECT 1;
(without bash
) 作为readiness
探测命令也会失败:Postgres 已启动,但测试返回“Readiness probe failed”。
我直接用了:
spec.tempalte.spec.containers:
[...]
envFrom:
- configMapRef:
name: config
readinessProbe:
exec:
command:
- bash
- "-c"
- |
psql -U "postgres" -d "mydb" -c 'SELECT 1;'
apiVersion: v1
kind: ConfigMap
metadata:
name: config
data:
POSTGRES_HOST: "pg-svc"
POSTGRES_DB: "mysb"
POSTGRES_USER: "postgres"
有点迷茫,有什么建议吗?