网站设计样例,有关电商网站开发的实习报告,网红商城,aspx网站配置服务器文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结
调度原理和过程
Scheduler 一直监听着… 文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结
调度原理和过程
Scheduler 一直监听着 api-server如果获取到Pod.Spec.NodeName为空会对每一个pod创建一个binding表示放在哪一个节点上运行 把 pod 按照预设的调度策略分配到集群的节点上
公平资源高效利用效率灵活
调度过程
预选predicate
过滤步满足条件的节点 PodFitsResources 节点上剩余的资源是否大于pod 请求的资源 PodFitsHost 如果pod 指定了NodeName检查节点名称是否和NodeName匹配 PodFitsHostPorts 节点上已经使用的port是否和pod申请的port冲突 PodselectorMatches 过滤掉和pod指定的 label 不匹配的节点 NoDiskConflict 已经mount的volume和pod指定的volume不冲突除非它们都是只读
优选priority
对节点按照优先级排序
选择出最优的节点如果预选的时候没有合适的节点pod 会一直处于 pending状态并且会不断重试调度直到有调度结果
调度策略
nodeSelect
最简单的调度形式节点选择约束将 pod 调度在拥有你指定的标签的节点上
示例
一个简单的nginx编排文件如下
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: defaultlabels:app: nginx
spec:selector:matchLabels:app: nginxreplicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent不进行特殊调度设置
kubectl apply -f nginx-demo.yaml给节点设置一个独一无二的标签信息
# 查看节点标签信息
kubectl get node --show-labels
# 给节点新增标签信息kubectl label nodes NodeName keyvalue
kubectl label nodes k8s-node01 nginxtrue
# 取消节点的标签信息
kubectl label nodes k8s-node01 nginx-**加上调度策略nodeSelect **
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: defaultlabels:app: nginx
spec:selector:matchLabels:app: nginxreplicas: 3template:metadata:labels:app: nginxspec:nodeSelector:app: nginxcontainers:- name: nginximage: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent查看效果 亲和性和反亲和性
相比之下亲和性和反亲和性的表达能力更强nodeSelector 只能选择所有固定标签的节点
requiredDuringSchedulingIgnoredDuringExecution
调度器只有在规则被满足的时候才能执行调度
preferredDuringSchedulingIgnoredDuringExecution
调度器会尝试寻找满足对应规则的节点如果找不到调度会在其他节点调度这个 pod
节点亲和性
NodeAffinity
“软需求”调度器在无法找到匹配节点时候仍然会调度 pod“硬需求”如果没有节点满足需求则不会被调度一直处于 pending 状态
Pod亲和性
PodAffinity
pod可以和哪些pod部署在同一个拓扑中
Pod互斥性
PodAntiAffinity
pod不和哪些pod部署在同一个拓扑中
调度策略
调度策略匹配标签操作符拓扑支持调度目标nodeAffinitynode节点In, NotIn,Exists,DoesNotExist, Gt,Lt否指定主机podAffinitypodIn, NotIn,Exists,DoesNotExist是pod与指定pod一个拓扑域PodAntiAffinitypodIn, NotIn,Exists,DoesNotExist是pod与指定pod不在一个拓扑域
操作符
Inlabel 的值在某个列表中NotInlabel 的值不在某个列表中Gtlabel 的值大于某个值Ltlabel 的值小于某个值Exists某个 label 存在DoesNotExist某个 label 不存在
NodeAffinify亲和验证
标准yaml文件
###第一个
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent###第二个
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx2namespace: defaultlabels:app: nginx2
spec:selector:matchLabels:app: nginx2replicas: 3template:metadata:labels:app: nginx2spec:containers:- name: nginx2image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresentNodeAffinify验证
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node03containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent 调度结果 硬策略不符合要求的时候的调度结果 如果是软策略
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node04containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresentPodAffinity 亲和验证
nginx2的运行情况
看下nginx1的硬策略
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginx2topologyKey: kubernetes.io/hostnamecontainers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent调度结果 PodAntiAffinity 反亲和验证
nginx2的运行情况 nginx1
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginx2topologyKey: kubernetes.io/hostnamecontainers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent调度结果 污点与容忍 污点taints 容忍tolerations 如果一个节点标记的有污点如果对pod不进行标识为可以容忍否则该节点不可调度pod 污点组成keyvalue:effect
effect污点的作用
- NoSchedule 表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上
- PreferNoSchedule 表示 k8s 将 尽量避免 将 Pod 调度到具有该污点的 Node 上
- NoExecute 表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上同时会将 Node 上已经存在的 Pod 驱逐出去基本操作
### 查看节点污点
kubectl describe nodes | grep -P Name:|Taints
### 设置污点
kubectl taint nodes NodeName keyvalue:effect
### 删除污点
kubectl taint nodes NodeName keyvalue:effect-验证
### 设置一个污点,看是否符合预期多开一个窗口观察
kubectl taint nodes k8s-node03 appnginx:NoExecute设置容忍度再看下调度结果
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:tolerations:- key: appoperator: Existseffect: NoExecutecontainers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresenttolerations 属性的写法
key、value、effect 与 Node 的 Taint 设置需保持一致operatorExistsvalue可以省略operatorEqualkey与value之间就是等于的关系不能省略不指定operator则默认就是Equal 跳过 Scheduler 调度策略
将 pod 直接调度到指定的Node节点上
###第一个
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx1namespace: defaultlabels:app: nginx1
spec:selector:matchLabels:app: nginx1replicas: 3template:metadata:labels:app: nginx1spec:nodeName: k8s-node01containers:- name: nginx1image: docker.m.daocloud.io/nginximagePullPolicy: IfNotPresent调度策略场景总结
调度策略场景说明nodeName调度固定节点用于验证特定节点数据、故障复现等nodeSelect调度到拥有特定标签的节点特殊部门、特殊业务线、测试等podAffinity使pod处于同一个拓扑域用于上下游应用存在大量数据交互的场景podAntiAffinity使pod不处于同一个拓扑域多个计算型应用是不适合调度同一台节点nodeAffinity指定调度到指定的节点核心应用必须调度到核心节点nodeAntiAffinity指定不调度到指定的节点核心节点不能被普通应用使用taints污点节点不允许被调度pod比如master节点GPU高计算性能节点等tolerations配置了才可以调度到taints节点