containerd对接harbor

containerd 实现了 kubernetes 的 Container Runtime Interface (CRI) 接口,提供容器运行时核心功能,如镜像管理、容器管理等,相比 dockerd 更加简单、健壮和可移植。
containerd 不能像docker一样 docker login registry.harbor.com 登录到镜像仓库。无法从harbor拉取到镜像。

以下从containerd的安装到对接一步步讲解

一、containerd安装

获取阿里云YUM源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

下载安装:
yum install -y containerd.io
###启动containerd
[root@ecs ~]# systemctl enable containerd
[root@ecs ~]# systemctl start  containerd

###生成配置文件
containerd config default > /etc/containerd/config.toml  ##生成默认配置文件

###安装crictl工具
默认containerd使用ctr管理镜像、容器
下载地址https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.23.0/crictl-v1.23.0-linux-amd64.tar.gz

##################################
crictl 是遵循 CRI 接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像。

ctr 是 containerd 的一个客户端工具。

ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。

一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。
#################################


###解压到/usr/bin目录
tar -zxvf crictl-v1.23.0-linux-amd64.tar.gz -C /usr/bin/
###查看crictl版本
[root@ecs ~]# crictl --version
crictl version v1.23.0

二、对接harbor

###编辑配置文件
vim /etc/containerd/config.toml添加如下内容
#############################
[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = ""

  [plugins."io.containerd.grpc.v1.cri".registry.auths]
  [plugins."io.containerd.grpc.v1.cri".registry.configs]
      
    [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.harbor.com:4000".tls]####harbor仓库的地址(ip/域名+端口)
      insecure_skip_verify = true  ###跳过认证(如果不配置,需要使用harbor证书)
      ################
      ca_file = "/etc/containerd/certs.d/registry.harbor.com/ca.crt" #ca证书
      cert_file = "/etc/containerd/certs.d/registry.harbor.com/registry.harbor.com.cert" #harbor证书
      key_file = "/etc/containerd/certs.d/registry.harbor.com/registry.harbor.com.key" #密钥
      
    [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.harbor.com:4000".auth]####harbor仓库的地址(ip/域名+端口)
      username = "admin"   ###harbor的登录用户名
      password = "Harbor12345"   ###harbor的登录密码

  [plugins."io.containerd.grpc.v1.cri".registry.headers]

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.harbor.com:4000"]####harbor仓库的地址(ip/域名+端口)
      endpoint = ["http://registry.harbor.com:4000"] ###harbor仓库的地址
###系统做解析
cat /etc/hosts
192.168.2.110 registry.harbor.com

####加载配置
systemctl daemon-reload
###重启服务
systemctl restart containerd

三、测试

###下载测试镜像
ctr image pull --all-platforms  docker.io/library/redis:alpine

###镜像设置tag
ctr images tag docker.io/library/redis:alpine registry.harbor.com:4000/test/redis:alpine

###上传镜像
ctr images  push --plain-http=true --skip-verify  --user admin:Harbor12345 registry.harbor.com:4000/test/redis:alpine

########################################
由于 Containerd 也有 namespaces 的概念,对于上层编排系统的支持,ctr 客户端 主要区分了 3 个命名空间分别是k8s.io、moby和default,以上我们用crictl操作的均在k8s.io命名空间,使用ctr 看镜像列表就需要加上-n 参数。crictl 是只有一个k8s.io命名空间,但是没有-n 参数。

ctr images pull 拉取的镜像默认放在default,而 crictl pull 和 kubelet 默认拉取的镜像都在 k8s.io 命名空间下。所以通过ctr导入镜像的时候特别注意一点,最好指定命名空间。

harbor查看
containerd对接harbor_第1张图片
使用crictl下载测试

###下载
crictl pull registry.harbor.com:4000/test/redis:alpine
[root@ecs ~]# crictl images |grep redis
I0817 17:56:09.290765   13675 util_unix.go:103] "Using this endpoint is deprecated, please consider using full URL format" endpoint="/run/containerd/containerd.sock" URL="unix:///run/containerd/containerd.sock"
registry.harbor.com:4000/test/redis                  9192ed4e49554       11.9MB

四、常见问题解决

  • 提示FATA[0010] failed to connect: failed to connect: context deadline exceeded
解决方法如下:
[root@ecs ~]# crictl config runtime-endpoint /run/containerd/containerd.sock
  • ctr: failed to do request: Head “https://registry.harbor.com:4000/v2/test/redis/blobs/sha256:51ea0096b5c1dc947db0746d32a864b67466e95ca49abc644ee95f9c32862334”: http: server gave HTTP response to HTTPS client
解决方法如下:

这个问题主要是因为registry默认就是https,需要添加--skip-verify参数
ctr images  push --plain-http=true --skip-verify  --user admin:Harbor12345 registry.harbor.com:4000/test/redis:alpine

你可能感兴趣的:(k8s,k8s)