国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Kubelet源碼分析(四) diskSpaceManager

hlcfan / 732人閱讀

摘要:顧名思義就是管理磁盤空間的,實(shí)際它的實(shí)現(xiàn)較為簡(jiǎn)單,就是給所在的節(jié)點(diǎn)預(yù)留磁盤空間的,當(dāng)該節(jié)點(diǎn)磁盤空間低于該值時(shí),將拒絕的創(chuàng)建。其實(shí)就是中的接口該接口很簡(jiǎn)單,就是分別調(diào)用實(shí)現(xiàn)的兩個(gè)接口,然后判斷磁盤空間是否夠用。

源碼版本

kubernetes version: v1.3.0

簡(jiǎn)介

前一節(jié)介紹了Garbage Collection,涉及到的策略基本與磁盤資源有關(guān)。對(duì)于k8s集群如何高效的利用各種資源,也非常值得我們涉獵學(xué)習(xí)。管理好資源才能更好的創(chuàng)建服務(wù),所以這節(jié)繼續(xù)學(xué)習(xí)kubelet的diskSpaceManager。
diskSpaceManager顧名思義就是管理磁盤空間的,實(shí)際它的實(shí)現(xiàn)較為簡(jiǎn)單,就是給kubelet所在的節(jié)點(diǎn)預(yù)留磁盤空間的,當(dāng)該節(jié)點(diǎn)磁盤空間低于該值時(shí),將拒絕Pod的創(chuàng)建。

策略初始化

跟GC介紹的套路一樣,先從策略入手。
相關(guān)的結(jié)構(gòu)如下:

type DiskSpacePolicy struct {
    // free disk space threshold for filesystem holding docker images.
    DockerFreeDiskMB int
    // free disk space threshold for root filesystem. Host volumes are created on root fs.
    RootFreeDiskMB int
}

該結(jié)構(gòu)的出廠設(shè)置在cmd/kubelet/app/server.go中的UnsecuredKubeletConfig()接口進(jìn)行。

func UnsecuredKubeletConfig(s *options.KubeletServer) (*KubeletConfig, error) {
...
    diskSpacePolicy := kubelet.DiskSpacePolicy{
        DockerFreeDiskMB: int(s.LowDiskSpaceThresholdMB),
        RootFreeDiskMB:   int(s.LowDiskSpaceThresholdMB),
    }
...
}

賦值的KubeletServer的LowDiskSpaceThresholdMB參數(shù)的初始化在cmd/kubelet/app/options/options.go中的NewKubeletServer()接口中進(jìn)行:

func NewKubeletServer() *KubeletServer {
    return &KubeletServer{
        ...
        LowDiskSpaceThresholdMB:      256,
        ...
    }
}

diskSpaceManager保留磁盤空間的默認(rèn)值是256MB,當(dāng)然這個(gè)值我們也可以手動(dòng)修改,這些kubelet的手動(dòng)配置都是在cmd/kubelet/app/options/options.go中的AddFlags()接口:

func (s *KubeletServer) AddFlags(fs *pflag.FlagSet) {
...
    fs.Int32Var(&s.LowDiskSpaceThresholdMB, "low-diskspace-threshold-mb", s.LowDiskSpaceThresholdMB, "The absolute free disk space, in MB, to maintain. When disk space falls below this threshold, new pods would be rejected. Default: 256")
...

所以手動(dòng)的話,需要修改kubelet命令flags中的low-diskspace-threshold-mb。

diskSpaceManager初始化

先介紹diskSpaceManager:

type diskSpaceManager interface {
    // Checks the available disk space
    IsRootDiskSpaceAvailable() (bool, error)
    IsRuntimeDiskSpaceAvailable() (bool, error)
}

跟前一章的套路一樣,該diskSpaceManager是個(gè)interface。
具體的初始化需要查看pkg/kubelet/kubelet.go中的NewMainKubelet()接口。
調(diào)用流程: main -- app.Run -- UnsecuredKubeletConfig --> RunKubelet -- CreateAndInitKubelet -- NewMainKubelet
NewMainKubelet接口如下:

func NewMainKubelet(
    hostname string,
    nodeName string,
...
) (*Kubelet, error) {
...
    diskSpaceManager, err := newDiskSpaceManager(cadvisorInterface, diskSpacePolicy)
    if err != nil {
        return nil, fmt.Errorf("failed to initialize disk manager: %v", err)
    }
...
}

繼續(xù)查看newDiskSpaceManager()接口,該接口傳入了cadvisorInterface和diskSpacePolicy參數(shù),比較好理解這些參數(shù),因?yàn)榇疟P管理需要使用cAdvisor來獲取磁盤信息,而diskSpacePolicy就是上面介紹策略初始化的結(jié)構(gòu)。
該接口在pkg/kubelet/disk_manager.go中,繼續(xù)查看源碼:

