c语言sscanf函数的用法是什么
290
2022-10-27
kubernetes快速入门14-调度器、预选策略及优选函数
kubernetes快速入门14-调度器、预选策略及优选函数
预选与优选
k8s进行节点调度的阶段:
1. 节点预选(Predicate),从节点中排除完全不符合要求的过程 2. 节点优选(Priority),使用优选函数给各个节点打分,并排序 3. 节点选定(Select),选择得分最高的节点,若多个节点有最高分,则随机选择最高分的节点
预选策略:
1. CheckNodeCondition: 检查节点本身是否正常 2. GeneralPredicates: 通用预选策略 HostName: 检查Pod对象是否定义了 pod.spec.hostname PodFitsHostPorts: 检查Pod对象是否定义了 pod.spec.containers.ports.hostPort MatchNodeSelector: 检查Pod对象是否定义了 pod.spec.nodeSelector PodFitsResources: 检查节点是否有足够的资源来运行当前pod 3. NoDiskConflict: 是否不存在磁盘冲突,看是否满足pod依赖的存储卷的需求 4. PodToleratesNodeTaints: 检查pod上的spec.tolerations可容忍的污点是否完全 包含节点上的污点 5. PodToleratesNodeNoExecuteTaints: 6. CheckNodeLabelPresence: 检查节点标签的存在性 7. CheckServiceAffinity:把pod调度到已经有service关联到该类pod运行的节点上 8. CheckNodeMemoryPressure: 检查节点内存资源是否压力过大 9. CheckNodePIDPressure: 检查节点PID资源是否压力过大 10. CheckNodeDiskPressure: 检查节点磁盘资源是否压力过大 ...... 预选策略是一票否决,只要已启用的预选策略有一条不满足那就不满足预选。
优选函数:
1. LeastRequested: (((cpu总容量 - 被所有pod使用的容量之和)*10/cpu总量) + ((内存总容量 - 被所有pod使用的容量之和)*10/内存总量))/2,数值越低,得分越高 2. BalancedResourceAllocation: cpu和内存资源被占用率相近的胜出 3. NodePreferAvoidPods: 根据节点的annotation信息“scheduler.alpha.kubernetes.io/preferAvoidPods” 4. TaintToleration: 将pod对象的spec.tolerations与节点的taints列表项进行匹配度检查,匹配越多,得分越低 5. SelectorSpreading: 被同一个标签选择器选择的pod尽量被分散运行在不同的节点,节点运行同一个标签选择器选中的Pod数越多,得分越低 6. InterPodAffinity: 基于pod亲和性,亲和性条目匹配越多,得分越高 7. NodeAffinity: 基于节pod.spec.nodeSelector进行亲和性检查,亲和性条目匹配越多,得分越高 8. MostRequested: 与LeastRequested相反 9. NodeLabel: 根据节点是否有标签来进行打分 10. ImageLocality: 根据满足当前pod运行需求的已有镜像体积大小之和来打分 优选函数使用全部已启用的优选函数进行评分,最终得分为评分的总和。
k8s高级调度方式
节点选择器: nodeSelector, nodeName
节点亲和调度: nodeAffinity
节点亲和性和pod亲和性的帮助信息:
KIND: Pod VERSION: v1 FIELDS: spec
nodeAffinity事例
# 资源清单文件
k8s@node01:~/my_manifests/scheduler$ cat pod-nodeaffinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeaffinity-demo
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 强亲和性,没有满足条件的pod将pending
nodeSelectorTerms:
- matchExpressions:
- key: rack
operator: In
values:
- rack1
# 应用配置,因各个节点无"rack:rack1"这个标签,而又使用的强亲和性,所以scheduler在预选时找不到满足条件的node,pod就将被挂起
k8s@node01:~/my_manifests/scheduler$ kubectl apply -f pod-nodeaffinity-demo.yaml
k8s@node01:~/my_manifests/scheduler$ kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-nodeaffinity-demo 0/1 Pending 0 9s
# 在node03上打上“rack:rack1”的label后,pod被调度到了node03节点上
k8s@node01:~/my_manifests/scheduler$ kubectl label nodes/node03 rack=rack1
node/node03 labeled
k8s@node01:~/my_manifests/scheduler$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nodeaffinity-demo 1/1 Running 0 6m21s 10.244.2.9 node03
如果使用的是preferredDuringSchedulingIgnoredDuringExecution,即使无法找到满足条件的node节点,最终也会选择一个节点来运行pod。
podAffinity事例
pod的亲和性表示让需要高效通信的Pod尽可能的运行在同一个节点或拥有同一性质特性的节点。为了更好演示此性质,又增加了一个node04节点作为工作节点。
# 给node03和node04两个节点打上了“rack=rack1”这个标签,模拟这两个节点在机房的同一个机架上
k8s@node01:~$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node01 Ready master 11d v1.18.6 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node02 Ready
资源清单
# 编写测试资源清单
k8s@node01:~/my_manifests/scheduler$ cat pod-podaffinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
namespace: default
labels:
app: myapp
tier: fronted
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- {key: rack, operator: In, values: ["rack1"]}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-bbox
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: db
template:
metadata:
name: pod-bbox
labels:
app: db
spec:
containers:
- name: busybox
image: busybox:latest
command: ["sh","-c","sleep 3600"]
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions: # 关联与哪个pod的亲和性
- {key: app, operator: In, values: ["myapp"]}
topologyKey: rack # 工作节点是标签key
k8s@node01:~/my_manifests/scheduler$ kubectl apply -f pod-podaffinity-demo.yaml
pod/pod1 created
deployment.apps/deploy-bbox created
k8s@node01:~/my_manifests/scheduler$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-bbox-7f85dd55f-h7hgf 1/1 Running 0 116s 10.244.2.21 node03
资源清单中的第一个资源为自主式pod,使用了nodeAffinity让其运行在节点有“rack:rack1”这样的节点上,node03,node04满足要求,所以这个自主式pod1会运行在node03或node04上,而Deployment控制器控制的2个pod也会与pod1运行节点上的标签"rack"key的值相同的节点上,也是node03或node04这两个节点。
podAntiAffinity事例
如果把上边的例子中的podAffinity修改为podAntiAffinity,那么deployment控制的2个pod就只能运行在node02这个工作节点上。
Node的Taints和Pod的Tolerations
Taint的作用对象是node,表示一个node拥有什么污点,node是k8s中的标准资源,而Toleration的作用对象是pod,表示pod对污点的容忍度。
KIND: Node
VERSION: v1
FIELDS:
spec
KIND: Pod
VERSION: v1
FIELDS:
spec
对node打Taint一般使用如下命令
kubectl taint nodes NAME KEY_1=VAL_1:TAINT_EFFECT_1 ... KEY_N=VAL_N:TAINT_EFFECT_N [options]
比如给node02和node03节点打上一个Taint
k8s@node01:~$ kubectl taint nodes node02 node-type=production:NoSchedule k8s@node01:~$ kubectl taint nodes node03 node-type=dev:NoExecute # 查看节点详细信息 k8s@node01:~$ kubectl describe nodes/node02 ... Taints: node-type=production:NoSchedule # 被打上了污点 ...
现在运行一个有3个副本的deployment资源看看效果
k8s@node01:~/my_manifests/scheduler$ cat deployment-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
revisionHistoryLimit: 5
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: http
path: /
scheme: HTTP
k8s@node01:~/my_manifests/scheduler$ kubectl apply -f deployment-demo.yaml
deployment.apps/myapp-deploy created
k8s@node01:~/my_manifests/scheduler$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-deploy-679fcdf84-hw6q8 0/1 Pending 0 4s
myapp-deploy-679fcdf84-z9wxr 0/1 Pending 0 4s
myapp-deploy-679fcdf84-znx8v 0/1 Pending 0 4s
# 因pod中未定义污点的容忍,node02和node03都不能满足预选,所以pod处于Pending状态
# 修改资产清单文件,让其容忍node02上的污点
k8s@node01:~/my_manifests/scheduler$ cat deployment-demo.yaml
...
readinessProbe:
httpGet:
port: http
path: /
scheme: HTTP
tolerations: # 增加此字段
- key: node-type
value: production
operator: Equal
effect: NoSchedule
k8s@node01:~/my_manifests/scheduler$ kubectl apply -f deployment-demo.yaml
k8s@node01:~/my_manifests/scheduler$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-777d554c7-chdlr 1/1 Running 0 12s 10.244.1.17 node02
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~