聊聊Kubernetes移除docker

Kubernetes 宣布在1.24版本移除 dockershim,不在支持docker,官方给出的解释:

简单总结下:

官方建议使用实现CRI插件接口的容器运行时作为kubernetes的容器引擎,比较常见的实现CRI插件接口的容器运行时有containerd、CRI-O,这里主要介绍containerd,也是本人在生产上使用的。

1.24 之后的版本使用containerd 作为容器的运行时,移除dockershim。

kubernetes 移除 dockershim

移除dockershim后kubernetes 使用 CRI 插件和 containerd 容器引擎进行通信来管理容器

kubernetes 使用 CRI插件和containerd 通信

dockershim 和CRI 的由来

在 Kubernetes 的早期,Docker 是唯一受支持的容器运行时,Kubernetes 使用了Docker提供的API来执行各种操作方式来管理容器。Kubernetes 的核心组件之一 kubelet 会直接和Docker守护进程(Docker Daemon)通信。

然而,这也意味着Kubernetes在一定程度上被绑定在了Docker这一特定的容器平台上。随着时间的推移和容器生态的发展,这种直接依赖导致了灵活性不足和扩展性问题,为了让 Kubernetes 能够使用各种容器运行时而不再与 Docker 强耦合,Kubernetes官方设计了CRI(容器运行时接口)。

而dockershim是在CRI提出之后由Kubernetes社区开发的,是作为 Kubernetes 与 Docker 间的适配层。这是因为现有的 Kubernetes 系统是直接与 Docker Daemon 通信的,引入 CRI 后,需要一个桥接组件来继续支持 Docker 容器。所以dockershim就承担了这个角色,它实现了 CRI,允许通过标准化的接口与旧的 Docker Daemon 通信。

随着时间的推移,兼容CRI 的其他容器运行时像 containerd 和 CRI-O 的成熟与普及,dockershim 组件不再是必需的,因为更多的 Kubernetes 集群转向直接使用其他更加符合 CRI 标准的容器运行时,Kubernetes 官方也宣布了对dockershim的弃用计划。

这里先介绍下 CRI 、OCI、CNI

OCI:开放容器倡议( Open Container Initiative)

开放容器倡议(Open Container Initiative,OCI)的起源可以追溯到2015年,那时容器技术迅速发展,尤其是以Docker为代表的容器化技术获得了广泛的关注和采用。然而,随着越来越多的公司和组织创建自己的容器标准和实现,这种分裂引发了对兼容性和标准化的担忧。业界认识到一个统一的标准有助于提高效率,减少分歧,促进创新。为了应对这一挑战,2015年6月,Docker公司宣布将其容器格式和运行时、镜像规范和容器运行时标准化为开源项目,并将这些代码捐赠给新成立的开放容器项目(Open Container Project,OCP),后来这个项目被更名为开放容器倡议(OCI)。

OCI 得到了包括微软、谷歌、红帽、VMware、centos在内的众多公司支持。它旨在定义一组标准,规范的容器格式和运行时行为,确保不论在哪个环境中都能保持一致性和互操作性。

目前已经了符合OCI标准的容器运行时和镜像规范,比较常见的有:

  1. containerd: Docker 的核心组件之一,后来发展成为一个独立的容器运行时,完全兼容 OCI 规范
  2. CRI-O: 是一个轻量级的容器运行时,完全兼容 OCI 容器规范,并专门设计来运行 Kubernetes Pod 容器。
  3. Podman: 由Red Hat开发,可以作为Docker的替代品,同样遵循 OCI 规范。

CRI:容器运行时接口( Container Runtime Interface )

容器运行时接口(Container Runtime Interface,CRI)是Kubernetes 提出的一个插件接口,它定义了一套与不同的容器运行时进行交互通信的标准接口,以标准化Kubernetes与容器运行时这一底层技术之间的通信,减少了Kubernetes项目对于任何特定容器技术的依赖。

containerd 和 CRI-O 都是实现了 CRI(Container Runtime Interface)的容器运行时。它们与 Kubernetes 的 kubelet 组件通信,遵循 CRI 协议来管理容器的生命周期。CRI 的出现使得 Kubernetes 可以以统一的方式与任何实现了这些接口的容器运行时协作。

