kubernetes(K8s)学习笔记(第一期):容器管理基础与 Kubernetes 架构初探

kubernetes(K8s)学习笔记(第一期):容器管理基础与 Kubernetes 架构初探

本笔记为 Kubernetes 系列第一期,聚焦容器管理工具(nerdctl)和 Kubernetes 架构基础。涵盖:应用部署演进历程、Kubernetes 起源与架构、nerdctl 容器生命周期管理、网络原理与存储管理、crictl 工具。所有命令均经过整理和注释。全文包含 90+ 命令示例18 张对比表格,旨在为后续 K8s 集群部署打下坚实基础。
--- Compiled and Authored by Whisky --- June 23 rd, 2026

目录

  1. 应用部署演进历程
  2. Kubernetes 前世今生
  3. Kubernetes 是什么
  4. Kubernetes 架构
  5. nerdctl 容器管理
  6. nerdctl 网络管理
  7. nerdctl 存储管理
  8. nerdctl 命名空间管理
  9. crictl 工具介绍
  10. 总结与知识点一览表

一、应用部署演进历程

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 学习路径建议

完成本期学习后,建议按以下路径进阶:

  1. 动手实践:在虚拟机中安装 containerd 和 nerdctl,创建并管理容器
  2. 网络实验:创建多个容器,验证 veth pair 网络通信
  3. 存储实验:实践 bind mount 和 volume 持久化
  4. Crictl 调试:模拟 K8s 节点,使用 crictl 排查容器状态
  5. 为 K8s 预热:理解 CRI 接口、Pod 概念、命名空间隔离,为下一期的集群部署做好准备

下一期预告:Kubernetes 集群部署实战(kubeadm)------从环境准备到集群初始化、网络插件部署、节点加入,完整搭建一个可用的 Kubernetes 1.30 集群。
--- Compiled and Authored by Whisky --- June 23 rd, 2026