You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes 1.22版本自定义kube-scheduler部署异常:指定Pod始终处于Pending状态

排查Kubernetes 1.22自定义kube-scheduler调度失败问题

看起来你的自定义调度器my-scheduler遇到了Pod一直Pending的问题,我结合你提供的配置和日志,整理了几个关键排查方向:

1. Leader选举配置冲突是核心问题

从你的调度器日志里能看到这一行:

I1008 21:21:56.223364 1 leaderelection.go:248] 尝试获取leader lease kube-system/kube-scheduler...

虽然你在Deployment的启动命令里加了--leader-elect=false,但在K8s 1.22版本中,调度器配置文件(KubeSchedulerConfiguration)的参数优先级高于命令行参数。你的配置文件里没显式设置leaderElect: false,所以调度器会用默认值true,跑去竞争默认调度器的leader lease——这会导致你的自定义调度器卡在初始化环节,根本没法处理调度请求。

解决办法:在你的调度器配置文件里明确禁用leader选举(单实例场景),或者配置专属的leader lease(高可用场景):

apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
leaderElect: false  # 单实例直接禁用,避免和默认调度器抢lease
profiles:
- schedulerName: my-scheduler

如果后续要部署多实例做高可用,就改成专属的lease配置:

apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
leaderElect: true
leaderElection:
  leaderElect: true
  resourceName: my-scheduler  # 用自己的名字做lease资源
  resourceNamespace: kube-system
profiles:
- schedulerName: my-scheduler

2. 确认配置文件是否真的加载成功

有时候配置文件挂载出问题,调度器根本没读到你的自定义配置:

  • 先检查ConfigMap是否存在:kubectl get configmap my-scheduler-config -n kube-system,确保里面有my-scheduler-config.yaml这个文件
  • 进入调度器Pod里验证文件内容:
kubectl exec -it <你的my-scheduler Pod名称> -n kube-system -- cat /etc/kubernetes/my-scheduler/my-scheduler-config.yaml

如果文件不存在或者内容不对,那肯定没法生效。

3. 验证RBAC权限是否真的足够

你已经绑定了两个ClusterRole,但还是建议手动验证下关键权限:

# 检查是否能列出Pod
kubectl auth can-i list pods --as=system:serviceaccount:kube-system:my-scheduler
# 检查是否能列出Node(调度器必须能看Node状态)
kubectl auth can-i list nodes --as=system:serviceaccount:kube-system:my-scheduler
# 检查是否能更新Pod状态(调度成功后要标记Pod绑定的Node)
kubectl auth can-i update pods/status --as=system:serviceaccount:kube-system:my-scheduler

如果任何一条返回no,就得补充对应的权限绑定。

4. 查看Pending Pod的事件日志

直接查看你的测试Pod的事件信息,往往能找到更直接的原因:

kubectl describe pod my-scheduler-check

比如如果调度器没注册成功,事件里可能会提示no scheduler matching name my-scheduler found之类的信息。

5. 确认调度器Pod本身是健康的

检查调度器Pod的存活和就绪状态:

kubectl get pods -n kube-system | grep my-scheduler

如果探针失败(状态是Not Ready),那调度器根本没法工作。你可以调整initialDelaySeconds给调度器更多启动时间,或者确认探针的端口/路径是否正确(你的配置里用10259是对的,安全端口)。


按照上面的步骤一步步排查,应该能找到问题所在并解决。

内容的提问来源于stack exchange,提问作者Chiranga Alwis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:57:32