快轉到主要內容

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

·410 字·2 分鐘·
ChengHao Yang
作者
ChengHao Yang
SRE / CNCF Ambassador
目錄

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,檔案內容如下:

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 套件庫。

接下來建置指令如下:

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 檔案內容如下:

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 叢集:

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

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

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

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

套用進去叢集中:

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

相關文章

Kubernetes 一致性測試 - Sonobuoy

·880 字·5 分鐘
現今 Kubernetes 的發行版非常多(e.g. K0s、K3s、Rancher 等),以及雲端服務也有人提供 Kubernetes(e.g. GKE、AKS、EKS 等),但有沒有想過,為什麼這些社群或雲端供應商聲稱可以提供 K8s 呢?我只要自稱能提供 K8s 也可以嗎?