【K8S系列】Kubernetes Pod节点Pending状态及解决方案详解【已解决】

时间:2024-10-22 22:30:13

在这里插入图片描述

在 Kubernetes 中,Pod 的状态为 Pending 表示 Pod
已被创建,但尚未被调度到节点上,或者已调度到节点上但容器尚未开始运行。这一状态常常是因为某些条件未满足,导致 Pod 无法正常启动。以下是对
Pending 状态的详细分析及解决方案。

在这里插入图片描述

一、Pending 状态的详细描述

描述

  • Pending 状态表示 Pod 已被创建,但由于某种原因尚未被调度到节点上,或者尽管已调度到节点上,但容器未能启动。这个状态通常表明 Pod 处于等待中,等待某些条件得到满足。

状态转移

  • Pod 从 Pending 状态可能会转移到其他状态,如 Running(容器成功启动)或 Failed(容器启动失败)。

二、Pending 状态的可能原因

1. 调度失败

  • 原因:Kubernetes 调度器未能找到合适的节点来运行 Pod。这可能是由于节点不满足 Pod 的要求。
  • 检查:查看 Pod 的事件日志,使用以下命令:
    kubectl describe pod <pod-name>
    

2. 资源不足

  • 原因:节点的 CPU、内存或存储资源不足以满足 Pod 的需求。每个 Pod 在其定义中可以请求特定的资源。
  • 检查:查看节点的资源使用情况:
    kubectl get nodes
    

3. 存储卷未绑定

  • 原因:Pod 需要的持久卷(Persistent Volume)未能正确绑定,导致 Pod 无法启动。
  • 检查:使用以下命令查看持久卷和 PVC 的状态:
    kubectl get pv
    kubectl get pvc
    

4. 节点不可用

  • 原因:所有节点都处于 NotReady 状态,Kubernetes 无法将 Pod 调度到任何节点。
  • 检查:查看节点状态:
    kubectl get nodes
    

5. 亲和性和反亲和性规则

  • 原因:Pod 的调度受到特定亲和性或反亲和性规则的限制,导致无法找到合适的节点。
  • 检查:查看 Pod 的 YAML 配置,确认是否有过于严格的调度规则。

6. Taints 和 Tolerations

  • 原因:节点可能被标记了 Taints,导致没有 Pod 能够调度到该节点。虽然 Pod 可能具有容忍(Tolerations),但如果没有匹配的容忍,Pod 将无法调度。
  • 检查:使用以下命令查看节点的 Taints:
    kubectl describe node <node-name>
    

7. 网络问题

  • 原因:网络问题可能导致调度器无法与节点通信,造成 Pod 无法被调度。
  • 检查:确保网络连接正常,可以使用以下命令进行基本的网络测试。

三、解决方案

1. 检查 Pod 状态

首先,检查 Pod 的状态和事件:

kubectl get pods
kubectl describe pod <pod-name>

2. 查看节点资源使用情况

查看所有节点的状态和资源使用情况:

kubectl get nodes -o wide
示例输出:
NAME         STATUS    ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION    CONTAINER-RUNTIME
node-1      Ready     <none>   10d   v1.24.0   192.168.1.1     <none>        Ubuntu 20.04.3 LTS   5.4.0-89-generic   docker://20.10.7
node-2      NotReady  <none>   10d   v1.24.0   192.168.1.2     <none>        Ubuntu 20.04.3 LTS   5.4.0-89-generic   docker://20.10.7

3. 检查资源请求

查看 Pod 的 YAML 配置,确认资源请求是否合理:

resources:
  requests:
    memory: "512Mi"  # 检查内存请求
    cpu: "1000m"     # 检查 CPU 请求

4. 调整 Pod 的资源请求

如果资源不足,可以调整 Pod 的资源请求:

  • 编辑 Pod 的 YAML 文件,减少请求的 CPU 和内存:
resources:
  requests:
    memory: "256Mi"  # 减少内存请求
    cpu: "500m"      # 减少 CPU 请求

5. 检查存储卷的绑定状态

确保所需的持久卷已正确绑定:

kubectl get pvc
示例输出:
NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc      Bound    pvc-123 1Gi        RWO            standard      5m

确保 PVC 的状态为 Bound。

6. 检查节点的 Taints 和 Pod 的 Tolerations

确保 Pod 能够容忍节点的 Taints:

  • 查看节点的 Taints:
kubectl describe node <node-name>
示例输出:
Taints:             node.kubernetes.io/unreachable:NoExecute
  • 确保 Pod 定义中包含相应的 Tolerations:
tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 60

7. 亲和性和反亲和性规则

检查 Pod 的亲和性和反亲和性规则,确保它们没有过于严格:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: "kubernetes.io/hostname"
          operator: In
          values:
          - node-1

8. 增加节点或资源

如果集群资源不足,可以考虑:

  • 增加节点:向 Kubernetes 集群添加更多节点,以提高可用资源。
  • 扩展现有节点:增加现有节点的 CPU 和内存。

9. 监控和调试

使用监控工具(如 Prometheus 和 Grafana)监控集群状态,及时识别和解决问题。可以在集群中安装这些工具,收集和可视化集群的性能数据。

四、总结

Pod 在 Pending 状态通常是由于调度失败、资源不足、存储卷未绑定、节点不可用或调度规则限制等原因。通过系统地检查 Pod 和节点的状态、资源使用情况、存储卷状态、调度规则和网络连接,可以有效识别和解决问题。合理配置 Pod 的资源请求、存储卷和调度规则,有助于提高 Kubernetes 集群的稳定性和可用性。