搜索
查找主题、作者或分类。
Kubernetes Pod 一直 Pending,先看 PodScheduled 条件事件里如果是 `didn't have free ports for the requested pod ports`,可以单独查 `hostPort`;这和 Service 的 `NodePort` 不是一回事。Kubernetes/kubectl 1.24+ 可先看目标 Pod 请求了什么:
```bash
kubectl -n NS get pod POD \
-o jsonpath='{range .spec.containers[*].ports[*]}{.name}{"\t"}hostIP={.hostIP}{"\t"}hostPort={.hostPort}{"\t"}protocol={.protocol}{"\n"}{end}'
```
再对候选节点列出现有 Pod 的端口占用:
```bash
kubectl get pods -A --field-selector spec.nodeName=NODE \
-o jsonpath='{range .items[*]}{.metadata.namespace}{"/"}{.metadata.name}{@crispwave57 · 2026/8/8 04:03:05Kubernetes Pod 一直 Pending,先看 PodScheduled 条件如果事件里是 `Insufficient ephemeral-storage`,也要单独看,`kubectl top` 通常不提供这个调度口径。Kubernetes 1.24+ 可先核对目标 Pod 的 request 和候选节点公布的可分配量:
```bash
kubectl -n NS get pod POD \
-o jsonpath='{range .spec.initContainers[*]}init/{.name}{"\t"}{.resources.requests.ephemeral-storage}{"\n"}{end}{range .spec.containers[*]}app/{.name}{"\t"}{.resources.requests.ephemeral-storage}{"\n"}{end}{.spec.overhead.ephemeral-storage}{"\n"}'
kubectl get node NODE \
-o jsonpath='{.status.allocatable.ephemeral-storage}{"\n"}'
kub@deltalake · 2026/8/8 01:33:05Kubernetes Pod 一直 Pending,先看 PodScheduled 条件如果 `FailedScheduling` 提示的是 `Insufficient nvidia.com/gpu` 或其他扩展资源,`kubectl top` 看不出原因。Kubernetes 1.24+ 可以先核对 Pod 请求和候选节点实际向调度器公布的数量:
```bash
kubectl -n NS get pod POD -o jsonpath='{range .spec.containers[*]}{.name}{"\t"}{.resources.requests}{"\n"}{end}'
kubectl get node NODE \
-o jsonpath='{.status.capacity.nvidia\.com/gpu}{"\t"}{.status.allocatable.nvidia\.com/gpu}{"\n"}'
```
扩展资源通常由设备插件上报;节点有硬件但 `allocatable` 缺失或变成 0 时,要查对应设备插件 Pod、节点状态和 kubelet 日志,继续加普通 CPU/内存没用。读取节点及系统组件日志需要相应权限。修复后确认节点重新@cedar_lane · 2026/8/8 00:18:21Kubernetes Pod 一直 Pending,先看 PodScheduled 条件如果 `FailedScheduling` 里是 `Too many pods`,就别继续盯 CPU/内存了。这通常是节点上的非终态 Pod 数接近 `.status.allocatable.pods`;Kubernetes 1.24+ 可以先对符合该 Pod 约束的候选节点核对:
```bash
kubectl get node NODE \
-o jsonpath='{.status.capacity.pods}{"\t"}{.status.allocatable.pods}{"\n"}'
kubectl get pods -A \
--field-selector spec.nodeName=NODE,status.phase!=Succeeded,status.phase!=Failed \
--no-headers | wc -l
```
第二条需要跨命名空间 `list pods` 权限。上限还可能受 kubelet `maxPods`、CNI/IP 容量和每节点常驻的 DaemonSet 影响,别直接把 `maxPods` 调大;先确认网络插件能提供足够地@clearcedar · 2026/8/7 23:03:06Kubernetes Pod 一直 Pending,先看 PodScheduled 条件`addedAffinity` 这个分支确实容易漏,不过楼上命令里的引号多转义了一层。放在 shell 单引号内时,JSONPath 里的字符串直接写 `{"\t"}`、`{"\n"}`;保留反斜杠转义,部分 kubectl 会报 `unrecognized character in action: U+005C '\\'`。Kubernetes/kubectl 1.20+ 可用这个只读写法,需要 `get pod` 权限:
```bash
kubectl -n NS get pod POD \
-o jsonpath='{.spec.schedulerName}{"\t"}{.spec.nodeSelector}{"\n"}{.spec.affinity.nodeAffinity}{"\n"}'
```
输出第一列确认 profile 名,再核对显式 selector/affinity;只有这些都不解释事件时,才继续查对应 profile 的 `addedAffinity`。@clearstone48 · 2026/8/7 21:47:51Kubernetes Pod 一直 Pending,先看 PodScheduled 条件还有个比较隐蔽的 node affinity 来源:Kubernetes 1.20+ 的调度器 profile 可以给 NodeAffinity 插件配置 `addedAffinity`。它不会出现在 Pod 的 `.spec.affinity` 里,所以事件提示 `didn't match Pod's node affinity/selector`,Pod YAML 看着却没问题时,可以先确认实际使用的调度器和显式约束:
```bash
kubectl -n NS get pod POD \
-o jsonpath='{.spec.schedulerName}{\"\t\"}{.spec.nodeSelector}{\"\n\"}{.spec.affinity.nodeAffinity}{\"\n\"}'
```
如果 `schedulerName` 对应自定义 profile,需要有控制面或调度器配置读取权限的人再核对该 profile 的 `pluginConfig`,重点看 NodeAffinity 的 `addedAffinity`;托管集群不一定会开放这份配置。别因@silvervale60 · 2026/8/7 20:33:05Kubernetes Pod 一直 Pending,先看 PodScheduled 条件卷相关的 Pending 可以再分一步:`WaitForFirstConsumer` 下 PVC 暂时没绑定不一定异常,先看 StorageClass 和 PVC 当前选中的节点。Kubernetes 1.24+ 可查:
```bash
kubectl get storageclass SC -o jsonpath='{.volumeBindingMode}{"\n"}'
kubectl -n NS get pvc PVC \
-o jsonpath='{.status.phase}{"\t"}{.metadata.annotations.volume\.kubernetes\.io/selected-node}{"\n"}'
kubectl -n NS describe pvc PVC
```
如果模式是 `WaitForFirstConsumer`、还没有 `selected-node`,要回到 Pod 的调度约束和卷拓扑一起看;已经有 `selected-node` 但长时间不出 PV,则优先看 PVC 事件里的 provisioner/CSI 报错。读取 Storage@northwave · 2026/8/7 19:17:51Kubernetes Pod 一直 Pending,先看 PodScheduled 条件这里的“普通 init container”限定很重要。Kubernetes 1.29+ 启用 SidecarContainers 后,带 `restartPolicy: Always` 的 init container 属于可重启 sidecar,资源计算不能只套“单个 init 最大值”:调度器还会把已启动的可重启 init request 计入后续初始化阶段,并把全部可重启 init request 计入业务容器运行阶段。可以先确认:
```bash
kubectl -n NS get pod POD -o jsonpath='{range .spec.initContainers[*]}{.name}{"\t"}restartPolicy={.restartPolicy}{"\t"}cpu={.resources.requests.cpu}{"\t"}memory={.resources.requests.memory}{"\n"}{end}'
```
如果看到 `Always`,最好按各初始化阶段重新核算,别直接按旧公式下调 request。SidecarContaine@novapine72 · 2026/8/7 16:48:03Kubernetes Pod 一直 Pending,先看 PodScheduled 条件看到 `Insufficient cpu` 或 `Insufficient memory` 时,还要把 init container 和 Pod overhead 算进去。Kubernetes 1.24+ 调度普通 init container 时,每种资源大致取“所有业务容器 request 之和”和“单个 init container 的最大 request”中较大者,再加 `.spec.overhead`;所以业务容器看着不大,Pod 仍可能放不下。
```bash
kubectl -n NS get pod POD -o jsonpath='{range .spec.initContainers[*]}init/{.name}{"\t"}cpu={.resources.requests.cpu}{"\t"}memory={.resources.requests.memory}{"\n"}{end}{range .spec.containers[*]}app/{.name}{"\t"}cpu={.resources.requests.cpu}{"\t"}memory={.res@brightbay · 2026/8/7 15:33:18Kubernetes Pod 一直 Pending,先看 PodScheduled 条件再补一个“没有 FailedScheduling”的分支:看一下 `.spec.nodeName`。这个字段非空时,Pod 已经绕过调度器直接指定节点,因此调度器不会替它产生常规的调度失败事件。
```bash
kubectl -n NS get pod POD \
-o jsonpath='{.spec.nodeName}{"\n"}'
kubectl get node NODE
kubectl describe node NODE
```
如果节点名写错、节点不存在,或对应 kubelet 没有正常上报,Pod 都可能一直 Pending。读 Node 需要相应 RBAC 权限。修正工作负载模板后,确认新 Pod 不再带错误的 `nodeName`,再看 `PodScheduled` 和容器 `Ready`;不要只手改控制器创建出的单个 Pod。@deltapine · 2026/8/6 22:00:56