首页 > 解决方案 > 如何解决 Kubernetes 中的 CrashLoopBackOff?

问题描述

我有一个带有 PostgreSQL 容器的 Kubernetes POD。我添加了一个活性探针来监控 psql。所以部署看起来像这样:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels: 
    app: postgres
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: postgres
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - env:
        - name: POSTGRES_DB
          value: mydb
        - name: POSTGRES_PASSWORD
          value: adminadmin
        - name: POSTGRES_USER
          value: admin
        image: postgres:9.6.1
        name: postgres
        livenessProbe:
          exec:
            command: ["psql", "-Uadmin", "-dmydb", "-c", "SELECT 1"]
          initialDelaySeconds: 60
          timeoutSeconds: 10
          failureThreshold: 12
        ports:
          - containerPort: 5432        
        volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: dbdata
          subPath: postgres
      restartPolicy: Always
      volumes:
      - name: dbdata
        persistentVolumeClaim:
          claimName: dbdata

如果发生一些奇怪的事情,我的 LivenessProbe 会无限循环CrashLoopBackOff,并且 postgres 容器将永远不会重新启动,直到我手动终止 POD。

例如,如果出于某种原因 POD 有一个 ReadOnly 文件系统,这会导致 Postgres 在启动后崩溃,这种情况似乎就会出现。

如果我杀死 POD 并强制重新安排,我可以手动解决这种情况。

现在我的问题是:如何配置我的 POD 部署,让 Kubernetes 检测到无休止的重启问题,然后杀死并重新安排 POD?

restartPolicy:Always 可能的原因吗?

标签: postgresqlkubernetes

解决方案


推荐阅读