当前位置: 首页 > news >正文

Kubernetes 调度器(Scheduler)

Kubernetes 调度器 - Scheduler

  • 一、调度器概念
  • 二、自定义调度器
  • 三、调度过程
    • 3.1 预选
    • 3.2 优选
  • 四、亲和性和反亲和性
    • 4.1 亲和性(pod/node Affinity)
      • 4.1.1 节点亲和性(nodeAffinity)
      • 4.1.2 Pod 亲和性(podAffinity)
    • 4.2 Pod 反亲和性(podAntiAffinity)
      • 4.2.1 软亲和(软策略):最好不要在一起
      • 4.2.2 硬亲和(硬策略):必须不能在一起
  • 五、容忍与污点
    • 5.1 污点(taint)
    • 5.2 容忍(tolerate)
  • 六、固定节点调度
    • 6.1 指定节点调度
    • 6.2 指定节点标签调度

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: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: myappstrategy:rollingUpdate:
.........template:metadata:
..........spec:containers:- image: harbor.registry.com/library/myapp:1.0imagePullPolicy: IfNotPresentname: myappresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: Always		 schedulerName: default-scheduler	# 这里定义调度器, Kubernetes 自带的调度器是default-schedulersecurityContext: {}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 node1Normal  Pulled     32s   kubelet            Container image "harbor.registry.com/library/myapp:1.0" already present on machineNormal  Created    32s   kubelet            Created container: myappNormal  Started    31s   kubelet            Started container myapp
  • 调度实例:
