HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 概览

    • K8s 实战学习实验室
    • 服务访问清单
    • K8s-Lab 学习总纲、仓库评估与专家路线图
  • 课程正文

    • 环境验证与第一课:认识你的真实集群
    • 第二课:kubectl apply 之后,到底发生了什么
    • 第三课:调度器如何选节点,为什么 Pod 会 Pending
    • 第四课:Kubernetes 网络、协议分层、VXLAN/IPIP/WireGuard 原理与排障
    • 第五课:NetworkPolicy、零信任网络与流量边界
    • 第六课:身份、认证、授权、准入与 ServiceAccount / RBAC 原理
    • 第七课:ConfigMap 与 Secret 注入模型、更新机制与安全边界
    • 第八课:存储持久化、PV / PVC / StorageClass 与 NFS 原理
    • 第九课:StatefulSet、Headless Service、稳定身份与存储原理
    • 第十课:探针、滚动更新、优雅终止与 PDB 原理
    • 第十一课:requests / limits、QoS、OOM 与驱逐原理
    • 第十二课:HPA、自动扩缩容、指标链路与副本伸缩原理
    • 第十三课:Service、EndpointSlice、kube-proxy、CoreDNS 与服务发现原理
    • 第十四课:Ingress-nginx、反向代理、Host / Path、NodePort 与北南向流量原理
    • 第十五课:HTTPS、TLS、SNI、证书信任与 Ingress 终止原理
    • 第十六课:cert-manager、Ingress 自动签发、证书生命周期与 ACME 工作流原理
    • 第十七课:ACME、Let's Encrypt、HTTP-01 / DNS-01、Orders / Challenges 与生产限制原理
    • 第十八课:大模型全生态,从数据到训练到部署到治理原理
    • 第十九课:大模型数据集、清洗、标注、切分、版本管理与质量治理原理
    • 第二十课:大模型训练、SFT、LoRA、Checkpoint、Adapter 与模型产物原理
    • 第二十一课:大模型推理、量化、KV Cache、vLLM、吞吐/延迟与部署发布链路原理
  • 实验操作记录

    • 本次仓库审查操作记录与命令原理
    • 本轮操作记录:环境验证、集群基线盘点与故障样本采集
    • 本轮操作记录:kubectl apply 主链路实验
    • 本轮操作记录:调度实验与 Pending 排查
    • 本轮操作记录:Kubernetes 网络原理、协议对比与调试实验
    • 本轮操作记录:NetworkPolicy 与零信任网络实验
    • 本轮操作记录:身份、认证、授权、准入实验
    • 本轮操作记录:ConfigMap 与 Secret 注入、更新与安全边界实验
    • 本轮操作记录:存储持久化、PV / PVC / StorageClass 与 NFS 实验
    • 本轮操作记录:StatefulSet、Headless Service 与稳定身份实验
    • 本轮操作记录:探针、滚动更新、优雅终止与 PDB 实验
    • 本轮操作记录:资源模型、QoS、OOM 与 CPU 节流实验
    • 本轮操作记录:HPA 自动扩缩容实验
    • 本轮操作记录:Service、EndpointSlice、CoreDNS 与服务发现排障实验
    • 本轮操作记录:Ingress-nginx、NodePort 与北南向流量实验
    • 本轮操作记录:HTTPS、TLS、自签证书与 Ingress 实验
    • 本轮操作记录:cert-manager 安装、CA 签发与 Ingress 自动证书实验
    • 本轮操作记录:ACME staging、HTTP-01 失败样本与排障实验
    • 本轮操作记录:大模型全生态与基础原理科普文撰写
    • 本轮操作记录:大模型数据集样本与治理文档编写
    • 本轮操作记录:大模型训练与模型产物概念文撰写
    • 本轮操作记录:大模型推理与服务发布概念文撰写

K8s 面试指南 — 从原理到实战

面试维度

面试官考察的不是你记住了多少命令,而是:

  1. 你理解设计动机吗? — 为什么这样设计,解决了什么问题
  2. 你能排查问题吗? — 给一个故障现象,你怎么定位
  3. 你做过生产级方案吗? — 高可用、安全、可观测怎么做

高频题 Top 20

架构类

