文章目录
- 一、环境准备
- 二、K8s安装和集群初始化
- 三、使用k8s 集调度运行pod
- 四、疑惑
- (1). kubectl get pods -o wide -A 是什么意思?
- (2). kubectl apply -f kube-flannel.yml 是什么意思?
- (3). k8s 中 node 和 pod 的区别?
- (4). `sysctl -f /etc/sysctl.d/k8s.conf` 什么意思?
- (5). `containerd config dump`和`containerd config default`有什么区别?
- (6). `kubectl kubelet kubeadm` 这几个的区别?
- (7). `kubeadm config images pull --config init.yml` 和 `crictl -r unix:///var/run/containerd/containerd.sock pull [registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8](http://registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8)` 的区别?
- (8). `containerd`的命名空间和`Kubernetes`命名空间有什么区别?
- (9). `kubectl get pods` 是什么意思?
- (10). `containerd`和`docker`的区别?
一、环境准备
设计思路
配置网络和ip
control: 192.168.110.10/24
node1: 192.168.110.11/24
node2: 192.168.110.22/24
GW: 192.168.110.2
DNS1: 114.114.114.114
DNS2: 223.5.5.5
从下面开始,所有的操作需要在三个节点上一起执行。
配置hosts文件
// 文件中新增以下三行
192.168.110.10 control
192.168.110.11 node1
192.168.110.22 node2
允许系统转发 ipv4 数据包
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/k8s.conf
# 读取文件内核配置
sysctl -f /etc/sysctl.d/k8s.conf
# 查看
sysctl net.ipv4.ip_forward
设置容器运行时
# 清理一下环境
dnf remove -y podman container* runc*
# 安装仓库配置命令行工具
dnf -y install dnf-utils
# 设置docker仓库,用来安装docker和containerd服务
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
dnf -y install docker-ce docker-ce-cli containerd.io
# 确保containerd服务开机自启
systemctl enable --now containerd.service
# 生成包含所有containerd默认设置的配置文件
containerd config default > /etc/containerd/config.toml
# 重启服务
systemctl restart containerd.service
编辑 /etc/containerd/config.toml
# 重启服务
systemctl restart containerd.service
禁用swap交换分区
swapoff -a
禁止交换分区在重启后挂载激活 vim /etc/fstab
禁用SELINUX
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
禁用防火墙
systemctl disable --now firewalld.service
nft flush ruleset
二、K8s安装和集群初始化
(1)安装k8s 安装工具的软件包
编辑所需的yum仓库 vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
安装Kubernetes及组件
dnf -y install kubectl kubelet kubeadm --disableexcludes=kubernetes
systemctl enable kubelet.service
(2) 集群初始化
获取初始化的默认配置
kubeadm config print init-defaults >> init.yml
更改镜像的地址
为加快集群初始化进程,提前下载集群运行的镜像
kubeadm config images pull --config init.yml
在集群初始化时,还是使用较早版本的pause:3.8 ,手动下载并修改镜像仓库标记即可。
拉取pause:3.8镜像 下面这条命令的作用等同于docker pull
crictl -r unix:///var/run/containerd/containerd.sock pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8
查看容器命名空间
ctr namespace list
改名,这条命令的作用等于docker tag
ctr --namespace k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8 registry.k8s.io/pause:3.8
查看所有containerd 可以使用的镜像
crictl -r unix:///var/run/containerd/containerd.sock images
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns # k8S 集群内部的域名解析
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd # 存储K8S集群的状态数据
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver # K8S的调用接口
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager # K8S 的控制器
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy #工作节点代理
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler # pod的调度
registry.cn-hangzhou.aliyuncs.com/google_containers/pause # K8S的基础设施
保证所有的节点都有以上列出的所有镜像后,开始调整初始化配置并进行集群的初始化 init.yml
运行初始化命令:(只需要在控制节点上运行即可)
kubeadm init --config init.yml
集群内加入新节点的指令,这个指令最好保存下来方便使用
保存控制节点的访问配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# echo引号中的内容来自初始化输出,直接复制即可,每个人的值都不一样
echo 'kubeadm join 192.168.110.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:6ca63b1e4c639dbb7b7222a2dc5cb2f0ccaaf57f159310be5810ea7006b6f388' > .kube/node_join
检查目前集群状态
kubectl get pods -o wide -A
有两个pod的状态不是running,原因是没有设置集群需要的网络插件
在node1 和 node2 上执行加入集群的指令(刚刚保存的)
kubeadm join 192.168.110.10:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:6ca63b1e4c639dbb7b7222a2dc5cb2f0ccaaf57f159310be5810ea7006b6f388'
在控制节点查看集群节点状态
kubectl get nodes
需要为K8S集群设置网络插件,才是完成了K8S集群的搭建,搭建完成后还可以使用更多的网络插件,结合不同项目的部署需要和实际组网需求。
(3)部署flannel 网络插件
为K8S集群设置flannel网络,网络插件以扁平化的网络管理模型,实现K8S集群中pod的通信,管理配置相当简单。
在控制节点配置完成:
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
启动容器
systemctl start docker
systemctl disable docker.service
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 223.5.5.5
nameserver 8.8.8.8
systemctl restart docker
拉取镜像
docker pull docker.io/flannel/flannel:v0.25.6
docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2
导出镜像并同步给node1 node2,然后导入到containerd的镜像仓库中,使用ctr
# 导出镜像
docker save -o flannel.tar flannel/flannel:v0.25.6
docker save -o flannel-cni.tar flannel/flannel-cni-plugin:v1.5.1-flannel2
# 同步
scp flannel.tar root@node1:/root
scp flannel-cni.tar root@node1:/root
scp flannel.tar root@node2:/root
scp flannel-cni.tar root@node2:/root
# 在三个节点上导入镜像仓库中
ctr --namespace k8s.io image import flannel.tar
ctr --namespace k8s.io image import flannel-cni.tar
crictl -r unix:///var/run/containerd/containerd.sock images
# 更新资源
kubectl apply -f kube-flannel.yml
此时检查K8S集群的核心组件以及节点的状态,均显示健康
kubectl get pods -o wide -A
# 查看集群节点状态
kubectl get nodes
至此K8S集群部署完成
作为一个较为复杂的平台搭建,生产环境下搭建时可以选择对应的自动化组件完成搭建,简化集群维护和扩展的操作复杂度。
三、使用k8s 集调度运行pod
vim my_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx # 资源名称
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2 # 调度两个pod
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx # 镜像
imagePullPolicy: IfNotPresent # 镜像不存在的时候进行拉取
ports:
- containerPort: 80 # 容器内开放80端口访问
拉取 Nginx 镜像
docker pull nginx # 等待缓慢下载完毕
docker images nginx
导出镜像并导入到node1,node2镜像仓库中
docker save -o nginx.tar nginx:latest
scp nginx.tar root@node1:/root
scp nginx.tar root@node2:/root
在node1 和node2 执行镜像导入操作,应用容器一般都会调度到work节点,所以要保证work节点上有nginx镜像
# 在work导入镜像 (node1 ,node2)
ctr -n k8s.io image import nginx.tar
crictl -r unix:///var/run/containerd/containerd.sock images
在工作节点上导入完毕镜像,就可以回到控制节点上,进行应用的调度
# 更新资源
kubectl apply -f my_nginx.yml
# 查看Kubernetes 集群中 Pod 的状态和信息
kubectl get pods
# 查看pod分到的IP地址,并尝试访问运行在pod中的nginx服务
kubectl get pods -l run=my-nginx -o custom-columns=POD_IP:.status.podIPs
# 访问可以成功 省略输出
curl 10.244.1.2
curl 10.244.2.2
或者在控制节点上打开火狐浏览器进行访问
# 两个pod 一个在node1 一个在node2
kubectl get pods -o wide
四、疑惑
(1). kubectl get pods -o wide -A 是什么意思?
kubectl get pods -o wide -A
是一个 Kubernetes 命令,用于列出集群中所有命名空间的 Pod 的详细信息。下面是这个命令中各个部分的含义:
kubectl
: 这是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。get pods
: 这是一个子命令,用于获取 Pod 的信息。Pod 是 Kubernetes 中的基本运行单元,通常包含一个或多个容器。-o wide
: 这个选项用于指定输出格式为“宽格式”。与默认的输出相比,宽格式会提供更多的信息,比如 Pod 的节点名称、IP 地址和容器状态等。-A
: 这个选项表示“所有命名空间”(All Namespaces)。默认情况下,kubectl get pods
只会显示当前命名空间中的 Pod。使用-A
后,它将列出集群中所有命名空间的 Pod。
因此,运行这个命令后,你将看到一个表格,列出所有 Pod 的名称、状态、节点、IP 地址、容器的状态等信息,适用于监控和管理 Kubernetes 集群中的 Pod。
(2). kubectl apply -f kube-flannel.yml 是什么意思?
kubectl apply -f kube-flannel.yml
命令的主要作用是应用指定的 YAML 配置文件,以便在 Kubernetes 集群中创建或更新资源。在部署 Flannel 等网络插件时,它是一个非常有用的命令。通过使用 apply
,你可以简化资源的管理,确保集群中的配置始终保持最新。
-
kubectl
:- 这是 Kubernetes 的命令行工具,用于与 Kubernetes API 进行交互。它允许用户管理集群资源、部署应用程序、查看日志等。
-
apply
:- 这是
kubectl
的一个子命令,用于创建或更新资源。 - 使用
apply
命令时,如果资源已经存在,Kubernetes 会对其进行更新;如果资源不存在,则会创建新资源。这种方式很方便,因为它能够自动处理资源的更新而不需要先删除再创建。
- 这是
-
-f
:- 这个选项指定要应用的文件。它后面通常跟一个文件名、目录名或 URL。
-f
的全称是--filename
,表示你想要应用的资源定义文件。
-
kube-flannel.yml
:- 这是一个 YAML 格式的文件,定义了要在 Kubernetes 中创建或更新的资源。具体内容通常包括以下几种类型的 Kubernetes 资源:
- Namespaces: 用于组织资源的命名空间。
- ConfigMaps: 配置文件。
- Deployments: 应用的部署策略。
- Services: 服务定义,确保 Pod 能被访问。
- DaemonSets: 确保在每个节点上运行 Pod。
- 这是一个 YAML 格式的文件,定义了要在 Kubernetes 中创建或更新的资源。具体内容通常包括以下几种类型的 Kubernetes 资源:
使用场景
- 网络插件: Flannel 是 Kubernetes 中的一个流行的网络插件,它允许 Pod 之间的通信。使用
kubectl apply -f kube-flannel.yml
可以方便地在集群中部署 Flannel 网络插件。 - 资源管理: 通过 YAML 文件定义的所有 Kubernetes 资源(如 Deployment、Service、ConfigMap 等),可以通过这个命令统一管理和版本控制。
(3). k8s 中 node 和 pod 的区别?
- 定义
-
Node:
- Node 是 Kubernetes 集群中的一台机器(可以是物理机或虚拟机),用于运行容器化的应用程序。
- 每个 Node 都运行一个 Kubernetes 代理(Kubelet),负责与 Kubernetes 控制平面进行通信,管理 Pod 的生命周期,并提供容器运行环境。
- Nodes 还可以运行其他必要的服务,比如 Kube-proxy,用于网络代理和负载均衡。
-
Pod:
- Pod 是 Kubernetes 中的基本执行单元,它可以包含一个或多个紧密关联的容器。这些容器共享存储、网络和运行环境。
- Pod 是运行在 Node 上的,容器在同一个 Pod 中可以互相访问,通常它们共同工作来提供某个功能或服务。
- Pod 具有自己的网络地址(IP),并能够通过该地址与其他 Pod 或服务通信。
- 作用
-
Node:
- 负责提供计算资源和网络连接。
- 可以运行多个 Pod,每个 Node 的资源(如 CPU、内存等)是有限的。
- Nodes 由 Kubernetes 控制平面进行管理和调度,确保 Pod 在集群中合理分布。
-
Pod:
- 负责运行应用程序或服务的实例。
- 可以被扩展或缩减,Kubernetes 根据需求动态调整 Pod 的数量(如通过部署、ReplicaSet 等)。
- Pod 是无状态或有状态的,可以通过 Kubernetes 的状态管理功能来保持应用的状态。
- 关系
- Node 与 Pod 的关系:
- 每个 Pod 必须运行在一个 Node 上。Node 是 Pod 的宿主,Pod 依赖于 Node 的资源来执行容器。
- 一个 Node 上可以运行多个 Pod,但通常受限于 Node 的资源(CPU、内存、存储等)。
- Kubernetes 使用调度器(Scheduler)决定将 Pod 安排到哪个 Node 上。
- 生命周期
-
Node:
- Node 的生命周期包括添加到集群、运行状态、维护状态和从集群中删除。
- Node 可能会由于硬件故障、维护、升级等原因而下线。
-
Pod:
- Pod 的生命周期包括创建、运行、就绪、终止等状态。
- Pod 可以在 Node 故障时被重新调度到其他 Node 上,Kubernetes 会负责恢复 Pod 的状态。
- 使用场景
-
Node:
- 适用于基础设施层面的管理,比如监控节点的状态、资源利用率、故障转移等。
- 可以根据负载水平进行 Node 的扩展(如增加新 Node)。
-
Pod:
- 适用于应用层面的管理,运行特定的应用或服务。
- 可以用于分布式应用程序的管理,像微服务架构中每个服务可以在不同的 Pod 中运行。
总结
- Node 是 Kubernetes 集群的计算资源单元,提供运行环境和资源。
- Pod 是运行在 Node 上的基本应用单元,负责承载容器化的应用程序。
(4). sysctl -f /etc/sysctl.d/k8s.conf
什么意思?
sysctl -f /etc/sysctl.d/k8s.conf
的作用是从 k8s.conf
文件中读取并应用内核参数,以优化系统的行为,特别是针对 Kubernetes 的性能和稳定性。这通常在安装或配置 Kubernetes 集群时使用,以确保系统设置符合 Kubernetes 的要求。
sysctl
sysctl
是一个用于在 Linux 系统中查看和修改内核参数的命令行工具。通过 sysctl
,管理员可以动态地调整内核的行为,而无需重启系统。
-f
选项
-f
选项表示“强制(force)”,用于强制加载指定文件中的参数设置,而忽略任何错误。如果该选项未指定,sysctl
在遇到错误时会停止执行。
(5). containerd config dump
和containerd config default
有什么区别?
containerd config dump
- 功能: 此命令会输出当前运行的 Containerd 实例的完整配置,包括所有自定义的设置以及默认值。如果你对 Containerd 进行了任何修改或者自定义配置,使用这个命令可以获取到这些信息。
- 输出内容: 生成的
config.toml
文件包含了所有有效的配置项,反映了当前系统中 Containerd 的状态和配置。
containerd config default
- 功能: 此命令用于生成一个包含所有默认设置的 Containerd 配置文件,不考虑当前运行实例的配置。它提供的是 Containerd 的“出厂设置”,即在没有任何用户自定义配置的情况下的配置。
- 输出内容: 生成的
config.toml
文件包含了所有可以用的默认参数和选项,这些参数是在默认情况下 Containerd 会使用的。
主要区别
-
内容来源:
config dump
反映的是当前 Containerd 实例的实际配置,包括任何手动修改的设置。config default
则是一个全新的配置文件,包含了所有的默认值,不包含任何修改。
-
用途:
config dump
更适合用于调试和排查问题,因为它提供了实际运行时的配置细节。config default
则适用于希望从默认配置开始重新配置 Containerd 的场景。
如果你希望恢复到默认配置,或者了解默认可用的配置项,使用 containerd config default
是合适的。如果你想要保存当前的配置状态,便于将来参考或者调试,则应使用 containerd config dump
。
(6). kubectl kubelet kubeadm
这几个的区别?
kubectl
: 用于与 Kubernetes API 交互和管理集群资源。kubelet
: 负责在每个节点上管理和运行容器。kubeadm
: 用于安装和配置 Kubernetes 集群。
kubectl
是 Kubernetes 的命令行工具,用于与 Kubernetes API 进行交互。它允许用户管理 Kubernetes 集群中的各种资源。
kubelet
是 Kubernetes 的一个主要组件,作为集群中的每个节点的代理,负责管理和运行容器。
kubeadm
是用于简化 Kubernetes 集群的安装和管理的工具。提供集群初始化 (kubeadm init
) 和加入节点 (kubeadm join
) 的功能。
(7). kubeadm config images pull --config init.yml
和 crictl -r unix:///var/run/containerd/containerd.sock pull [registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8](http://registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8)
的区别?
kubeadm config images pull --config init.yml
这个命令用于根据指定的配置文件 init.yml
拉取 Kubernetes 所需的镜像。
crictl -r unix:///var/run/containerd/containerd.sock pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8
这个命令使用 crictl
工具从指定的容器镜像仓库拉取 pause:3.8
镜像。
- 真正执行拉取操作的命令:
- 如果你是通过
kubeadm
进行镜像拉取,kubeadm
会调用底层的容器运行时来执行拉取,但实际的拉取操作是由运行时(如 Docker 或 containerd)处理的。 - 在
crictl
的情况下,它直接与容器运行时进行交互,因此它自己也执行了拉取操作。
- 如果你是通过
所以,kubeadm
依赖于底层容器运行时来完成实际的拉取操作,而 crictl
则直接调用容器运行时来执行拉取操作。
(8). containerd
的命名空间和Kubernetes
命名空间有什么区别?
- Containerd 命名空间 主要关注底层容器的管理与隔离,适用于容器的生命周期管理。容器资源隔离
- Kubernetes 命名空间 则用于资源的逻辑分组和管理,适合更复杂的应用架构和多租户环境。集群资源隔离
(9). kubectl get pods
是什么意思?
kubectl get pods
是 Kubernetes 的一个命令,用于列出当前 Kubernetes 集群中所有 Pod 的状态和信息。
Pod 的概念
是 Kubernetes 中的基本部署单位,一个 Pod 可以包含一个或多个紧密关联的容器。它们共享存储、网络,并且作为一个单元被调度。
输出内容
当你执行 kubectl get pods
命令时,通常会看到如下格式的输出:
NAME READY STATUS RESTARTS AGE
my-app-1 1/1 Running 0 2d
my-app-2 1/1 Running 0 2d
my-app-3 0/1 CrashLoopBackOff 3 5m
- NAME: Pod 的名称。
- READY: 显示 Pod 中容器的就绪状态,例如
1/1
表示 Pod 中有一个容器,并且它已经准备好处理请求。 - STATUS: Pod 的当前状态,包括:
Running
: Pod 正在运行。Pending
: Pod 正在等待被调度或容器正在创建。Succeeded
: Pod 中的所有容器都已成功终止。Failed
: Pod 中的容器已终止,并且未成功运行。CrashLoopBackOff
: 容器因为错误崩溃并在重启时受到限制。
- RESTARTS: Pod 中容器的重启次数。
- AGE: Pod 已经存在的时间。
用途
- 监控 Pod 状态: 通过该命令,你可以快速查看集群中 Pod 的状态,方便运维和故障排查。
- 调试问题: 如果某个 Pod 处于错误状态(如
CrashLoopBackOff
),可以根据输出信息进行进一步的调试。 - 获取详细信息: 可以与其他命令结合使用,比如
kubectl describe pod <pod-name>
来获取特定 Pod 的详细信息。
示例
-
列出特定命名空间中的 Pod:
kubectl get pods -n my-namespace
-
以更详细的格式显示 Pod 信息:
kubectl get pods -o wide
(10). containerd
和docker
的区别?
- Docker 是一个完整的容器化平台,提供从构建到运行的全面功能,适合开发和小型应用的管理。
- containerd 是一个轻量级的容器运行时,专注于容器的生命周期管理,通常用于 Kubernetes 等高级容器管理工具中。
定义与组成
- Docker:
- Docker 是一个开源的容器化平台,提供了完整的工具链来构建、运行和管理容器化应用程序。它包含多个组件,包括 Docker CLI、Docker Daemon、Docker Hub 和 Docker Compose。
- Docker 主要面向开发者,提供了用户友好的命令行界面和图形界面,简化了容器的管理。
- containerd:
- containerd 是一个容器运行时,用于管理容器的生命周期,包括镜像拉取、容器创建、启动、停止和删除等。
- 它是一个更底层的组件,专注于容器的运行,通常被 Docker 这样的更高层工具使用。containerd 是 CNCF(Cloud Native Computing Foundation)的一部分。
功能范围
-
Docker:
- 提供完整的容器管理解决方案,包括构建镜像、管理网络、存储和日志等功能。
- Docker 可以直接在开发和生产环境中使用,适合快速开发和部署应用程序。
-
containerd:
- 专注于容器的运行时功能,主要负责容器的创建、调度、生命周期管理等。
- 不提供镜像构建、网络管理等功能,通常与其他工具(如 Kubernetes)结合使用,以实现更高级的容器管理。
架构与组件
-
Docker:
- 由多个组件组成,包括:
- Docker CLI: 命令行工具,用于与 Docker Daemon 进行交互。
- Docker Daemon: 负责管理容器和镜像的后台服务。
- Docker Registry: 存储和分发容器镜像的服务。
- 由多个组件组成,包括:
-
containerd:
- 作为一个容器运行时,它提供了以下主要功能:
- 镜像管理: 支持镜像的拉取和管理。
- 容器管理: 提供容器的创建、启动、停止和删除等功能。
- 运行时管理: 支持 OCI(Open Container Initiative)标准的容器运行。
- 作为一个容器运行时,它提供了以下主要功能:
依赖关系
-
Docker:
- Docker 依赖于 containerd 作为其容器运行时,因此 Docker 可以看作是建立在 containerd 之上的更高层抽象。
-
containerd:
- 可以独立使用,也可以作为其他容器管理工具(如 Kubernetes)的基础组件。
性能与资源占用
-
Docker:
- 由于包含了多个组件和功能,Docker 的资源占用相对较高,但提供了更友好的用户体验。
-
containerd:
- 由于其简化的功能集和专注于容器运行,containerd 通常占用更少的资源,适合高效的生产环境。
管理。
- 由于其简化的功能集和专注于容器运行,containerd 通常占用更少的资源,适合高效的生产环境。
架构与组件
-
Docker:
- 由多个组件组成,包括:
- Docker CLI: 命令行工具,用于与 Docker Daemon 进行交互。
- Docker Daemon: 负责管理容器和镜像的后台服务。
- Docker Registry: 存储和分发容器镜像的服务。
- 由多个组件组成,包括:
-
containerd:
- 作为一个容器运行时,它提供了以下主要功能:
- 镜像管理: 支持镜像的拉取和管理。
- 容器管理: 提供容器的创建、启动、停止和删除等功能。
- 运行时管理: 支持 OCI(Open Container Initiative)标准的容器运行。
- 作为一个容器运行时,它提供了以下主要功能:
依赖关系
-
Docker:
- Docker 依赖于 containerd 作为其容器运行时,因此 Docker 可以看作是建立在 containerd 之上的更高层抽象。
-
containerd:
- 可以独立使用,也可以作为其他容器管理工具(如 Kubernetes)的基础组件。
性能与资源占用
-
Docker:
- 由于包含了多个组件和功能,Docker 的资源占用相对较高,但提供了更友好的用户体验。
-
containerd:
- 由于其简化的功能集和专注于容器运行,containerd 通常占用更少的资源,适合高效的生产环境。