中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Predicates Policies有什么用

發布時間:2021-12-20 09:58:21 來源:億速云 閱讀:161 作者:iii 欄目:云計算

本篇內容介紹了“Predicates Policies有什么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

##Predicates Policies分析 在/plugin/pkg/scheduler/algorithm/predicates.go中實現了以下的預選策略:

  • NoDiskConflict:檢查在此主機上是否存在卷沖突。如果這個主機已經掛載了卷,其它同樣使用這個卷的Pod不能調度到這個主機上。GCE,Amazon EBS, and Ceph RBD使用的規則如下:

    • GCE允許同時掛載多個卷,只要這些卷都是只讀的。

    • Amazon EBS不允許不同的Pod掛載同一個卷。

    • Ceph RBD不允許任何兩個pods分享相同的monitor,match pool和 image。

  • NoVolumeZoneConflict:檢查給定的zone限制前提下,檢查如果在此主機上部署Pod是否存在卷沖突。假定一些volumes可能有zone調度約束, VolumeZonePredicate根據volumes自身需求來評估pod是否滿足條件。必要條件就是任何volumes的zone-labels必須與節點上的zone-labels完全匹配。節點上可以有多個zone-labels的約束(比如一個假設的復制卷可能會允許進行區域范圍內的訪問)。目前,這個只對PersistentVolumeClaims支持,而且只在PersistentVolume的范圍內查找標簽。處理在Pod的屬性中定義的volumes(即不使用PersistentVolume)有可能會變得更加困難,因為要在調度的過程中確定volume的zone,這很有可能會需要調用云提供商。

  • PodFitsResources:檢查主機的資源是否滿足Pod的需求。根據實際已經分配的資源量做調度,而不是使用已實際使用的資源量做調度。

  • PodFitsHostPorts:檢查Pod內每一個容器所需的HostPort是否已被其它容器占用。如果有所需的HostPort不滿足需求,那么Pod不能調度到這個主機上。

  • HostName:檢查主機名稱是不是Pod指定的HostName。

  • MatchNodeSelector:檢查主機的標簽是否滿足Pod的nodeSelector屬性需求。

  • MaxEBSVolumeCount:確保已掛載的EBS存儲卷不超過設置的最大值。默認值是39。它會檢查直接使用的存儲卷,和間接使用這種類型存儲的PVC。計算不同卷的總目,如果新的Pod部署上去后卷的數目會超過設置的最大值,那么Pod不能調度到這個主機上。

  • MaxGCEPDVolumeCount:確保已掛載的GCE存儲卷不超過設置的最大值。默認值是16。規則同上。

下面是NoDiskConflict的代碼實現,其他Predicates Policies實現類似,都得如下函數原型: type FitPredicate func(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []PredicateFailureReason, error)

func NoDiskConflict(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) {
	for _, v := range pod.Spec.Volumes {
		for _, ev := range nodeInfo.Pods() {
			if isVolumeConflict(v, ev) {
				return false, []algorithm.PredicateFailureReason{ErrDiskConflict}, nil
			}
		}
	}
	return true, nil, nil
}


func isVolumeConflict(volume v1.Volume, pod *v1.Pod) bool {
	// fast path if there is no conflict checking targets.
	if volume.GCEPersistentDisk == nil && volume.AWSElasticBlockStore == nil && volume.RBD == nil && volume.ISCSI == nil {
		return false
	}

	for _, existingVolume := range pod.Spec.Volumes {
		...

		if volume.RBD != nil && existingVolume.RBD != nil {
			mon, pool, image := volume.RBD.CephMonitors, volume.RBD.RBDPool, volume.RBD.RBDImage
			emon, epool, eimage := existingVolume.RBD.CephMonitors, existingVolume.RBD.RBDPool, existingVolume.RBD.RBDImage
			// two RBDs images are the same if they share the same Ceph monitor, are in the same RADOS Pool, and have the same image name
			// only one read-write mount is permitted for the same RBD image.
			// same RBD image mounted by multiple Pods conflicts unless all Pods mount the image read-only
			if haveSame(mon, emon) && pool == epool && image == eimage && !(volume.RBD.ReadOnly && existingVolume.RBD.ReadOnly) {
				return true
			}
		}
	}

	return false
}

##Priorities Policies分析

