亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

合水县| 电白县| 通河县| 施甸县| 麻阳| 张掖市| 岗巴县| 泸定县| 永嘉县| 新营市| 商水县| 宽城| 扎赉特旗| 庆阳市| 成安县| 宿迁市| 营山县| 中西区| 青阳县| 浦江县| 永顺县| 周宁县| 桦南县| 巢湖市| 望奎县| 榆树市| 沽源县| 日喀则市| 曲靖市| 达拉特旗| 交口县| 江城| 子洲县| 蓝山县| 深泽县| 隆德县| 盐源县| 望奎县| 申扎县| 铜陵市| 大英县|