kubernetes(K8s)学习笔记(第一期):容器管理基础与 Kubernetes 架构初探
本笔记为 Kubernetes 系列第一期,聚焦容器管理工具(nerdctl)和 Kubernetes 架构基础。涵盖:应用部署演进历程、Kubernetes 起源与架构、nerdctl 容器生命周期管理、网络原理与存储管理、crictl 工具。所有命令均经过整理和注释。全文包含 90+ 命令示例 和 18 张对比表格,旨在为后续 K8s 集群部署打下坚实基础。
--- Compiled and Authored by Whisky --- June 23 rd, 2026
目录
- 应用部署演进历程
- Kubernetes 前世今生
- Kubernetes 是什么
- Kubernetes 架构
- nerdctl 容器管理
- nerdctl 网络管理
- nerdctl 存储管理
- nerdctl 命名空间管理
- crictl 工具介绍
- 总结与知识点一览表
一、应用部署演进历程
1.1 传统部署时代
企业在物理服务器上运行应用程序。无法为应用程序定义资源边界,导致资源分配问题。例如,一个应用程序可能占用大部分资源,导致其他应用程序性能下降。
缺点:
- 资源利用率低(一台物理机只能运行有限应用)
- 维护成本高(硬件采购、机房、运维人力)
- 扩展困难(需要重新采购服务器)
- 应用间相互影响(一个应用崩溃可能影响其他应用)
- 迁移成本高(应用与硬件强绑定)
比喻:这就像一栋公寓楼里,每个住户(应用)都占据整个楼层(物理机),但实际使用的空间(资源)可能只有一小部分,却无法让其他人共享剩余空间。
1.2 虚拟化部署时代
引入虚拟化功能,允许在单个物理服务器的 CPU 上运行多个虚拟机(VM)。应用程序在 VM 之间隔离,提供安全级别。
优点:
- 资源利用更充分(一台物理机可运行多个 VM)
- 可轻松添加或更新应用程序
- 更好的可伸缩性
- 更好的隔离性(VM 之间互不影响)
- 硬件抽象(VM 不感知底层硬件)
缺点:
- 每个 VM 包含完整的操作系统,资源开销大(GB 级别)
- 启动慢(分钟级)
- 管理复杂(需要管理多个 OS)
- 许可证成本(每个 VM 需要 OS 许可)
比喻:这就像将公寓楼改造成酒店式公寓,每个房间(VM)都是独立的套间,有自己的卫浴和厨房(完整 OS),可以独立出租,但每个房间都占用大量空间(资源开销)。
1.3 容器部署时代
容器类似于 VM,但具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。容器被认为是轻量级的,具有自己的文件系统、CPU、内存、进程空间等。
容器优势:
| 优势 | 说明 |
|---|---|
| 敏捷创建与部署 | 比 VM 镜像更简便高效,秒级启动 |
| 持续开发与集成 | 快速回滚,可靠镜像构建 |
| 开发运维分离 | 构建/发布时创建镜像,与基础架构分离 |
| 环境一致性 | 开发/测试/生产环境相同,杜绝"在我的机器上能运行" |
| 可移植性 | 可在 Ubuntu、RHEL、CoreOS、云环境等运行 |
| 以应用为中心 | 提高抽象级别 |
| 松散耦合 | 微服务架构,易于拆分和扩展 |
| 资源隔离 | 可预测性能 |
| 资源利用 | 高效率和密度(MB 级别开销) |
比喻:这就像将公寓楼改造成共享宿舍,每个房间(容器)只有床铺和书桌(应用所需环境),共享公共卫浴和厨房(共享 OS),空间利用率极高,且入住和退房(启动和销毁)都非常快速。
1.4 三种部署模式对比
| 维度 | 物理机 | 虚拟机 | 容器 |
|---|---|---|---|
| 资源开销 | 最低(无额外层) | 高(完整 OS) | 低(共享内核) |
| 启动速度 | 分钟级 | 分钟级 | 秒级 |
| 隔离性 | 完全隔离 | 强隔离 | 轻量隔离 |
| 可移植性 | 差 | 中等 | 好 |
| 密度 | 低 | 中等 | 高 |
| 资源利用率 | 低 | 中等 | 高 |
1.5 容器面临的挑战------为什么需要 Kubernetes?
容器虽然轻量高效,但当容器数量激增时,会面临新的挑战:
| 挑战 | 说明 |
|---|---|
| 如何调度? | 成千上万的容器应该分配到哪些节点上运行? |
| 如何自愈? | 容器崩溃后如何自动重启和替换? |
| 如何扩缩? | 访问量突增时如何快速扩容容器数量? |
| 如何服务发现? | 容器 IP 不断变化,如何让应用互相找到对方? |
| 如何负载均衡? | 多个容器副本之间如何均衡流量? |
| 如何滚动更新? | 如何做到不停机发布新版本,出问题立即回滚? |
这些挑战正是 Kubernetes 要解决的问题。 Kubernetes 可以理解为容器的"操作系统",它调度容器、自动修复故障、实现弹性伸缩。这就好比物理机的操作系统管理进程一样,Kubernetes 管理的是容器。
二、Kubernetes 前世今生
2.1 起源
Kubernetes 的名字来自希腊语,意思是"舵手"或"领航员"。K8s 是将 8 个字母 "ubernete" 替换为 "8" 的缩写。
- Google 数据中心运行着 20 多亿个容器
- Google 开发了 Borg 系统(后命名为 Omega)来调度容器
- 积累多年经验后,Google 决定重写并开源,这就是 Kubernetes
2.2 发展历程
| 时间 | 事件 |
|---|---|
| 2014 年 6 月 | Google 在旧金山正式宣布 Kubernetes 开源 |
| 2015 年 5 月 | K8s 搜索热度超过 Mesos 和 Docker Swarm |
| 2015 年 7 月 22 日 | K8s v1.0 正式发布 |
| 2017 年 9-10 月 | Mesosphere 和 Docker 宣布支持 K8s,三足鼎立时代结束 |
| 至今 | AWS、Azure、Google、阿里云等主流公有云提供基于 K8s 的容器服务 |
2.3 为什么 Kubernetes 胜出
| 原因 | 说明 |
|---|---|
| Google 背书 | 源自 Google 内部生产级系统 Borg |
| 开放生态 | 不绑定特定厂商或技术栈 |
| 活跃社区 | 全球最大的开源社区之一 |
| 标准化 | 推动 CRI、CNI、CSI 等标准 |
| 可扩展性 | 支持自定义资源和控制器 |
2.4 各容器编排方案对比
| 方案 | 特点 | 现状 |
|---|---|---|
| Kubernetes | 开放、标准化、功能全面 | 事实标准,全行业采用 |
| Docker Swarm | 简单、与 Docker 深度集成 | 已被 Docker 官方边缘化 |
| Mesos + Marathon | 通用资源调度,可管理多种负载 | 社区活跃度下降,用户流失 |
| Amazon ECS | AWS 托管,与 AWS 深度集成 | 特定云厂商,非通用方案 |
结论:Kubernetes 已成为容器编排领域的事实标准,是企业容器化转型的首选平台。
三、Kubernetes 是什么
官方定义:Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。
它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。
3.1 Kubernetes 核心特性详解
| 特性 | 说明 |
|---|---|
| 自动化上线和回滚 | 分步上线,监控健康状态,出现问题自动回滚 |
| 服务发现与负载均衡 | 为每个 Pod 提供独立 IP,为一组 Pod 提供 DNS 名称,负载均衡 |
| 存储编排 | 自动挂载本地存储、云存储或网络存储(iSCSI/NFS) |
| Secret 和配置管理 | 部署和更新配置无需重新构建镜像 |
| 自动装箱 | 根据资源需求自动放置容器 |
| 批量执行 | 管理批处理和 CI 工作负载 |
| 自我修复 | 自动重启崩溃容器、替换 Pod、重新挂载存储 |
| 水平扩缩 | 基于 CPU 使用情况自动扩缩应用 |
| IPv4/IPv6 双协议栈 | 为 Pod 和 Service 分配双栈地址 |
| 为扩展性设计 | 无需更改上游源码即可扩展集群 |
3.2 Kubernetes 不是什么
Kubernetes 不是传统的 PaaS(平台即服务)系统:
- 不限制应用类型、框架或语言
- 不提供中间件、数据处理框架、数据库作为内置服务
- 不部署源码或编译应用
- 允许用户选择自己的日志、监控和报警系统
- 不提供全面的应用配置语言/系统
- 不提供机器配置、维护、管理或自修复系统
四、Kubernetes 架构
一个 Kubernetes 集群由一组被称作 Node 的计算机组成。集群至少具有一个 Master(控制平面) 节点和一个 Worker 节点。
4.1 控制平面组件(Control Plane Components)
控制平面组件对集群做出全局决策,并检测和响应集群事件。
| 组件 | 功能 | 部署位置 |
|---|---|---|
| kube-apiserver | 提供 Kubernetes API 服务,是控制面的前端 | Master |
| kube-scheduler | 按照预定调度策略将 Pod 调度到相应机器 | Master |
| kube-controller-manager | 维护集群状态,故障检测、自动扩展、滚动更新 | Master |
| etcd | 高可用键值数据库,保存所有集群数据 | Master |
各组件职责详解:
- kube-apiserver :所有请求的入口,提供认证、授权、校验等能力。支持 RESTful API,可通过
kubectl或直接 HTTP 调用。 - kube-scheduler:根据资源需求、节点负载、亲和性等因素选择最优节点。
- kube-controller-manager:运行多个控制器(Deployment、ReplicaSet、Node 等),确保实际状态与期望状态一致。
- etcd:分布式键值存储,使用 Raft 协议保证一致性,存储所有集群配置和状态。
4.2 Worker 组件
Worker 组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。
| 组件 | 功能 |
|---|---|
| kubelet | 集群中每个节点上的代理,维护容器生命周期,管理 Volume 和网络 |
| kube-proxy | 节点上的网络代理,负责 Service 的服务发现和负载均衡 |
| 容器运行时 | 负责镜像管理以及 Pod 和容器的真正运行(CRI) |
注意 :kubelet 是唯一没有以容器形式运行的 Kubernetes 组件。
4.3 组件通信流程
text
kubectl → kube-apiserver → etcd(存储)
→ kube-scheduler(调度)
→ kube-controller-manager(控制)
→ kubelet(节点执行)
→ 容器运行时 → 容器
4.4 插件(Addons)
插件使用 Kubernetes 资源(DaemonSet、Deployment 等)实现集群功能,属于 kube-system 命名空间。
| 插件 | 功能 |
|---|---|
| CoreDNS | 为 Kubernetes 服务提供 DNS 记录 |
| Dashboard | Kubernetes 集群 Web UI |
| 容器资源监控 | 保存时间序列度量值(如 Heapster) |
| 集群层面日志 | 集中存储日志(如 Fluentd-elasticsearch) |
| 网络插件 | 实现 CNI 规范,为 Pod 分配 IP(如 Calico、Flannel) |
五、nerdctl 容器管理
5.1 nerdctl 配置文件回顾
nerdctl 配置文件位置:
- rootful (全局):
/etc/nerdctl/nerdctl.toml - rootless (普通用户):
~/.config/nerdctl/nerdctl.toml
配置内容:
toml
address = "unix:///run/containerd/containerd.sock"
hosts_dir = ["/etc/containerd/certs.d", "/etc/docker/certs.d"]
namespace = "default"
优先级:命令行参数 → 环境变量 → nerdctl.toml → 默认路径
5.2 容器生命周期管理
ls --- 查看容器清单
bash
# 查看运行中的容器
root@ubuntu2404:~# nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 查看所有容器(含已停止的)
root@ubuntu2404:~# nerdctl ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
249c162d8db6 docker.io/library/ubuntu:latest "/bin/bash" 24 seconds ago Exited (0) 22 seconds ago ubuntu-249c1
常用选项:
-a, --all:显示所有容器(默认仅运行中的)-f, --filter strings:按条件过滤--format string:自定义输出格式(Go template)
run --- 创建并运行容器
bash
# 基本用法
root@ubuntu2404:~# nerdctl run -it ubuntu
root@249c162d8db6:/# exit
exit
# 后台运行(-d)
root@ubuntu2404:~# nerdctl run -d nginx
de2241441cb6...
# 指定容器名
root@ubuntu2404:~# nerdctl run --name my-nginx -d nginx
常用选项:
| 选项 | 说明 |
|---|---|
-d, --detach |
后台运行 |
-i, --interactive |
保持 STDIN 打开 |
-t, --tty |
分配伪终端 |
--name |
指定容器名 |
--rm |
容器退出时自动删除 |
--restart |
重启策略(no/always/on-failure/unless-stopped) |
--net / --network |
网络模式(bridge/host/none) |
-v, --volume |
挂载卷 |
-e, --env |
设置环境变量 |
--cpu-shares |
CPU 权重 |
--cpus |
CPU 核心数 |
-m, --memory |
内存限制 |
--privileged |
给予扩展权限 |
rm --- 删除容器
bash
root@ubuntu2404:~# nerdctl rm 249c162d8db6
249c162d8db6
root@ubuntu2404:~# nerdctl ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
prune --- 删除所有未运行的容器
bash
root@ubuntu2404:~# nerdctl container prune --force
Deleted Containers:
62a3258de309...
d84bb674f77f...
rename --- 重命名容器
bash
root@ubuntu2404:~# nerdctl run --name ubuntu-1 ubuntu
root@ubuntu2404:~# nerdctl rename ubuntu-1 ubuntu
root@ubuntu2404:~# nerdctl ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f2aa825864f ubuntu "/bin/bash" 25s ago Exited (0) 24s ago ubuntu
stop / start --- 停止/启动容器
bash
root@ubuntu2404:~# nerdctl run -d nginx
root@ubuntu2404:~# nerdctl stop nginx-de224
nginx-de224
root@ubuntu2404:~# nerdctl start nginx-de224
nginx-de224
restart --- 重启容器
bash
root@ubuntu2404:~# nerdctl restart nginx-de224
pause / unpause --- 挂起/取消挂起容器
bash
root@ubuntu2404:~# nerdctl pause nginx-de224
nginx-de224
root@ubuntu2404:~# nerdctl ps -a --format "{{.Names}} {{.Status}}"
nginx-de224 Paused
root@ubuntu2404:~# nerdctl unpause nginx-de224
nginx-de224
kill --- 发送信号(默认 KILL)
bash
root@ubuntu2404:~# nerdctl kill nginx-de224
root@ubuntu2404:~# nerdctl ps -a --format "{{.Names}} {{.Status}}"
nginx-de224 Exited (137) 24 seconds ago
容器状态流转图:
text
Created → Running → Paused
↓ ↓
Exited Stopped
5.3 容器交互与信息
exec --- 在运行中的容器执行命令
bash
root@ubuntu2404:~# nerdctl start nginx-de224
root@ubuntu2404:~# nerdctl exec -it nginx-de224 bash
root@de2241441cb6:/# exit
exit
logs --- 查看容器日志
bash
root@ubuntu2404:~# nerdctl logs nginx-de224
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty...
2023/05/26 10:55:17 [notice] 1#1: using the "epoll" event method
...
inspect --- 查看容器详细信息
bash
root@ubuntu2404:~# nerdctl inspect nginx-de224
输出示例:
json
[
{
"Id": "de2241441cb6...",
"State": {
"Status": "running",
"Running": true,
"Pid": 4888
},
"Image": "docker.io/library/nginx:latest",
"NetworkSettings": {
"IPAddress": "10.4.0.14",
"IPPrefixLen": 24,
"MacAddress": "3e:51:10:ab:23:0b"
}
}
]
cp --- 宿主机与容器间复制文件
bash
# 复制文件到容器
root@ubuntu2404:~# nerdctl cp /etc/hostname nginx-de224:
root@ubuntu2404:~# nerdctl exec nginx-de224 ls hostname
hostname
port --- 查看端口映射
bash
root@ubuntu2404:~# nerdctl run --name nginx -d -p 8080:80 nginx
root@ubuntu2404:~# nerdctl port nginx
80/tcp -> 0.0.0.0:8080
5.4 commit --- 将容器提交为镜像
bash
root@ubuntu2404:~# nerdctl commit nginx-de224 mynginx:v1
root@ubuntu2404:~# nerdctl images
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE
mynginx v1 abc123... 5 seconds ago linux/amd64 145.3 MiB
5.5 nerdctl vs Docker 常用命令对照
| 操作 | Docker 命令 | nerdctl 命令 | 差异说明 |
|---|---|---|---|
| 列出容器 | docker ps |
nerdctl ps |
基本一致 |
| 运行容器 | docker run |
nerdctl run |
基本一致 |
| 停止容器 | docker stop |
nerdctl stop |
基本一致 |
| 删除容器 | docker rm |
nerdctl rm |
基本一致 |
| 查看日志 | docker logs |
nerdctl logs |
基本一致 |
| 构建镜像 | docker build |
nerdctl build |
需安装 buildkit |
| 列出镜像 | docker images |
nerdctl images |
基本一致 |
六、nerdctl 网络管理
6.1 网络原理------深入理解 veth pair
Containerd 中的网络与 Docker 类似,所有网络接口默认都是虚拟接口。当使用 nerdctl 创建容器时,会创建一个名称为 bridge 的 Linux 网桥(其上有一个 nerdctl0 内部接口),利用 Linux 虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 veth pair)。
veth pair 工作原理:
- veth pair 就像一个虚拟网线 ,一端插入容器(容器内的
eth0),另一端插入主机的网桥(宿主机上的vethxxx) - 发送到容器内
eth0的数据包会从宿主机vethxxx出来,进入网桥 - 反之亦然,从而实现容器与外部网络的双向通信
bash
root@ubuntu2404:~# nerdctl run -d busybox -- sleep infinity
bab94a9f169c...
root@ubuntu2404:~# ip a
6: nerdctl0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue ...
inet 10.4.0.1/24 brd 10.4.0.255 scope global nerdctl0
7: vethf9f77444@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
容器内看到的网卡:
bash
root@ubuntu2404:~# nerdctl exec busybox-bab94 -- ip a
2: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
inet 10.4.0.4/24 brd 10.4.0.255 scope global eth0
- 容器内网卡
eth0@if7的@if7代表对端是宿主机 7 号网卡 - 宿主机网卡
vethf9f77444@if2的@if2代表对端是容器内 2 号网卡
数据包流向:
text
容器内 (eth0) ↔ veth pair ↔ 宿主机 (vethxxx) ↔ nerdctl0 网桥 ↔ 宿主机网络
6.2 网络管理命令
bash
root@ubuntu2404:~# nerdctl network ls
NETWORK ID NAME FILE
17f29b073143 bridge /etc/cni/net.d/nerdctl-bridge.conflist
host
none
查看网络详情:
bash
root@ubuntu2404:~# nerdctl network inspect bridge
[
{
"Name": "bridge",
"Id": "17f29b073143...",
"IPAM": {
"Config": [
{
"Subnet": "10.4.0.0/24",
"Gateway": "10.4.0.1"
}
]
}
}
]
查看网桥信息(需安装 bridge-utils):
bash
root@ubuntu2404:~# apt install -y bridge-utils
root@ubuntu2404:~# brctl show
bridge name bridge id STP enabled interfaces
nerdctl0 8000.a64cc0326a5c no vethf9f77444
网络模式对比:
| 模式 | 说明 | 适用场景 |
|---|---|---|
bridge(默认) |
通过网桥连接,容器获得独立 IP | 多容器通信 |
host |
共享宿主机网络栈 | 性能敏感场景 |
none |
无网络 | 特殊隔离场景 |
七、nerdctl 存储管理
7.1 绑定挂载(Bind Mount)
将宿主机目录挂载给容器:
bash
root@ubuntu2404:~# nerdctl run -d -v /data:/data busybox -- sleep infinity
6afe638b117d...
root@ubuntu2404:~# touch /data/f1
root@ubuntu2404:~# nerdctl exec busybox-6afe6 -- ls /data
f1
Bind Mount 的特点:
- 宿主机目录和容器目录共享同一存储位置
- 容器内对文件的修改会直接反映在宿主机上
- 适合:配置文件挂载、开发环境代码共享、日志目录挂载
7.2 卷管理(Volume)
使用 volume 实现数据持久化:
bash
root@ubuntu2404:~# nerdctl run -d -v data:/data busybox -- sleep infinity
dd82eea219b3...
root@ubuntu2404:~# nerdctl exec busybox-dd82e -- touch /data/f1
root@ubuntu2404:~# nerdctl volume ls
VOLUME NAME DIRECTORY
data /var/lib/nerdctl/1935db59/volumes/k8s.io/data/_data
root@ubuntu2404:~# ls /var/lib/nerdctl/1935db59/volumes/k8s.io/data/_data
f1
Volume 的特点:
- 由 containerd 管理,不依赖宿主机特定路径
- 支持在容器之间共享数据
- 适合:数据库持久存储、应用状态数据、需要备份的数据
7.3 volume 子命令
bash
root@ubuntu2404:~# nerdctl volume
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
存储方式对比:
| 方式 | 持久性 | 管理方式 | 适用场景 |
|---|---|---|---|
| Bind Mount | 持久化 | 手动 | 配置文件、宿主机数据共享 |
| Volume | 持久化 | 自动管理 | 应用数据持久存储 |
| 容器内部存储 | 临时 | 随容器删除 | 临时缓存 |
7.4 存储驱动原理简介------OverlayFS
nerdctl 和 Docker 一样,默认使用 OverlayFS 作为存储驱动。它利用 Linux 内核的 OverlayFS 特性,实现镜像分层存储:
text
Container Layer (读写层) ←── 容器启动时创建
↑
Image Layer 3 (只读) ←── 最上层镜像
Image Layer 2 (只读) ←── 中间层
Image Layer 1 (只读) ←── 基础镜像层
优点:
- 镜像分层存储,相同层可在不同容器间共享,节省磁盘空间
- 容器启动时只需创建薄薄一层读写层,启动飞快
八、nerdctl 命名空间管理
Containerd 的命名空间(namespace)与 Linux 命名空间不同,它用于隔离 containerd 资源(镜像、容器等)。
bash
root@ubuntu2404:~# nerdctl namespace ls
NAME CONTAINERS IMAGES VOLUMES LABELS
k8s.io 3 2 1
重要 :Kubernetes 默认使用
k8s.io命名空间。如果不设置,nerdctl 默认将镜像导入到default命名空间,K8s 将无法使用。
命名空间子命令:
| 命令 | 功能 |
|---|---|
create |
创建新命名空间 |
inspect |
查看命名空间详情 |
ls |
列出所有命名空间 |
remove |
删除命名空间 |
update |
更新命名空间标签 |
bash
# 创建命名空间
root@ubuntu2404:~# nerdctl namespace create test
# 删除命名空间
root@ubuntu2404:~# nerdctl namespace remove test
九、crictl 工具介绍
9.1 crictl 是什么
crictl 命令是遵循 CRI 接口规范的命令行工具,通常用它来检查和管理 kubelet 节点上的容器运行时和镜像。
在 Kubernetes 集群中,当执行 kubectl 命令时,kubelet 代理会调用 CRI 接口管理镜像和容器。
关系链 :
kubectl → kubelet → CRI → containerd → runc
CRI 接口版本:
- Kubernetes 1.x 支持多个 CRI 版本
- containerd 1.0+ 内置 CRI 实现
- containerd 2.x 使用
io.containerd.cri.v1.images插件
9.2 安装与配置
安装 crictl:
bash
# 添加 Kubernetes 仓库
root@ubuntu2404:~# curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
root@ubuntu2404:~# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" > /etc/apt/sources.list.d/kubernetes.list
root@ubuntu2404:~# apt update && apt install -y cri-tools=1.30.1-1.1
配置对接 containerd:
bash
root@ubuntu2404:~# crictl config --set runtime-endpoint=unix:///var/run/containerd/containerd.sock
root@ubuntu2404:~# cat /etc/crictl.yaml
runtime-endpoint: "unix:///var/run/containerd/containerd.sock"
image-endpoint: ""
timeout: 0
debug: false
pull-image-on-create: false
disable-pull-on-run: false
9.3 常用命令分类
| 分类 | 命令 | 功能 |
|---|---|---|
| 镜像 | images |
列出镜像 |
pull |
拉取镜像 | |
rmi |
删除镜像 | |
| 容器 | ps |
列出容器 |
inspect |
查看容器详情 | |
logs |
查看日志 | |
start / stop |
启动/停止容器 | |
exec |
在容器中执行命令 | |
| Pod | pods |
列出 Pod |
runp / stopp / rmp |
创建/停止/删除 Pod | |
inspectp |
查看 Pod 详情 | |
| 其他 | version |
版本信息 |
info |
运行时信息 | |
completion |
命令补全 |
Pod 与容器的关系:
- Pod 是 Kubernetes 的最小调度单位
- 一个 Pod 包含一个或多个容器(共享网络和存储)
- Pod 沙箱(Sandbox)是 K8s 中的"元容器"
9.4 配置命令补全
bash
root@ubuntu2404:~# apt install -y bash-completion
root@ubuntu2404:~# crictl completion bash > /etc/bash_completion.d/crictl
root@ubuntu2404:~# source /etc/bash_completion.d/crictl
9.5 crictl 使用场景示例
场景一:排查节点上容器状态
bash
# 查看所有容器(含非运行态)
root@ubuntu2404:~# crictl ps -a
# 查看容器的详细信息(含资源限制、挂载卷等)
root@ubuntu2404:~# crictl inspect <container-id>
场景二:手动拉取镜像验证加速配置
bash
root@ubuntu2404:~# crictl pull busybox
Image is up to date for sha256:925ff61909...
场景三:查看节点 Pod 列表
bash
root@ubuntu2404:~# crictl pods
POD ID CREATED STATE NAME
十、总结与知识点一览表
10.1 核心知识点汇总
| 模块 | 核心概念 | 关键命令 |
|---|---|---|
| 应用部署演进 | 物理机 → 虚拟机 → 容器 | --- |
| Kubernetes 架构 | Master/Worker 组件 | --- |
| nerdctl 容器 | 生命周期管理 | run, ps, stop, start, rm, exec, logs, inspect |
| nerdctl 网络 | bridge + veth pair | network ls, network inspect |
| nerdctl 存储 | bind mount + volume | volume ls, volume create, -v 选项 |
| nerdctl 命名空间 | containerd 资源隔离 | namespace ls, namespace create |
| crictl | CRI 调试工具 | images, ps, pods, pull |
10.2 关键概念对照表
| 对比项 | Docker | nerdctl | crictl |
|---|---|---|---|
| 面向对象 | 开发者 | 开发者 | K8s 调试 |
| 命令风格 | Docker 原生 | 兼容 Docker | CRI 风格 |
| 底层运行时 | containerd | containerd | containerd / CRI |
| 适用场景 | 开发/单机 | K8s 节点管理 | K8s 故障排查 |
| 镜像加速配置 | daemon.json | certs.d / hosts.toml | CRI 配置 |
10.3 常见问题排查
| 问题 | 原因 | 解决方法 |
|---|---|---|
nerdctl 找不到镜像 |
命名空间不对 | 设置 CONTAINERD_NAMESPACE=k8s.io |
crictl 无法连接 |
runtime-endpoint 未配置 | crictl config --set runtime-endpoint=... |
| 容器无法联网 | CNI 插件未安装 | 安装 CNI 插件到 /opt/cni/bin |
| 镜像拉取超时 | 未配置镜像加速 | 配置 /etc/containerd/certs.d/ |
| 容器无法停止 | 进程卡死 | 使用 nerdctl kill 发送信号 |
10.4 学习路径建议
完成本期学习后,建议按以下路径进阶:
- 动手实践:在虚拟机中安装 containerd 和 nerdctl,创建并管理容器
- 网络实验:创建多个容器,验证 veth pair 网络通信
- 存储实验:实践 bind mount 和 volume 持久化
- Crictl 调试:模拟 K8s 节点,使用 crictl 排查容器状态
- 为 K8s 预热:理解 CRI 接口、Pod 概念、命名空间隔离,为下一期的集群部署做好准备
下一期预告:Kubernetes 集群部署实战(kubeadm)------从环境准备到集群初始化、网络插件部署、节点加入,完整搭建一个可用的 Kubernetes 1.30 集群。
--- Compiled and Authored by Whisky --- June 23 rd, 2026