博客 / 詳情

返回

Kubernetes 基於sealos和nerdctl實現鏡像管理

實踐環境

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 runnerdctl build等命令與Docker完全兼容);
  • 暴露containerd的原生高級特性(如Rootless無特權運行、Stargz懶加載、鏡像加密等),這些特性是Docker CLI尚未充分支持的;
  • 作為containerd的非核心子項目,聚焦“用户友好性”與“功能實驗性”,助力containerd生態的發展。

2. 關鍵特性

nerdctl的特性圍繞“兼容Docker”與“擴展containerd功能”展開,主要包括:

  • Docker CLI兼容:支持幾乎所有常用Docker命令(如runpsbuildpush),甚至Docker Compose(nerdctl compose up),用户可直接替換dockernerdctl使用;

  • 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"

輸出説明:包含容器的網絡配置(如 IPAddressGateway)、掛載點(如 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"

注意:

  1. 權限要求:nerdctl 需要訪問 containerd 的 socket 文件(/run/containerd/containerd.sock),因此需以 root用户執行(或通過 sudo提升權限)。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.