精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久亚洲AV成人无码国产野外| 色综合视频二区偷拍在线| 无码人妻精品一区二区三区夜夜嗨| 亚洲一区导航| 亚洲成人综合在线| 日日噜噜噜噜夜夜爽亚洲精品| 亚洲最大成人av| 伊人影院久久| 自拍偷拍亚洲欧美| 久久久高清视频| 日韩av电影资源网| 一区二区成人在线| 日韩色妇久久av| 丰满人妻一区二区三区四区53| 石原莉奈在线亚洲二区| 欧美成人自拍视频| 日韩精品电影一区二区| 一区二区三区四区视频免费观看| 色噜噜狠狠色综合欧洲selulu| 人人妻人人澡人人爽精品欧美一区| 日韩有码电影| 国产美女在线观看一区| 国产精品pans私拍| 成人免费区一区二区三区| 9191国语精品高清在线| 亚洲色图13p| 中文字幕在线永久| 五月亚洲婷婷| 91精品国产全国免费观看| 日韩 欧美 高清| 美女网站在线看| 亚洲一区二区三区在线播放| 宅男一区二区三区| 国产女主播在线写真| 日韩黄色片网站| 国产日本久久| 一本到不卡精品视频在线观看| 精品免费久久久久久久| 欧美日本高清| 国产目拍亚洲精品99久久精品| 国产欧美精品一区二区三区| 999国产精品视频免费| 麻豆精品视频在线| 日本一区二区三区在线播放| 日韩黄色a级片| 国精品一区二区| 精品久久久999| av在线播放中文字幕| 竹菊久久久久久久| 亚洲免费精彩视频| 91中文字幕永久在线| 欧美亚洲大陆| 亚洲精品动漫久久久久| 精品国产av色一区二区深夜久久| 成人性生交大片免费看96| 日韩丝袜情趣美女图片| a级大片免费看| 久久免费精品| 日韩欧美一二区| 亚洲欧美激情一区二区三区| 亚洲国产精品免费视频| 日韩精品一区二区三区视频 | 精品无人码麻豆乱码1区2区| 国产精品欧美风情| 中文无码精品一区二区三区| 免费在线观看日韩欧美| 国产欧美一区二区白浆黑人| 一区二区三区日| 国产精品一二三四| 国产伦精品一区二区三区免费视频| 日本wwwxxxx| 久久蜜桃av一区二区天堂| 欧美xxxx黑人又粗又长精品| 国产在线一在线二| 中文字幕日本不卡| 免费观看亚洲视频| 国产高清视频色在线www| 超级碰碰久久| 99re亚洲国产精品| 久久久久久99| 97超碰人人在线| 亚洲精品亚洲人成人网| 五十路熟女丰满大屁股| 成人av三级| 欧美日韩极品在线观看一区| 中文字幕55页| 欧美一级二级三级视频| 永久免费精品影视网站| 波多野结衣不卡视频| 亚洲激情av| 国产精品女人网站| 亚洲AV无码精品色毛片浪潮| 91麻豆swag| 三年中文高清在线观看第6集 | 亚洲欧美色一区| 每日在线观看av| 日韩一区精品| 欧美tk—视频vk| www久久久久久久| 欧美.日韩.国产.一区.二区| 欧洲亚洲妇女av| 国产丝袜视频在线观看| 久久久午夜电影| 国产又粗又长又爽视频| 欧美影视资讯| 精品久久久久久亚洲综合网| 色噜噜噜噜噜噜| 亚洲精品专区| 亚洲精品免费一区二区三区| 青青草娱乐在线| 一区二区三区日韩精品| 一区二区成人网| 国产精品欧美大片| 日韩在线视频观看| 在线精品免费视| 国产a区久久久| 亚洲综合第一| 电影网一区二区| 精品国产一区二区三区久久影院| 亚洲一级黄色录像| 一本色道久久综合一区 | 久久久伦理片| 欧美成人精品激情在线观看 | 九色|91porny| 精品乱码一区二区三区| 怡红院在线播放| 欧美日韩黄视频| 99久久久无码国产精品衣服| 99精品免费视频| 96久久精品| 精品国产99久久久久久| 欧美日韩在线综合| 久久久久久久久久久久久久久| aa国产精品| 国产成人免费观看| 在线免费观看a视频| 91精品国产麻豆国产自产在线 | 欧美777四色影| 国产综合香蕉五月婷在线| 国产精品久久久久一区二区国产| 狠狠色狠狠色综合日日五| 无码任你躁久久久久久老妇| 欧美一区高清| 亚洲一区二区久久久久久久| 黄色片网站在线| 欧美人妇做爰xxxⅹ性高电影| 免费黄色片网站| 日本亚洲三级在线| 亚洲蜜桃在线| 国产精品xxx| 色诱女教师一区二区三区| 国产99久久久久久免费看| 国产亚洲精品中文字幕| 午夜肉伦伦影院| 精品一区二区三| 国产精品美女无圣光视频| 91在线品视觉盛宴免费| 欧美日韩一区成人| 欧美黄色aaa| 国产成人精品一区二| 国产毛片久久久久久国产毛片| 天堂va在线高清一区| 国内精久久久久久久久久人| 天天操天天射天天舔| 色婷婷av一区| 人与动物性xxxx| 国产精品66部| 久久久999视频| 国内成人精品| 国产精品丝袜一区二区三区| 亚洲精品一区二区毛豆| 欧美18hd| 日韩精品专区在线影院观看 | 欧美性猛交xxxx久久久| 欧美黄色高清视频| 国产另类ts人妖一区二区| 免费人成自慰网站| 国产一区二区三区四区| 国产精品爽爽ⅴa在线观看| 成人影院在线看| 亚洲国模精品一区| 欧美在线视频精品| 亚洲免费大片在线观看| 日韩成人av一区二区| 日韩不卡一二三区| 国产免费xxx| 色老板在线视频一区二区| 国产精品久久久久免费a∨| 亚洲男同gay网站| 亚洲人成网站色ww在线| 国产强伦人妻毛片| 欧美香蕉大胸在线视频观看| 久久嫩草捆绑紧缚| 99久久久精品免费观看国产蜜| 精品视频无码一区二区三区| 欧美有码视频| 区一区二区三区中文字幕| 成人网av.com/| 日韩美女主播视频| 天使と恶魔の榨精在线播放| 国产一区二区免费| 丰满肥臀噗嗤啊x99av| 欧美性色黄大片| 国产午夜激情视频| 最新日韩av在线| 9.1成人看片免费版| 国产另类ts人妖一区二区| 青青青国产在线视频| 红桃视频亚洲| 一区二区三区的久久的视频| 婷婷综合成人| 成人动漫视频在线观看完整版| 日韩成人亚洲| 91成人天堂久久成人| 亚洲国产精品精华素| 主播福利视频一区| 精品成人一区二区三区免费视频| 日韩一卡二卡三卡四卡| 中文字幕 自拍偷拍| 欧美日韩精品二区| 日韩激情一区二区三区| 亚洲免费观看高清| 肉色超薄丝袜脚交69xx图片 | 无码毛片aaa在线| 中文字幕xxxx| 亚洲国产欧美在线人成| 日韩av手机在线免费观看| 久久精品人人爽人人爽| 精品国产av色一区二区深夜久久| 高潮精品一区videoshd| 久久综合在线观看| 久久aⅴ国产欧美74aaa| 在线观看免费污视频| 免费观看日韩电影| 五月天婷婷激情视频| 三级成人在线视频| 日本精品www| 模特精品在线| 免费日韩视频在线观看| 亚洲深夜av| 凹凸国产熟女精品视频| 国产一区白浆| 国产免费毛卡片| 麻豆精品网站| 牛夜精品久久久久久久| 日韩国产在线观看一区| 成人在线看视频| 久久这里只有| 欧美黄色性生活| 开心九九激情九九欧美日韩精美视频电影| 青青青国产在线视频| 蜜臀av性久久久久蜜臀aⅴ| 欧美精品第三页| 免费在线看一区| 国产成人美女视频| 国模无码大尺度一区二区三区| 手机av在线免费| 国产成人在线色| 影音先锋资源av| 久久影院电视剧免费观看| 麻豆av免费观看| 国产精品日韩精品欧美在线 | 亚洲欧美日韩在线| 全程偷拍露脸中年夫妇| 亚洲一区二区精品3399| 成人毛片18女人毛片| 色综合久久久久网| 中文字幕欧美在线观看| 91精品国产一区二区三区蜜臀| 精品人妻无码一区二区| 亚洲第一网站免费视频| 激情小视频在线| 色哟哟亚洲精品一区二区| 怡红院红怡院欧美aⅴ怡春院| 久久人人爽人人| 日韩久久一区二区三区| 国产欧美久久久久久| 91国内精品| 日本不卡一区二区三区在线观看| 999久久久91| 国产一线二线三线女| 免费在线成人| 欧美一级小视频| av网站一区二区三区| 日韩三级成人av网| a天堂中文在线观看| 日韩激情av在线播放| 中文字幕在线播放| 欧美疯狂做受xxxx高潮| 三上悠亚国产精品一区二区三区| 91日韩在线视频| 美日韩中文字幕| 91大学生片黄在线观看| 久久精品女人| 国产成人精品一区二区三区在线观看 | 欧美激情亚洲视频| 欧美gay囗交囗交| 114国产精品久久免费观看| 亚洲丝袜啪啪| 日韩久久久久久久久久久久| 日韩精品亚洲一区| 制服下的诱惑暮生| 欧美激情一区在线| 国产污视频在线看| 69精品人人人人| 国产三级视频在线| 97涩涩爰在线观看亚洲| 日韩午夜电影免费看| 91视频国产一区| 精品国产精品国产偷麻豆| 日本一区午夜艳熟免费| 捆绑变态av一区二区三区| 色噜噜在线观看| 亚洲图片一区二区| 国产毛片毛片毛片毛片毛片| 一区二区欧美亚洲| 天堂av中文在线观看| 成人欧美一区二区三区视频| 97精品在线| 国产熟人av一二三区| 91麻豆高清视频| 久久精品免费av| 日韩午夜电影在线观看| 女女色综合影院| 国产精品极品美女在线观看免费 | 亚洲一卡二卡三卡| 久久久久91| 香蕉视频黄色在线观看| 亚洲精品精品亚洲| 国产成人免费看一级大黄| 日韩一级黄色av| 性欧美video另类hd尤物| 日本不卡一区二区三区在线观看| 亚洲自拍另类| 少妇光屁股影院| 一本久久精品一区二区| 午夜福利视频一区二区| 97人人模人人爽人人喊中文字| 成人影院中文字幕| 日韩 欧美 视频| av成人老司机| 国产成人无码精品久久久久| 亚洲国产精品va在看黑人| 不卡av免费观看| 国精产品一区二区| 一本色道久久综合亚洲精品高清| 91玉足脚交白嫩脚丫| 欧美日韩在线免费| 欧美拍拍视频| 国产精品久久久久久久久免费| 一级片视频播放| 国产欧美一二三区| 国产女优在线播放| 日韩中文字幕国产| 中文字幕成人| 中文字幕色呦呦| av亚洲精华国产精华精| 亚洲天堂av片| 亚洲系列中文字幕| 欧美一区二区三区婷婷| 久久国产精品免费观看| 国产成人综合网站| 国产免费av一区二区| 亚洲视频精品在线| 欧美亚洲综合视频| 狠狠精品干练久久久无码中文字幕 | 日本老师69xxx| 欧美丝袜一区| 日韩av影视大全| 欧美日韩国产影院| 国产一级片在线| 成人淫片在线看| 极品裸体白嫩激情啪啪国产精品| 性久久久久久久久久| 欧美性生活一区| 免费污视频在线| 欧美日韩国产不卡在线看| 久久精品国产第一区二区三区| 国产av 一区二区三区| 国产视频在线一区二区| av成人在线看| 国产一二三在线视频| 亚洲国产高清不卡| 国产黄色高清视频| 国产成人福利网站| 小处雏高清一区二区三区| 国产情侣久久久久aⅴ免费| 一本大道久久a久久综合| 国产视频在线播放| 免费看成人午夜电影| 国产麻豆精品一区二区| 国产精品久免费的黄网站| 久久亚洲精品一区二区| 任你弄精品视频免费观看| 三级av免费观看| 欧美日韩激情网| 日本欧美电影在线观看| 日韩av高清在线播放| 成人中文字幕电影| 伊人网免费视频|