精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

容器中的 Shim 到底是個什么鬼?

云計算 云原生
Kubernetes 1.20 版開始廢除了對 dockershim 的支持,改用 Containerd[1] 作為默認的容器運行時。本文將介紹 Containerd 中的 "shim" 接口。

本文轉載自微信公眾號「云原生實驗室」,作者Brian Goff。轉載本文請聯系云原生實驗室公眾號。

Kubernetes 1.20 版開始廢除了對 dockershim 的支持,改用 Containerd[1] 作為默認的容器運行時。本文將介紹 Containerd 中的 "shim" 接口。

每一個 Containerd 或 Docker 容器都有一個相應的 "shim" 守護進程,這個守護進程會提供一個 API,Containerd 使用該 API 來管理容器基本的生命周期(啟動/停止),在容器中執行新的進程、調整 TTY 的大小以及與特定平臺相關的其他操作。shim 還有一個作用是向 Containerd 報告容器的退出狀態,在容器退出狀態被 Containerd 收集之前,shim 會一直存在。這一點和僵尸進程很像,僵尸進程在被父進程回收之前會一直存在,只不過僵尸進程不會占用資源,而 shim 會占用資源。

shim 將 Containerd 進程從容器的生命周期中分離出來,具體的做法是 runc 在創建和運行容器之后退出,并將 shim 作為容器的父進程,即使 Containerd 進程掛掉或者重啟,也不會對容器造成任何影響。這樣做的好處很明顯,你可以高枕無憂地升級或者重啟 Containerd,不會對運行中的容器產生任何影響。Docker 的 --live-restore[2] 特征也實現了類似的功能。

Containerd 支持哪些 shim?

Containerd 目前官方支持的 shim 清單:

io.containerd.runtime.v1.linux

io.containerd.runtime.v1.linux 是最原始的 shim API 和實現的 v1 版本,在 Containerd 1.0 之前被設計出來。該 shim 使用 runc 來執行容器,并且只支持 cgroup v1。目前 v1 版 shim API 已被廢棄,并將于 Containerd 2.0 被刪除。

io.containerd.runc.v1

io.containerd.runc.v1 與 io.containerd.runtime.v1.linux 的實現類似,唯一的區別是它使用了 v2 版本 shim API。該 shim 仍然只支持 cgroup v1。

io.containerd.runc.v2

該 shim 與 v1 采用了完全不同的實現,并且使用了 v2 版本 shim API,同時支持 cgroup v1 和 v2。該 shim 進程以運行多個容器,用于 Kubernetes 的 CRI 實現,可以在一個 Pod 中運行多個容器。

io.containerd.runhcs.v1

這是 Windows 平臺的 shim,使用 Window 的HCSv2 API 來管理容器。

當然,除了官方正式支持的 shim 之外,任何人都可以編寫自己的 shim,并讓 Containerd 調用該 shim。Containerd 在調用時會將 shim 的名稱解析為二進制文件,并在 $PATH 中查找這個二進制文件。例如 io.containerd.runc.v2 會被解析成二進制文件 containerd-shim-runc-v2,io.containerd.runhcs.v1 會被解析成二進制文件 containerd-shim-runhcs-v1.exe。客戶端在創建容器時可以指定使用哪個 shim,如果不指定就使用默認的 shim。

下面是一個示例,用來指定將要使用的 shim:

package main

import (
"context"

"github.com/containerd/containerd"
"github.com/containerd/containerd/namespaces"
"github.com/containerd/containerd/oci"
v1opts "github.com/containerd/containerd/pkg/runtimeoptions/v1"
)

func main() {
ctx := namespaces.WithNamespace(context.TODO(), "default")

// Create containerd client
client, err := containerd.New("/run/containerd/containerd.sock")
if err != nil {
panic(err)
}

// Get the image ref to create the container for
img, err := client.GetImage(ctx, "docker.io/library/busybox:latest")
if err != nil {
panic(err)
}

// set options we will pass to the shim (not really setting anything here, but we could)
var opts v1opts.Options

// Create a container object in containerd
cntr, err := client.NewContainer(ctx, "myContainer",
// All the basic things needed to create the container
containerd.WithSnapshotter("overlayfs"),
containerd.WithNewSnapshot("myContainer-snapshot", img),
containerd.WithImage(img),
containerd.WithNewSpec(oci.WithImageConfig(img)),

// Set the option for the shim we want
containerd.WithRuntime("io.containerd.runc.v1", &opts),
)
if err != nil {
panic(err)
}

// cleanup
cntr.Delete(ctx)
}

