91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

K8S中Eviction Manager如何實現Pod驅逐

發布時間:2021-12-15 18:49:14 來源:億速云 閱讀:285 作者:柒染 欄目:云計算

今天就跟大家聊聊有關K8S中Eviction Manager如何實現Pod驅逐,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

為了保證Node節點的穩定性,當資源(memory/storage)出現緊缺時,kubelet會主動選擇驅逐一些Pods來釋放資源。實現該功能的組件是Eviction Manager。

當驅逐一個Pod時,kubelet會將pod內的所有containers都kill掉,并把pod的狀態設置為Failed。被kill掉的pod,可能被調度到其他node上。

可以人為定義Thresholds來告訴Kubelet在什么情況下驅逐pods。有兩種類型的thresholds:

Soft Eviction Thresholds - 到達閾值時,并不會馬上觸發驅逐操作,而是會等待一個用戶配置的grace period之后再觸發。

Hard Eviction Thresholds - 立刻Kill Pods。

實現

Eviction Manager相關的代碼在包/pkg/kubelet/eviction中,核心邏輯是managerImpl.synchronize方法。EvictionManager會在一個單獨的協程中周期性調用synchronize方法,實現驅逐。

synchronize方法主要包含以下幾個步驟:

1.初始化配置

func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, capacityProvider CapacityProvider) []*v1.Pod {

   // 1. 從配置中讀取所有Thresholds

   thresholds := m.config.Thresholds

   if len(thresholds) == 0 {

      return nil

   }

 

   ....

   // 2. 初始化rank funcs/reclaim funcs等

   if m.dedicatedImageFs == nil {

      hasImageFs, ok := diskInfoProvider.HasDedicatedImageFs()

      if ok != nil {

         return nil

      }

      m.dedicatedImageFs = &hasImageFs

      m.resourceToRankFunc = buildResourceToRankFunc(hasImageFs)

      m.resourceToNodeReclaimFuncs = buildResourceToNodeReclaimFuncs(m.imageGC, m.containerGC, hasImageFs)

   }

 

   // 3. 通過初始化傳入的func獲取Pods

   activePods := podFunc()

   // 4. 通過summary provider獲得當前資源使用情況

   observations, statsFunc, err := makeSignalObservations(m.summaryProvider, capacityProvider, activePods)

   ....

 

   // 5. 通過memcg加速內存占用通知,只在notifiersInitialized 為false時進入

   if m.config.KernelMemcgNotification && !m.notifiersInitialized {

      ....

      m.notifiersInitialized = true  // 初始化完成 

     err = startMemoryThresholdNotifier(m.config.Thresholds, observations, true, func(desc string) {

         // 回調函數,memcg的通知會立即觸發synchronize函數

        glog.Infof("hard memory eviction threshold crossed at %s", desc)

         m.synchronize(diskInfoProvider, podFunc, capacityProvider)

      })

      ....

   }

 

   ....

}

2.計算Thresholds

func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, capacityProvider CapacityProvider) []*v1.Pod {

    ....

    // 1. 根據配置的thresholds參數以及當前資源使用情況,計算出超出的thresholds

    thresholds = thresholdsMet(thresholds, observations, false)

 

    // 2. 合并上次計算的thresholds結果

    if len(m.thresholdsMet) > 0 {

        thresholdsNotYetResolved := thresholdsMet(m.thresholdsMet, observations, true)

        thresholds = mergeThresholds(thresholds, thresholdsNotYetResolved)

    }

 

    // 3. 過濾未真正激活的soft thresholds

    now := m.clock.Now()

    thresholdsFirstObservedAt := thresholdsFirstObservedAt(thresholds, m.thresholdsFirstObservedAt, now)

    ....

    thresholds = thresholdsMetGracePeriod(thresholdsFirstObservedAt, now)

  

    // 4. 更新計算結果

    m.Lock()

    m.nodeConditions = nodeConditions

    m.thresholdsFirstObservedAt = thresholdsFirstObservedAt

    m.nodeConditionsLastObservedAt = nodeConditionsLastObservedAt

    m.thresholdsMet = thresholds

 

    // determine the set of thresholds whose stats have been updated since the last sync

    thresholds = thresholdsUpdatedStats(thresholds, observations, m.lastObservations)

    debugLogThresholdsWithObservation("thresholds - updated stats", thresholds, observations)

 

    m.lastObservations = observations

    m.Unlock()

 

   ...

}

3.計算本輪Eviction考察的Resource

在每一輪Eviction中,kubelet至多只會kill一個Pod。由于Eviction Manager會同時處理多種資源(memory/storage)的緊缺情況,因此在選擇Pod之前,首先會選出本輪Eviction參考的資源類型,再將Pods對該種資源的使用量進行排序,選出kill掉的Pod。

func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, capacityProvider CapacityProvider) []*v1.Pod {

    ....

    // 1. 收集當前所有發生緊缺的resource類型

    starvedResources := getStarvedResources(thresholds)

    if len(starvedResources) == 0 {

        glog.V(3).Infof("eviction manager: no resources are starved")

        return nil

    }

 

    // 2. 排序并選擇其中一種resource

    sort.Sort(byEvictionPriority(starvedResources))

    resourceToReclaim := starvedResources[0]

 

    // determine if this is a soft or hard eviction associated with the resource

    softEviction := isSoftEvictionThresholds(thresholds, resourceToReclaim)

    .....

 

    // 3. 根據選中Resource的使用量來排序Pods

    rank, ok := m.resourceToRankFunc[resourceToReclaim]

    ....

    rank(activePods, statsFunc)

 

    ....

}

4. Kill Pod

在排好序的Pods中選擇第一個Kill掉:

func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, capacityProvider CapacityProvider) []*v1.Pod {

    ....

    for i := range activePods {

        pod := activePods[i]

        ...

        status := v1.PodStatus{

            Phase:   v1.PodFailed,

            Message: fmt.Sprintf(message, resourceToReclaim),

            Reason:  reason,

        }

        ....

        gracePeriodOverride := int64(0)

        if softEviction {

            gracePeriodOverride = m.config.MaxPodGracePeriodSeconds

        }

        // 真正KillPod

        err := m.killPodFunc(pod, status, &gracePeriodOverride)

        if err != nil {

            glog.Warningf("eviction manager: error while evicting pod %s: %v", format.Pod(pod), err)

        }

        return []*v1.Pod{pod}

    }

    glog.Infof("eviction manager: unable to evict any pods from the node")

    return nil

}

看完上述內容,你們對K8S中Eviction Manager如何實現Pod驅逐有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

AI

彭山县| 双鸭山市| 潜江市| 扎赉特旗| 五莲县| 陆良县| 郧西县| 丰顺县| 广东省| 丹凤县| 德阳市| 辽阳县| 河间市| 鹤峰县| 旌德县| 湛江市| 乃东县| 荔波县| 湄潭县| 江孜县| 社旗县| 清远市| 梅河口市| 岗巴县| 丽水市| 耒阳市| 武川县| 河曲县| 明水县| 正阳县| 惠安县| 老河口市| 韶山市| 资兴市| 长丰县| 安庆市| 介休市| 元江| 宜兰市| 安多县| 兴山县|