kubernetes(K8s)学习笔记:第一期与第二期核心知识点学习自测与详解

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 -adocker run -d nginxdocker exec -it nginx bashdocker logs nginxdocker 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=1ip_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 设为 truesandbox_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

初始化过程关键阶段

  1. [preflight] --- 预检查
  2. [certs] --- 生成证书
  3. [kubeconfig] --- 生成配置文件
  4. [etcd] --- 部署 etcd
  5. [control-plane] --- 部署控制平面组件
  6. [addons] --- 部署 CoreDNS 和 kube-proxy

题目九:Calico 网络插件部署

题目:Kubernetes 集群初始化后,为什么需要部署网络插件?部署 Calico 时,需要修改哪个参数以匹配集群配置?

考查知识点

  • 网络插件部署 ------ 第二期 §8
  • Calico 配置

详细解答

为什么需要网络插件

  • 集群初始化后,CoreDNS 等 Pod 处于 Pending 状态,节点状态为 NotReady
  • 缺少 CNI 网络插件,Pod 无法获得 IP 地址
  • 网络插件负责为每个 Pod 分配 IP,并实现跨节点 Pod 通信

Calico 部署要点

  1. 下载 calico.yaml

    bash

    复制代码
    wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.7/manifests/calico.yaml
  2. 修改 CALICO_IPV4POOL_CIDR

    • 必须与 kubeadm init 中的 --pod-network-cidr 一致
    • 示例:10.224.0.0/16
  3. 所有节点下载 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
  4. 部署

    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