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 -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

初始化过程关键阶段:

  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