kubernetes(K8s)学习笔记:第一期与第二期核心知识点学习自测与详解
本解析针对 Kubernetes 系列第一期(容器管理基础与 Kubernetes 架构初探)和第二期(Kubernetes 集群部署实战)的核心内容。共 10 题,每题包含题目回顾、考查知识点、详细解答与分析,帮助读者巩固集群部署与容器管理基础。
题目一:应用部署演进的三个阶段
题目:请简述应用部署从传统物理机到容器化的演进历程,并说明容器相比虚拟机的核心优势是什么?
考查知识点
- 应用部署演进(物理机 → 虚拟机 → 容器)------ 第一期 §1
- 容器与虚拟机的对比
详细解答
三个阶段:
| 阶段 | 特点 | 缺点 |
|---|---|---|
| 物理机部署 | 应用直接运行在物理服务器上 | 资源利用率低、扩展困难、应用间相互影响 |
| 虚拟机部署 | 一台物理机运行多个 VM,应用在 VM 内隔离 | 资源开销大(完整 OS)、启动慢(分钟级) |
| 容器部署 | 应用共享宿主机内核,轻量隔离 | --- |
容器核心优势:
- 资源开销小(MB 级别 vs GB 级别)
- 启动速度快(秒级 vs 分钟级)
- 环境一致性(开发/测试/生产环境相同)
- 可移植性强(跨云、跨操作系统)
- 密度高(一台宿主机可运行数百个容器)
题目二:Kubernetes 架构组件
题目:Kubernetes 集群由哪些核心组件组成?请分别说明控制平面组件和 Worker 组件的职责。
考查知识点
- Kubernetes 架构与组件职责 ------ 第一期 §4
详细解答
控制平面组件(Master 节点):
| 组件 | 职责 |
|---|---|
kube-apiserver |
提供 API 服务,是控制面的前端,所有请求的入口 |
kube-scheduler |
按照调度策略将 Pod 分配到合适的节点 |
kube-controller-manager |
维护集群状态,运行各类控制器(Deployment、ReplicaSet、Node 等) |
etcd |
高可用键值数据库,存储所有集群数据 |
Worker 组件:
| 组件 | 职责 |
|---|---|
kubelet |
节点代理,维护容器生命周期,管理 Volume 和网络 |
kube-proxy |
网络代理,负责 Service 的服务发现和负载均衡 |
| 容器运行时 | 负责镜像管理和容器运行(如 containerd) |
注意:kubelet 是唯一没有以容器形式运行的 Kubernetes 组件。
题目三:nerdctl 与 Docker 命令对照
题目 :请写出以下 Docker 操作对应的 nerdctl 命令:docker ps -a、docker run -d nginx、docker exec -it nginx bash、docker logs nginx、docker rm nginx。
考查知识点
- nerdctl 容器管理命令 ------ 第一期 §5
详细解答
| Docker 命令 | nerdctl 命令 | 说明 |
|---|---|---|
docker ps -a |
nerdctl ps -a |
列出所有容器(含已停止) |
docker run -d nginx |
nerdctl run -d nginx |
后台运行 nginx 容器 |
docker exec -it nginx bash |
nerdctl exec -it nginx bash |
进入容器执行交互式命令 |
docker logs nginx |
nerdctl logs nginx |
查看容器日志 |
docker rm nginx |
nerdctl rm nginx |
删除容器 |
补充:nerdctl 是 containerd 的 Docker 兼容客户端,命令 99% 与 Docker 一致,日常管理首选。
题目四:nerdctl 网络原理
题目 :当使用 nerdctl run -d busybox 创建容器时,容器如何与宿主机通信?请解释 nerdctl0 网桥和 veth pair 的作用。
考查知识点
- nerdctl 网络原理 ------ 第一期 §6
- veth pair 工作机制
详细解答
网络拓扑:
text
容器内 (eth0) ←→ veth pair ←→ 宿主机 (vethXXX) ←→ nerdctl0 网桥 ←→ 宿主机网络
各组件作用:
| 组件 | 作用 |
|---|---|
nerdctl0 |
Linux 网桥,连接所有容器的虚拟网卡,实现容器间通信 |
| veth pair | 虚拟网线,一端在容器内(eth0),一端在宿主机(vethXXX),连接容器和网桥 |
| 容器内 eth0 | 容器的网络接口,拥有独立 IP(如 10.4.0.4/24) |
验证命令:
bash
# 查看宿主机网桥
ip addr show nerdctl0
# 查看容器内网卡
nerdctl exec busybox-bab94 -- ip a
# 输出中 eth0@if7 的 @if7 代表对端是宿主机 7 号网卡
# 查看 veth pair 对应关系
brctl show
题目五:crictl 工具的作用与配置
题目 :crictl 是什么?它与 nerdctl 有何区别?如何配置 crictl 对接 containerd?
考查知识点
- crictl 工具介绍 ------ 第一期 §9
- crictl vs nerdctl 对比
详细解答
crictl 是什么:遵循 CRI(容器运行时接口)规范的命令行工具,用于检查和管理 kubelet 节点上的容器运行时和镜像。在 Kubernetes 集群中,kubelet 通过 CRI 接口调用 containerd。
crictl vs nerdctl 区别:
| 对比项 | nerdctl | crictl |
|---|---|---|
| 面向对象 | 开发者 | K8s 调试 |
| 命令风格 | 兼容 Docker | CRI 风格 |
| 适用场景 | K8s 节点管理(日常) | K8s 故障排查 |
| 镜像加速配置 | certs.d / hosts.toml | CRI 配置(mirrors) |
配置 crictl 对接 containerd:
bash
crictl config --set runtime-endpoint=unix:///var/run/containerd/containerd.sock
配置后,crictl 才能与 containerd 通信。配置文件位于
/etc/crictl.yaml。
题目六:kubeadm 部署的节点环境准备
题目:使用 kubeadm 部署 Kubernetes 集群时,节点需要做哪些环境准备?请至少列出 5 项。
考查知识点
- kubeadm 部署环境准备 ------ 第二期 §2
详细解答
环境准备清单:
| 序号 | 准备项 | 命令/说明 |
|---|---|---|
| 1 | 关闭 swap | swapoff -a && sed -i '/swap/d' /etc/fstab |
| 2 | 配置主机名和 /etc/hosts | hostnamectl set-hostname,添加集群节点 IP 映射 |
| 3 | 配置静态 IP | Netplan 配置(Ubuntu) |
| 4 | 时间同步 | apt install chrony && systemctl enable chrony --now |
| 5 | 加载内核模块 | modprobe overlay br_netfilter,加载 IPVS 模块 |
| 6 | 配置内核参数 | sysctl 设置 bridge-nf-call-iptables=1、ip_forward=1 等 |
| 7 | 安装容器运行时 | apt install containerd.io,配置 SystemdCgroup |
| 8 | 配置镜像加速 | 配置 CRI mirrors 和 certs.d |
| 9 | 安装 kubeadm/kubelet/kubectl | 指定版本安装 |
| 10 | 配置命令补全 | 设置 CONTAINERD_NAMESPACE=k8s.io |
关键点:swap 必须关闭,内核参数必须正确,容器运行时必须与 kubelet 的 cgroup 驱动一致(SystemdCgroup=true)。
题目七:containerd 配置中的 SystemdCgroup 和 sandbox_image
题目 :为什么 containerd 配置中需要将 SystemdCgroup 设为 true?sandbox_image 的作用是什么?
考查知识点
- containerd 配置 ------ 第二期 §4.3
- SystemdCgroup 与 sandbox_image
详细解答
SystemdCgroup = true:
- Kubernetes 使用 systemd 作为 cgroup 驱动
- containerd 必须与 kubelet 保持一致,否则 Pod 资源限制不生效
- 不一致会导致节点异常,Pod 无法正常调度
sandbox_image(Pause 容器):
- 每个 Pod 会先启动一个 Pause 容器,持有 Pod 的网络命名空间
- 其他业务容器共享 Pause 容器的网络命名空间,实现 Pod 内容器共享 IP 和端口
- 配置为
registry.k8s.io/pause:3.9
配置命令:
bash
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml
题目八:kubeadm init 初始化过程与参数
题目 :kubeadm init 初始化集群时,--pod-network-cidr 参数的作用是什么?初始化成功后,kubectl 配置凭据有哪几种方式?
考查知识点
- 集群初始化 ------ 第二期 §7
- 凭据配置 ------ 第二期 §7.6
详细解答
--pod-network-cidr 参数:
- 指定 Pod 网络的 IP 地址范围(如
10.224.0.0/16) - 必须与后续部署的网络插件(如 Calico)配置一致
- 如果不一致,Pod 无法获得正确的 IP 地址,集群无法正常工作
配置 kubectl 凭据的三种方式:
| 方式 | 命令 |
|---|---|
| 默认位置(推荐) | mkdir -p $HOME/.kube && cp /etc/kubernetes/admin.conf $HOME/.kube/config |
| 环境变量 | export KUBECONFIG=/etc/kubernetes/admin.conf |
| 命令行参数 | kubectl get nodes --kubeconfig /etc/kubernetes/admin.conf |
初始化过程关键阶段:
[preflight]--- 预检查[certs]--- 生成证书[kubeconfig]--- 生成配置文件[etcd]--- 部署 etcd[control-plane]--- 部署控制平面组件[addons]--- 部署 CoreDNS 和 kube-proxy
题目九:Calico 网络插件部署
题目:Kubernetes 集群初始化后,为什么需要部署网络插件?部署 Calico 时,需要修改哪个参数以匹配集群配置?
考查知识点
- 网络插件部署 ------ 第二期 §8
- Calico 配置
详细解答
为什么需要网络插件:
- 集群初始化后,CoreDNS 等 Pod 处于 Pending 状态,节点状态为 NotReady
- 缺少 CNI 网络插件,Pod 无法获得 IP 地址
- 网络插件负责为每个 Pod 分配 IP,并实现跨节点 Pod 通信
Calico 部署要点:
-
下载 calico.yaml:
bash
wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.7/manifests/calico.yaml -
修改
CALICO_IPV4POOL_CIDR:- 必须与
kubeadm init中的--pod-network-cidr一致 - 示例:
10.224.0.0/16
- 必须与
-
所有节点下载 Calico 镜像:
bash
nerdctl pull docker.io/calico/cni:v3.30.7 nerdctl pull docker.io/calico/node:v3.30.7 nerdctl pull docker.io/calico/kube-controllers:v3.30.7 -
部署:
bash
kubectl apply -f calico.yaml
验证 :
kubectl get pods -n kube-system -l k8s-app=calico-node,状态应为Running。
题目十:Worker 节点加入集群
题目 :如果忘记了 kubeadm init 输出的 join 命令,如何重新获取?Worker 节点加入集群后,如何验证加入成功?
考查知识点
- Worker 节点加入 ------ 第二期 §9
- 集群验证 ------ 第二期 §10
详细解答
重新获取 join 命令:
bash
[root@master30 ~]# kubeadm token create --print-join-command
kubeadm join 10.1.8.30:6443 --token dzpuca.8lqxqqydwskroabx --discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd
Worker 节点加入:
bash
[root@worker31 ~]# kubeadm join 10.1.8.30:6443 \
--token mi0yt8.1tzza4q64dr8y3pc \
--discovery-token-ca-cert-hash sha256:5606e09618330aee8859abe3ea4cd8734f9b540630048a6e1c3aaf6c54d486fd
验证加入成功:
bash
# 在 Master 节点查看节点列表
[root@master30 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.whisky.cloud Ready control-plane 9h v1.30.2
worker31.whisky.cloud Ready <none> 8h v1.30.2
worker32.whisky.cloud Ready <none> 8h v1.30.2
# 查看所有 Pod 状态
[root@master30 ~]# kubectl get pods -A
# 所有 Pod 应为 Running 状态
节点 Ready 的前提条件:
- 网络插件部署成功
- kubelet 服务正常运行
- swap 已关闭
- 内核参数正确
附:知识点对应总表
| 题号 | 主要考查知识点(对应笔记章节) |
|---|---|
| 1 | 第一期 §1 应用部署演进 |
| 2 | 第一期 §4 Kubernetes 架构 |
| 3 | 第一期 §5 nerdctl 容器管理 |
| 4 | 第一期 §6 nerdctl 网络原理 |
| 5 | 第一期 §9 crictl 工具 |
| 6 | 第二期 §2 环境准备 |
| 7 | 第二期 §4 containerd 配置 |
| 8 | 第二期 §7 集群初始化 |
| 9 | 第二期 §8 网络插件部署 |
| 10 | 第二期 §9-10 节点加入与验证 |
学习建议:对于答错的题目,请回看第一期或第二期对应章节,并动手在环境中执行相关命令。集群部署涉及大量细节,建议按照笔记步骤重新搭建一次,确保每个环节都理解透彻。熟练掌握第一期和第二期的内容,是学习后续 Pod 管理、控制器、存储、网络等高级主题的基础。
--- Compiled and Authored by Whisky --- June 25th, 2026