實踐環境
nerdctl下載地址
https://github.com/containerd/nerdctl/releases
openEuler-22.03-LTS-SP4
registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16
https://github.com/labring/sealos/releases/download/v5.1.1/sealos_5.1.1_linux_amd64.tar.gz
nerdctl簡介
nerdctl是一款專為containerd設計的Docker兼容命令行工具(CLI),旨在為熟悉Docker的用户提供無縫遷移體驗,同時解鎖containerd的高級特性。其核心定位是填補“低級容器運行時(containerd)”與“高級用户體驗(Docker CLI)”之間的 gap,讓用户無需改變使用習慣即可享受containerd的性能與安全優勢。
1. 核心目標
nerdctl的主要目標是降低containerd的使用門檻,推動其普及。具體來説:
- 從Docker轉向containerd的用户提供一致的命令行體驗(如
nerdctl run、nerdctl build等命令與Docker完全兼容); - 暴露containerd的原生高級特性(如Rootless無特權運行、Stargz懶加載、鏡像加密等),這些特性是Docker CLI尚未充分支持的;
- 作為containerd的非核心子項目,聚焦“用户友好性”與“功能實驗性”,助力containerd生態的發展。
2. 關鍵特性
nerdctl的特性圍繞“兼容Docker”與“擴展containerd功能”展開,主要包括:
-
Docker CLI兼容:支持幾乎所有常用Docker命令(如
run、ps、build、push),甚至Docker Compose(nerdctl compose up),用户可直接替換docker為nerdctl使用; -
Rootless無特權模式:允許非root用户運行容器,通過
containerd-rootless-setuptool.sh安裝配置,降低安全風險; -
高級鏡像特性:支持Stargz/Nydus/OverlayBD等懶加載技術(無需完全下載鏡像即可啓動)、鏡像加密(ocicrypt)、P2P鏡像分發(IPFS)及鏡像簽名驗證(cosign);
-
Kubernetes集成:可直接管理Kubernetes集羣中的容器(通過
--namespace k8s.io參數),如nerdctl --namespace k8s.io ps -a查看集羣容器; -
多平台與構建支持:支持多平台鏡像構建(
nerdctl buildx build)、鏡像格式轉換(如Docker Manifest轉OCI/estargz)及BuildKit依賴(用於鏡像構建
安裝nerdctl
k8s集羣所有需要使用nerdctl的節點上部署
wget https://github.com/containerd/nerdctl/releases/download/v1.7.6/nerdctl-full-1.7.6-linux-amd64.tar.gz
tar -C /usr/local -xzf nerdctl-full-1.7.6-linux-amd64.tar.gz
ln -s /usr/local/bin/nerdctl /usr/bin/nerdctl
驗證
# nerdctl --version
nerdctl version 1.7.6
參考鏈接:
https://github.com/containerd/nerdctl
配置 nerdctl 訪問 K8s 命名空間
Sealos 部署的 K8s 集羣使用 k8s.io命名空間存儲容器數據(containerd 的命名空間機制),而 nerdctl 默認使用 default命名空間。因此,需通過以下方式讓 nerdctl 訪問 K8s 容器:
-
臨時指定:在執行 nerdctl 命令時,通過
--namespace=k8s.io參數指定命名空間(推薦,避免全局配置影響)。示例:列出 K8s 集羣中的所有容器(需指定命名空間)
# nerdctl ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # nerdctl --namespace=k8s.io ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 063e15488d95 sealos.hub:5000/cilium/cilium:v1.14.4 "cilium-agent --conf…" 3 days ago Created k8s://kube-system/cilium-2lrwx/cilium-agent 1006e0854b8b sealos.hub:5000/pause:3.5 "/pause" 3 days ago Up ...略 -
永久配置:創建 nerdctl 配置文件(
/etc/nerdctl/nerdctl.toml),設置默認命名空間為k8s.io:# mkdir /etc/nerdctl # vi /etc/nerdctl/nerdctl.toml設置
nerdctl.toml中增加以下全局配置,這樣執行nerdctl命令時默認使用k8s.io命名空間namespace = "k8s.io" debug = false
核心操作(nerdctl 管理 K8s 容器)
nerdctl 與 Sealos 集成後,主要用於容器調試(彌補 kubectl的不足),以下是常見操作:
1. 查看 K8s 容器狀態
# 列出所有 K8s 容器(包括停止的)
nerdctl --namespace=k8s.io ps -a
# 過濾特定 Pod 的容器(如 `nginx` Pod)
nerdctl --namespace=k8s.io ps -a | grep nginx
2. 查看容器日誌(解決 kubectl logs失效問題)
當 kubectl logs <pod-name>無法獲取日誌(如容器崩潰、日誌截斷)時,nerdctl 可直接讀取容器的標準輸出日誌:
# 查看容器實時日誌(-f 跟蹤日誌,--tail 顯示最後 N 行)
nerdctl --namespace=k8s.io logs -f --tail=100 <容器ID>
# 示例:查看 nginx Pod 的容器日誌
nerdctl --namespace=k8s.io logs -f $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}')
優勢:nerdctl 日誌直接來自 containerd,避免了 kubectl與 K8s API 之間的轉發延遲,更適合調試容器啓動失敗等問題。
3. 進入運行中的容器
當需要進入 K8s 容器執行命令(如查看配置文件、調試應用)時,nerdctl 可直接附加到容器進程:
# 進入容器(--it 交互式終端,/bin/sh 進入 shell)
nerdctl --namespace=k8s.io exec -it <容器ID> /bin/sh
# 示例:進入 `nginx` 容器
nerdctl --namespace=k8s.io exec -it $(nerdctl --namespace=k8s.io ps -a | grep nginx | awk '{print $1}') /bin/sh
注意:需確保容器處於 Up狀態,且鏡像包含 shell(如 nginx:alpine包含 /bin/sh)。
4. 查看容器詳細信息
通過 nerdctl inspect可獲取容器的底層信息(如網絡配置、掛載點、環境變量),幫助排查網絡或存儲問題:
# 查看容器詳細信息(JSON 格式)
nerdctl --namespace=k8s.io inspect <容器ID>
# 過濾關鍵信息(如 IP 地址、掛載點)
nerdctl --namespace=k8s.io inspect <容器ID> | grep -A 10 "NetworkSettings"
輸出説明:包含容器的網絡配置(如 IPAddress、Gateway)、掛載點(如 Mounts)、環境變量(如 Env)等,比 kubectl describe pod更詳細。
5. 管理容器鏡像(補充 Sealos 鏡像管理)
nerdctl 可直接操作 Sealos 集羣節點上的容器鏡像(如拉取、刪除、打標籤),補充 Sealos 離線鏡像管理的不足:
# 登錄倉庫(有些鏡像倉庫要求登錄後才可以執行其它操作,比如阿里雲)
# nerdctl login sealos.hub:5000 #説明:回車後會要求輸入賬號,輸入賬號後回車會要求輸入密碼
# 拉取鏡像(支持鏡像加速,如阿里雲)
# nerdctl pull registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine
# 列出本地鏡像
# nerdctl --namespace=k8s.io images
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
docker.xuanyuan.me/library/nginx 1.25 a484819eb602 2 days ago linux/amd64 192.8 MiB 67.7 MiB
sealos.hub:5000/cilium/cilium v1.14.4 57b1a0413723 3 days ago linux/amd64 520.1 MiB 183.7 MiB
sealos.hub:5000/cilium/cilium <none> 57b1a0413723 3 days ago linux/amd64 520.1 MiB 183.7 MiB
sealos.hub:5000/kube-proxy v1.22.17 614ec43f14e1 3 days ago linux/amd64 104.8 MiB 34.3 MiB
...略
# 批量刪除所有 tag 為 None的鏡像
# 通過 nerdctl images命令過濾無標籤鏡像,並結合管道操作批量刪除:
# 列出所有無標籤鏡像的 ID
# nerdctl --namespace=k8s.io images --all --filter "dangling=true"
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
sealos.hub:5000/cilium/cilium <none> 57b1a0413723 3 days ago linux/amd64 520.1 MiB 183.7 MiB
...略
# 批量刪除(謹慎操作!)
nerdctl images --all --filter "dangling=true" -q | xargs nerdctl rmi -f
# 給本地鏡像打一個標記(`tag`),可將其歸入某一倉庫
# nerdctl --namespace=k8s.io tag docker.xuanyuan.me/library/nginx:1.25 my-registry/nginx:v1
# nerdctl --namespace=k8s.io images
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
my-registry/nginx v1 a484819eb602 10 seconds ago linux/amd64 192.8 MiB 67.7 MiB
docker.xuanyuan.me/library/nginx 1.25 a484819eb602 2 days ago linux/amd64 192.8 MiB 67.7 MiB
...略
# 刪除本地鏡像
nerdctl rmi a484819eb602
# 到導出鏡像包將:鏡像`my-registry/nginx:v1`保存為`my-nginx.tar`
# nerdctl --namespace=k8s.io image save -o my-nginx.tar my-registry/nginx:v1
# 刪除鏡像
# nerdctl --namespace=k8s.io rmi my-registry/nginx:v1
# 導入鏡像
# nerdctl --namespace=k8s.io image load -i my-nginx.tar
説明:基於sealos部署k8s,會自動創建一個本地私有倉庫,倉庫默認地址:sealos.hub:5000,登錄賬號,密碼存放在/etc/containerd/config.toml ,如下
# cat /etc/containerd/config.toml
...略
[plugins]
...略
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."sealos.hub:5000".auth]
username = "admin"
password = "passw0rd"
注意:
- 權限要求:nerdctl 需要訪問 containerd 的 socket 文件(
/run/containerd/containerd.sock),因此需以root用户執行(或通過sudo提升權限)。