CNI: 容器网络接口(Container Network Interface)

在容器生态系统出现初期,Docker 成为开创性的产品,提供了容器的基础性能,容器网络的配置通常是由容器运行时(Docker)自己的网络解决方案(CNM)来处理的。随着容器技术的快速发展,出现了更多的容器运行平台和编排系统,比如 Kubernetes和Mesos ,每个系统都有自己的网络配置方法,为了实现这容器能够互相通信以及与外部世界通信。需要对每个容器进行网络配置,包括分配IP地址,设置路由规则,管理网络接口等。在CNI出现之前,不同容器运行时和编排系统往往采用它们自己的网络配置方法,这些方法通常不相互兼。

为了解决这个问题,需要一个通用的网络接口,使得容器的网络配置可以跨不同的容器运行时和编排系统实现标准化和互操作。于是,CoreOS 团队发起了 CNI 项目,并于 2015 年将其贡献给了社区。

CNI 提供了一个标准化的网络接口,让网络配置和管理对于容器编排平台来说是通用的。 让不同的网络提供商可以在为 Kubernetes 和其他平台提供服务的同时,保持它们自己网络解决方案的特性和优势,一些知名的 CNI 插件如 Calico、Flannel。

下面来介绍下containerd的安装和使用

containerd 安装

containerd 是一个容器运行时,管理和控制容器的整个生命周期。这个守护进程根据项目的需要创建、执行和销毁容器。除了管理容器生命周期之外,它还负责其他一些职责,如拉取容器镜像、允许容器网络以及在项目进行中挂载存储。containerd 最初是由 Docker 公司开发的。

  1. 安装 containerd

下载解压container

# 下载安装包
wget https://github.com/containerd/containerd/releases/download/v1.7.15/containerd-1.7.15-linux-amd64.tar.gz

# 解压
[root@localhost soft]# tar Cxzvf /usr/local containerd-1.7.15-linux-amd64.tar.gz
bin/
bin/ctr
bin/containerd
bin/containerd-shim
bin/containerd-shim-runc-v2
bin/containerd-shim-runc-v1
bin/containerd-stress

创建 containerd service 服务

cat  > /usr/lib/systemd/system/containerd.service << 'EOF'
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment="ENABLE_CRI_SANDBOXES=sandboxed"
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
EOF

设置开机自动启动 containerd

[root@localhost containerd]# systemctl enable containerd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /usr/lib/systemd/system/containerd.service.

启动 containerd

systemctl start containerd
  1. 安装 runc

runc 是实现了 Open Container Initiative(OCI)的容器运行时规范,runc 的核心作用是根据 OCI 规范提供的容器规格(Specification)来创建和运行容器。安装 containerd 需要 runc 的原因是 containerd 使用了 runc 作为其底层的容器运行时。containerd 提供了容器的生命周期管理能力,例如镜像拉取、容器创建、执行、停止和删除等操作,而实际上创建和执行容器的工作是通过调用 runc 完成的

# 下载安装包
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64

# 安装 runc
install -m 755 runc.amd64 /usr/local/sbin/runc
[root@localhost soft]# runc --version
runc version 1.1.12
commit: v1.1.12-0-g51d5e946
spec: 1.0.2-dev
go: go1.20.13
libseccomp: 2.5.4
  1. 安装CNI 插件

默认Containerd管理的容器仅有lo网络,无法访问容器之外的网络,CNI 插件可以为其添加网络插件, 使用容器可以连接外网。

# 下载安装包
wget https://github.com/containernetworking/plugins/releases/download/v1.4.1/cni-plugins-linux-amd64-v1.4.1.tgz

# 创建安装目录
mkdir -p /opt/cni/bin

