如何识别 statefulset 中不健康的 pod

问题描述

我有一个有 6 个副本的 StatefulSet。

突然间 StatefulSet 认为有 5 个准备好的副本,如果是 6。当我查看 pod 状态时,所有 6 个 pod 都准备好了,所有的准备检查都通过了 1/1

现在我正在尝试根据 StatefulSet 查找显示哪个 pod 不健康的日志或状态,以便我可以进一步调试。

我在哪里可以找到 StatefulSet 的信息或日志,可以告诉我哪个 Pod 不健康?我已经检查了 describe podsdescribe statefulset输出,但没有一个显示哪个 Pod 不健康。

解决方法

假设您创建了下一个 statefulset:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    user: anurag
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      user: anurag # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 6 # by default is 1
  template:
    metadata:
      labels:
        user: anurag # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard"
      resources:
        requests:
          storage: 1Gi

结果是:

kubectl get StatefulSet web -o wide
NAME   READY   AGE     CONTAINERS   IMAGES
web    6/6     8m31s   nginx        k8s.gcr.io/nginx-slim:0.8

我们还可以检查StatefulSet的状态:

kubectl get statefulset web -o yaml
status:
  collisionCount: 0
  currentReplicas: 6
  currentRevision: web-599978b754
  observedGeneration: 1
  readyReplicas: 6
  replicas: 6
  updateRevision: web-599978b754
  updatedReplicas: 6

根据 Debugging a StatefulSet,您可以使用标签列出属于当前 StatefulSet 的所有 pod。

$  kubectl get pods -l user=anurag
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          13m
web-1   1/1     Running   0          12m
web-2   1/1     Running   0          12m
web-3   1/1     Running   0          12m
web-4   1/1     Running   0          12m
web-5   1/1     Running   0          11m

此时,如果您的任何 Pod 不可用,您肯定会看到。下一个调试是 Debug Pods and ReplicationControllers,包括检查您是否有足够的资源来启动所有这些 pod 等等。

描述有问题的 pod (kubectl describe pod web-0) 应该会在事件部分的最后告诉您为什么会发生这种情况。


例如,如果您将在 statefulset components 的本示例中使用 origin yaml - 您将遇到错误并且您的任何 Pod 都将启动并运行。 (原因是 storageClassName: "my-storage-class"

确切的错误和对正在发生的事情的理解来自描述有问题的 pod……这就是它的工作原理。

kubectl describe pod web-0
vents:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  31s (x2 over 31s)  default-scheduler  0/3 nodes are available: 3 pod has unbound immediate PersistentVolumeClaims.