Centos7.9安装containerd容器与cni网络插件

举报
江晚正愁余 发表于 2024/01/16 12:12:26 2024/01/16
【摘要】 Centos7.9安装containerd容器与cni网络插件一,Containerd 的技术方向和目标简洁的基于 gRPC 的 API 和 client library完整的 OCI 支持(runtime 和 image spec)同时具备稳定性和高性能的定义良好的容器核心功能一个解耦的系统(让 image、filesystem、runtime 解耦合),实现插件式的扩展和重用   为什么...

Centos7.9安装containerd容器与cni网络插件



一,Containerd 的技术方向和目标

  • 简洁的基于 gRPC 的 API 和 client library

  • 完整的 OCI 支持(runtime 和 image spec)

  • 同时具备稳定性和高性能的定义良好的容器核心功能

  • 一个解耦的系统(让 image、filesystem、runtime 解耦合),实现插件式的扩展和重用


 为什么需要独立的 containerd:

  • 以往隶属于docker项目中,现如今从整体 docker 引擎中分离出的项目(开源项目的思路)

  • 可以被 Kubernets CRI 等项目使用(通用化)

  • 为广泛的行业合作打下基础(就像 runC 一样)


二,安装步骤

1,升级内核

[root@os-240 ~]#  rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@os-240 ~]#   yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#建议迁移lt长期支持内核
[root@os-240 ~]#   yum --enablerepo='elrepo-kernel' install kernel-lt kernel-lt-devel
[root@os-240 ~]#  grub2-set-default 0
[root@os-240 ~]#  reboot


不升级内核,启动containerd服务或是拉取镜像会报以下错误:

Mar 24 11:05:03 os-240 containerd: time="2023-03-24T11:05:03.870447561+08:00" level=error msg="(*service).Write failed" error="rpc error: code = Canceled desc = context canceled" expected="sha256:d4ceccbfc2696101c94fbf2149036e4ff815e4723e518721ff85105ce5aa8afc" ref="layer-sha256:d4ceccbfc2696101c94fbf2149036e4ff815e4723e518721ff85105ce5aa8afc" total=1405

FATA[0005] failed to copy: httpReadSeeker: failed open: failed to do request: Get "https://registry-1.docker.io/v2/library/nginx/blobs/sha256:e9427fcfa8642f8ddf5106f742a75eca0dbac676cf8145598623d04fa45dd74e": dial tcp: lookup registry-1.docker.io on 114.114.114.114:53: no such host 

如果出现镜像无法下载情况,可以修改dns1=8.8.8.8


2,下载相关软件包,系统采用Centos7.9,需要安装的软件版本如下:

[root@os-240 ~]#  wget https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64
[root@os-240 ~]#  wget https://github.com/opencontainers/runc/releases/download/v1.1.4/libseccomp-2.5.4.tar.gz
[root@os-240 ~]#   wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
[root@os-240 ~]#   wget https://github.com/containerd/nerdctl/releases/download/v1.2.1/nerdctl-1.2.1-linux-amd64.tar.gz
[root@os-240 ~]#   wget https://github.com/moby/buildkit/releases/download/v0.11.5/buildkit-v0.11.5.linux-amd64.tar.gz
[root@os-240 ~]#  wget https://github.com/containerd/containerd/releases/download/v1.7.0/containerd-1.7.0-linux-amd64.tar.gz


# 安装新版libseccomp软件包,runc需要使用

[root@os-240 ~]#   tar zxvf libseccomp-2.5.4.tar.gz

[root@os-240 ~]#  yum  -y install gperf                         #根据情况安装编写环境

[root@os-240 ~]#  ./configure

[root@os-240 ~]#  make && make install



[root@os-240 ~]#   tar xvf containerd-1.7.0-linux-amd64.tar.gz

# 二进制文件都安装到/usr/local/bin/目录下
[root@os-240 ~]#  cp -r bin/* /usr/local/bin/


3,创建containerd systemd service启动管理文件

修改ExecStart=/usr/local/bin/containerd为当前containerd文件路径

[root@os-240 ~]#   cd /etc/systemd/system/
[root@os-240 ~]#  cat containerd.service 


# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
 
