containerd镜像管理

我在 k8s 集群中尝试使用 containerd 作为 CRI,发现镜像下载和导入与 docker 存在一些区别,大致如下:

  • containerd 命令行工具 ctr 特性不如 docker 丰富,如 ctr 1.2 并没有 tag 子命令,直到 1.3 才有
  • 为支持多租户隔离,containerd 有 namespace 概念,不同 namespace 下的 image、container 均不同,直接使用 ctr 操作时,会使用 default namespace

如果使用的是 ctr 1.2,可以通过 docker tag 镜像,再使用 ctr 导入镜像

1
2
docker save k8s.gcr.io/pause -o pause.tar
ctr -n <namespace> images import pause.tar

k8s 只会使用 k8s.io namespace 中镜像。当导入k8s使用的镜像的时候,需要指定namespace

1
2
3
4
5
6
[root@k8s-worker-01 ~]# ctr namespace ls
NAME LABELS
default
k8s.io
[root@k8s-worker-01 ~]# ctr -n k8s.io images import metrics-server_v0.4.1.tar
unpacking k8s.gcr.io/metrics-server/metrics-server:v0.4.1 (sha256:379ccb5f1062c75384800b21b346eed316c648c12c80389d26aff7e67e746a89)...done

ctr导出镜像

1
ctr -n <namespaces> image  export  heapster-amd64:v1.5.4.tar k8s.gcr.io/heapster-amd64:v1.5.4

ctr导入镜像

1
2
ctr -n k8s.io images import heapster-amd64:v1.5.4.tar
ctr -n k8s.io images import --base-name k8s.gcr.io/heapster-amd64 heapster-amd64:v1.5.4.tar