func newDiskSpaceManager(cadvisorInterface cadvisor.Interface, policy DiskSpacePolicy) (diskSpaceManager, error) {
    // 檢查策略參數(shù)是否有效
    // 實(shí)際就是判斷下是否 < 0
    err := validatePolicy(policy)
    if err != nil {
        return nil, err
    }

    dm := &realDiskSpaceManager{
        cadvisor:   cadvisorInterface,
        policy:     policy,
        cachedInfo: map[string]fsInfo{},
    }

    return dm, nil
}

該接口的返回值是diskSpaceManager,而實(shí)際返回是realDiskSpaceManager結(jié)構(gòu)體。
所以所有diskSpaceManager的接口實(shí)現(xiàn)需要根據(jù)realDiskSpaceManager進(jìn)行查看。
realDiskSpaceManager結(jié)構(gòu)如下:

type realDiskSpaceManager struct {
    // 用于獲取磁盤相關(guān)信息
    cadvisor   cadvisor.Interface
    // 用于緩存文件系統(tǒng)信息
    cachedInfo map[string]fsInfo // cache of filesystem info.
    // 操作鎖
    lock       sync.Mutex        // protecting cachedInfo.
    // 磁盤管理策略
    policy     DiskSpacePolicy   // thresholds. Set at creation time.
}

查看下realDiskSpaceManager結(jié)構(gòu)實(shí)現(xiàn)的diskSpaceManager接口:

// 查看Runtime占用的磁盤空間是否夠用
func (dm *realDiskSpaceManager) IsRuntimeDiskSpaceAvailable() (bool, error) {
    return dm.isSpaceAvailable("runtime", dm.policy.DockerFreeDiskMB, dm.cadvisor.ImagesFsInfo)
}
// 查看根目錄的磁盤空間是否夠用
func (dm *realDiskSpaceManager) IsRootDiskSpaceAvailable() (bool, error) {
    return dm.isSpaceAvailable("root", dm.policy.RootFreeDiskMB, dm.cadvisor.RootFsInfo)
}

上面兩個(gè)方法最終都調(diào)用了dm.isSpaceAvailable(),該接口使用了3個(gè)參數(shù):

文件系統(tǒng)類型

磁盤保留空間大小,用于判斷是否有效

cAdvisor的接口,用于獲取RootFS和ImagesFs使用的磁盤情況

而該接口返回的是一個(gè)Bool值,true or false。
接口如下:

func (dm *realDiskSpaceManager) isSpaceAvailable(fsType string, threshold int, f func() (cadvisorapi.FsInfo, error)) (bool, error) {
    fsInfo, err := dm.getFsInfo(fsType, f)
    if err != nil {
        return true, fmt.Errorf("failed to get fs info for %q: %v", fsType, err)
    }
    // 有效值判斷
    if fsInfo.Capacity == 0 {
        return true, fmt.Errorf("could not determine capacity for %q fs. Info: %+v", fsType, fsInfo)
    }
    if fsInfo.Available < 0 {
        return true, fmt.Errorf("wrong available space for %q: %+v", fsType, fsInfo)
    }
    // 判斷該文件系統(tǒng)可用的磁盤空間是否小于最小預(yù)留空間
    if fsInfo.Available < int64(threshold)*mb {
        glog.Infof("Running out of space on disk for %q: available %d MB, threshold %d MB", fsType, fsInfo.Available/mb, threshold)
        return false, nil
    }
    return true, nil
}

