PostgreSQL/Kubernetes:PANIC无法找到有效的检查点记录/CrashLoopBackOff

9

Postgres无法启动,出现以下错误:

PANIC could not locate a valid checkpoint record

在谷歌上有很多解决方案,但是所有的解决方案都需要连接pod来执行一些pg命令。
但是,由于我使用K8S,我的pod陷入状态:CrashLoopBackOff,所以我无法再连接到我的pod。
我该怎么做来修复我的postgres数据库?
编辑:
我已经尝试运行以下命令:
pg_resetwal /var/lib/postgresql/data

使用:

...
spec:
      containers:
      - args:
        - pg_resetwal
        - /var/lib/postgresql/data

但是我得到了:
pg_resetwal: cannot be executed by "root"
You must run pg_resetwal as the PostgreSQL superuser.

能够进一步...

编辑2:

我尝试使用相同的挂载卷和相同的postgresql容器运行新的pod,但将命令更改为:pg_resetwal /var/lib/postgresql/data

我还添加了:

securityContext:
              runAsUser: 0

这是部署的yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    reloader.stakater.com/auto: "true"
  labels:
    app: metadata-postgres-fix
  name: metadata-postgres-fix
  namespace: metadata
spec:
  selector:
    matchLabels:
      app: metadata-postgres-fix
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: metadata-postgres-fix
    spec:
      containers:
      - args:
        - pg_resetwal
        - /var/lib/postgresql/data
        envFrom:
          - secretRef:
              name: metadata-env
        image: postgres:11.3
        name: metadata-postgres-fix
        securityContext:
          runAsUser: 0
        ports:
        - containerPort: 5432
        imagePullPolicy: Always
        volumeMounts:
        - mountPath: /etc/postgresql/postgresql.conf
          name: metadata-postgres-data
          subPath: postgres.conf
        - mountPath: /docker-entrypoint-initdb.d/init.sh
          name: metadata-postgres-data
          subPath: init.sh
        - mountPath: /var/lib/postgresql/data
          name: metadata-postgres-claim
          subPath: postgres
      restartPolicy: Always
      volumes:
      - name: metadata-postgres-data
        configMap:
          name: cfgmap-metadata-postgres
      - name: metadata-postgres-claim
        persistentVolumeClaim:
          claimName: metadata-postgres-claim
      nodeSelector:
        kops.k8s.io/instancegroup: nodes

你是否已将它部署在 Kubernetes 上作为 StatefulSet?事件中还有其他内容吗?您可以使用安全上下文以特定用户身份运行您的 Pod。 - mario
@mario 不,我没有使用StatefulSet,我已经使用了安全上下文。但是pg_resetwal /var/lib/postgresql/data没有起到任何作用。对于第二个问题也是否定的。 - Juliatzin
1
但是 runAsUser: 0 不会像所述的 PostgreSQL 超级用户 一样运行它,而是作为 root 运行,并且您已经在错误消息中明确说明它 不能由 "root" 执行。此外,由于 db 是一个有状态的应用程序,您应该考虑将其作为 StatefulSet 而不是 Deployment 运行。 - mario
1个回答

10

我解决了它,改变了

- args:
    - pg_resetwal
    - /var/lib/postgresql/data

暂停以便能够获取Postgres的UID:

- args:
    - sleep
    - 1000

使用

cat /etc/passwd

我发现posgres的UID是999

最后将runAsUser: 0更改为runAsUser: 999


6
你帮助了我!非常感谢!我们的K8s节点遇到了突然崩溃,我遇到了相同的错误。 总结一下:我添加了command: ["sleep"]args:["1000"]。进入pod并执行su postgres,最后运行pg_resetwal /var/lib/postgresql/data - Lam Le
1
@LamLe 非常感谢!你的解决方案对我也有效。 - Tùng Lê

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接