Q1: 描述 kubectl apply -f deployment.yaml 之后发生了什么?

完整链路:

kubectl → API Server (认证→授权→准入控制→持久化到 etcd)
       → Controller Manager 的 Deployment Controller 看到新 Deployment
       → 创建 ReplicaSet
       → ReplicaSet Controller 看到需要 3 个 Pod
       → 创建 3 个 Pod(状态 Pending)
       → Scheduler Watch 到 Pending Pod
       → 过滤 + 打分 → 绑定到节点
       → kubelet Watch 到自己节点上有新 Pod
       → 通过 CRI 调用 containerd
       → containerd 拉镜像、创建容器
       → kubelet 上报 Pod Running

Q2: etcd 存了什么?为什么重要?

所有集群状态:节点、Pod、Service、ConfigMap、Secret、RBAC 规则。丢了 etcd = 丢了整个集群。生产必须定期备份,部署奇数台(3/5)保证 Raft 共识。

我们的实验:etcdctl snapshot save 备份了 31MB,3087 keys。

Q3: Master 挂了会怎样?

  • 已运行的 Pod 不受影响(kubelet 继续管理)
  • 但不能创建/更新/删除任何资源
  • 不能调度新 Pod
  • 不能执行 kubectl 命令
  • 如果 kubelet 重启,无法重新注册
  • 这就是为什么生产需要 3 个 Master(HA)

网络类

Q4: Service 的 ClusterIP 是怎么工作的?

ClusterIP 是虚拟 IP,不绑定在任何网卡上。kube-proxy 在每个节点写 iptables 规则:发往 ClusterIP 的包做 DNAT 转发到后端 Pod IP。请求从哪个节点发出,就在哪个节点做转发(不经过 master)。

我们的实验:nginx-svc ClusterIP 10.110.86.136 → Endpoints 指向 3 个 Pod IP。

Q5: Pod 之间怎么通信?

K8s 网络模型要求:

  1. 每个 Pod 有唯一 IP
  2. 任意 Pod 可以直接通信(不需要 NAT)
  3. 实现靠 CNI 插件(我们用 Calico)

同节点:通过 Linux bridge/veth pair 跨节点:Calico 使用 BGP 或 IP-in-IP 隧道

Q6: Ingress 和 Service 的区别?

Service 是 L4(IP + 端口),Ingress 是 L7(域名 + 路径)。Ingress 底层是反向代理(nginx/envoy),提供基于 Host/Path 的路由、TLS 终结、限速等。

我们的实验:app.k8s-lab.local/ → nginx-svc,/web → web-headless。

调度类

Q7: Pod 一直 Pending 怎么排查?

kubectl describe pod <name>  # 看 Events 中的 FailedScheduling 原因

常见原因:资源不足、nodeSelector 不匹配、Taint 没 Toleration、PVC 未 Bound。

我们的实验:请求 100Gi 内存 → "4 Insufficient memory"。

Q8: requests 和 limits 的区别?

requestslimits
含义调度时的保证运行时的上限
CPU 超了—被节流(变慢)
Memory 超了—被 OOMKill(杀掉)
调度依据✅ 是❌ 不是

Q9: Taint/Toleration 和 NodeAffinity 的区别?

  • Taint/Toleration:节点说"我不欢迎你",Pod 说"我能忍"(排斥机制)
  • NodeAffinity:Pod 说"我想去哪"(吸引机制)

实际常组合使用:GPU 节点加 Taint 防止普通 Pod 过来 + GPU Pod 加 Toleration + NodeAffinity 优先选 GPU 节点。

存储类

Q10: PV 的生命周期?

Available → Bound(被 PVC 绑定)→ Released(PVC 删除)→ Delete/Retain

我们的实验:16 个 PVC 通过 NFS StorageClass 动态创建 PV,全部 Bound。

Q11: StatefulSet 缩容后 PVC 删吗?

不删。这是数据安全设计——扩回来后 PVC 自动重新绑定。需要手动 kubectl delete pvc 才真删。

安全类

Q12: Secret 安全吗?

默认不安全。base64 ≠ 加密。需要额外配置:

  1. etcd 加密(EncryptionConfiguration)
  2. RBAC 限制读取权限
  3. 审计日志监控谁访问了 Secret