繼續(xù)看dm.getFsInfo()接口:

func (dm *realDiskSpaceManager) getFsInfo(fsType string, f func() (cadvisorapi.FsInfo, error)) (fsInfo, error) {
    dm.lock.Lock()
    defer dm.lock.Unlock()
    // 先查看緩存中的文件系統(tǒng)信息
    // 需要比較該信息的時(shí)間有效性,為2s內(nèi)
    fsi := fsInfo{}
    if info, ok := dm.cachedInfo[fsType]; ok {
        timeLimit := time.Now().Add(-2 * time.Second)
        if info.Timestamp.After(timeLimit) {
            fsi = info
        }
    }
    // 2s之外的話,需要調(diào)用cAdvisor接口重新獲取磁盤信息
    if fsi.Timestamp.IsZero() {
        // 該f()接口作為參數(shù)傳入,不同的文件系統(tǒng)對(duì)應(yīng)不同的接口
        // runtime: dm.cadvisor.ImagesFsInfo
        // rootfs: dm.cadvisor.RootFsInfo
        fs, err := f()
        if err != nil {
            return fsInfo{}, err
        }
        fsi.Timestamp = time.Now()
        fsi.Usage = int64(fs.Usage)
        fsi.Capacity = int64(fs.Capacity)
        fsi.Available = int64(fs.Available)
        // 更新cache
        dm.cachedInfo[fsType] = fsi
    }
    return fsi, nil
}
diskSpaceManager實(shí)現(xiàn)

上面的初始化可以看到diskSpaceManager的兩個(gè)關(guān)鍵性接口IsRuntimeDiskSpaceAvailable()和IsRootDiskSpaceAvailable(),說簡(jiǎn)單點(diǎn)就是用于判斷對(duì)應(yīng)的磁盤空間是否還夠用。
該功能具體作用的地方,一下子找不到的話,我們可以通過搜索上面兩個(gè)接口來查看調(diào)用者。
其實(shí)就是pkg/kubelet/kubelet.go中的isOutOfDisk()接口:

// handleOutOfDisk detects if pods can"t fit due to lack of disk space.
func (kl *Kubelet) isOutOfDisk() bool {
    // Check disk space once globally and reject or accept all new pods.
    withinBounds, err := kl.diskSpaceManager.IsRuntimeDiskSpaceAvailable()
    // Assume enough space in case of errors.
    if err != nil {
        glog.Errorf("Failed to check if disk space is available for the runtime: %v", err)
    } else if !withinBounds {
        return true
    }

    withinBounds, err = kl.diskSpaceManager.IsRootDiskSpaceAvailable()
    // Assume enough space in case of errors.
    if err != nil {
        glog.Errorf("Failed to check if disk space is available on the root partition: %v", err)
    } else if !withinBounds {
        return true
    }
    return false
}

該接口很簡(jiǎn)單,就是分別調(diào)用diskSpaceManager實(shí)現(xiàn)的兩個(gè)接口,然后判斷磁盤空間是否夠用。
到這里我們可以猜想一下,最開始介紹該功能的時(shí)候已經(jīng)說了是用于預(yù)留磁盤空間,以此為條件來判斷Pods是否能成功創(chuàng)建。所以可以想到這個(gè)isOutOfDisk()肯定是作用于Pods創(chuàng)建的流程中,在創(chuàng)建之前判斷是否有條件可以創(chuàng)建。
具體的Pod管理流程內(nèi)容較多,后面新啟一篇文章進(jìn)行多帶帶介紹。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/32535.html

