Kubernetes 1.22版本自定义kube-scheduler部署异常:指定Pod始终处于Pending状态
看起来你的自定义调度器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

