Contanerd 隨筆

容器是特殊的進(jìn)程,runc則是他們的直接管理工具,contanerd則是提供對(duì)runc的管理。contanerd通過(guò)shim(墊片代理)屏蔽底層runtime實(shí)現(xiàn)(如runc),管理本機(jī)所有的runc和他的容器進(jìn)程實(shí)例。一個(gè)容器進(jìn)程實(shí)例對(duì)應(yīng)一個(gè)task。

contanerd 可以完成鏡像下載unpack到容器啟動(dòng)的整個(gè)過(guò)程,并管理容器的整個(gè)生命周期。容器的元數(shù)據(jù)實(shí)際會(huì)存儲(chǔ)在boltdb(golang版本地kv db)中。contanerd完成容器的信息存儲(chǔ)和狀態(tài)存儲(chǔ),是容器的虛擬世界管理映射。

Container為容器的數(shù)據(jù)結(jié)構(gòu)標(biāo)識(shí),可被存儲(chǔ)在boltdb中,task是執(zhí)行容器的運(yùn)行時(shí)對(duì)象,相當(dāng)于類和對(duì)象的關(guān)系。task實(shí)際會(huì)調(diào)用綁定的runtime,Containerd默認(rèn)采用runc作為runtime,其他容器運(yùn)行時(shí)如(runtime)也可以通過(guò)對(duì)接shim接口來(lái)接入Containerd。

runc相當(dāng)于一個(gè)命令行工具通過(guò)命令將container啟動(dòng)起來(lái)就不管了,containerd則是一個(gè)守護(hù)進(jìn)程。

shim service負(fù)責(zé)直接和container接觸,代理其IO并接收退出信號(hào),提供統(tǒng)一運(yùn)行接口(啟動(dòng) 刪除 運(yùn)行),在shim service 之上會(huì)有一個(gè)統(tǒng)一管理進(jìn)程來(lái)對(duì)各個(gè)shim或者說(shuō)各個(gè)task實(shí)例進(jìn)行管理。

Shims實(shí)現(xiàn)了對(duì)bundle目錄的rootfs系統(tǒng)的掛載,卸載,containerd的文件系統(tǒng)是由snapshoter管理的,containerd 為不同文件系統(tǒng)提供管理如ext4 overlay, 每種不同的文件系統(tǒng)對(duì)應(yīng)各自的實(shí)現(xiàn)的Snapshotter, 用戶可以在配置文件中指定Snapshotter。

containerd 中的service 都是通過(guò)plugin加grpc方式組織管理,實(shí)際就是將service封裝成plugin形式,然后調(diào)用統(tǒng)一接口啟動(dòng)封裝成plugin的所有服務(wù)。

// shim 啟動(dòng)入口 v2 "github.com/containerd/containerd/runtime/v2/runc/v2"
// v2 是一個(gè)實(shí)際的runc runtime shim service 管理runc的生命周期,提供實(shí)際的api 如創(chuàng)建 container 在容器中啟動(dòng)進(jìn)程等 
func main() {
    shim.Run("io.containerd.runc.v2", v2.New)
}

// containerd/runtime/v2/shim/shim.go
// 初始化并啟動(dòng)shim server
func Run(id string, initFunc Init, opts ...BinaryOpts) {
    run(id, initFunc, config)
}

type Init func(context.Context, string, Publisher, func()) (Shim, error)

func run(id string, initFunc Init, config Config) error {
    service, err := initFunc(ctx, idFlag, publisher, cancel)
}
// containerd/client.go  Client為客戶調(diào)用containerd接口,為taskService,
// diffService等提供一個(gè)統(tǒng)一的接口,通過(guò)grpc方式來(lái)調(diào)用。
type Client struct {
    services
    connMu    sync.Mutex
    conn      *grpc.ClientConn
    runtime   string
    defaultns string
    platform  platforms.MatchComparer
    connector func() (*grpc.ClientConn, error)
}

// 創(chuàng)建client
client, err := containerd.New("/run/containerd/containerd.sock")
// 實(shí)際通過(guò)unix socket來(lái)連接后端的grpc服務(wù)
func DialAddress(address string) string {
    return fmt.Sprintf("unix://%s", address)
}
// 通過(guò)init.go initial進(jìn)程調(diào)用runc創(chuàng)建容器(調(diào)用runc cmd來(lái)實(shí)現(xiàn))
func NewContainer(ctx context.Context, platform stdio.Platform, r *task.CreateTaskRequest) (_ *Container, retErr error) {
    p, err := newInit(
        ctx,
        r.Bundle,
        filepath.Join(r.Bundle, "work"),
        ns,
        platform,
        config,
        &opts,
        rootfs,
    )
    p.Create(ctx, config)
}

func (p *Init) Create(ctx context.Context, r *CreateConfig) error {
    // runtime為*runc.Runc, 實(shí)際是調(diào)用runc命令創(chuàng)建container
    p.runtime.Create(ctx, r.ID, r.Bundle, opts)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們?yōu)槭裁词褂萌萜鳎?我們?yōu)槭裁词褂锰摂M機(jī)(云主機(jī))? 為什么使用物理機(jī)? 這一系列的問(wèn)題并沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)答案...
    永杰gg閱讀 486評(píng)論 0 1
  • https://edu.aliyun.com/course/1651 第一章 云原生課 1.1 云原生技術(shù)發(fā)展歷程...
    MichelleZm閱讀 1,889評(píng)論 0 0
  • containerd簡(jiǎn)介 Containerd是一個(gè)工業(yè)標(biāo)準(zhǔn)的容器運(yùn)行時(shí),重點(diǎn)是它簡(jiǎn)潔,健壯,便攜,在Linux和...
    流雨聲閱讀 6,454評(píng)論 0 6
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,477評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn),也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 7,612評(píng)論 0 4

友情鏈接更多精彩內(nèi)容