相關(guān)文章

  • Kubelet源碼分析(一):啟動(dòng)流程分析

    摘要:源碼版本簡(jiǎn)介在急群眾,在每個(gè)節(jié)點(diǎn)上都會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程。該進(jìn)程用于處理節(jié)點(diǎn)下發(fā)到本節(jié)點(diǎn)的任務(wù),管理及中的容器。每個(gè)進(jìn)程會(huì)在上注冊(cè)節(jié)點(diǎn)自身信息,定期向節(jié)點(diǎn)匯報(bào)節(jié)點(diǎn)資源的使用情況,并通過監(jiān)控容器和節(jié)點(diǎn)資源。最后運(yùn)行健康檢測(cè)服務(wù)。 源碼版本 kubernetes version: v1.3.0 簡(jiǎn)介 在Kubernetes急群眾,在每個(gè)Node節(jié)點(diǎn)上都會(huì)啟動(dòng)一個(gè)kubelet服務(wù)進(jìn)程。該進(jìn)程...

    mindwind 評(píng)論0 收藏0
  • Kubelet源碼分析(三):Garbage Collection

    摘要:源碼版本介紹在分析啟動(dòng)流程時(shí),老是會(huì)碰到各類,這里單獨(dú)提出來做下較詳細(xì)的分析。主要由兩部分組成使用指定的回收策略,刪除那些已經(jīng)結(jié)束的所有的生命周期管理就是通過來實(shí)現(xiàn)的,其實(shí)該也是依賴了。相關(guān)配置該值表示磁盤占用率達(dá)到該值后會(huì)觸發(fā)。 源碼版本 kubernetes version: v1.3.0 kubelet GC介紹 在分析kubelet啟動(dòng)流程時(shí),老是會(huì)碰到各類GC,這里單獨(dú)提出來...

    siberiawolf 評(píng)論0 收藏0
  • Kubelet無法訪問rancher-metadata問題分析

    摘要:引言能夠支持,可以快速幾乎無障礙的拉起一套環(huán)境,這對(duì)剛?cè)腴T的小白來說簡(jiǎn)直是一大利器。本文就分析一下關(guān)于無法訪問問題。檢查一下有問題的節(jié)點(diǎn)的系統(tǒng),果然會(huì)發(fā)現(xiàn)安裝了服務(wù)服務(wù)名為。 引言 Rancher能夠支持Kubernetes,可以快速幾乎無障礙的拉起一套K8s環(huán)境,這對(duì)剛?cè)腴TK8s的小白來說簡(jiǎn)直是一大利器。當(dāng)然由于系統(tǒng)特性五花八門,系統(tǒng)內(nèi)置軟件也相互影響,所以有時(shí)候伙伴們會(huì)碰到比較難纏...

    hiYoHoo 評(píng)論0 收藏0
  • Kubelet無法訪問rancher-metadata問題分析

    摘要:引言能夠支持,可以快速幾乎無障礙的拉起一套環(huán)境,這對(duì)剛?cè)腴T的小白來說簡(jiǎn)直是一大利器。本文就分析一下關(guān)于無法訪問問題。檢查一下有問題的節(jié)點(diǎn)的系統(tǒng),果然會(huì)發(fā)現(xiàn)安裝了服務(wù)服務(wù)名為。 引言 Rancher能夠支持Kubernetes,可以快速幾乎無障礙的拉起一套K8s環(huán)境,這對(duì)剛?cè)腴TK8s的小白來說簡(jiǎn)直是一大利器。當(dāng)然由于系統(tǒng)特性五花八門,系統(tǒng)內(nèi)置軟件也相互影響,所以有時(shí)候伙伴們會(huì)碰到比較難纏...

    bigdevil_s 評(píng)論0 收藏0
  • Kubelet源碼分析(二): DockerClient

    摘要:接口分析源碼目錄實(shí)現(xiàn)的接口如下可以看到結(jié)構(gòu)體實(shí)現(xiàn)了所有的接口。這些接口其實(shí)是對(duì)的操作接口進(jìn)行了封裝,下面取一個(gè)接口進(jìn)行分析該接口的關(guān)鍵就是調(diào)用了所以關(guān)鍵對(duì)象還是,繼續(xù)回到上面講初始化時(shí)介紹到的結(jié)構(gòu)體。 源碼版本 kubernetes version: v1.3.0 DockerClient初始化 DockerClient是KubeletConfig的成員之一。KubeletConfig...

    李世贊 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

hlcfan

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<