KIND 使用 CRI-O 作為預設容器 Runtime

KIND 使用 Containerd 作為預設容器 Runtime,但如果有些需求想要換成 CRI-O 呢?

今天來記錄一下,如何自己編譯出 CRI-O 的 KIND node image 吧!

工商時間:KCD Taipei 2025

KCD Taipei 2025 活動 Logo

Kubernetes Community Day (KCD) 是由雲端原生計算基金會 (CNCF) 支持與認證的官方社群組織活動,此會議集結來自開源和雲端原生社群的使用者及技術人員,以進行教育、協作和分享。

KCD Taipei 2025 即將在 7/5臺灣科技大學國際大樓舉辦,是臺灣最大的 CNCF 官方活動,目前正在徵稿開放 RSVP,趕快去官網了解更多資訊吧!

官網連結:https://kcd.taipei/2025

前言

前陣子在 CNTUG 2024/10 Meetup #62 準備 Kubernetes v1.31 簡單雜談,有個功能是 ImageVolume,可以用 OCI 當作 Volume 掛載到容器中,但快樂地用 KIND 打開該 Feature Gate 後…?

Containerd OCI Volume 使用狀況

錯誤訊息如下: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 發現:

Kubernetes Blog 說明 Image Volume 需要 CRI-O 1.31 以上

原來 CRI-O 的版本要 v1.31 以上,那 Containerd 呢?

Containerd 支援 OCI Volume 的 Issue

雖然現在已經進 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ARG K8S_VERSION=v1.32.3

FROM kindest/node:${K8S_VERSION:-v1.32.3}

ARG CRIO_VERSION=v1.32

RUN echo "Installing Packages ..." \
&& apt-get clean \
&& apt-get update -y \
&& DEBIAN_FRONTEND=noninteractive apt-get install -y \
software-properties-common vim gnupg \
&& echo "Installing cri-o ..." \
&& curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg \
&& echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list \
&& apt-get update \
&& DEBIAN_FRONTEND=noninteractive apt-get --option=Dpkg::Options::=--force-confdef install -y cri-o \
&& sed -i 's/containerd/crio/g' /etc/crictl.yaml \
&& systemctl disable containerd \
&& systemctl enable crio

其中兩個引數需要使用,K8S_VERSION 是 Kubernetes 版本,要打上完整版本號碼。CRIO_VERSION 是 CRI-O 版本,不需要打上修正版號,這個會需要加入 apt 套件庫。

接下來建置指令如下:

1
docker build --build-arg CRIO_VERSION=v1.32 --build-arg K8S_VERSION=v1.32.3 -t kindnode/crio:v1.32.3 .

完成後,就可以用在 KIND 中,不過 KIND 設定檔需要做一些改寫,要把 CRI Socket 改成 CRI-O 的路徑。

kind-crio.yaml 檔案內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: crio
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///var/run/crio/crio.sock
- |
kind: JoinConfiguration
nodeRegistration:
criSocket: unix:///var/run/crio/crio.sock
- role: worker
kubeadmConfigPatches:
- |
kind: JoinConfiguration
nodeRegistration:
criSocket: unix:///var/run/crio/crio.sock
featureGates:
"ImageVolume": true # 1.31 alpha

Worker node 可以依照需求數量往下複製,下一步就是啟動 KIND 叢集:

1
kind create cluster --image kindnode/crio:v1.32.3 --config kind-crio.yaml

接下來啟動 KIND 叢集後,來示範是否能正常使用 ImageVolume 功能,驗證成功就代表成功使用 CRI-O 作為預設容器。

oci-vol-sample.yaml 檔案內容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
name: oci-vol-sample
spec:
containers:
- name: test
image: registry.k8s.io/e2e-test-images/echoserver:2.3
volumeMounts:
- name: volume
mountPath: /volume
volumes:
- name: volume
image:
reference: quay.io/crio/artifact:v1
pullPolicy: IfNotPresent

套用進去叢集中:

1
kubectl apply -f oci-sample.yaml

進去 container 裡面,用 cat 輸出 /volume/file/volume/dir/file

分別輸出 21 就代表功能都正常使用。

結語

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 連結。

Buy Me A Coffee

KIND 使用 CRI-O 作為預設容器 Runtime
https://blog.yangjerry.tw/kind-crio/
作者
Jerry Yang
發布於
2025年4月14日
許可協議