Harbor 和Containerd的最佳实栈

Posted 键客李大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Harbor 和Containerd的最佳实栈相关的知识,希望对你有一定的参考价值。

前言

  Kubernetes 计划在即将发布的 1.24 版本里弃用并移除 dockershim。使用 Docker 引擎作为其 Kubernetes 集群的容器运行时的工作流或系统需要在升级到 1.24 版本之前进行迁移。1.23 版本将会保留 dockershim,对该版本的支持则会再延长一年。\\
  本文基于Containerd为容器运行时的kubernetes集群,分析Containerd与Harbor私有镜像仓库的结合使用,关于Cintainerd为运行时搭建kubernetes集群,你可以阅读这篇文章: 《kubeadm部署单master集群(contained运行时)》

二进制安装Containerd

2.1 下载二进制包

  • ontainerd有3种安装包:
  • containerd-xxx,这种包用于单机测试没问题,不包含runC,但需要Runc运行容器,需要提前安装。
  • cri-container-xxx,不包含cni,但是运行容器也需要cni-plugin
  • cri-containerd-cni-xxxx,包含runc和k8s里的所需要的相关文件。k8s集群里需要用到此包。虽然包含runC,但是依赖系统中的seccomp(安全计算模式,是一种限制容器调用系统资源的模式。)
    $ wget https://github.com/containerd/containerd/releases/download/v1.6.5/cri-containerd-1.6.5-linux-amd64.tar.gz
    $ tar zxvf cri-containerd-1.6.5-linux-amd64.tar.gz
    $ ls  -l
    drwxr-xr-x  4 root root        51 4月  26 07:52 etc
    drwxr-xr-x  4 root root        35 4月  26 07:51 opt
    drwxr-xr-x  3 root root        19 4月  26 07:50 usr

    etc目录:主要为containerd服务管理配置文件及cni虚拟网卡配置文件;\\
    opt目录:主要为gce环境中使用containerd配置文件及cni插件;\\
    usr目录:主要为containerd运行时的二进制文件,包含runc;

2.2 拷贝二进制可执行文件到$PATH

