实战-centos7上containerd的安装-v1-5-5-20211023-测试成功
实战:centos7上containerd的安装(测试成功)-2021.10.23
💘 实践:centos7上containerd的安装(成功测试)-2021.10.23 |
---|
实验环境
实验环境:1、win10笔记本2、1台centos7.6虚机(vmwrokstation虚机)cri-containerd-cni-1.5.5-linux-amd64.tar.gz
实验软件
2、下载containerd软件包并解压
由于 containerd 需要调用 runc,所以我们也需要先安装 runc,不过 containerd 提供了一个包含相关依赖的压缩包 cri-containerd-cni-${VERSION}.${OS}-${ARCH}.tar.gz
,可以直接使用这个包来进行安装。首先从 release页面下载最新版本的压缩包,当前为 1.5.5 版本(注意:最新的1.5.7版本在CentOS7下面执行 runc 会报错:
该issue:
直接将压缩包解压到系统的各个目录中:
[root@containerd ~]#tar -C / -xzf cri-containerd-cni-1.5.5-linux-amd64.tar.gz
当然要记得将 /usr/local/bin
和 /usr/local/sbin
追加到 ~/.bashrc
文件的 PATH
环境变量中:
[root@containerd ~]#vim ~/.bashrcexport PATH=$PATH:/usr/local/bin:/usr/local/sbin #添加这行
然后执行下面的命令使其立即生效:
[root@containerd ~]#source ~/.bashrc
注意:centos7默认的PAH就已经包含了
/usr/local/bin
和/usr/local/sbin
路径,但老师这里还是手动添加了这2个路径,我这里就继续添加下吧。
3、生成containerd 的默认配置文件config.toml
containerd 的默认配置文件为 /etc/containerd/config.toml
,我们可以通过如下所示的命令生成一个默认的配置:
[root@containerd ~]#mkdir -p /etc/containerd[root@containerd ~]#containerd config default >/etc/containerd/config.toml
由于上面我们下载的 containerd 压缩包中包含一个 etc/systemd/system/containerd.service
的文件,这样我们就可以通过 systemd 来配置 containerd 作为守护进程运行了,内容如下所示:
[root@containerd ~]#ll /etc/systemd/system/containerd.service-rw-r--r-- 1 1001 116 1270 Jul 30 01:12 /etc/systemd/system/containerd.service[root@containerd ~]#cat !$cat /etc/systemd/system/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:## 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 runtimeDocumentation=https:After=network.target local-fs.target[Service]ExecStartPre=-/sbin/modprobe overlayExecStart=/usr/local/bin/containerdType=notifyDelegate=yesKillMode=processRestart=alwaysRestartSec=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=infinityLimitCORE=infinityLimitNOFILE=infinity# Comment TasksMax if your systemd version does not supports it.# Only systemd 226 and above support this version.TasksMax=infinityOOMScoreAdjust=-999[Install]WantedBy=multi-user.target[root@containerd ~]#
这里有两个重要的参数:
Delegate
:这个选项允许 containerd 以及运行时自己管理自己创建容器的 cgroups。如果不设置这个选项,systemd 就会将进程移到自己的 cgroups 中,从而导致 containerd 无法正确获取容器的资源使用情况。KillMode
:这个选项用来处理 containerd 进程被杀死的方式。**默认情况下,systemd 会在进程的 cgroup 中查找并杀死 containerd 的所有子进程。**KillMode 字段可以设置的值如下。control-group
(默认值):当前控制组里面的所有子进程,都会被杀掉process
:只杀主进程mixed
:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号none
:没有进程会被杀掉,只是执行服务的 stop 命令
我们需要将 KillMode 的值设置为 process,这样可以确保升级或重启 containerd 时不杀死现有的容器。
注意:这里自己对这个KillMode参数的说明比较模糊,后期注意下。
4、追加1:配置镜像加速器地址
我们首先来查看下上面默认生成的配置文件 /etc/containerd/config.toml
:
[root@containerd ~]#cat /etc/containerd/config.tomldisabled_plugins =[]imports =[]oom_score =0plugin_dir =""required_plugins =[]root ="/var/lib/containerd"state ="/run/containerd"version =2[cgroup]path =""[debug]address =""format =""gid =0level =""uid =0[grpc]address ="/run/containerd/containerd.sock"gid =0max_recv_message_size =16777216max_send_message_size =16777216tcp_address =""tcp_tls_cert =""tcp_tls_key =""uid =0[metrics]address =""grpc_histogram =false[plugins][plugins."io.containerd.gc.v1.scheduler"]deletion_threshold =0mutation_threshold =100pause_threshold =0.02schedule_delay ="0s"startup_delay ="100ms"[plugins."io.containerd.grpc.v1.cri"]disable_apparmor =falsedisable_cgroup =falsedisable_hugetlb_controller =truedisable_proc_mount =falsedisable_tcp_service =trueenable_selinux =falseenable_tls_streaming =falseignore_image_defined_volumes =falsemax_concurrent_downloads =3max_container_log_line_size =16384netns_mounts_under_state_dir =falserestrict_oom_score_adj =falsesandbox_image ="k8s.gcr.io/pause:3.5"selinux_category_range =1024stats_collect_period =10stream_idle_timeout ="4h0m0s"stream_server_address ="127.0.0.1"stream_server_port ="0"systemd_cgroup =falsetolerate_missing_hugetlb_controller =trueunset_seccomp_profile =""[plugins."io.containerd.grpc.v1.cri".cni]bin_dir ="/opt/cni/bin"conf_dir ="/etc/cni/net.d"conf_template =""max_conf_num =1[plugins."io.containerd.grpc.v1.cri".containerd]default_runtime_name ="runc"disable_snapshot_annotations =truediscard_unpacked_layers =falseno_pivot =falsesnapshotter ="overlayfs"[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]base_runtime_spec =""container_annotations =[]pod_annotations =[]privileged_without_host_devices =falseruntime_engine =""runtime_root =""runtime_type =""[plugins."io.containerd.grpc.v1.cri".containerd.default_runtime.options][plugins."io.containerd.grpc.v1.cri".containerd.runtimes][plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]base_runtime_spec =""container_annotations =[]pod_annotations =[]privileged_without_host_devices =falseruntime_engine =""runtime_root =""runtime_type ="io.containerd.runc.v2"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]BinaryName =""CriuImagePath =""CriuPath =""CriuWorkPath =""IoGid =0IoUid =0NoNewKeyring =falseNoPivotRoot =falseRoot =""ShimCgroup =""SystemdCgroup =false[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime]base_runtime_spec =""container_annotations =[]pod_annotations =[]privileged_without_host_devices =falseruntime_engine =""runtime_root =""runtime_type =""[plugins."io.containerd.grpc.v1.cri".containerd.untrusted_workload_runtime.options][plugins."io.containerd.grpc.v1.cri".image_decryption]key_model ="node"[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.headers][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]tls_cert_file =""tls_key_file =""[plugins."io.containerd.internal.v1.opt"]path ="/opt/containerd"[plugins."io.containerd.internal.v1.restart"]interval ="10s"[plugins."io.containerd.metadata.v1.bolt"]content_sharing_policy ="shared"[plugins."io.containerd.monitor.v1.cgroups"]no_prometheus =false[plugins."io.containerd.runtime.v1.linux"]no_shim =falseruntime ="runc"runtime_root =""shim ="containerd-shim"shim_debug =false[plugins."io.containerd.runtime.v2.task"]platforms =["linux/amd64"][plugins."io.containerd.service.v1.diff-service"]default =["walking"][plugins."io.containerd.snapshotter.v1.aufs"]root_path =""[plugins."io.containerd.snapshotter.v1.btrfs"]root_path =""[plugins."io.containerd.snapshotter.v1.devmapper"]async_remove =falsebase_image_size =""pool_name =""root_path =""[plugins."io.containerd.snapshotter.v1.native"]root_path =""[plugins."io.containerd.snapshotter.v1.overlayfs"]root_path =""[plugins."io.containerd.snapshotter.v1.zfs"]root_path =""[proxy_plugins][stream_processors][stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]accepts =["application/vnd.oci.image.layer.v1.tar+encrypted"]args =["--decryption-keys-path","/etc/containerd/ocicrypt/keys"]env =["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]path ="ctd-decoder"returns ="application/vnd.oci.image.layer.v1.tar"[stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]accepts =["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]args =["--decryption-keys-path","/etc/containerd/ocicrypt/keys"]env =["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]path ="ctd-decoder"returns ="application/vnd.oci.image.layer.v1.tar+gzip"[timeouts]"io.containerd.timeout.shim.cleanup"="5s""io.containerd.timeout.shim.load"="5s""io.containerd.timeout.shim.shutdown"="3s""io.containerd.timeout.task.state"="2s"[ttrpc]address =""gid =0uid =0[root@containerd ~]#
这个配置文件比较复杂,我们可以将重点放在其中的 plugins
配置上面,仔细观察我们可以发现每一个顶级配置块的命名都是 plugins."io.containerd.xxx.vx.xxx"
这种形式,每一个顶级配置块都表示一个插件,其中 io.containerd.xxx.vx
表示插件的类型,vx
后面的 xxx
表示插件的 ID,我们可以通过 ctr
查看插件列表:
[root@containerd ~]#ctr plugin lsTYPE ID PLATFORMS STATUSio.containerd.content.v1 content - okio.containerd.snapshotter.v1 aufs linux/amd64 skipio.containerd.snapshotter.v1 btrfs linux/amd64 skipio.containerd.snapshotter.v1 devmapper linux/amd64 errorio.containerd.snapshotter.v1 native linux/amd64 okio.containerd.snapshotter.v1 overlayfs linux/amd64 okio.containerd.snapshotter.v1 zfs linux/amd64 skipio.containerd.metadata.v1 bolt - okio.containerd.differ.v1 walking linux/amd64 okio.containerd.gc.v1 scheduler - okio.containerd.service.v1 introspection-service - okio.containerd.service.v1 containers-service - okio.containerd.service.v1 content-service - okio.containerd.service.v1 diff-service - okio.containerd.service.v1 images-service - okio.containerd.service.v1 leases-service - okio.containerd.service.v1 namespaces-service - okio.containerd.service.v1 snapshots-service - okio.containerd.runtime.v1 linux linux/amd64 okio.containerd.runtime.v2 task linux/amd64 okio.containerd.monitor.v1 cgroups linux/amd64 okio.containerd.service.v1 tasks-service - okio.containerd.internal.v1 restart - okio.containerd.grpc.v1 containers - okio.containerd.grpc.v1 content - okio.containerd.grpc.v1 diff - okio.containerd.grpc.v1 events - okio.containerd.grpc.v1 healthcheck - okio.containerd.grpc.v1 images - okio.containerd.grpc.v1 leases - okio.containerd.grpc.v1 namespaces - okio.containerd.internal.v1 opt - okio.containerd.grpc.v1 snapshots - okio.containerd.grpc.v1 tasks - okio.containerd.grpc.v1 version - okio.containerd.grpc.v1 cri linux/amd64 ok[root@containerd ~]#
顶级配置块下面的子配置块表示该插件的各种配置,比如 cri 插件下面就分为 containerd、cni 和 registry 的配置,而 containerd 下面又可以配置各种 runtime,还可以配置默认的 runtime。比如现在我们要为镜像配置一个加速器,那么就需要在 cri 配置块下面的 registry
配置块下面进行配置 registry.mirrors
:
注意缩进:
[root@containerd ~]#vim /etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri".registry][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint=["https:[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]endpoint=["https:state ="/run/containerd"
其中 root
是用来保存持久化数据,包括 Snapshots,Content,Metadata 以及各种插件的数据,每一个插件都有自己单独的目录,Containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件。
而另外的 state
是用来保存运行时的临时数据的,包括 sockets、pid、挂载点、运行时状态以及不需要持久化的插件数据。
到此,关于containerd安装结束!
5、追加2:将 containerd 的 cgroup driver 配置为 systemd
对于使用 systemd 作为 init system 的 Linux 的发行版,使用 systemd
作为容器的 cgroup driver
可以确保节点在资源紧张的情况更加稳定,所以推荐将 containerd 的 cgroup driver 配置为 systemd。
修改方法:
修改前面生成的配置文件 /etc/containerd/config.toml
,在 plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options
配置块下面将 SystemdCgroup
设置为 true
:
#通过搜索SystemdCgroup进行定位vim/etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]...[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup=true....#注意:最终输出shell命令:sed-i"s/SystemdCgroup =false/SystemdCgroup =true/g"/etc/containerd/config.toml
备注:
如果 linux 系统使用 systemd 初始化系统,初始化进程会生成一个 root cgroup,每个
systemd unit
都将会被分配一个cgroup,同样可以配置容器运行时如 containerd 选择使用 cgroupfs 或 systemd 作为 cgroup 驱动,containerd 默认使用的是 cgroupfs,但对于使用了 systemd 的 linux 发行版来说就同时存在两个 cgroup 管理器,对于该服务器上启动的容器使用的是cgroupfs,而对于其他 systemd 管理的进程使用的是 systemd,这样在服务器资源负载高的情况下可能会变的不稳定。因此对于使用了 systemd 的 linux 系统,推荐将容器运行时的 cgroup 驱动使用 systemd。
6、启动containerd服务
现在我们就可以启动 containerd 了,直接执行下面的命令即可:
[root@containerd ~]#systemctl daemon-reload[root@containerd ~]#systemctl restart containerd
7、验证
启动完成后就可以使用 containerd 的本地 CLI 工具 ctr
和 crictl
了,比如查看版本:
➜ ~ctr version➜ ~crictl version
FAQ
注意:libseccomp-devel.x86_64和libseccomp.x86_64 2个软件包有什么区别?
01.老师亲自实战安装的是libseccomp-devel.x86_64软件,但文档上提供的是libseccomp.x86_64软件,2者实验都是没问题的; 02.自己最后建议按文档上的来吧,自己也是按文档上的来吧,也就是说使用yum install -y libseccomp.x86_64即可!
[root@containerd ~]#yum search libseccomp Loaded plugins:fastestmirror Loading mirror speeds from cached hostfile
- base:mirrors.aliyun.com
- extras:mirrors.aliyun.com
- updates:mirrors.aliyun.com ========================================================================N/S matched:libseccomp ========================================================================libseccomp-devel.i686 :Development files used to build applications with libseccomp support libseccomp-devel.x86_64 :Development files used to build applications with libseccomp support libseccomp.i686 :Enhanced seccomp library libseccomp.x86_64 :Enhanced seccomp library
Name and summary matches only,use "search all"for everything. [root@containerd ~]#
注意:如果有配置config.toml文件,一定要记得先reload一下配置文件,再重启服务
#配置完成后记得重启下containerdsystemctldaemon-reloadsystemctlrestartcontainerd
注意:containerd的k8s集群,pod跨节点请求出现了点问题
master1上无法访问其他节点pod,但在pod所在节点上可以访问:
[root@node2 ~]#curl http:<!DOCTYPEhtml><html><head><title>Welcome to nginx!</title><style>html{color-scheme:lightdark;}body{width:35em;margin:0auto;font-family:Tahoma,Verdana,Arial,sans-serif;}</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page,the nginx web server is successfully installed andworking.Furtherconfigurationisrequired.</p><p>For online documentation and support please refer to<a href="http:Commercialsupportisavailableat<a href="http:<p><em>Thank you forusing nginx.</em></p></body></html>
这个问题好无语啊。。。。感觉像是flannel插件哪里出问题了。。。。。
跨节点也是ping测试失败的。。。。
master节点上没有cni0,以及flannel.1地址:
我重建下allnode的flannel pod,再尝试一次:
重建flannel pod后发现master1上出现了flannel.1地址:
此时再次测试,观看效果:
ping测试,跨节点也是没有任何问题的;
curl测试nginx也是没问题的:
结论:
注意:老师重建flannel网络命令
ifconfig cni0 down &&ip link delete cni0 ifconfig flannel.1 down &&ip link delete flannel.1
输出脚本
2021-10-31更新脚本:
cd/root/yuminstalllibseccomp-ywgethttps:tar-C/-xzfcri-containerd-cni-1.5.5-linux-amd64.tar.gzecho"export PATH=$PATH:/usr/local/bin:/usr/local/sbin">>~/.bashrcsource~/.bashrcmkdir-p/etc/containerdcontainerdconfigdefault>/etc/containerd/config.tomlsed-i"s/SystemdCgroup =false/SystemdCgroup =true/g"/etc/containerd/config.toml# 将 containerd 的 cgroup driver 配置为 systemd,需要手动配置!systemctldaemon-reloadsystemctlenablecontainerd--nowcriversioncrictlversion
关于我
我的博客主旨:我希望每一个人拿着我的博客都可以做出实验现象,先把实验做出来,然后再结合理论知识更深层次去理解技术点,这样学习起来才有乐趣和动力。并且,我的博客内容步骤是很完整的,也分享源码和实验用到的软件,希望能和大家一起共同进步!
各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人免费帮您解决问题:
- 个人微信二维码:x2675263825 (舍得), qq:2675263825。
- 个人博客地址:www.onlyonexl.cn
- 个人微信公众号:云原生架构师实战
- 个人csdn https:
版权:此文章版权归 One 所有,如有转载,请注明出处!
链接:可点击右上角分享此页面复制文章链接