?# 拉取鏡像到 k8s.io 命名空間 sudo nerdctl --namespace k8s.io pull nginx:1.23.4 # 驗證鏡像是否已下載 sudo nerdctl --namespace k8s.io images
下載鏡像到k8s.io名稱空間下
nerdctl ?--namespace k8s.io ?pull zookeeper:3.6.2
sudo ctr image pull --namespace k8s.io docker.io/zookeeper:3.6.2
sudo ctr -n k8s.io images ls | grep redis
sudo ctr -n k8s.io images ls
一、使用?nerdctl
?構建到?k8s.io
?命名空間
nerdctl
?是最簡便的方式,直接通過?--namespace
?參數指定目標命名空間:
bash
# 構建鏡像并存儲到 k8s.io 命名空間
sudo nerdctl --namespace k8s.io build -t myimage:latest .例如sudo nerdctl --namespace k8s.io build -t your-registry/goodskill-web:latest .# 驗證鏡像是否已在 k8s.io 命名空間中
sudo nerdctl --namespace k8s.io images
二、使用?buildkitd
?+?buildctl
?構建到?k8s.io
?命名空間
如果你使用 BuildKit 原生工具鏈,需要通過?--output
?參數指定存儲位置:
1. 啟動 buildkitd 服務(如果未運行)
bash
sudo buildkitd --oci-worker-no-process-sandbox &
2. 使用 buildctl 構建并輸出到 k8s.io 命名空間
bash
buildctl build \--frontend dockerfile.v0 \--local context=. \--local dockerfile=. \--output type=image,name=docker.io/library/myimage:latest \--export-attr containerd.io/gateway.address=unix:///run/containerd/containerd.sock \--export-attr containerd.io/namespace=k8s.io例如# 1. 構建并導出為 OCI 格式
buildctl build \--frontend dockerfile.v0 \--local context=. \--local dockerfile=. \--output type=oci,dest=/tmp/image.tar,name=docker.io/library/your-registry/goodskill-gateway:latest# 2. 導入到 containerd 的 k8s.io 命名空間
sudo ctr --namespace k8s.io images import /tmp/image.tar或者buildctl build \--frontend dockerfile.v0 \--local context=. \--local dockerfile=. \--output type=image,name=docker.io/library/your-registry/goodskill-gateway:latest,push=false \--output type=containerd,ref=docker.io/library/your-registry/goodskill-gateway:latest, \opt=containerd-gateway=unix:///run/containerd/containerd.sock, \opt=containerd-namespace=k8s.iobuildctl build --frontend dockerfile.v0 --local context=. --local dockerfile=. --output type=image,name=video:latest,push=false
參數說明:
--export-attr containerd.io/gateway.address
:指定 containerd 的 socket 地址。--export-attr containerd.io/namespace=k8s.io
:指定目標命名空間。
三、使用?ctr
?構建到?k8s.io
?命名空間
ctr
?本身構建功能有限,需結合 BuildKit 后端:
1. 確保 containerd 已啟用 BuildKit 支持
編輯?/etc/containerd/config.toml
,添加:
toml
[plugins."io.containerd.buildkit.v1"]enabled = true
重啟 containerd:
bash
sudo systemctl restart containerd
2. 使用?ctr
?調用 BuildKit 構建
bash
sudo ctr --namespace k8s.io build -t myimage:latest .
四、驗證鏡像是否在?k8s.io
?命名空間中
bash
# 使用 nerdctl 查看
sudo nerdctl --namespace k8s.io images# 或使用 ctr 查看
sudo ctr --namespace k8s.io images ls
五、注意事項
- 權限問題:所有操作需要 root 權限或?
sudo
。 - 命名空間隔離:
k8s.io
?命名空間中的鏡像可直接被 Kubernetes Pod 使用。- 普通用戶操作默認使用?
default
?命名空間,需顯式指定?k8s.io
。
- 私有倉庫認證:
- 如果需要從私有倉庫拉取基礎鏡像,確保認證信息已配置到?
k8s.io
?命名空間 -
sudo nerdctl --namespace k8s.io login my-registry.example.com
- 如果需要從私有倉庫拉取基礎鏡像,確保認證信息已配置到?
要將 Docker 格式的鏡像 tar 文件導入到 containerd 的?k8s.io
?命名空間,可以使用?ctr
?命令結合格式轉換。以下是具體步驟:
方法一:使用?ctr
?直接導入(需轉換格式)
Docker 導出的 tar 文件默認是 Docker 格式,需要先轉換為 OCI 格式才能被 containerd 正確識別:
bash
# 1. 加載 Docker 格式的 tar 文件到臨時命名空間
sudo ctr -n default images import --all-platforms your-image.tar# 2. 查看鏡像名稱和標簽
sudo ctr -n default images ls# 3. 轉換并導出為 OCI 格式
sudo ctr -n default images export /tmp/oci-image.tar your-image:tag# 4. 導入到 k8s.io 命名空間
sudo ctr -n k8s.io images import /tmp/oci-image.tar# 5. 清理臨時文件
rm /tmp/oci-image.tar
方法二:使用?nerdctl
?導入(更簡單)
如果已安裝?nerdctl
,可以直接導入 Docker 格式的 tar 文件:
bash
# 直接導入到 k8s.io 命名空間
sudo nerdctl --namespace k8s.io load -i your-image.tar
驗證導入結果
bash
# 使用 ctr 查看 k8s.io 命名空間中的鏡像
sudo ctr --namespace k8s.io images ls | grep your-image# 或使用 nerdctl 查看
sudo nerdctl --namespace k8s.io images | grep your-image
常見問題
-
鏡像名稱沖突:
- 導入時可能需要指定新的名稱:
sudo ctr -n k8s.io images import --ref your-image:new-tag /tmp/oci-image.tar
- 導入時可能需要指定新的名稱:
-
權限問題:
- 確保當前用戶有權限訪問?
/run/containerd/containerd.sock
- 確保當前用戶有權限訪問?
-
格式不兼容:
- 如果直接導入 Docker 格式的 tar 文件出現問題,請使用方法一進行格式轉換
通過以上方法,你可以將 Docker 鏡像 tar 文件成功導入到 containerd 的?k8s.io
?命名空間,供 Kubernetes 直接使用。
?