k8s上Pod全自动调度、定向调度、亲和性调度、污点和容忍调度详解

目录

一.Pod调度简介

二.Deployment/RC全自动调度

1.简介

2.案例演示

(1)Deployment

(2)RC

三.nodeSelector/nodeName指定节点调度

1.原理简介

(1)nodeSelector原理

(2)nodeName原理

2.案例演示

3.kubernetes预定义pod标签

四.Affinity亲和性调度

1.简介

2.三类Affinity

(1)nodeAffinity,node亲和性

a.以node为主体,针对pod调度到node问题

b.两种表达方式和可配置项

c.案例演示

d.注意事项

(2)podAffinity,pod亲和性

a.以pod为主体,针对pod和pod部署在同一个拓扑的问题

b.两种表达方式和可配置项

c.案例演示

  (3)podAntiAffinity,pod反亲和性

a.以pod为主体,针对pod和pod不能部署在同一个拓扑的问题

b.案例演示

五.taint污点调度和Toleration容忍调度

1.污点调度(node方)

(1)三个污点策略

(2)添加污点/查看污点/去除污点

(3)案例演示

a.PreferNoSchedule

b.NoSchedule

c.NoExecute

2.容忍调度(pod方)

(1)容忍的配置参数

(2)案例演示


 

一.Pod调度简介

默认情况下,Pod调度到哪个节点都是右Scheduler组件进行调度,对于在工作和学习中需要指定设备运行特定pod时就显得不实用,此时我们家就需要合理利用几个调度规则,主要包括全自动调度、定向调度、亲和性调度、污点调度、容忍调度等

二.Deployment/RC全自动调度

1.简介

主要功能是自动部署一个容器的多个副本,以来持续保持使用者指定的副本数量(replicas)

2.案例演示

创建一个Deployment来管理pod,指定创建2个副本,自动调度pod,创建完成后查看调度情况

(1)Deployment

[root@k8s-master pod]# kubectl create deployment my-nginx --image=nginx --replicas=2 --port=80 -n myns --dry-run=client -o yaml > mydeployment.yaml
[root@k8s-master pod]# cat mydeployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: my-nginxname: my-nginxnamespace: myns
spec:replicas: 2selector:matchLabels:app: my-nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: my-nginxspec:containers:- image: nginxname: nginxports:- containerPort: 80resources: {}
status: {}
​
[root@k8s-master pod]# kubectl apply -f mydeployment.yaml
​
[root@k8s-master pod]# kubectl get deploy -n myns   #创建了两个副本
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx   2/2     2            2           8m17s
[root@k8s-master pod]# kubectl get pods -n myns -o wide   #两个node分别分配到了各自的pod任务
NAME                        READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
my-nginx-64f6999999-5j7nl   1/1     Running   0          8m40s   10.244.36.65     k8s-node1   <none>           <none>
my-nginx-64f6999999-hjbd4   1/1     Running   0          8m40s   10.244.169.130   k8s-node2   <none>           <none>

(2)RC

[root@k8s-master pod]# cat myrc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-rcnamespace: myns
spec:replicas: 2selector:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginx-containerimage: nginxports:- containerPort: 80
[root@k8s-master pod]# kubectl apply -f myrc.yaml 
replicationcontroller/nginx-rc created
[root@k8s-master pod]# kubectl get rc -n myns
NAME       DESIRED   CURRENT   READY   AGE
nginx-rc   2         2         2       25s
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
nginx-rc-4qfm8   1/1     Running   0          36s   10.244.36.70     k8s-node1   <none>           <none>
nginx-rc-xmdbc   1/1     Running   0          36s   10.244.169.133   k8s-node2   <none>           <none>

三.nodeSelector/nodeName指定节点调度

1.原理简介

(1)nodeSelector原理

就是给具体的受管node打上标签,在部署pod时指定调度到特定标签的node,前提是这个集群中需要有指定的node,若没有这个特定node即使有其他正常运行的node,这个pod也无法完成调度任务。如果多个node拥有同一个标签,那么Scheduler会进一步选择一个可用的node进行配合调度任务。

(2)nodeName原理

强制指定node的名称,也就是“kubectl get nodes”可以查出来的node名称

2.案例演示

