陕西城乡建设网站,丰泽区住房和城乡建设局投诉网站,WordPress百度自动翻译,工作表现情况怎么写作者 | 阿文#xff0c;责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN#xff08;ID#xff1a;CSDNnews#xff09;自互联网出现以来 #xff0c;云计算的概念已经提出了有 50 年。从1957 年#xff0c;John McCarthy 将计算机中的分时共享概念设计成了一种工具。从此… 作者 | 阿文责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDNIDCSDNnews自互联网出现以来 云计算的概念已经提出了有 50 年。从1957 年John McCarthy 将计算机中的分时共享概念设计成了一种工具。从此以后这个概念的名字经历过数次变化从“服务中心service bureau”到应用服务提供商到互联网即服务到云计算再到软件定义的数据中心。一直以来基础设施是云计算的基础核心基础设施服务Infrastructure as a ServiceIaaS将IT基础设施资源计算、网络与存储以一种弹性的服务方式对外提供。近十余年来随着云计算不断发展与落地云基础设施技术架构也在不断往前演进从传统虚拟化、基础设施资源管理走向软件定义架构。随着近5年来以容器和微服务为代表的云原生技术兴起云基础设施架构需要演进以全面拥抱云原生技术。以容器、容器编排、微服务、服务网格为代表的云原生技术正在日益体现出期在云计算领域的非凡价值众所周知容器编排中 Kubernetes 已经成为容器编排领域的事实标准。kubernetes 可以提供所需的编排和管理功能以便针对工作负载大规模部署容器。借助 Kubernetes 编排功能可以快速的构建跨多个容器的应用服务、跨集群调度、扩展这些容器并长期持续管理这些容器的健康状况。在 Kubernetes 中调度 是指将 Pod 放置到合适的 Node上然后对应 Node 上的 Kubelet才能够运行这些 pod。那么kubernetes 是如何进行调度的呢我们来一起看下。Kubernetes 是如何调度的kube-scheduler 是 Kubernetes 集群的默认调度器并且是集群 控制面的一部分。同时 kube-scheduler 在设计上是允许你自己写一个调度组件并替换原有的 kube-scheduler。对每一个新创建的 Pod 或者是未被调度的 Podkube-scheduler 会选择一个最优的 Node 去运行这个 Pod。那么kube-scheduler 是如何选择最优的 Node 呢kube-scheduler监听apiserver的/api/pod/当发现集群中有未得到调度的pod(即PodSpec.NodeName为空)时会查询集群各node的信息经过Predicates(过滤)、Priorities(优选器)得到最适合该pod运行的node后再向apiserver发送请求将该容器绑定到选中的node上。Kubernetes Scheduler 提供的调度流程分三步过滤 遍历nodelist选择出符合要求的候选节点Kubernetes内置了多种预选规则供用户选择。打分 在选择出符合要求的候选节点中采用优选规则计算出每个节点的积分最后选择得分最高的。绑定 选出其中得分最高的 Node 来运行 Pod。之后调度器将这个调度决定通知给 kube-apiserver这个过程叫做绑定。整个过程如图所示预选的算法可以参考源码predicates.gohttps://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.goconst (// MatchInterPodAffinityPred defines the name of predicate MatchInterPodAffinity.MatchInterPodAffinityPred MatchInterPodAffinity// CheckVolumeBindingPred defines the name of predicate CheckVolumeBinding.CheckVolumeBindingPred CheckVolumeBinding// GeneralPred defines the name of predicate GeneralPredicates.GeneralPred GeneralPredicates// HostNamePred defines the name of predicate HostName.HostNamePred HostName// PodFitsHostPortsPred defines the name of predicate PodFitsHostPorts.PodFitsHostPortsPred PodFitsHostPorts// MatchNodeSelectorPred defines the name of predicate MatchNodeSelector.MatchNodeSelectorPred MatchNodeSelector// PodFitsResourcesPred defines the name of predicate PodFitsResources.PodFitsResourcesPred PodFitsResources// NoDiskConflictPred defines the name of predicate NoDiskConflict.NoDiskConflictPred NoDiskConflict// PodToleratesNodeTaintsPred defines the name of predicate PodToleratesNodeTaints.PodToleratesNodeTaintsPred PodToleratesNodeTaints// CheckNodeUnschedulablePred defines the name of predicate CheckNodeUnschedulablePredicate.CheckNodeUnschedulablePred CheckNodeUnschedulable// CheckNodeLabelPresencePred defines the name of predicate CheckNodeLabelPresence.CheckNodeLabelPresencePred CheckNodeLabelPresence// CheckServiceAffinityPred defines the name of predicate checkServiceAffinity.CheckServiceAffinityPred CheckServiceAffinity// MaxEBSVolumeCountPred defines the name of predicate MaxEBSVolumeCount.// DEPRECATED// All cloudprovider specific predicates are deprecated in favour of MaxCSIVolumeCountPred.MaxEBSVolumeCountPred MaxEBSVolumeCount// MaxGCEPDVolumeCountPred defines the name of predicate MaxGCEPDVolumeCount.// DEPRECATED// All cloudprovider specific predicates are deprecated in favour of MaxCSIVolumeCountPred.MaxGCEPDVolumeCountPred MaxGCEPDVolumeCount// MaxAzureDiskVolumeCountPred defines the name of predicate MaxAzureDiskVolumeCount.// DEPRECATED// All cloudprovider specific predicates are deprecated in favour of MaxCSIVolumeCountPred.MaxAzureDiskVolumeCountPred MaxAzureDiskVolumeCount// MaxCinderVolumeCountPred defines the name of predicate MaxCinderDiskVolumeCount.// DEPRECATED// All cloudprovider specific predicates are deprecated in favour of MaxCSIVolumeCountPred.MaxCinderVolumeCountPred MaxCinderVolumeCount// MaxCSIVolumeCountPred defines the predicate that decides how many CSI volumes should be attached.MaxCSIVolumeCountPred MaxCSIVolumeCountPred// NoVolumeZoneConflictPred defines the name of predicate NoVolumeZoneConflict.NoVolumeZoneConflictPred NoVolumeZoneConflict// EvenPodsSpreadPred defines the name of predicate EvenPodsSpread.EvenPodsSpreadPred EvenPodsSpread
)常用的预选策略PodFitsHostPorts如果 Pod 中定义了 hostPort 属性那么需要先检查这个指定端口是否 已经被 Node 上其他服务占用了。PodFitsHost若 pod 对象拥有 hostname 属性则检查 Node 名称字符串与此属性是否匹配。PodFitsResources检查 Node 上是否有足够的资源如cpu 和内存来满足 pod 的资源请求。PodMatchNodeSelector检查 Node 的 标签 是否能匹配 Pod 属性上 Node 的 标签 值。NoVolumeZoneConflict检测 pod 请求的 Volumes 在 Node 上是否可用因为某些存储卷存在区域调度约束。NoDiskConflict检查 Pod 对象请求的存储卷在 Node 上是否可用若不存在冲突则通过检查。MaxCSIVolumeCount检查 Node 上已经挂载的 CSI 存储卷数量是否超过了指定的最大值。CheckNodeMemoryPressure如果 Node 上报了内存资源压力过大而且没有配置异常那么 Pod 将不会被调度到这个 Node 上。CheckNodePIDPressure如果 Node 上报了 PID 资源压力过大而且没有配置异常那么 Pod 将不会被调度到这个 Node 上。CheckNodeDiskPressure如果 Node 上报了磁盘资源压力过大文件系统满了或者将近满了 而且配置异常那么 Pod 将不会被调度到这个 Node 上。CheckNodeConditionNode 可以上报其自身的状态如磁盘、网络不可用表明 kubelet 未准备好运行 pod。如果 Node 被设置成这种状态那么 pod 将不会被调度到这个 Node 上。PodToleratesNodeTaints检查 pod 属性上的 tolerations 能否容忍 Node 的 taints。CheckVolumeBinding检查 Node 上已经绑定的和未绑定的 PVCs 能否满足 Pod 对象的存储卷需求。打分策略如下SelectorSpreadPriority尽量将归属于同一个 Service、StatefulSet 或 ReplicaSet 的 Pod 资源分散到不同的 Node 上。InterPodAffinityPriority遍历 Pod 对象的亲和性条目并将那些能够匹配到给定 Node 的条目的权重相加结果值越大的 Node 得分越高。LeastRequestedPriority空闲资源比例越高的 Node 得分越高。换句话说Node 上的 Pod 越多并且资源被占用的越多那么这个 Node 的得分就会越少。MostRequestedPriority空闲资源比例越低的 Node 得分越高。这个调度策略将会把你所有的工作负载Pod调度到尽量少的 Node 上。RequestedToCapacityRatioPriority为 Node 上每个资源占用比例设定得分值给资源打分函数在打分时使用。BalancedResourceAllocation优选那些使得资源利用率更为均衡的节点。NodePreferAvoidPodsPriority这个策略将根据 Node 的注解信息中是否含有 scheduler.alpha.kubernetes.io/preferAvoidPods 来 计算其优先级。使用这个策略可以将两个不同 Pod 运行在不同的 Node 上。NodeAffinityPriority基于 Pod 属性中 PreferredDuringSchedulingIgnoredDuringExecution 来进行 Node 亲和性调度。你可以通过这篇文章 Pods 到 Nodes 的分派 来了解到更详细的内容。TaintTolerationPriority基于 Pod 中对每个 Node 上污点容忍程度进行优先级评估这个策略能够调整待选 Node 的排名。ImageLocalityPriorityNode 上已经拥有 Pod 需要的 容器镜像 的 Node 会有较高的优先级。ServiceSpreadingPriority这个调度策略的主要目的是确保将归属于同一个 Service 的 Pod 调度到不同的 Node 上。如果 Node 上 没有归属于同一个 Service 的 Pod这个策略更倾向于将 Pod 调度到这类 Node 上。最终的目的即使在一个 Node 宕机之后 Service 也具有很强容灾能力。CalculateAntiAffinityPriorityMap这个策略主要是用来实现pod反亲和。EqualPriorityMap将所有的 Node 设置成相同的权重为 1。自定义调度器除了 kubernetes 自带的调度器考虑到实际环境中的各种复杂情况kubernetes 的调度器采用插件化的形式实现可以方便用户进行定制或者二次开发我们可以自定义一个调度器并以插件形式和 kubernetes 进行集成。你也可以编写自己的调度器。通过 spec:schedulername 参数指定调度器的名字可以为 pod 选择某个调度器进行调度。kube-scheduler在启动的时候可以通过 --policy-config-file参数来指定调度策略文件我们可以根据我们自己的需要来组装Predicates和Priority函数。选择不同的过滤函数和优先级函数、控制优先级函数的权重、调整过滤函数的顺序都会影响调度过程。比如下面的 pod 选择 test-my-scheduler 进行调度而不是默认的 default-schedulerapiVersion: v1
kind: Pod
metadata:name: test-schedulerlabels:name: testscheduler-example
spec:schedulername: test-my-schedulercontainers:- name: pod-with-second-annotation-containerimage: gcr.io/google_containers/pause:2.0调度器的编写请参考 kubernetes 默认调度器的实现最核心的内容就是读取 apiserver 中 pod 的值根据特定的算法找到合适的 node然后把调度结果会写到 apiserver。官方给出的范例#!/bin/bash
SERVERlocalhost: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 )
;doNODES($(kubectl --server $SERVER get nodes -o json | jq .items[].metadata.name | tr -d ))NUMNODES${#NODES[]}CHOSEN${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: $CHOSEN}} http://$SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/echo Assigned $PODNAME to $CHOSENdonesleep 1
done推荐阅读
实操来了一文告诉你如何用 Streamlit 和 Heroku 开发 Web避坑使用 Kubernetes 最易犯的 10 个错误雷军4G 手机已清仓全力转 5GQQ音乐播放中途插语音广告引热议Wine 5.9 发布 | 极客头条15 岁黑进系统发挑衅邮件意外获 Offer不惑之年捐出全部财产Twitter CEO 太牛了必读53个Python经典面试题详解赠书 | 1月以来 Tether 增发47亿 USDT美元都去哪儿了真香朕在看了