K8S 1.20 棄用 Docker 評估之 Docker CLI 的替代產品 nerdctl

背景

2020 年 12 月初,Kubernetes 在其最新的 Changelog 中宣佈,自 Kubernetes 1.20 之後將棄用 Docker 作爲容器運行時。

棄用 Docker 帶來的,可能是一系列的改變,包括不限於:

  • 容器鏡像構建工具
  • 容器 CLI
  • 容器鏡像倉庫
  • 容器運行時

專題文章《K8S 1.20 棄用 Docker 評估》會從多方面分析由此帶來的變動和影響。

  1. 《K8S 1.20 棄用 Docker 評估之 Docker 和 OCI 鏡像格式的差別》 主要介紹 鏡像格式的變化
  2. 《K8S 1.20 棄用 Docker 評估之 Docker CLI 的替代產品》 主要介紹 Docker CLI 的替代產品及個人推薦 - RedHat 3件套 - Buildah、Podman 和 Skopeo

書接上文,今天來介紹 Docker CLI 替代產品的另一種選擇:nerdctl。

nerdctl 簡介

nerdctl:是由 containerd 開源的、contaiNERD CTL,這是一個用於 containerd 的,且和 Docker 兼容的 CLI,另外還支持 Compose。

典型應用場景

K8S 1.20+ Node 上做容器 Debug

如果你最近剛剛開始使用 K8S 1.20 及以上版本,並且 CRI 選擇了 containerd ,那麼你會注意到 containerd 默認帶的 CLI - ctr 相比 Docker CLI 發生了較大變化,且存在以下問題:
與 Docker CLI 不兼容,對用戶不友好。另外,ctr 缺少以下類似 Docker CLI 的命令:

  • docker run -p <PORT>
  • docker run --restart=always --net=bridge
  • 使用 ~/.docker/config.json 配置 docker pull 以及認證助手工具如 docker-credential-ecr-login
  • docker logs

nerdctl 最主要的優點就是幾乎完全兼容 Docker CLI,那麼 nerdctl 在 K8S 集羣中 debug 就很方便。
僅有的一些差別在於 nerdctl 有 namespace 的概念(✍️備註:其實是 containerd 有 namespace 的概念),如下:

  • default(默認)
  • moby:Docker
  • k8s.io:Kubernetes 集羣

舉例來說要列出 k8s 中的容器,需要:

nerdctl --namespace k8s.io ps -a

綜上,在新版本 K8S 中,爲了用戶體驗的一致性,建議:

  1. 在 K8S Node 上都安裝 nerdctl,安裝步驟:
  2. 通過 alias 命令,實現和之前版本體驗一致,操作如下:

vi ~/.bashrc

因爲主要是用於 K8S Node 上 debug,所以直接這麼寫:

alias docker='nerdctl -n k8s.io'

安裝和使用

curl -fsSLO https://github.com/containerd/nerdctl/releases/download/v0.13.0/nerdctl-0.13.0-linux-amd64.tar.gz
tar xvzf nerdctl-0.13.0-linux-amd64.tar.gz -C /usr/local/bin/ nerdctl

完整的使用手冊見:nerdctl README,可以看到是基本上和 Docker 命令一樣。

總結

在 K8S 1.20+ Node 上做容器 Debug,需要用到 CLI,建議使用 nerdctl,並且 alias 成 Docker 提供一致的體驗。
至於個人電腦或是操作機,建議不要替換,直接用 Docker 全套它不香嗎?😏😏😏

三人行, 必有我師; 知識共享, 天下爲公. 本文由東風微鳴技術博客 EWhisper.cn 編寫.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章