KIND 使用 CRI-O 作為預設容器 Runtime
KIND 使用 Containerd 作為預設容器 Runtime,但如果有些需求想要換成 CRI-O 呢?
今天來記錄一下,如何自己編譯出 CRI-O 的 KIND node image 吧!
工商時間:KCD Taipei 2025
Kubernetes Community Day (KCD) 是由雲端原生計算基金會 (CNCF) 支持與認證的官方社群組織活動,此會議集結來自開源和雲端原生社群的使用者及技術人員,以進行教育、協作和分享。
KCD Taipei 2025 即將在 7/5 於臺灣科技大學國際大樓舉辦,是臺灣最大的 CNCF 官方活動,目前正在徵稿和開放 RSVP,趕快去官網了解更多資訊吧!
前言
前陣子在 CNTUG 2024/10 Meetup #62 準備 Kubernetes v1.31 簡單雜談,有個功能是 ImageVolume
,可以用 OCI 當作 Volume 掛載到容器中,但快樂地用 KIND 打開該 Feature Gate 後…?
錯誤訊息如下:Failed to pull image "quay.io/crio/artifact:v1": failed to pull and unpack image "quay.io/crio/artifact:v1": number of layers and diffIDs don't match: 1 != 0
居然不能用?腦中冒出無限問號之時,回去仔細看 Kubernetes Blog 發現:
原來 CRI-O 的版本要 v1.31 以上,那 Containerd 呢?
雖然現在已經進 main 分支,但去年 10 月準備時還沒有相關實作。那只能先想辦法弄出 CRI-O 的 Kubernetes cluster 呢!可是又覺得 Kubespray 自己裝 VM 好麻煩…
那就來自己準備 CRI-O 的 KIND node image 吧!
環境設定
- MacBook Pro 16” 2023 (M2 Max)
- Host OS: macOS Sequoia 15.3.2
- OrbStack 1.10.3
- KIND v0.27.0
用空資料夾準備好 Dockerfile
,檔案內容如下:
1 |
|
其中兩個引數需要使用,K8S_VERSION
是 Kubernetes 版本,要打上完整版本號碼。CRIO_VERSION
是 CRI-O 版本,不需要打上修正版號,這個會需要加入 apt 套件庫。
接下來建置指令如下:
1 |
|
完成後,就可以用在 KIND 中,不過 KIND 設定檔需要做一些改寫,要把 CRI Socket 改成 CRI-O 的路徑。
kind-crio.yaml
檔案內容如下:
1 |
|
Worker node 可以依照需求數量往下複製,下一步就是啟動 KIND 叢集:
1 |
|
接下來啟動 KIND 叢集後,來示範是否能正常使用 ImageVolume
功能,驗證成功就代表成功使用 CRI-O 作為預設容器。
oci-vol-sample.yaml
檔案內容如下:
1 |
|
套用進去叢集中:
1 |
|
進去 container 裡面,用 cat
輸出 /volume/file
和 /volume/dir/file
。
分別輸出 2
和 1
就代表功能都正常使用。
結語
KIND 雖然預設是 Containerd,但經由適當調整後,可以自行切換到 CRI-O 作為預設容器 Runtime,不知道更底層的 runc 或 crun 是不是也能這樣做?後續可以來研究看看。
Kubernetes v1.31 引入了 Image Volume 功能,為機器學習、深度學習以及大型語言模型(LLM)等應用場景提供了更靈活的資料掛載方式。透過 Image Volume,模型不再需要與應用程式一起打包,應用程式可以在執行時自由替換後端模型,帶來更高的模組化與彈性。
Image Volume 預計在 Kubernetes v1.33 進入 Beta,預設依然是關閉,如果要使用記得要在 Feature Gate 打開。
此外,自 Containerd v2.1.0 起,也已經支援 Image Volume,不再是 CRI-O 的獨有功能,但目前 v2.1.0 還在 beta 中,我們就耐心等候吧!
後記
之前就想要用 CRI-O 在 KIND 中,網路上找到方法有些是版本較舊,或有點麻煩,不容易快速測試。
本篇文章的靈感出自於這篇文章:https://rkiselenko.dev/blog/crio-in-kind/
原始文章是從頭自己編譯,但我認為應該不是每個步驟都需要,因此最後簡化了原始文章的流程,並且更新 CRI-O 的 apt repo 連結。