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

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

本自测解析针对 Kubernetes 系列第三期(集群基础管理)和第四期(Pod 管理)的核心内容。共 10 题,每题包含题目回顾、考查知识点、详细解答与分析,帮助读者巩固集群运维与 Pod 管理技能。

第三期:集群基础管理(5 题)

题目一:节点维护流程(cordon / drain / uncordon)

题目 :请完整描述 Kubernetes 节点维护的标准流程。需要执行哪些命令?各命令的作用是什么?如果 kubectl drain 命令卡住,可能的原因有哪些?

考查知识点
  • 节点管理 ------ 第三期 §1.2
  • cordon / drain / uncordon 命令详解
详细解答

标准维护流程(三步走):

步骤 命令 作用
1. cordon kubectl cordon <node> 标记节点为不可调度,阻止新 Pod 调度到该节点
2. drain kubectl drain <node> --ignore-daemonsets 驱逐节点上所有 Pod(DaemonSet 除外),将其迁移到其他节点
3. 维护操作 在节点上执行实际维护(升级内核、更换硬件等) ---
4. uncordon kubectl uncordon <node> 恢复节点调度能力

drain 命令常用参数

参数 作用
--ignore-daemonsets 忽略 DaemonSet 管理的 Pod(必须加)
--force 强制驱逐无法正常终止的 Pod
--delete-emptydir-data 删除使用 emptyDir 的 Pod
--grace-period=30 优雅终止宽限期(秒)

drain 卡住的可能原因

  1. PodDisruptionBudget(PDB)限制:Pod 设置了 PDB,阻止驱逐以保证最低可用副本数。
  2. 裸 Pod :非控制器管理的 Pod(直接用 kubectl run 创建的)无法被重新调度,需加 --force 或手动处理。
  3. PVC 限制:使用本地存储的 Pod 可能无法迁移。
  4. DaemonSet Pod 未忽略 :未加 --ignore-daemonsets 参数。
  5. 节点上 Pod 无法正常终止 :容器进程卡死,超过 terminationGracePeriodSeconds

完整命令示例

bash

复制代码
# 1. 标记节点不可调度
kubectl cordon worker31.whisky.cloud

# 2. 驱逐 Pod(忽略 DaemonSet)
kubectl drain worker31.whisky.cloud --ignore-daemonsets

# 3. 在节点上执行维护操作(如升级内核)
# ...

# 4. 恢复调度
kubectl uncordon worker31.whisky.cloud

题目二:节点状态与 Conditions 解读

题目kubectl get nodes 显示节点状态为 NotReady。请说明排查思路,包括需要查看哪些信息、各 Condition 的含义,以及常见原因。

考查知识点
  • 节点状态与 Conditions ------ 第三期 §1.1
  • 集群排错基础 ------ 第三期 §6
详细解答

排查步骤

bash

复制代码
# 1. 查看节点详细状态(Conditions 和 Events)
kubectl describe node worker31.whisky.cloud

# 2. 查看 kubelet 日志
journalctl -u kubelet -n 50

# 3. 检查 kubelet 服务状态
systemctl status kubelet

各 Condition 含义

Condition True 表示 影响
MemoryPressure 内存压力大 节点可能驱逐 Pod
DiskPressure 磁盘空间不足 节点可能驱逐 Pod
PIDPressure 进程数过多 节点无法创建新进程
Ready 节点就绪 正常接收 Pod

NotReady 常见原因

