Kubernetes 调度器 - Scheduler
Scheduler 是 Kubernetes 的调度器:绑定 Pod 和 Node节点
一、调度器概念

节点列表 Node01、Node02、Node03,待部署的 Pod 列表有 Pod1、Pod2、Pod3。
所谓待部署就是处于 Pending 状态的 Pod,然后再变为 Creating 状态,最后再变为 Running 状态。
Sheduler 是作为单独的程序运行的,启动之后会一直监听 APlServer,获取 Pod.Spec.NodeName 为空的 Pod,对每个 Pod 都会创建一个 binding,表明该 Pod 应该放到哪个节点上
二、自定义调度器
除了 kubernetes 自带的调度器,也可以编写自己的调度器
通过 spec:schedulername 参数指定调度器的名字,可以为 pod 选择某个调度器进行调度。
[root@master 8]# kubectl create deploy myapp --image=harbor.registry.com/library/myapp:1.0
deployment.apps/myapp created
[root@master 8]# kubectl get deploy myapp -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
.............
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: myapp
strategy:
rollingUpdate:
.........
template:
metadata:
..........
spec:
containers:
- image: harbor.registry.com/library/myapp:1.0
imagePullPolicy: IfNotPresent
name: myapp
resources: {
}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler # 这里定义调度器, Kubernetes 自带的调度器是default-scheduler
securityContext: {
}
terminationGracePeriodSeconds: 30
.................
[root@master 8]# kubectl describe pod myapp
Name: myapp-5846867694-s8mmt
Namespace: default
Priority: 0
Service Account: default
Node: node1/192.168.86.12
Start Time: Sun, 20 Jul 2025 09:37:31 +0800
Labels: app=myapp
.............
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 31s default-scheduler Successfully assigned default/myapp-5846867694-s8mmt to node1
Normal Pulled 32s kubelet Container image "harbor.registry.com/library/myapp:1.0" already present on machine
Normal Created 32s kubelet Created container: myapp
Normal Started 31s kubelet Started container myapp
- 调度实例:
# 创建一个pod(创建的deployment,因为在创建deployment会自动创建一个RS)
[root@master 8]# cat 1.deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
schedulerName: my-scheduler #指定调度器
containers:
- name: myapp
image: harbor.registry.com/library/myapp:1.0
[root@master 8]# kubectl create -f 1.deployment.yaml
deployment.apps/myapp created
[root@master 8]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-5c4b8f9985-dvh4d 0/1 Pending 0 27s
# 目前 Pod 的状态是 Pending,表示还未调度
[root@master 8]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 0/1 1 0 32s
基于 Shell 编写一个自定义的调度器
# 基于 Shell 编写一个自定义的调度器
[root@master 8]# vim 2.my-scheduler.sh
[root@master 8]# cat 2.my-scheduler.sh
#!/bin/bash
SERVER='localhost:8001'
while true
do
for PODNAME in $(kubectl --server $SERVER get pods -o json | jq '.items[] | select(.spec.schedulerName == "my-scheduler") | select(.spec.nodeName == null) | .metadata.name' | tr -d '"')
do #jq 是 JSON 的解析器
NODES=($(kubectl --server $SERVER get nodes -o json | jq

最低0.47元/天 解锁文章
1542

被折叠的 条评论
为什么被折叠?



