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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值