Q13: RBAC 怎么设计最小权限?

CI/CD 例子:只给 apps/deployments 的 get/create/update,不给 delete,只限特定 namespace。 我们的实验:developer SA 只能 get/list/watch pods in dev → 不能 delete,不能跨 namespace。

Q14: PSS restricted 级别要求什么?

runAsNonRoot、drop ALL capabilities、allowPrivilegeEscalation=false、seccomp RuntimeDefault。我们的实验:特权容器被拒绝,合规容器通过。

运维类

Q15: 如何实现零停机发布?

  1. RollingUpdate 策略(maxUnavailable=0)
  2. readinessProbe(新 Pod 就绪才接收流量)
  3. preStop hook(旧 Pod 优雅关闭)
  4. PDB(保证最少可用副本数)

Q16: 集群升级流程?

1. etcd 备份
2. kubeadm upgrade plan → apply(Master 先升)
3. drain Worker → upgrade kubelet/kubectl → uncordon
4. 逐个 Worker 升级
5. 版本偏差策略:kubelet 可以比 apiserver 低最多 2 个次版本

Q17: 如何排查节点 NotReady?

kubectl describe node → 看 Conditions
SSH 到节点 → systemctl status kubelet
           → journalctl -u kubelet
           → systemctl status containerd
           → df -h(磁盘满?)
           → free -m(内存?)

可观测类

Q18: Prometheus pull 模型的优势?

  • 感知 target 存活(pull 失败 = 挂了)
  • 低耦合(target 不需要知道 Prometheus 地址)
  • 控制采集频率(避免被推送淹没)

Q19: metrics-server、node-exporter、kube-state-metrics 区别?

组件采集什么给谁用
metrics-server实时 CPU/内存kubectl top、HPA
node-exporter节点系统指标Prometheus → Grafana
kube-state-metricsK8s 对象状态Prometheus → Grafana

架构设计类

Q20: 你会怎么设计一个公司的 K8s 平台?

基础层:
  - 3 Master HA + N Worker
  - Calico CNI (NetworkPolicy)
  - NFS/Ceph 存储 + local SSD 给数据库

安全层:
  - RBAC 按团队/环境隔离
  - PSS restricted 给 prod
  - NetworkPolicy 零信任
  - External Secrets Operator

CI/CD:
  - Harbor 镜像仓库(Trivy 扫描)
  - ArgoCD GitOps(Git 是唯一真相源)
  - 环境:dev → staging → prod(namespace 隔离)

可观测:
  - Prometheus + Grafana(指标 + 告警)
  - Loki(日志)
  - 告警规则:Pod 重启、节点 NotReady、磁盘 >80%

弹性:
  - HPA(基于 CPU/自定义指标)
  - PDB(保护最少可用副本)
  - 定期 etcd 备份

以上所有组件我们在实验环境中全部搭建并验证过。

我们实验室的完整技术栈

┌──────────────────────────────────────────────────┐
│                CI/CD & GitOps                      │
│    Gitea (Git) → Harbor (镜像) → ArgoCD (部署)    │
├──────────────────────────────────────────────────┤
│              可观测性                               │
│  Prometheus → Grafana (指标)                       │
│  Loki + Promtail (日志)                            │
│  Alertmanager (告警)                               │
├──────────────────────────────────────────────────┤
│             流量管理                                │
│  nginx-ingress (入口) + Calico NetworkPolicy (隔离)│
├──────────────────────────────────────────────────┤
│              工作负载                               │
│  Deployment / StatefulSet / DaemonSet / Job        │
│  HPA (自动伸缩) + PDB (故障保护)                    │
├──────────────────────────────────────────────────┤
│              安全                                   │
│  RBAC + PSS + Secret 管理                          │
├──────────────────────────────────────────────────┤
│              存储                                   │
│  NFS 动态 Provisioning (StorageClass)              │
├──────────────────────────────────────────────────┤
│              集群基础                               │
│  K8s v1.30 (kubeadm) + Calico CNI + containerd    │
│  5 节点 WireGuard Mesh (LA×3 + HK×2)              │
└──────────────────────────────────────────────────┘