# 创建一个pod(创建的deployment,因为在创建deployment会自动创建一个RS)
[root@master 8]# cat 1.deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:name: myappnamespace: defaultlabels:app: myapp
spec:replicas: 1selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:schedulerName: my-scheduler		#指定调度器containers:- name: myappimage: 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/bashSERVER='localhost:8001'while true
dofor 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 '.items[].metadata.name' | tr -d '"'))NUMNODES=${#NODES[@]}CHOSENODE=${NODES[$[ $RANDOM % $NUMNODES ]]}curl --header "Content-Type:application/json" --request POST --data '{"apiVersion": "v1", "kind": "Binding", "metadata": {"name": "'$PODNAME'"}, "target": {"apiVersion": "v1", "kind": "Node", "name": "'$CHOSENODE'"}}' http://$SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/echo "Assigned $PODNAME to $CHOSENODE"donesleep 1
done
[root@master 8]# ll
total 8
-rw-r--r--. 1 root root 371 Jul 20 10:00 1.deployment.yaml
-rw-r--r--. 1 root root 757 Jul 20 10:01 2.my-scheduler.sh
[root@master 8]# chmod +x 2.my-scheduler.sh 
[root@master 8]# ll
total 8
-rw-r--r--. 1 root root 371 Jul 20 10:00 1.deployment.yaml
-rwxr-xr-x. 1 root root 757 Jul 20 10:01 2.my-scheduler.sh

在 Kubernetes 的 master 节点开启 apiserver 的代理,目的是将 apiserver 服务端点暴露出来,这个端点暴露以后是不具备安全访问的,也就是不需要做 https 认证就可以访问。一般主要用于测试

[root@master 8]# kubectl proxy --port=8001		#开启服务代理
Starting to serve on 127.0.0.1:8001# 复制会话
[root@master 8]# ./2.my-scheduler.sh 
{"kind": "Status","apiVersion": "v1","metadata": {},"status": "Success","code": 201
}Assigned myapp-5c4b8f9985-dvh4d to node1#再复制一个会话
[root@master 8]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
myapp-5c4b8f9985-dvh4d   1/1     Running   0          7m23s
[root@master 8]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
myapp-5c4b8f9985-dvh4d   1/1     Running   0          7m52s   10.224.166.177   node1   <none>           <none>
[root@master 8]# curl 10.224.166.177
hello jock | welcome to nginx! | version 1.0

在这里插入图片描述

在这里插入图片描述

[root@master 8]# kubectl describe pod myapp
Name:             myapp-5c4b8f9985-dvh4d
Namespace:        default
Priority:         0
Service Account:  default
Node:             node1/192.168.86.12
Start Time:       Sun, 20 Jul 2025 10:07:16 +0800
Labels:           app=myapppod-template-hash=5c4b8f9985
Annotations:      cni.projectcalico.org/containerID: 490c7f784845c809af9e20f57c4c948f565bdeff2f5404c8e125f3bca520edf3cni.projectcalico.org/podIP: 10.224.166.177/32cni.projectcalico.org/podIPs: 10.224.166.177/32
Status:           Running
IP:               10.224.166.177
IPs:IP:           10.224.166.177
Controlled By:  ReplicaSet/myapp-5c4b8f9985
Containers:myapp:Container ID:   docker://100a2c9104ba536604bcd39195bd30091f8a33472fb4a1d8f72a27870aa7731eImage:          harbor.registry.com/library/myapp:1.0Image ID:       docker-pullable://harbor.registry.com/library/myapp@sha256:f9132f778905888fce4d3b691c4e67afa963e417786e308969ef745666ae2bd1Port:           <none>Host Port:      <none>State:          RunningStarted:      Sun, 20 Jul 2025 10:07:17 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-r92gl (ro)
Conditions:Type                        StatusPodReadyToStartContainers   True Initialized                 True Ready                       True ContainersReady             True PodScheduled                True 
Volumes:kube-api-access-r92gl:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtOptional:                falseDownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason   Age    From     Message----    ------   ----   ----     -------Normal  Pulled   4m59s  kubelet  Container image "harbor.registry.com/library/myapp:1.0" already present on machineNormal  Created  4m59s  kubelet  Created container: myappNormal  Started  4m59s  kubelet  Started container myapp

三、调度过程

预选:过滤掉不满足条件的节点

优选:对通过的节点按照优先级排序

每个版本的调度器的预选算法和优选算法都在更新

3.1 预选

  • PodFitsResources:节点上剩余的资源是否大于 pod 请求的资源。
  • PodFitsHost:如果 pod 指定了 NodeName,检查节点名称是否和 NodeName 匹配。
  • PodFitsHostPorts:节点上已经使用的 port 是否和 pod 申请的 port 冲突。
  • PodSelectorMatches:过滤掉和 pod 指定的 label 不匹配的节点。
  • NoDiskConflict:已经 mount 的 volume 和 pod 指定的 volume 不冲突,除非它们都是只读。

3.2 优选

如果在 预选 过程中没有合适的节点,pod 会一直在 pending 状态,并不断重试调度,直到有节点满足条件,如果有多个节点满足条件,就继续 优选 过程:按照优先级大小对节点排序

优先级由一系列键值对组成,是该优先级项的名称是它的权重(该项的重要性)

  • LeastRequestedPriority:通过计算 CPU 和 Memory 的使用率来决定权重,使用率越低权重越高。换句话说,这个优先级指标倾向于资源使用比例更低的节点。
  • BalancedResourceAllocation:节点上 CPU 和 Memory 使用率越接近,权重越高。这个选项应该和上面选项一起使用,不应该单独使用。
  • lmageLocalityPriority:倾向于已经有要使用镜像的节点,镜像总大小值越大,权重越高。

四、亲和性和反亲和性

亲和性是在一起,反亲和性是不在一起。

官方文档:亲和性和反亲和性

将 Pod 约束到具有特定标签的节点上。 亲和性和反亲和性扩展了可以定义的约束类型

4.1 亲和性(pod/node Affinity)

针对 Pod 和 节点,具有亲和性

亲和性:

  1. 亲和性分为节点亲和性(nodeAffinity)和 Pod 亲和性(podAffinity)

  2. 亲和性分为软亲和性和硬亲和性

    • 软亲和性:如果满足条件由 Pod 会调度到这个满足条件的节点,如果条件不能满足,Pod也会成功调度,使用的则是默认的调度规则
    • 硬亲和性:如果满足条件由 Pod 会调度,否则 Pod 会调度失败。

4.1.1 节点亲和性(nodeAffinity)

软性和硬性策略,通过 kubectl explain pod.spec.affinity.nodeAffinity 去查询硬亲和软亲和的表达式

  • preferredDuringSchedulingIgnoredDuringExecution:软策略。调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod
  • requiredDuringSchedulingIgnoredDuringExecution:硬策略。调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector , 但其语法表达能力更强

用 operator 字段来为 Kubernetes 设置在解释规则时要使用的逻辑操作符。 可以使用 In 、NotIn 、 Exists 、 DoesNotExist 、 Gt 和 Lt 之一作为操作符

在这里插入图片描述

  • 软亲和(prefrerence):
[root@master 8]# kubectl create -f 3.pod.yaml 
pod/node-preferred-affinity created
[root@master 8]# cat 3.pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: node-preferred-affinitylabels:app: node-preferred-affinity
spec:containers:- name: node-preferred-affinity-podimage: harbor.registry.com/library/myapp:1.0affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: domainoperator: In	#为Kubernetes设置在解释规则时要使用的逻辑操作符values:- chengke
[root@master 8]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
node-preferred-affinity   1/1     Running   0          16s   10.224.166.176   node1   <none>           <none>
# 不加亲和性,可能在node1也可能在node2

软亲和:如果满足条件就会分配过去,否则就按默认分配(希望有这个东西,如果没有,也可以)

不是只要满足匹配的节点就一定能分配过去,如果达不到预选和优选条件,节点和 Pod 依然不会绑定成功

  • 硬亲和(required)— 必须要能够达到满足的条件才能让节点处理 running 状态,否则就会一直处于 pending 状态
[root@master 8]# vim 5.pod.yaml 
[root@master 8]# cat 5.pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: node-required-affinitylabels:app: node-required-affinity
spec:containers:- name: node-required-affinity-podimage: harbor.registry.com/library/myapp:1.0affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostname	#固定写法operator: Invalues:- node4	#节点不存在,调度不成功

4.1.2 Pod 亲和性(podAffinity)

Pod 间亲和性可以基于已经在节点上运行的 Pod 的标签约束 Pod 可以调度到的节点,而不是基于节点上的标签

  • 软策略:如果有就之间调用,如果没有,就按照默认的
[root@master 8]# kubectl get pod
No resources found in default namespace.		#此时没有Pod,也就不能和亲和策略的相匹配[root@master 8]# vim 7.pod.yaml 
[root@master 8]# cat 7.pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-preferred-affinitylabels:app: pod-aff
spec:containers:- name: myappimage: harbor.registry.com/library/myapp:1.0affinity:podAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- pod-1topologyKey: kubernetes.io/hostname
[root@master 8]# kubectl apply -f 7.pod.yaml 
pod/pod-preferred-affinity created
[root@master 8]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
pod-preferred-affinity   1/1     Running   0          8s
[root@master 8]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
pod-preferred-affinity   1/1     Running   0          26s   10.224.166.190   node1   <none>           <none>
  • 硬亲和:有就调度,没有就不能调度
[root@master 8]# vim 8.pod.yaml 
[root@master 8]# cat 8.pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-require-affinitylabels:app: pod-require-affinity
spec:containers:- name: myappimage: harbor.registry.com/library/myapp:1.0affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:		#硬亲和这里要加这个斜线matchExpressions:- key: appoperator: Invalues:- pod-1topologyKey: kubernetes.io/hostname
[root@master 8]# kubectl apply -f 8.pod.yaml 
pod/pod-require-affinity created
[root@master 8]# kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
pod-require-affinity   0/1     Pending   0          7s    <none>   <none>   <none>           <none>
[root@master 8]# kubectl describe pod pod-require-affinity
Name:             pod-require-affinity
Namespace:        default
Priority:         0
Service Account:  default
Node:             <none>
Labels:           app=pod-require-affinity
Annotations:      <none>
Status:           Pending
IP:               
IPs:              <none>
Containers:myapp:Image:        harbor.registry.com/library/myapp:1.0Port:         <none>Host Port:    <none>Environment:  <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dpzs6 (ro)
Conditions:Type           StatusPodScheduled   False 
Volumes:kube-api-access-dpzs6:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtOptional:                falseDownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type     Reason            Age   From               Message----     ------            ----  ----               -------Warning  FailedScheduling  26s   default-scheduler  0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 2 node(s) didn't match pod affinity rules. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.[root@master 8]# cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-demolabels:app: pod-1
spec:containers:- name: myapp-1image: harbor.registry.com/library/myapp:2.0
[root@master 8]# kubectl apply -f pod.yaml 
pod/pod-demo created
[root@master 8]# kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
pod-demo               1/1     Running   0          8s    10.224.166.185   node1   <none>           <none>
pod-require-affinity   1/1     Running   0          95s   10.224.166.181   node1   <none>           <none>

4.2 Pod 反亲和性(podAntiAffinity)

反亲和性:
一般只有 Pod 有反亲和性,反亲和性的作用是不要和它在一起

  1. 如果A节点中有Pod具有指定的标签,而B节点中没有Pod指定标签,那么这个Pod就会被调度到B节点上。
  2. 如果A节点和B节点中都有Pod具有指定的标签,那么如果是软反亲和性策略,则会采用默认的调度方式来进行调度。
  3. 如果A节点和B节点中都有Pod具有指定的标签,并且是硬反亲和性策略,则该Pod不会成功被调度。
  4. 如果A节点和B节点中都没有Pod指定的标签,则不管是软反亲和性还是硬反亲和性策略,都采用默认的调度策略来进行调度

在这里插入图片描述

4.2.1 软亲和(软策略):最好不要在一起

node1 和 node2 两个节点都有不匹配的,就按默认的调度

affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecution

4.2.2 硬亲和(硬策略):必须不能在一起

反亲和性的硬策略是必须不能在一起

affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution

五、容忍与污点

节点亲和性是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点(这可能出于一种偏好,也可能是硬性要求)

污点(Taint)则相反——它使节点能够排斥一类特定的 Pod

容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。

Taint(污点) 和 Toleration(容忍度) 相互配合,可以用来避免 Pod 被分配到不合适的节点上

5.1 污点(taint)

官方文档:污点

污点(Taint):使节点能够排斥一类特定的 Pod(每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod,是不会被该节点接受的)

# 污点组成格式:
key=value:effect#每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用

effect 的值:

  • NoExecute :驱离(保证 Pod 能持续的运行)

    将己经运行在该节点上的 Pod 从该节点上驱离出去,同时不会让新的Pod调度到此节点上。在驱离时,可以指定驱离的最大宽限时间,单位为秒。如果在指定的时间内没有成功驱离,则该 Pod 会被强制删除。

  • NoSchedule :不调度

    除非具有匹配的容忍度规约,否则新的 Pod 不会被调度到带有污点的节点上。 当前正在节点上运行的 Pod 不会被驱逐。

  • PreferNoSchedule :尽可能不调度

    尽可能不调度,不能完全保证不会有 Pod 被调度到该节点上运行

kubectl describe node 节点名称		#查看污点状态(Kubernetes集群的master节点天生就有一个污点)
#master 节点不是不能运行 Pod,而是它本身有污点,导致它不参与调度# 设置污点
kubectl taint nodes node1 key1=value1:NoSchedule	# 只有拥有和这个污点相匹配的容忍度的 Pod 才能够被分配到 node1 这个节点# 移除污点
kubectl taint nodes node1 key1=value1:NoSchedule-	# 去除需要带上等号(=)

5.2 容忍(tolerate)

容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。

设置了污点的 Node 将根据 taint 的 effect(影响)和 Pod 之间产生互斥的关系,Pod 将在一定程度上不会被调度到 Node 上

effect(影响):NoSchedule、PreferNoSchedule、NoExecute

可以在 Pod 上设置容忍(Toleration),意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上

# 查看生成的资源配置文件:
kubectl get ds -n kube-system kube-proxy -o yaml
# ds:daemonset
  • 容忍设置方式(两种):
# 第一种方式:
tolerations:
- key: "key1"operator: "Equal"value: "value1"effect: "NoSchedule"
#默认的 Kubernetes 调度器在选择一个节点来运行特定的 Pod 时会考虑污点和容忍
#如果手动为一个 Pod 指定了.spec.nodeName ,那么选节点操作会绕过调度器; 
#这个 Pod 将会绑定到指定的节点上,即使选择的节点上有 NoSchedule 的污点。 
#如果这种情况发生,且节点上还设置了NoExecute的污点,kubelet 会将 Pod 驱逐出去,除非有适当的容忍度设置# 第二种方式:
tolerations:
- key: "key1"operator: "Equal"value: "value1"effect: "NoExecute"tolerationSeconds: 3600
#如果这个 Pod 正在运行,同时一个匹配的污点被添加到其所在的节点, 那么 Pod 还将继续在节点上运行 3600 秒,然后被驱逐。 
#如果在此之前上述污点被删除了,则 Pod 不会被驱逐

容忍特殊类型

  1. 当不指定 value 时,表示容忍所有的污点 value
  2. 当不指定 key 值时,表示容忍所有的污点 key
  3. 当不指定 effect 值时,表示容忍所有的污点作用
  4. 有多个 Master 存在时,防止资源浪费,可以设置:
    kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

六、固定节点调度

6.1 指定节点调度

通过指定 pod.spec.nodeName 选项可将 Pod 直接调度到指定的 Node 节点上,它会跳过 Scheduler 的调度策略,因为该匹配规则是强制匹配

6.2 指定节点标签调度

通过配置 pod.spec.nodeSelector 选项可通过 kubernetes 的 label-selector 机制选择节点,由调度器调度策略匹配 label,而后调度 Pod 到目标节点,该匹配规则属于强制约束


文章转载自:

http://6N7VKuSh.fwdLn.cn
http://4nYtspwj.fwdLn.cn
http://TriD7tcZ.fwdLn.cn
http://aciCY7oK.fwdLn.cn
http://pUTm4ePY.fwdLn.cn
http://S3DnKMkU.fwdLn.cn
http://n6gietuv.fwdLn.cn
http://oFNKk3B3.fwdLn.cn
http://4TifUFck.fwdLn.cn
http://wMQDJBl0.fwdLn.cn
http://G0X01tFL.fwdLn.cn
http://AupFbLhx.fwdLn.cn
http://edpgbaCs.fwdLn.cn
http://5YVTyTjJ.fwdLn.cn
http://lpevZjzk.fwdLn.cn
http://vhaVlDBL.fwdLn.cn
http://KUJudX2W.fwdLn.cn
http://B5fZkm9i.fwdLn.cn
http://LJJ3mmbY.fwdLn.cn
http://kRBmPVWh.fwdLn.cn
http://toqDGBlY.fwdLn.cn
http://UMTwvYrz.fwdLn.cn
http://vAHxd5ii.fwdLn.cn
http://fn0TogAU.fwdLn.cn
http://PFvzBTAY.fwdLn.cn
http://3Wg1ajBP.fwdLn.cn
http://t52fE2KL.fwdLn.cn
http://nSlGEBxq.fwdLn.cn
http://oCaVqt3A.fwdLn.cn
http://sa8Wc99r.fwdLn.cn
http://www.dtcms.com/a/386945.html

相关文章:

  • Java设计模型-责任链模式
  • Linux 服务器安全优化:firewalld SSH 限制 白名单与 SCP 服务禁用流程
  • bisheng 智能体
  • 学完Python之后我写了一个免费看电影的软件
  • 【ROS2】Concept(Advanced )
  • Apifox自动化测试场景设计
  • 知识复用缺乏跨角色适配该如何改善
  • XML 与 YML 全方位对比:从语法到应用场景
  • pandas方法集
  • PAT乙级_1106 2019数列_Python_AC解法_含疑难点
  • 自动检测并交互删除未使用 Docker 自定义网桥
  • 物联网卡相关知识
  • 访答编辑器使用体验
  • 日常系统问题解决:数据库查询停止
  • 5.3 文件系统 (答案见原书)
  • 【C++】C++11(一)
  • 两数的乘积 = 最大公约数 × 最小公倍数
  • 【Block总结】FDConv,多频动态调制卷积模块|即插即用|CVPR2025
  • Python 爬虫入门:如何抓取电商网站商品数据
  • 2025年上半年软考系统架构设计师备考指南
  • 双反向传播训练光子神经网络(未做完)
  • Java和rust的AES加解密算法互相转化,秘钥key格式不一致带来的问题
  • Altium Designer(AD24)导入DDB库文件(Protel 99SE)方法
  • GEO数据集编号,我为您整理了对应的芯片平台信息的获得办法
  • 《漫威争锋》新内容曝光:刀锋战士预热登场及多项更新
  • 【Redis】-- 哨兵
  • C++八大排序
  • 特殊文件,日志
  • Linux命令大全(文件管理)
  • jira工具