# 解压到安装目录
tar Cxzvf /opt/cni/bin  cni-plugins-linux-amd64-v1.4.1.tgz
[root@localhost soft]# ll /opt/cni/bin/
total 79156
-rw-r--r-- 1 test docker    11357 Mar 12 18:56 LICENSE
-rw-r--r-- 1 test docker     2343 Mar 12 18:56 README.md
-rwxr-xr-x 1 test docker  4119661 Mar 12 18:56 bandwidth
-rwxr-xr-x 1 test docker  4662227 Mar 12 18:56 bridge
-rwxr-xr-x 1 test docker 11065251 Mar 12 18:56 dhcp
-rwxr-xr-x 1 test docker  4306546 Mar 12 18:56 dummy
-rwxr-xr-x 1 test docker  4751593 Mar 12 18:56 firewall
-rwxr-xr-x 1 test docker  4198427 Mar 12 18:56 host-device
-rwxr-xr-x 1 test docker  3560496 Mar 12 18:56 host-local
-rwxr-xr-x 1 test docker  4324636 Mar 12 18:56 ipvlan
-rwxr-xr-x 1 test docker  3651038 Mar 12 18:56 loopback
-rwxr-xr-x 1 test docker  4355073 Mar 12 18:56 macvlan
-rwxr-xr-x 1 test docker  4095898 Mar 12 18:56 portmap
-rwxr-xr-x 1 test docker  4476535 Mar 12 18:56 ptp
-rwxr-xr-x 1 test docker  3861176 Mar 12 18:56 sbr
-rwxr-xr-x 1 test docker  3120090 Mar 12 18:56 static
-rwxr-xr-x 1 test docker  4381887 Mar 12 18:56 tap
-rwxr-xr-x 1 test docker  3743844 Mar 12 18:56 tuning
-rwxr-xr-x 1 test docker  4319235 Mar 12 18:56 vlan
-rwxr-xr-x 1 test docker  4008392 Mar 12 18:56 vrf
  1. 配置 containerd
# 创建配置目录
mkdir -pv  /etc/containerd

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


  1. 安装 containerd cli 客户端

客户端

介绍

ctr

是 containerd 的低级别命令行客户端,主要被用于开发和调试目的

nerdctl

提供一个熟悉的接口给习惯使用 Docker 命令的用户

crictl

主要在k8s中使用,用于与实现了 Kubernetes CRI (Container Runtime Interface) 的容器运行时交互,只要实现了CRI的容器都可以使用,比如 CRI-O

接下来介绍nerdctl 的安装

wget https://github.com/containerd/nerdctl/releases/download/v1.7.5/nerdctl-1.7.5-linux-amd64.tar.gz

mkdir  /opt/soft/nerdctl
 tar -zxvf nerdctl-1.7.5-linux-amd64.tar.gz -C /opt/soft/nerdctl
 ln -s/opt/soft/nerdctl/nerdctl /usr/local/bin
 
 # 验证
 nerdctl run  -d  --name nginx nginx
[root@localhost soft]#  nerdctl run -d --name nginx nginx
0d16bbc0f8d00efa03128246e9815fc4c906b304f1645837a06608b359c0f2db
[root@localhost soft]# nerdctl ps -a
CONTAINER ID    IMAGE                             COMMAND                   CREATED           STATUS                      PORTS    NAMES
0d16bbc0f8d0    docker.io/library/nginx:latest    "/docker-entrypoint.…"    15 seconds ago    Up                                   nginx
38e805193b50    docker.io/library/redis:alpine    "docker-entrypoint.s…"    3 minutes ago     Exited (0) 3 minutes ago             redis

nerdctl 提供了与相似的 docker 命令,对比 nerdctl 和 docker 命令时,可以发现它们在许多常用功能上有相似的命令和选项,例如创建和管理容器、构建和管理镜像、网络设置等


nerdctl

docker

拉取镜像

nerdctl pull

docker pull

显示所有镜像

nerdctl images

docker images

运行容器

nerdctl run

docker run

查看日志

nerdctl logs

docker logs

进入容器

nerdctl exec

docker exec


更多关于nerdctl 的详细命令使用,可以参考下面的文档

nerdctl/docs/command-reference.md at main · containerd/nerdctl · GitHub

展开阅读全文

页面更新:2024-04-13

标签:兼容性   容器   组件   插件   接口   命令   通信   标准   项目   网络

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top