$ ls usr/local/bin/
containerd  containerd-shim  containerd-shim-runc-v1  containerd-shim-runc-v2  containerd-stress  crictl  critest  ctd-decoder  ctr
$ cp usr/local/bin/*  /usr/local/bin/

2.3 创建并修改配置文件

Containerd 的默认配置文件为 /etc/containerd/config.toml

1)生成初始配置文件

$ mkdir -p /etc/containerd/
$ containerd config default > /etc/containerd/config.toml

2)替换镜像源

  由于国内环境原因我们需要将 sandbox_image 镜像源设置为阿里云google_containers镜像源。

$ sed -i "s#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g"  /etc/containerd/config.toml

也可以这样修改:

$ vim /etc/containerd/config.toml
  [plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"

3)配置镜像加速(可选)

$ vim /etc/containerd/config.toml
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
      endpoint = ["https://xlx9erfu.mirror.aliyuncs.com"]

endpoint填写镜像地址列表(多个以逗号分隔)。

4)配置驱动器

  使用虽然containerdKubernetes默认使用旧版驱动程序来管理cgroups,但建议在基于 systemd 的主机上使用该驱动程序,以符合 cgroup 的“单编写器”规则。

$ sed -i s#SystemdCgroup = false#SystemdCgroup = true#g /etc/containerd/config.toml

或者:

$ vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

2.4 创建服务启动文件

  将下载的二进制包的etc/systemd/system/containerd.servic服务启动文件拷贝到/usr/lib/systemd/system/目录下。

$ grep -Ev ^#|^$  /usr/lib/systemd/system/containerd.service 
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
$ cp etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service

2.5 启动 containerd 服务

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now containerd.service   #立即启动并设置为开机自启
$ sudo systemctl status containerd.service
$ containerd  --version    #查看版本
containerd github.com/containerd/containerd v1.6.3 f830866066ed06e71bad64871bccfd34daf6309c

2.6 安装runc

  Runc是真正运行容器的工具。\\
  由于二进制包中提供的runC默认需要系统中安装seccomp支持,需要单独安装,且不同版本runC对seccomp版本要求不一致,所以建议单独下载runC 二进制包进行安装,里面包含了seccomp模块(安全计算模式)支持,libseccomp需要2.4以上版本。

$ cp usr/local/sbin/runc  /usr/bin/
$ wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
$ rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm
$ rpm -qa |  grep libseccomp
libseccomp-2.5.1-1.el8.x86_64
$ runc  -version
runc version 1.1.2
commit: v1.1.2-0-ga916309f
spec: 1.0.2-dev
go: go1.17.11
libseccomp: 2.5.1

2.7 安装客户端管理工具(nerdctl)

  Containerd常用的客户端管理工具有:ctr、crictl、nerdctl\\
  Nerdctl工具跟docker的使用跟docker类似,本处使用的是该客户端工具。

$ wget https://github.com/containerd/nerdctl/releases/download/v0.21.0/nerdctl-0.21.0-linux-amd64.tar.gz
$ tar zxvf nerdctl-0.21.0-linux-amd64.tar.gz
$ mv nerdctl  /usr/local/bin/

Containerd配置Harbor参数

  在containerd服务的配置文件中配置Harbor相关的参数,使Containerd可以登录Harbor并推送/拉取镜像到Harbor以及镜像拉取凭证的配置。

3.1 修改containerd配置

$ cat /etc/containerd/config.toml
version = 2
…
    [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/harbor"

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

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

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
         [plugin."io.containerd.grpc.v1.cri".registry.mirrors."harbor"]
            endpoint = ["https://192.168.2.250:443"]  #Harbor服务地址
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
         [plugin."io.containerd.grpc.v1.cri".registry.configs."harbor".tls]  #harbor 证书认证配置
            insecure_skip_verify = true  #是否跳过证书认证(设置为false要指定ca_file、cert_file、key_file的值)
            ca_file   = "/etc/containerd/harbor/ca.pem"   #CA 证书(cfssl工具的则为ca.pem)
            cert_file = "/etc/containerd/harbor/harbor.pem"  #harbor证书(harbor.pem)
            key_file  = "/etc/containerd/harbor/harbor-key.pem"  #harbor私钥(harbor-key.pem)
         [plugin."io.containerd.grpc.v1.cri".registry.configs."harbor".auth]  #配置凭据
            username = "admin"    #Harbor用户名
            password = "Harbor12345"  #Harbor密码
            auth = ""   #可选
            identifytoken = ""    #可选
    [plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming] 
      tls_cert_file = ""
      tls_key_file = ""
…


3.2 重启containerd服务

  重新加载systemd 的 daemon守护进程并重启containerd.service服务,然后k8s集群节点便可正常从Harbor拉取镜像了。

$ systemctl daemon-reload && systemctl restart containerd.service

3.3 命令行登录Harbor

  在命令行通过nerdctl工具登录Harbor。

$ nerdctl  login 192.168.2.250:443 -u admin -p Harbor12345  --insecure-registry


  nerdctl就和docker类似,nerdctl login会在当前用户家目录下生成~/.docker/config.json,可以根据该文件制作镜像拉取凭证。

如果登录报错:

$ nerdctl  login 192.168.2.250:443 -u admin -p Harbor12345
ERRO[0005] failed to call tryLoginWithRegHost            error="failed to call rh.Client.Do: Get \\"https://192.168.2.250:443/v2/\\": x509: certificate signed by unknown authority" i=0
FATA[0005] failed to call rh.Client.Do: Get "https://192.168.2.250:443/v2/": x509: certificate signed by unknown authority

  可以看到报错“certificate signed by unknown authority(由未知机构签署的证书)”的错误,添加参数
--insecure-registry即可解决。

3.4 推送镜像到Harbor

  从dockerhub下载镜像,然后tag打上新的标签,再将镜像推送到Harbor。

$ nerdctl  pull nginx:1.23.1
$ nerdctl  image tag  nginx:1.23.1  192.168.2.250:443/lidabai/nginx:1.23.1
$ nerdctl  image push  192.168.2.250:443/lidabai/nginx:1.23.1 --insecure-registry


3.5 拉取Harbor私有镜像

  将本地的镜像删除,然后从Harbor拉取刚才推送上去的镜像。

$ nerdctl -n k8s.io image rm 192.168.2.250:443/lidabai/nginx:1.23.1
$ nerdctl -n k8s.io images
$ nerdctl -n k8s.io pull 192.168.2.250:443/lidabai/nginx:1.23.1 --insecure-registry


3.6 登出Harbor

退出登录后,会清除~/.docker/config.json中的登录凭证。

$ nerdctl  logout 192.168.2.250:443
Removing login credentials for 192.168.2.250:443

以上是关于Harbor 和Containerd的最佳实栈的主要内容,如果未能解决你的问题,请参考以下文章

[Harbor] Kubernetes对接Harbor私有镜像仓库 (运行时: containerd)

[Harbor] Kubernetes对接Harbor私有镜像仓库 (运行时: containerd)

Harbor密码重置 密码修改 admin密码重置

k8s二containerd的安装

K8s 终将废弃 docker,TKE 早已支持 containerd

k8s二containerd的安装