(1)仍然使用mydeployment.yaml进行测试,nodeSelector为节点打上标签,,加上nodeSelector参数指定节点,运行完成后可以看到3个副本都运行在node1

[root@k8s-master pod]# kubectl label nodes k8s-node1 name=node1
​
[root@k8s-master pod]# kubectl get nodes --show-labels
NAME         STATUS   ROLES           AGE   VERSION   LABELS
k8s-master   Ready    control-plane   34m   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node1    Ready    <none>          34m   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,name=node1
k8s-node2    Ready    <none>          33m   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,name=node2
​
[root@k8s-master pod]# cat mydeployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: my-nginxname: my-nginxnamespace: myns
spec:replicas: 3selector:matchLabels:app: my-nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: my-nginxspec:containers:- image: nginxname: nginxports:- containerPort: 80nodeSelector:name: node1[root@k8s-master pod]# kubectl apply -f mydeployment.yaml 
deployment.apps/my-nginx created
​
[root@k8s-master pod]# kubectl get deployments -n myns
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx   3/3     3            3           23s
​
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
my-nginx-74db7ccb9b-gvgfk   1/1     Running   0          31s   10.244.36.67   k8s-node1   <none>           <none>
my-nginx-74db7ccb9b-kpsb2   1/1     Running   0          31s   10.244.36.66   k8s-node1   <none>           <none>
my-nginx-74db7ccb9b-xwpjt   1/1     Running   0          31s   10.244.36.68   k8s-node1   <none>           <none>

(2)使用nodeName同样可以实现

[root@k8s-master pod]# kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   70m   v1.28.2
k8s-node1    Ready    <none>          70m   v1.28.2
k8s-node2    Ready    <none>          70m   v1.28.2
​
[root@k8s-master pod]# cat mydeployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: my-nginxname: my-nginxnamespace: myns
spec:replicas: 3selector:matchLabels:app: my-nginxstrategy: {}template:metadata:creationTimestamp: nulllabels:app: my-nginxspec:containers:- image: nginxname: nginxports:- containerPort: 80nodeName: k8s-node1
​
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
my-nginx-7544fbf745-gwxv7   1/1     Running   0          85s   10.244.36.70   k8s-node1   <none>           <none>
my-nginx-7544fbf745-kn8lj   1/1     Running   0          85s   10.244.36.71   k8s-node1   <none>           <none>
my-nginx-7544fbf745-q6w6j   1/1     Running   0          85s   10.244.36.69   k8s-node1   <none>           <none>

3.kubernetes预定义pod标签

可以看到查看node的labels后,有一长串现有标签,这些就是k8s预定义的pod标签,当然也可以只指定标签进一步指定node进行pod调度。其中基本上都是指定的基于设备架构类型和操作系统类型

[root@k8s-master pod]# kubectl get nodes --show-labels
NAME         STATUS   ROLES           AGE   VERSION   LABELS
k8s-master   Ready    control-plane   41m   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node1    Ready    <none>          40m   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,name=node1
k8s-node2    Ready    <none>          40m   v1.28.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,name=node2

四.Affinity亲和性调度

1.简介

对pod配置亲和性调度,可以解决上面介绍的定向调度存在“没有满足匹配条件的node时,即使其他有可用node,pod也无法成功调度”的问题,亲和性调度会先选择满足条件的node,若没有,也可以调度到其他可用node上

2.三类Affinity

(1)nodeAffinity,node亲和性

a.以node为主体,针对pod调度到node问题

b.两种表达方式和可配置项

[root@k8s-master pod]# kubectl explain pod.spec.affinity.nodeAffinity
KIND:       Pod
VERSION:    v1
​preferredDuringSchedulingIgnoredDuringExecution   <[]PreferredSchedulingTerm>#强调优先满足指定规则,可以理解为尽量满足该规则,实在是不满足再为其分配其他可用node,调度器尝试但不强求调度pod到node上,若有多个优先级规则那么可以设置权值来调整调度顺序- weight: 1  #权值,越小优先级越高,1-100preference:   #节点选择器,关联weightmatchExpressions:   #按照节点的标签来匹配选择目标- key: kubernetes.io/arch  #同上operator: Invalues:- amd64requiredDuringSchedulingIgnoredDuringExecution    <NodeSelector>#必须满足指定的规则才能调度pod至node上,硬性条件nodeSelectorTerms:   #节点选择列表- matchExpressions:   #或matchFields,当然比较推荐matchExpressions,表示按照节点的标签来匹配选择调度目标- key: kubernetes.io/hostname   #标签的键operator: In  #operator关系符,可以是In(属于)、NotIn(不属于)、Exists(存在)、DoseNotExists(不存在)、Gt(大于)、Lt(小于)values:   #标签的值- k8s-node1