原因 排查方法
kubelet 服务未运行或崩溃 systemctl status kubelet
swap 未关闭 free -hswapoff -a
容器运行时故障(containerd) systemctl status containerd
网络插件未部署或故障 `kubectl get pods -n kube-system
内核参数未配置 sysctl net.bridge.bridge-nf-call-iptables
磁盘空间满 df -h
证书过期 kubeadm certs check-expiration

排故原则kubectl describe node 是首选排查命令,Events 部分通常能直接定位问题。

题目三:Namespace 资源隔离(ResourceQuota 与 LimitRange)

题目:请解释 Kubernetes 中 Namespace 的作用,并说明 ResourceQuota 和 LimitRange 的区别与使用场景。请分别给出 YAML 示例。

考查知识点
  • Namespace 管理 ------ 第三期 §3
  • ResourceQuota 与 LimitRange ------ 第三期 §3.4、§3.5
详细解答

Namespace 的作用

  • 将物理集群逻辑划分为多个虚拟集群
  • 实现资源隔离和权限隔离
  • 便于团队/项目/环境的资源管理

ResourceQuota vs LimitRange

对比项 ResourceQuota LimitRange
作用范围 整个 Namespace 单个 Pod/容器
控制内容 总资源用量上限 单 Pod/容器资源默认值和范围
典型配置 CPU/内存总量、PVC 数量、Pod 数量 单 Pod 最小/最大/默认 CPU/内存
使用场景 防止 Namespace 资源超限 防止单 Pod 资源无限使用

ResourceQuota YAML 示例

yaml

复制代码
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota
  namespace: whisky
spec:
  hard:
    requests.cpu: "2"
    requests.memory: "2Gi"
    limits.cpu: "4"
    limits.memory: "4Gi"
    persistentvolumeclaims: "5"
    pods: "10"

LimitRange YAML 示例

yaml

复制代码
apiVersion: v1
kind: LimitRange
metadata:
  name: limits
  namespace: whisky
spec:
  limits:
  - max:
      cpu: "1"
      memory: "1Gi"
    min:
      cpu: "100m"
      memory: "128Mi"
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    type: Container

补充:创建 ResourceQuota 后,Namespace 中的所有 Pod 都必须指定资源请求(requests)和限制(limits),否则创建 Pod 会失败。

题目四:多集群上下文切换

题目 :用户需要管理两个 Kubernetes 集群(cluster1 和 cluster2)。请说明如何配置和切换集群上下文?kubectx 工具如何简化这一过程?

考查知识点
  • 集群上下文切换 ------ 第三期 §5
  • kubectx 工具 ------ 第三期 §5.5
详细解答

配置多集群 :将两个集群的配置合并到 ~/.kube/config 文件,或通过多 KUBECONFIG 环境变量管理。

多集群配置示例

yaml

复制代码
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.1.8.30:6443
  name: cluster1
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.1.8.150:6443
  name: cluster2
contexts:
- context:
    cluster: cluster1
    namespace: default
    user: cluster1-admin
  name: cluster1-context
- context:
    cluster: cluster2
    namespace: default
    user: cluster2-admin
  name: cluster2-context
current-context: cluster1-context
kind: Config
users:
- name: cluster1-admin
  user:
    client-certificate-data: DATA+OMITTED
- name: cluster2-admin
  user:
    client-certificate-data: DATA+OMITTED

kubectl config 切换

bash

复制代码
# 查看集群列表
kubectl config get-clusters

# 查看上下文列表
kubectl config get-contexts

# 切换上下文
kubectl config use-context cluster2-context

kubectx 工具简化

bash

复制代码
# 列出所有上下文
kubectx

# 查看当前上下文
kubectx -c

# 切换上下文
kubectx cluster2-context

# 切换到上一个上下文
kubectx -

补充 :多 KUBECONFIG 环境变量方式:export KUBECONFIG=/root/.kube/config:/root/cluster2.conf,然后用 kubectl config view --flatten 合并。

题目五:集群重建与证书更新

题目:Kubernetes 集群证书过期了怎么办?请说明如何检查证书过期时间以及如何更新证书。如果证书无法更新,如何重建集群?

考查知识点
  • 集群删除与重建 ------ 第三期 §2
  • 证书过期处理 ------ 第三期 §2.3
详细解答

检查证书过期时间

bash

复制代码
kubeadm certs check-expiration

输出示例:

text

复制代码
CERTIFICATE                EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
admin.conf                 Jun 18, 2025 10:00 UTC   364d            no
apiserver                  Jun 18, 2025 10:00 UTC   364d            no
...

更新证书

bash

复制代码
# 1. 更新所有证书
kubeadm certs renew all

# 2. 重启 kubelet
systemctl restart kubelet

# 3. 更新 kubeconfig(如果 admin.conf 过期)
kubectl config view --raw > /root/.kube/config

证书无法更新时重建集群

bash

复制代码
# 1. 备份集群配置
kubectl get cm kubeadm-config -n kube-system -o yaml > kubeadm.yml

# 2. 删除所有 Worker 节点
kubectl drain worker31.whisky.cloud --ignore-daemonsets --force
kubectl drain worker32.whisky.cloud --ignore-daemonsets --force
kubectl delete node worker31.whisky.cloud worker32.whisky.cloud
kubeadm reset -f  # 在 worker 节点执行

# 3. 删除 Master 节点
kubectl delete node master30.whisky.cloud
kubeadm reset -f
rm -fr .kube/

# 4. 使用备份配置重建集群
kubeadm init --config kubeadm.yml
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 5. 重新部署网络插件
kubectl apply -f calico.yaml

# 6. Worker 重新加入
kubeadm join ...

补充:证书默认有效期 1 年,建议在生产环境中设置证书自动续期或定期检查。

第四期:Pod 管理(5 题)

题目六:Pod 与容器的关系及 Pod 状态

题目:Kubernetes 中 Pod 和容器的关系是什么?为什么 K8s 管理 Pod 而不是直接管理容器?请列举 Pod 的常见状态及含义。

考查知识点
  • Pod 介绍 ------ 第四期 §1
  • Pod 与容器辨析 ------ 第四期 §9
  • Pod 生命周期与状态 ------ 第四期 §5
详细解答

Pod 与容器的关系

维度 容器 Pod
本质 运行进程(运行时概念) 容器的外壳 + 运行环境(K8s 概念)
K8s 调度单位 ❌ 不是 ✅ 是
多容器支持 ❌ 不支持 ✅ 天然支持
网络/存储共享 ❌ 不能 ✅ 内部容器可共享

为什么 K8s 管理 Pod 而不是容器

  1. 容器太"原子":K8s 需要一个能直接调度、有完整身份的对象------Pod。
  2. 支持多容器协同:业务容器 + Sidecar 容器(日志、监控、代理)需要共享网络和存储。
  3. 统一生命周期管理:以 Pod 为单位管理重启、自愈、滚动更新,语义清晰。
  4. 解耦底层容器运行时:Pod 屏蔽了 Docker、containerd、cri-o 等差异。

Pod 常见状态

状态 含义
Pending Pod 已创建但尚未调度到节点
ContainerCreating 正在拉取镜像、创建容器
Running Pod 正常运行
Completed 容器进程正常退出(exit 0)
Error 容器进程错误退出(exit ≠ 0)
CrashLoopBackOff 反复崩溃,正在退避等待重启
ImagePullBackOff 镜像拉取失败
Terminating 正在被删除,优雅终止中

题目七:多容器 Pod 的使用场景与操作

题目:请说明多容器 Pod 的典型使用场景。Pod 中多个容器如何共享资源?请写出在多容器 Pod 中执行命令、复制文件到指定容器的命令格式。

考查知识点
  • 多容器 Pod ------ 第四期 §3
  • Pod 中执行命令和复制文件 ------ 第四期 §2.3、§2.4
详细解答

多容器 Pod 典型场景

场景 说明 示例
Sidecar 模式 辅助容器提供日志收集、监控、代理等功能 Nginx + Filebeat
数据同步 一个容器写数据,另一个容器读取或备份 主容器写日志,备份容器同步
初始化 使用 Init Container 完成初始化(特殊) 数据库迁移、权限设置
代理/网关 代理容器处理网络通信 Nginx + Envoy

Pod 中多容器共享资源

共享资源 说明
网络命名空间 所有容器共享同一个 IP 地址和端口空间,可通过 localhost 通信
存储卷 所有容器可挂载相同的 Volume,实现数据共享
IPC 命名空间 容器之间可通过进程间通信交互
生命周期 同生共死,一起调度、一起销毁

多容器 Pod 操作命令

bash

复制代码
# 多容器 Pod 中执行命令(-c 指定容器)
kubectl exec bbs -c wordpress -- hostname

# 复制文件到指定容器
kubectl cp /etc/hosts bbs:/new-hosts -c wordpress

# 查看多容器 Pod 日志(默认显示第一个容器)
kubectl logs bbs
# 查看指定容器日志
kubectl logs bbs -c wordpress

题目八:Init Container 的作用与场景

题目:什么是 Init Container?它与普通容器有何区别?请写出一个使用 Init Container 等待 Service 就绪的 YAML 示例。

考查知识点
  • Init Container ------ 第四期 §7
  • Init Container 使用场景
详细解答

Init Container 定义 :在 Pod 中普通容器启动之前运行的特殊容器,用于执行初始化任务。

Init Container vs 普通容器

对比项 Init Container 普通容器
执行顺序 按顺序依次执行 并行启动
前置条件 前一个 Init 成功才能执行下一个 无前置条件
成功要求 必须成功完成(exit 0) 保持运行
重启策略 失败时根据 restartPolicy 重启 独立重启
就绪探针 不支持 支持
资源限制 独立设置 独立设置

使用场景

  1. 等待依赖服务就绪(数据库、DNS 等)
  2. 等待固定时间后再启动业务容器
  3. 初始化 Volume 数据(克隆 Git 仓库、创建目录、设置权限)
  4. 执行数据库迁移

等待 Service 就绪的 Init Container 示例

yaml

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done; sleep 3;']
  - name: init-mydb
    image: busybox
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done; sleep 3;']
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']

观察 Pod 状态变化

Init:0/2Init:1/2PodInitializingRunning

题目九:restartPolicy 三种策略

题目 :Kubernetes Pod 的 restartPolicy 有哪三种取值?请分别说明其行为,并给出适用场景。在多容器 Pod 中,重启策略如何生效?

考查知识点
  • restartPolicy ------ 第四期 §6
  • 多容器场景下的重启策略
详细解答

三种重启策略

策略 行为 适用场景
Always 无论容器成功还是失败,都重启 默认值,Web 服务等长期运行的应用
OnFailure 只在容器失败(exit ≠ 0)时重启 批处理任务、Job
Never 从不重启 一次性任务、调试、数据迁移

多容器 Pod 中的重启策略

  • restartPolicy 针对 Pod 中所有容器,而不是单个容器
  • 只要有一个容器需要重启,整个 Pod 就会根据策略重新创建

验证实验

yaml

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  restartPolicy: Always
  containers:
  - name: busybox1
    image: busybox
    command: ['sh', '-c', 'echo Hello && sleep 5']
  - name: busybox2
    image: busybox
    command: ['sh', '-c', 'echo Hello && sleep 5']
  • Always:任一容器完成,Pod 就重启
  • OnFailure:正常完成不重启,错误才重启
  • Never:任何情况都不重启

题目十:静态 Pod 与 pause 容器

题目:什么是静态 Pod?Master 节点上的系统组件(kube-apiserver 等)是如何以静态 Pod 方式运行的?请解释 pause 容器的 3 个核心作用。

考查知识点
  • 静态 Pod ------ 第四期 §8
  • pause 容器 ------ 第四期 §9.3
详细解答

静态 Pod 定义

  • kubelet 直接管理的 Pod,不通过 API Server
  • kubelet 定期扫描 staticPodPath 目录中的 YAML 文件,根据文件变动创建或删除 Pod

Master 组件静态 Pod

bash

复制代码
# 查看静态 Pod 目录
grep staticPodPath /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests

# 查看静态 Pod 文件
ls -1 /etc/kubernetes/manifests
etcd.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml

静态 Pod vs 普通 Pod

特性 静态 Pod 普通 Pod
管理者 kubelet API Server / 控制器
可通过 API 删除 ❌ 会立即重建 ✅ 直接删除
可用于系统组件 ✅ 是 ❌ 不适合

pause 容器的 3 个核心作用

  1. 创建并持有 Pod 的 Linux Namespace
    • Pod 中所有容器共享 Network、PID、IPC 命名空间
    • 必须有一个容器来"持有"这些空间,pause 容器承担此角色
  2. 让 Pod 生命周期独立于业务容器
    • 业务容器可以重启,pause 容器不重启
    • Pod 的网络、IP、存储挂载始终保持不变
  3. 实现多容器共享网络
    • 所有容器加入 pause 的 Network Namespace
    • 共享同一个 IP,可以用 127.0.0.1 互相访问
    • 端口不能冲突

超形象比喻

概念 比喻
pause 容器 房东(先占好房子)
Pod 房子(提供居住环境)
业务容器 租客(住进房子干活)

房东(pause)先占好房子(网络/命名空间),租客(业务容器)才能住进来。租客换了一波又一波,房子一直都在。

附:知识点对应总表

题号 主要考查知识点(对应笔记章节)
1 第三期 §1.2 节点维护流程(cordon/drain/uncordon)
2 第三期 §1.1 节点状态与 Conditions;§6 集群排错基础
3 第三期 §3.4-3.5 ResourceQuota 与 LimitRange
4 第三期 §5 集群上下文切换;§5.5 kubectx 工具
5 第三期 §2 集群删除与重建;§2.3 证书过期处理
6 第四期 §1 Pod 介绍;§5 Pod 生命周期与状态;§9 Pod 与容器辨析
7 第四期 §3 多容器 Pod;§2.3-2.4 exec/cp 操作
8 第四期 §7 Init Container 概念与场景
9 第四期 §6 restartPolicy 三种策略
10 第四期 §8 静态 Pod;§9.3 pause 容器作用

学习建议:对于答错的题目,请回看第三期或第四期对应章节,并动手在集群环境中验证。集群运维和 Pod 管理是 Kubernetes 日常操作的基础,建议通过实际操作加深理解。
--- Compiled and Authored by Whisky --- June 25th, 2026