??注意:WithRuntime 將 interface{} 作為第二個參數,可以傳遞任何類型給 shim。只要確保你的 shim 能夠識別這個類型的數據,并在 typeurl 包中注冊這個類型,以便它能被正確編碼。

每個 shim 都有自己支持的一組配置選項,可以單獨針對每個容器進行配置。例如 io.containerd.runc.v2 可以將容器的 stdout/stderr 轉發到一個單獨的進程,為 shim 的運行設置自定義的 cgroup 等等。你可以創建自定義的 shim,在容器運行時添加自定義的選項。總的來說,shim 的 API 包含了 RPC 和一些二進制調用用于創建/刪除 shim,以及到 Containerd 進程的反向通道。

如果你想實現自己的 shim,下面是相關參考資料:

  • (v2) shim RPC API 的詳細定義[3]
  • 實現 shim 二進制和RPC API的輔助工具[4]
  • shim 的使用方式[5]

你只需要實現一個接口,shim.Run 會處理剩下的事情。shim 需要重點關注的是內存使用,因為每個容器都有一個 shim 進程,隨著容器數量的增加,shim 的內存使用會急劇上升。shim 的 API 是在 protobuf 中定義的,看起來有點像 gRPC 的 API,但實際上 shim 使用的是一個叫做 ttrpc[6] 的自定義協議,與 gRPC 并不兼容。ttrpc 是一個原 RPC 協議,專為降低內存使用而設計。

創建容器的 RPC 調用流程

Containerd 中有一個 container 對象,當你創建一個 container 對象,只是創建了一些與容器相關的數據,并將這些數據存儲到本地數據庫中,并不會在系統中啟動任何容器。container 對象創建成功后,客戶端會從 container 對象中創建一個 task,接下來是調用 shim API。