c.案例演示

下例要求必须运行在hostname为k8s-node1的节点,尽量运行在架构为amd64的设备上

[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          9s    10.244.36.82   k8s-node1   <none>           <none>
[root@k8s-master pod]# cat myaffinity.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx-podnamespace: myns
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/archoperator: Invalues:- amd64containers:- name: nginx-containerimage: nginx:latestports:- name: nginx-portcontainerPort: 80

若将硬限制处改为不存在的node,那么会调度错误

apiVersion: v1
kind: Pod
metadata:name: nginx-podnamespace: myns
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node3#preferredDuringSchedulingIgnoredDuringExecution:#- weight: 1#preference:#matchExpressions:#- key: kubernetes.io/arch#operator: In#values:#- amd64containers:- name: nginx-containerimage: nginx:latestports:- name: nginx-portcontainerPort: 80
​
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
nginx-pod   0/1     Pending   0          6s    <none>   <none>   <none>           <none>
[root@k8s-master pod]# kubectl describe pod nginx-pod -n myns | tail -5node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type     Reason            Age   From               Message----     ------            ----  ----               -------Warning  FailedScheduling  25s   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's node affinity/selector. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling..

若将软限制更改为一个不存在的node,那么会自动挑选一个可用node接受调度任务

[root@k8s-master pod]# cat myaffinity.yaml 
apiVersion: v1
kind: Pod
metadata:name: nginx-podnamespace: myns
spec:affinity:nodeAffinity:#requiredDuringSchedulingIgnoredDuringExecution:#nodeSelectorTerms:#- matchExpressions:#- key: kubernetes.io/hostname#operator: In#values:#- k8s-node3preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node3containers:- name: nginx-containerimage: nginx:latestports:- name: nginx-portcontainerPort: 80
​
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          8s    10.244.36.83   k8s-node1   <none>           <none>

d.注意事项

定向调度nodeSelector和nodeAffinity可以同时配置,但需要两者的条件都满足才能正常运行调度

pod被调度到node后node的标签发生了改变不符合亲和性调度匹配规则时,系统将忽略此变化(requiredDuringSchedulingIgnoredDuringExecution表达方式中的IgnoredDuringExecution就表示这个意思)

定义了多个nodeSelectorTerms时满足一个即可

定义了多个matchExpressions时需要都满足才成功

(2)podAffinity,pod亲和性

a.以pod为主体,针对pod和pod部署在同一个拓扑的问题

为减少网络通信性能损耗,多用于两个pod应用频繁交互互动的情况

b.两种表达方式和可配置项

[root@k8s-master pod]# kubectl explain  pod.spec.affinity.podAffinity
KIND:       Pod
VERSION:    v1
​
FIELDS:preferredDuringSchedulingIgnoredDuringExecution   <[]WeightedPodAffinityTerm>#软限制,尽量满足- weight: 3        podAffinityTerm:   #选项labelSelector:matchExpressions:- key: kubernetes.io/archoperator: Invalues:- amd64topologyKey: kubernetes.io/arch 
​requiredDuringSchedulingIgnoredDuringExecution    <[]PodAffinityTerm>#硬限制,必须满足- labelSelector:   #标签选择器matchExpressions:   #同nodeAffinity- key: nameoperator: Invalues:- su1namespaces: xxx     #指定参照pod的名称空间topologyKey: kubernetes.io/hostname  #指定调度作用域,kubernetes.io/hostname(以Node节点为区分范围),kubernetes.io/os(以Node节点的操作系统类型来区分)等#matchLabels    可指定多个matchExpressions内容

c.案例演示

下例要求将两个nginx的pod运行在同一个node,并且是以hostname为调度作用域

[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
my-nginx1   1/1     Running   0          9s    10.244.36.80   k8s-node1   <none>           <none>
my-nginx2   1/1     Running   0          9s    10.244.36.81   k8s-node1   <none>           <none>
[root@k8s-master pod]# cat twopod.yaml 
apiVersion: v1
kind: Pod
metadata:name: my-nginx1labels:name: su1namespace: myns
spec:containers:- name: my-nginx1image: nginx
​
---
​
apiVersion: v1
kind: Pod
metadata: name: my-nginx2labels:name: su2namespace: myns
spec:containers:- name: my-nginx2image: nginxaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: nameoperator: Invalues:- su1topologyKey: kubernetes.io/hostnamepreferredDuringSchedulingIgnoredDuringExecution:- weight: 3        podAffinityTerm:labelSelector:matchExpressions:- key: kubernetes.io/archoperator: Invalues:- amd64topologyKey: kubernetes.io/arch 

  (3)podAntiAffinity,pod反亲和性

a.以pod为主体,针对pod和pod不能部署在同一个拓扑的问题

为提高服务可用性,多用于pod应用有多个副本,让应用分布到各个node上的情况,用法和podAffinity一致

b.案例演示

简单测试下效果就将上面podAffinity例子改为podAntiAffinity即可

[root@k8s-master pod]# cat twopod.yaml 
apiVersion: v1
kind: Pod
metadata:name: my-nginx1labels:name: su1namespace: myns
spec:containers:- name: my-nginx1image: nginx
​
---
​
apiVersion: v1
kind: Pod
metadata: name: my-nginx2labels:name: su2namespace: myns
spec:containers:- name: my-nginx2image: nginxaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: nameoperator: Invalues:- su1topologyKey: kubernetes.io/hostnamepreferredDuringSchedulingIgnoredDuringExecution:- weight: 3        podAffinityTerm:labelSelector:matchExpressions:- key: kubernetes.io/archoperator: Invalues:- amd64topologyKey: kubernetes.io/arch [root@k8s-master pod]# kubectl get pods -n myns -o wide   #已将其运行在其他node
NAME        READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
my-nginx1   1/1     Running   0          9s    10.244.36.84     k8s-node1   <none>           <none>
my-nginx2   1/1     Running   0          9s    10.244.169.132   k8s-node2   <none>           <none>

五.taint污点调度和Toleration容忍调度

1.污点调度(node方)

也就是在node上添加一个taint的属性,来标识此node是否允许pod调度

(1)三个污点策略

PreferNoSchedule

能不来你就别来了,但是要是没有其他node可以调度了可以过来

NoSchedule

新pod就别来了,我现在只负责我的老pod了

NoExecute

老pod我也不负责了,新的我也调度不了

(2)添加污点/查看污点/去除污点

#添加
kubectl taint nodes nodename 键=值:污点策略
#查看
kubectl describe nodes nodename | grep Taints
#删除
kubectl taint nodes nodename 键:污点策略-
#删除所有
kubectl taint nodes nodename 键-

(3)案例演示

模拟目前集群中只有k8s-node1一个node可用,在该node上演示污点调度的三种模式效果

[root@k8s-master pod]# kubectl get nodes -o wide
NAME         STATUS   ROLES           AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIME
k8s-master   Ready    control-plane   8m32s   v1.28.2   192.168.2.150   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   containerd://1.6.24
k8s-node1    Ready    <none>          7m42s   v1.28.2   192.168.2.151   <none>        CentOS Linux 7 (Core)   3.10.0-1160.el7.x86_64   containerd://1.6.24

a.PreferNoSchedule

可以看到设置PreferNoSchedule后在无其他可用节点时仍然mytaint1可以被调度上来

[root@k8s-master pod]# kubectl taint nodes k8s-node1 status=taint:PreferNoSchedule
node/k8s-node1 tainted
[root@k8s-master pod]# kubectl run mytaint1 --image=nginx -n myns
pod/mytaint1 created
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
mytaint1   1/1     Running   0          9s    10.244.36.66   k8s-node1   <none>           <none>
[root@k8s-master pod]# kubectl taint nodes k8s-node1 status:PreferNoSchedule-
node/k8s-node1 untainted

b.NoSchedule

可以看到设置NoSchedule后,新pod无法被调度,但不会影响原有的mytaint1

[root@k8s-master pod]# kubectl taint nodes k8s-node1 status=taint:NoSchedule
node/k8s-node1 tainted
[root@k8s-master pod]# kubectl run mytaint2 --image=nginx -n myns
pod/mytaint2 created
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME       READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
mytaint1   1/1     Running   0          2m54s   10.244.36.66   k8s-node1   <none>           <none>
mytaint2   0/1     Pending   0          9s      <none>         <none>      <none>           <none>
[root@k8s-master pod]# kubectl taint nodes k8s-node1 status:NoSchedule-
node/k8s-node1 untainted

c.NoExecute

可以看到在设置NoExecute后,node上原有的pod都被剔除,只剩mytaint3,他同样也无法被调度

[root@k8s-master pod]# kubectl taint nodes k8s-node1 status=taint:NoExecute
node/k8s-node1 tainted
[root@k8s-master pod]# kubectl run mytaint3 --image=nginx -n myns
pod/mytaint3 created
[root@k8s-master pod]# kkubec get pods -n myns -o wide
-bash: kkubec: command not found
[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
mytaint3   0/1     Pending   0          16s   <none>   <none>   <none>           <none>

2.容忍调度(pod方)

就是实在需要将pod调度到污点node上,可以利用容忍调度

(1)容忍的配置参数

[root@k8s-master pod]# kubectl explain pod.spec.tolerations
KIND:       Pod
VERSION:    v1
​
FIELDS:effect    <string>#指定对应想要调度node的污点策略,若是空则匹配所有策略,必须和目标node的策略一致key   <string>#指定对应想要调度node的污点键,必须和目标node的污点键一致operator  <string>#运算符,只支持Equal和Exists,默认ExiststolerationSeconds <integer>#容忍时间,设置pod在node上的存活时间,只有在污点策略为NoExecute才生效value <string>#指定对应想要调度node的污点键对应的值,必须和目标node的污点键值一致

(2)案例演示

在污点为“status=taint:NoExecute”的k8s-node1上成功调度my-to

[root@k8s-master pod]# kubectl describe node k8s-node1 | grep Taints
Taints:             status=taint:NoExecute
​
[root@k8s-master pod]# cat mytoleration.yaml 
apiVersion: v1
kind: Pod
metadata:name: my-tonamespace: myns
spec:containers:- name: my-nginximage: nginxtolerations:- key: statusoperator: Equalvalue: tainteffect: NoExecute[root@k8s-master pod]# kubectl get pods -n myns -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
my-to   1/1     Running   0          6m48s   10.244.36.68   k8s-node1   <none>           <none>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理类联考——数学——汇总篇——知识点突破——应用题——路程——记忆

路程——【考频&#xff1a;高】——【解题提示&#xff1a;根据题意画图&#xff0c;找等量关系&#xff08;一般是时间和路程&#xff09;&#xff0c;列方程求解。】 【 应用题 ⟹ \Longrightarrow ⟹ 路程 ⟹ \Longrightarrow ⟹ 直线 ⟹ \Longrightarrow ⟹ 匀速、相遇、…

Kafka 集群如何实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

数字图像处理(实践篇)二 画出图像中目标的轮廓

目录 一 涉及的OpenCV函数 二 代码 三 效果图 一 涉及的OpenCV函数 contours, hierarchy cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) image&#xff1a;源图像。mode&#xff1a;轮廓的检索方式。cv2.RETR_EXTERNAL&#xff08;只检测…

Xcode:does not contain bitcode

1.错误描述 使用了第三方库错误提示如下&#xff1a; ld: xxx does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. xxx for architectur…

nvm安装及使用

文章目录 一、[介绍](https://github.com/nvm-sh/nvm)1.1、卸载node1.1.1、从控制面板的程序卸载node1.1.2、删除node的安装目录1.1.3、查找.npmrc文件删除1.1.4、逐一删除下列文件1.1.5、删除node环境变量1.1.6、验证是否卸载成功 二、安装2.1、window系统2.2、mac系统2.2.1、…

蓝桥杯第597题 跑步锻炼 C++ 日期模板题(模拟经典)

题目 跑步锻炼https://www.lanqiao.cn/problems/597/learning/?page1&first_category_id1&name%E8%B7%91%E6%AD%A5%E9%94%BB%E7%82%BC 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝每天都锻炼身…

基于uniapp的 电子书小程序——需求整理

前言 想开发一个很简单的 电子书阅读小程序&#xff0c;要怎么做的。下面从功能、数据库设计这一块来说一下。说不一定能从某个角度提供一些思路 开发语言 springcloud uniapp 小程序&#xff08;vue2&#xff09;mysql 说明 电子书的主题是电子书&#xff0c;我们在日常…

基于若依的ruoyi-nbcio流程管理系统增加流程节点配置(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 为了增加流程节点配置的功能的灵活性与方便性&#xff0c;这里增加流程节点的配置。 1、相应表结构如下&a…

apipost接口200状态码,浏览器控制台500状态码

后端 url 登录login方法 login(){this.$refs.loginForm.validate(async valid > {if (!valid) return// 由于data属性是一个json对象&#xff0c;需要进行解构赋值{data:result}&#xff0c;进行状态码判断const {data: result} await this.$http.post(/api/doLogin,this.…

【如何学习Python自动化测试】—— Cookie 处理

前提 网络通信是当今社会最为普及和繁荣的技术之一&#xff0c;其承载了人们生活中瞬息万变的信息传递和交流。而作为网络通信的核心要素&#xff0c;网络协议、socket、cookie和session则是网络通信的灵魂。 一、网络协议 网络协议是计算机和网络设备之间相互通信的规则和标准…

相机设置参数:黑电平(Black Level)详解和示例

本文通过原理和示例对相机设置参数“黑电平”进行讲解&#xff0c;以帮助大家理解和使用。 原理 相机中黑电平原理是将电平增大&#xff0c;可以显示更多暗区细节&#xff0c;可能会损失一些亮区&#xff0c;但图像更多的关注暗区&#xff0c;获取完图像信息再减掉。只是为了…

N皇后问题解的个数

暴力递归 #include <stdio.h>int count0,a[15],flag; void queen(int,int); int main(){int n;scanf("%d",&n);queen(n,n);printf("%d",count); } void queen(int n,int n0){if(n<1){flag1;for(int i1;i<n0;i){for(int j1;j<n0;j){if(…

【汉诺塔 —— (经典分治递归)】

汉诺塔 —— &#xff08;经典分治递归&#xff09; 一.汉诺塔介绍二.分治算法解决汉诺塔问题三.汉诺塔问题的代码实现四.主函数测试展示 一.汉诺塔介绍 汉诺塔问题源自印度一个古老的传说&#xff0c;印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱&#xff0c;其中的一…

【Jenkins】jenkins发送邮件报错:Not sent to the following valid addresses:

jenkins报错未能发送邮件到指定邮箱 注意&#xff1a;这是在系统配置中修改 在系统配置》邮件通知中添加配置信息 注意&#xff1a;这个是在项目的配置下修改 配置完成后&#xff0c;重新执行发送邮件成功&#xff01;&#xff01;&#xff01;

量子计算 | 解密著名量子算法Shor算法和Grover算法

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

unigui同页面内重定向跳转,企业微信内部应用开发获取用户code例子

procedure TMainForm.UniFormCreate(Sender: TObject); varurl: string;code: string; begin //如果没有code值&#xff0c;将进行重定向if UniApplication.Parameters.Values[code] thenbeginurl :https://open.weixin.qq.com/connect/oauth2/authorize?appid你们的企业ID&…

STM32_7(ADC)

一、ADC ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间输入电压范围&#xff1a;0~3.3V&#xff0c;…

Ubuntu中安装搜狗输入法教程(详细图文教程)

习惯了使用搜狗输入法&#xff0c;这里总结了Ubuntu系统下安装搜狗输入法的详细教程&#xff0c;每个步骤都很详细&#xff0c;耐心安装。 搜狗输入法是一款功能强大、使用方便的输入法&#xff0c;能够有效提升用户在Ubuntu系统中的输入体验。 目录 一、下载搜狗安装包1.1 搜…

HBase数据模型杂谈

1.概述 HBase是一个稀疏、多维度、排序的映射表&#xff0c;这张表的索引是行键、列族、列限定符和时间戳。 每个值是一个未经解释的字符串&#xff0c;没有数据类型。用户在表中存储数据&#xff0c;每一行都有一个可排序的行键和任意多的列。表在水平方向由一个或者多个列族…

数据结构——单链表(Singly Linked List)

1.链表介绍 链表是一种物理储存上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。 对于上图&#xff0c;每一个结点都是一个结…