0

我正在尝试将非常标准的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 变量。

最后,直接设置值而不使用bashwith 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"

有点迷茫,有什么建议吗?

4

0 回答 0