以下是 RPC 調用的總體流程:

  • 客戶端調用 container.NewTask(…),containerd 根據指定或默認的運行時名稱解析 shim 二進制文件,例如:io.containerd.runc.v2 -> containerd-shim-runc-v2。
  • containerd 通過 start 命令啟動 shim 二進制文件,并加上一些額外的參數,用于定義命名空間、OCI bundle 路徑、調試模式、返回給 containerd 的 unix socket 路徑等。在這一步調用中,當前工作目錄設置為 shim 的工作路徑。
  • 此時,新創建的 shim 進程會向 stdout 寫一個連接字符串,以允許 containerd 連接到 shim ,進行 API 調用。一旦連接字符串初始化完成,shim 開始監聽之后,start 命令就會返回。
  • containerd 使用 shim start 命令返回的連接字符串,打開一個與 shim API 的連接。
  • containerd 使用 OCI bundle 路徑和其他選項,調用 Create shim RPC。這一步會創建所有必要的 沙箱,并返回沙箱進程的 pid。以 runc 為例,我們使用 runc create --pid-file= 命令創建容器,runc 會分叉出一個新進程(runc init)用來設置沙箱,然后等待調用 runc start,所有這些都準備好后,runc create 命令就會返回結果。在 runc create 返回結果之前,runc 會將 runc-init 進程的 pid 寫入定義的 pid 文件中,客戶端可以使用這個 pid 來做一些操作,比如在沙箱中設置網絡(網絡命名空間可以在 /proc//ns/net 中設置)。
  • create 調用還會提供一個掛載列表以構建 rootfs,還包含 checkpoint 信息。
  • 下一步客戶端調用 task.Wait,觸發 containerd 調用 shim Wait API。這是一個持久化的請求,只有在容器退出后才會返回。到這一步仍然不會啟動容器。
  • 客戶端繼續調用 task.Start,觸發 containerd 調用 Start shim RPC。這一步才會真正啟動容器,并返回容器進程的 pid。
  • 這一步,客戶端就可以針對 task 進行一些額外的調用請求。例如,如果 task 包含 TTY,會請求task.ResizePTY,或者請求 task.Kill 來發送一個信號等等。
  • task.Exec 比較特殊,它會調用 shim Exec RPC,但并沒有在容器中執行某個進程,只是在 shim 中注冊了 exec,后面會使用 exec ID 來調用 shim Start RPC。
  • 在容器或 exec 進程退出后,containerd 將會調用 shim Delete RPC,清理 exec 進程或容器的所有資源。例如,對于runc shim, 這一步會調用 runc delete。
  • containerd 調用 Shutdown RPC,此時 shim 將會退出。

shim 的另一個重要部分是將容器的生命周期事件返回給 containerd ,包括:TaskCreateTaskStart TaskDelete TaskExit,TaskOOM, TaskExecAdded, TaskExecStarted,TaskPaused, TaskResumed,TaskCheckpointed。可參考 task 的詳細定義[7]。

總結

Containerd 通過 shim 為底層的容器運行時提供了可插拔能力。雖然這不是使用 Containerd 管理容器的唯一手段,但目前內置的 TaskService 使用了該方式,Kubernetes 通過調用 CRI 來創建 Pod 也是使用的 shim。由此可見 shim 這種方式很受歡迎,它不但增強了 Containerd 的擴展能力,以支持更多平臺和基于虛擬機的運行時(firecracker[8],kata[9]),而且允許嘗試其他 shim 實現(systemd[10])。

引用鏈接

[1]Containerd: https://containerd.io/

[2]--live-restore: https://docs.docker.com/config/containers/live-restore/

[3](v2) shim RPC API 的詳細定義: https://github.com/containerd/containerd/blob/v1.5.8/runtime/v2/task/shim.proto

[4]實現 shim 二進制和RPC API的輔助工具: https://github.com/containerd/containerd/blob/89370122089d9cba9875f468db525f03eaf61e96/runtime/v2/shim/shim.go#L181-L194

[5]shim 的使用方式: https://github.com/containerd/containerd/blob/v1.5.8/cmd/containerd-shim-runc-v2/main.go

[6]ttrpc: https://github.com/containerd/ttrpc

[7]task 的詳細定義: https://github.com/containerd/containerd/blob/v1.5.6/api/events/task.proto

[8]firecracker: https://github.com/firecracker-microvm/firecracker-containerd/tree/main/runtime

[9]kata: https://github.com/kata-containers/kata-containers/tree/2.3.0/src/runtime

[10]systemd: https://github.com/cpuguy83/containerd-shim-systemd-v1

責任編輯:武曉燕 來源: 云原生實驗室
相關推薦

2020-10-25 20:05:29

Pythonyield開發

2021-03-06 09:18:51

JS閉包函數

2020-09-27 06:53:57

MavenCDNwrapper

2019-10-30 10:13:15

區塊鏈技術支付寶

2024-09-11 13:58:18

2023-09-21 07:24:52

2022-02-22 13:20:57

RSA算法加密

2012-02-13 15:50:59

2021-01-29 12:24:22

電腦電子計算機

2022-04-10 19:26:07

TypeScript類型語法

2022-01-10 11:16:40

漏洞 Log4j2Jndi

2021-03-22 07:45:05

Sentinel微服務開源的項目

2021-02-18 07:43:25

TCP協議網絡

2018-09-06 11:20:24

CDNDDoS網站

2024-07-12 15:08:23

Python@wraps函數

2024-08-26 14:23:56

2015-05-21 15:45:13

2016-10-21 09:58:19

WindowsKMSOEM系統

2024-07-03 12:04:42

C++this?

2025-10-29 07:33:13

點贊
收藏

51CTO技術棧公眾號

亚洲精品高清无码视频| 国产综合动作在线观看| 久久国产高清视频| 99a精品视频在线观看| 精品女同一区二区三区在线播放| 日韩.欧美.亚洲| 精品人妻一区二区三区三区四区| 夜夜精品视频| 久久久99免费视频| 欧美做受喷浆在线观看| 日韩精品一级毛片在线播放| 亚洲电影在线播放| 亚洲欧洲日韩精品| 噜噜噜久久,亚洲精品国产品| 久久精品卡一| 欧美放荡办公室videos4k| 国产aⅴ激情无码久久久无码| 精品视频一区二区三区在线观看| 欧美丝袜美女中出在线| 无码人妻aⅴ一区二区三区日本| 神马午夜在线观看| 精品一区二区精品| 国产成人拍精品视频午夜网站 | 中文字幕av在线免费观看| 综合激情在线| 色哟哟网站入口亚洲精品| 国产性生活毛片| 另类视频一区二区三区| 色av成人天堂桃色av| 超碰成人免费在线| 成人影院在线观看| 中文字幕二三区不卡| 久久精品99久久| 亚洲精品字幕在线观看| 久久成人麻豆午夜电影| 国产精品免费在线免费| 亚洲影院在线播放| 国产欧美短视频| 久久久亚洲精选| 欧美黑人一级片| 一本到12不卡视频在线dvd| 国产性猛交xxxx免费看久久| 一卡二卡三卡四卡| 秋霞综合在线视频| 欧美精品一区二区三区高清aⅴ | 中文字幕欧美日韩一区| 精品亚洲一区二区三区四区五区高| 亚洲va欧美va| 国产河南妇女毛片精品久久久| 国产又爽又黄的激情精品视频| 波多野结衣 久久| 久久av在线| 青草热久免费精品视频| 丰满人妻老熟妇伦人精品| 亚洲伦理一区| 57pao精品| 亚洲午夜18毛片在线看| 亚洲一区二区免费看| 7m精品福利视频导航| 毛片视频网站在线观看| 亚洲深夜激情| 国产va免费精品高清在线观看| 国产三级av片| 日韩精品欧美精品| 国产精品美女主播| 一级黄色免费片| 国产精品99久久久久久似苏梦涵| 91九色视频在线观看| 亚洲AV无码国产精品午夜字幕| 丁香天五香天堂综合| 波多野结衣精品久久| 五月激情婷婷综合| 久久亚洲综合色一区二区三区| 欧美性xxxx69| 黄色动漫在线| 亚洲第一搞黄网站| 国产成人无码一二三区视频| 99精品国自产在线| 56国语精品自产拍在线观看| 激情小说欧美色图| 丝袜美腿综合| 最新69国产成人精品视频免费| 国产精品视频一区二区三 | 国产女主播视频一区二区| 一本久道久久综合| 欧美24videosex性欧美| 精品久久久久久| 三级在线视频观看| 91成人午夜| 亚洲色图av在线| 日本一二三区在线观看| 亚洲国产导航| 91精品久久久久久综合乱菊 | 国产成人无码av| 另类的小说在线视频另类成人小视频在线| 91免费国产网站| 五十路在线视频| 一色屋精品亚洲香蕉网站| 久久久久久免费看| 国产亚洲欧美日韩精品一区二区三区 | xfplay精品久久| 一本久久a久久精品vr综合| 免费在线观看av电影| 日本黄色一区二区| 超碰人人cao| 国产99久久久国产精品成人免费| 色999日韩欧美国产| 日韩精品成人一区| 精久久久久久久久久久| 久久涩涩网站| 色av手机在线| 欧美日韩一卡二卡三卡| 亚洲国产综合视频| 欧美日韩久久| 国产精品爽爽爽| 亚洲 国产 欧美 日韩| 亚洲天堂久久久久久久| 成年人在线看片| 国产精品毛片久久久| 久久亚洲私人国产精品va| av网站中文字幕| 懂色av一区二区在线播放| 亚洲精品一品区二品区三品区| 韩国精品一区| 欧美tk丨vk视频| 国产大学生自拍| 久久99最新地址| 五月天丁香综合久久国产| 老牛影视精品| 亚洲二区在线播放视频| 欧美成人黄色网| 国内成人自拍视频| 一区一区视频| 国产69精品久久| 亚洲天堂成人在线| 国产一级一级国产| 99精品久久免费看蜜臀剧情介绍| 国产又粗又长又爽视频| 亚洲综合视频| 日日骚久久av| 亚洲一区二区三区网站| 国产日韩欧美精品一区| 人妻少妇被粗大爽9797pw| 精品素人av| 96精品视频在线| 亚洲av成人精品一区二区三区在线播放 | 最新中文字幕一区| 91在线视频播放| 一女被多男玩喷潮视频| 日韩高清三区| 日本欧美中文字幕| 国模精品一区二区| 在线免费观看视频一区| 亚洲一二三精品| 免费黄网站欧美| 夜夜爽www精品| 激情综合五月| 久久久久久久久综合| 人妻一区二区三区免费| 欧美性猛交xxxx富婆弯腰| 大黑人交xxx极品hd| 日韩精品一二区| 不卡中文字幕在线| 精品一区二区三区中文字幕视频 | www.成人影院| 国产亚洲精品va在线观看| 在线观看毛片av| 亚洲欧美一区二区久久| 亚洲精品无码一区二区| 国产精品久久777777毛茸茸| 五月天色一区| 玖玖玖视频精品| 97成人超碰免| 国产中文字幕在线观看| 4438成人网| 欧美亚洲天堂网| 国产日韩欧美制服另类| 亚洲黄色片免费| 亚洲激情亚洲| 日韩精品欧美专区| 日日夜夜精品视频| 日本亚洲欧洲色| 99福利在线| 日韩精品在线观看视频| 亚洲最大成人av| 亚洲国产一区二区视频| 国产精品高清无码在线观看| 国产综合久久久久久鬼色| 欧美一级视频免费看| 少妇一区二区视频| 999视频在线免费观看| 在线看片福利| 免费91麻豆精品国产自产在线观看| 婷婷开心激情网| 欧美精品自拍偷拍| 免费日韩一级片| 亚洲欧美一区二区三区国产精品 | 蜜桃av噜噜一区二区三区麻豆| 色婷婷久久久久swag精品 | 欧美bbbbb性bbbbb视频| 久久精品理论片| 日韩少妇内射免费播放18禁裸乳| 91九色精品| 欧美婷婷久久| 激情视频极品美女日韩| 成人在线国产精品| 日韩电影av| 性欧美亚洲xxxx乳在线观看| 欧美18hd| 亚洲午夜久久久影院| 国产小视频一区| 91精品午夜视频| 波多野结衣一区二区在线 | 免费在线a视频| 午夜视频精品| 一区二区视频国产| 一区二区三区四区在线看| 国产精品久久久久久久天堂第1集| a成人v在线| 国产精品91一区| 中文av在线全新| 97色在线视频观看| 欧美人与性动交α欧美精品济南到 | 日本aa在线| 精品国产一区二区三区久久久 | 国产xxxx在线观看| 欧美亚洲动漫精品| 美女又爽又黄免费视频| 亚洲高清免费在线| 久热精品在线观看| 亚洲精品国产精品乱码不99 | sese一区| 国产一区二区三区视频 | xxx成人少妇69| 超碰免费97在线观看| 精品亚洲aⅴ在线观看| 色婷婷中文字幕| 欧美成人vps| 成人av免费播放| 日韩美女天天操| 精品人妻一区二区三区含羞草| 欧美军同video69gay| 国产精品亚洲欧美在线播放| 欧美日韩国产免费一区二区 | 成人激情综合| 国产经典一区二区| 日韩中文在线播放| 国产精品成熟老女人| 国产超碰精品| 国产精品视频中文字幕91| 91在线成人| 成人久久18免费网站图片| 亚洲我射av| 成人av中文| 欧美精品中文| 日本成人黄色免费看| 欧美色女视频| 咪咪色在线视频| 欧美不卡在线| 国产精品一线二线三线| 国产日韩一区| 亚洲精品一二三四五区| 久久se这里有精品| 国产老头和老头xxxx×| av在线播放成人| 自拍偷拍亚洲天堂| 国产精品毛片久久久久久久| 三级在线观看免费大全| 亚洲国产成人高清精品| 日本特级黄色片| 欧美日韩精品高清| 国产999久久久| 日韩不卡中文字幕| av在线电影免费观看| 欧美精品一本久久男人的天堂| 国产网红在线观看| 国产精品第一第二| 日韩三级av高清片| 欧美一级片免费观看| 亚洲精品网址| 精品少妇一区二区三区在线| 美腿丝袜亚洲综合| 韩国一区二区三区四区| 久久久www成人免费无遮挡大片| 91av手机在线| 精品色蜜蜜精品视频在线观看| 国产精品成人久久久| 日韩欧美国产成人一区二区| 飘雪影院手机免费高清版在线观看| 中国china体内裑精亚洲片| 欧美xxxx性xxxxx高清| 国产成人亚洲综合91精品| 国产精品视频一区视频二区| 玖玖玖精品中文字幕| 国产高清欧美| 能在线观看的av| 国产成人在线视频网址| 中文字幕黄色网址| 亚洲成人1区2区| 国产精品久久久久久免费播放| 日韩精品免费在线视频观看| 国产91在线视频蝌蚪| 日本成熟性欧美| 成人涩涩网站| 91制片厂免费观看| 日韩在线一区二区| 性高潮免费视频| 亚洲欧洲一区二区在线播放| 九九热精品视频在线| 欧美一区二区精品在线| 触手亚洲一区二区三区| 69**夜色精品国产69乱| 国产一区二区三区黄网站| 日韩精品欧美专区| 午夜亚洲精品| 先锋资源av在线| 亚洲激情网站免费观看| 亚洲天堂网视频| 亚洲人午夜精品免费| 91丝袜在线| 波多野结衣久草一区| 亚洲一区色图| 亚洲xxxx2d动漫1| 久久这里只有精品视频网| 日本熟妇毛茸茸丰满| 日韩欧美久久一区| 国产精品剧情| 国产在线久久久| 日韩电影一区| 999在线观看| 国产精品美女久久久久久久久久久| 午夜婷婷在线观看| 日韩va亚洲va欧洲va国产| 24小时免费看片在线观看 | 国产成人一区二区三区影院| 国自产拍偷拍精品啪啪一区二区| 国产成人午夜片在线观看高清观看| 国产麻豆视频在线观看| 欧美猛男超大videosgay| 69久久久久| 国产伦精品一区二区三区精品视频| 欧美一二区在线观看| 天天操天天爱天天爽| 中文字幕av免费专区久久| 做爰无遮挡三级| 永久免费看mv网站入口亚洲| 成人h在线观看| 亚洲精品国产系列| 国内久久精品视频| 成年人av电影| 精品福利二区三区| 日本不良网站在线观看| 欧美国产综合视频| 日韩成人一区二区| 免费看一级黄色| 4438x成人网最大色成网站| 色婷婷av在线| 国产精品国产一区二区| 一区二区动漫| 人妻视频一区二区| 欧美剧情电影在线观看完整版免费励志电影| 毛片在线看片| 粉嫩av免费一区二区三区| 一本久道综合久久精品| 日本xxxx裸体xxxx| 91福利在线免费观看| 欧美18一19xxx性| 国产精华一区二区三区| 香蕉久久夜色精品国产| 亚洲色图欧美色| 日韩久久久久久| 无码小电影在线观看网站免费| 亚洲v国产v在线观看| 国产一区二区三区在线观看精品 | 亚洲一区二区四区| 国产九九视频一区二区三区| 国产一国产二国产三| 亚洲精品视频在线播放| 日本一区二区三区中文字幕| 91大学生片黄在线观看| 96av麻豆蜜桃一区二区| 五月天中文字幕| 欧美激情亚洲精品| 欧美男gay| 欧美69精品久久久久久不卡| 色综合色综合色综合色综合色综合| 9191在线| 国产欧美日韩综合一区在线观看 | 在线观看一区二区三区视频| 精品国产精品自拍| 亚洲1卡2卡3卡4卡乱码精品| 国产经典一区二区三区| 蜜臀av一区二区三区| 国产精久久久久久| 最近2019中文字幕第三页视频| 哺乳挤奶一区二区三区免费看 | 伦av综合一区| 精品中文字幕乱| 日本电影一区二区| 亚洲国产精品无码久久久久高潮|