現在支持的優先級函數包括以下幾種:

  • LeastRequestedPriority:如果新的pod要分配給一個節點,這個節點的優先級就由節點空閑的那部分與總容量的比值(即(總容量-節點上pod的容量總和-新pod的容量)/總容量)來決定。CPU和memory權重相當,比值最大的節點的得分最高。需要注意的是,這個優先級函數起到了按照資源消耗來跨節點分配pods的作用。計算公式如下: cpu((capacity – sum(requested)) * 10 / capacity) + memory((capacity – sum(requested)) * 10 / capacity) / 2

  • BalancedResourceAllocation:盡量選擇在部署Pod后各項資源更均衡的機器。BalancedResourceAllocation不能單獨使用,而且必須和LeastRequestedPriority同時使用,它分別計算主機上的cpu和memory的比重,主機的分值由cpu比重和memory比重的“距離”決定。計算公式如下: score = 10 – abs(cpuFraction-memoryFraction)*10

  • SelectorSpreadPriority:對于屬于同一個service、replication controller的Pod,盡量分散在不同的主機上。如果指定了區域,則會盡量把Pod分散在不同區域的不同主機上。調度一個Pod的時候,先查找Pod對于的service或者replication controller,然后查找service或replication controller中已存在的Pod,主機上運行的已存在的Pod越少,主機的打分越高。

  • CalculateAntiAffinityPriority:對于屬于同一個service的Pod,盡量分散在不同的具有指定標簽的主機上。

  • ImageLocalityPriority:根據主機上是否已具備Pod運行的環境來打分。ImageLocalityPriority會判斷主機上是否已存在Pod運行所需的鏡像,根據已有鏡像的大小返回一個0-10的打分。如果主機上不存在Pod所需的鏡像,返回0;如果主機上存在部分所需鏡像,則根據這些鏡像的大小來決定分值,鏡像越大,打分就越高。

  • NodeAffinityPriority(Kubernetes1.2實驗中的新特性):Kubernetes調度中的親和性機制。Node Selectors(調度時將pod限定在指定節點上),支持多種操作符(In, NotIn, Exists, DoesNotExist, Gt, Lt),而不限于對節點labels的精確匹配。另外,Kubernetes支持兩種類型的選擇器,一種是“hard(requiredDuringSchedulingIgnoredDuringExecution)”選擇器,它保證所選的主機必須滿足所有Pod對主機的規則要求。這種選擇器更像是之前的nodeselector,在nodeselector的基礎上增加了更合適的表現語法。另一種是“soft(preferresDuringSchedulingIgnoredDuringExecution)”選擇器,它作為對調度器的提示,調度器會盡量但不保證滿足NodeSelector的所有要求。

下面是ImageLocalityPriority的代碼實現,其他Priorities Policies實現類似,都得如下函數原型: type PriorityMapFunction func(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error)

func ImageLocalityPriorityMap(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error) {
	node := nodeInfo.Node()
	if node == nil {
		return schedulerapi.HostPriority{}, fmt.Errorf("node not found")
	}

	var sumSize int64
	for i := range pod.Spec.Containers {
		sumSize += checkContainerImageOnNode(node, &pod.Spec.Containers[i])
	}
	return schedulerapi.HostPriority{
		Host:  node.Name,
		Score: calculateScoreFromSize(sumSize),
	}, nil
}

func calculateScoreFromSize(sumSize int64) int {
	var score int
	switch {
	case sumSize == 0 || sumSize < minImgSize:
		// score == 0 means none of the images required by this pod are present on this
		// node or the total size of the images present is too small to be taken into further consideration.
		score = 0
	// If existing images' total size is larger than max, just make it highest priority.
	case sumSize >= maxImgSize:
		score = 10
	default:
		score = int((10 * (sumSize - minImgSize) / (maxImgSize - minImgSize)) + 1)
	}
	// Return which bucket the given size belongs to
	return score
}

其計算每個Node的Score算法為: score = int((10 * (sumSize - minImgSize) / (maxImgSize - minImgSize)) + 1)

其中: minImgSize int64 = 23 * mb, maxImgSize int64 = 1000 * mb, sumSize為Pod中定義的container Images' size 的總和

可見,Node上該Pod要求的容器鏡像大小之和越大,得分越高,越有可能是目標Node。

“Predicates Policies有什么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

峨眉山市| 岳阳市| 阿城市| 桐城市| 剑川县| 新蔡县| 嵊州市| 桦南县| 屏边| 冷水江市| 长汀县| 保定市| 九寨沟县| 梨树县| 广安市| 开化县| 丰原市| 松滋市| 乌兰县| 青州市| 班戈县| 化隆| 九龙县| 密云县| 介休市| 明光市| 临海市| 泰州市| 香河县| 沙河市| 奎屯市| 太白县| 靖安县| 牙克石市| 平山县| 集贤县| 府谷县| 临朐县| 开江县| 鸡东县| 江北区|