[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
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
 
[Install]
WantedBy=multi-user.target



[root@os-240 ~]#   mkdir /etc/containerd

[root@os-240 ~]#   containerd config default > /etc/containerd/config.toml

[root@os-240 ~]#   systemctl daemon-reload


修改配置文件

vim下搜索/mirrors,添加镜像加速,使用docker镜像源即可,上下级配置,缩进两个空格。

   [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://dxc7f1d6.mirror.aliyuncs.com"]


或是使用: 

endpoint = ["https://registry-1.docker.io"]


[root@os-240 ~]#   systemctl enable containerd --now


4,安装runc

[root@os-240 ~]#  mv runc.amd64 /usr/local/bin/runc

[root@os-240 ~]# chmod +x /usr/local/bin/runc

[root@os-240 ~]#  runc -version
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d1
spec: 1.0.2-dev
go: go1.17.10
libseccomp: 2.5.4


5,安装buildkit,实现Dockerfile构建镜像
[root@os-240 ~]#    tar zxvf buildkit-v0.11.5.linux-amd64.tar.gz 
[root@os-240 ~]#    cp -a bin/build* /usr/local/bin/

添加启动服务
[root@os-240 ~]#   cat > /etc/systemd/system/buildkit.service <<EOF
   [Unit]
   Description=BuildKit
   Documentation=https://github.com/moby/buildkit
   [Service]
   ExecStart=/usr/local/bin/buildkitd --oci-worker=false --containerd-worker=true
   [Install]
   WantedBy=multi-user.target
   EOF


[root@os-240 ~]#    systemctl daemon-reload 
[root@os-240 ~]#    systemctl enable buildkit --now
[root@os-240 ~]#    systemctl status buildkit.service 


6,安装cni网络插件

CNI:Container network interface容器网络接口,为容器分配ip地址网卡等

[root@os-240 ~]#   mkdir  -p /opt/cni/bin

[root@os-240 ~]#   tar xvf cni-plugins-linux-amd64-v1.2.0.tgz -C /opt/cni/bin/


# 给containerd配置一个网络
root@containerd:/tools# nerdctl network create docker0


#如不配置网络,会有以下报错。
# Mar 24 10:14:51 os-240 containerd: time="2023-03-24T10:14:51.282280892+08:00" level=error msg="failed to load cni during init, please check CRI plugin status before setting up network for pods" error="cni config load failed: no network config found in /etc/cni/net.d: cni plugin not initialized: failed to load cni config"



[root@os-240 ~]# nerdctl network ls
NETWORK ID      NAME       FILE
17f29b073143    bridge     /etc/cni/net.d/nerdctl-bridge.conflist
297a8b73df18    docker0    /etc/cni/net.d/nerdctl-docker0.conflist
                host       
                none       

[root@os-240 ~]# nerdctl network create bridge


# 最后重启containerd
root@containerd:/tools#   systemctl restart containerd.service 


# 创建容器时,不加--netwrok 参数时,默认使用bridge网卡。


[root@os-240 ~]# nerdctl run -dt --name=nginx --network docker0 -p 8082:80 docker.io/library/nginx:latest
#以上添加network命令使用docker0网络,网络配置文件内容可以修改 /etc/cni/net.d/nerdctl-docker0.conflist。


7,安装命令工具,这里使用nerdctl,与docker命令基本一样。

[root@os-240 ~]#  tar xvf nerdctl-1.2.1-linux-amd64.tar.gz 
[root@os-240 ~]#  cp nerdctl /usr/local/bin/

[root@os-240 ~]#   cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
                               overlay
                               br_netfilter
                               EOF

[root@os-240 ~]#  sudo modprobe overlay
[root@os-240 ~]#  sudo modprobe br_netfilter


[root@os-240 ~]#  systemctl restart containerd.service 


8,命令补全

[root@os-240 ~]#   source /usr/share/bash-completion/bash_completion
[root@os-240 ~]#   source <(nerdctl completion bash)
[root@os-240 ~]#   echo "source <(nerdctl completion bash)" >> ~/.bashrc
[root@os-240 ~]#   source ~/.bashrc


[root@os-240 ~]#   ln -s /usr/local/bin/nerdctl /usr/local/bin/docker


# 实现与docker命令操作一样的效果


9,命令测试

[root@os-240 ~]# nerdctl run -dt --name=nginxweb --network docker0 -p 8083:80 docker.io/library/nginx:latest
7181edec2d8a556ac8d2fbbff36123797963ac7091ec2d44a66efacb2732237d
 
[root@os-240 ~]# docker  ps 
CONTAINER ID    IMAGE                             COMMAND                   CREATED              STATUS    PORTS                   NAMES
7181edec2d8a    docker.io/library/nginx:latest    "/docker-entrypoint.…"    5 seconds ago        Up        0.0.0.0:8083->80/tcp    nginxweb
 
[root@os-240 ~]# 
[root@os-240 ~]# curl -i 127.0.0.1:8083

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。