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 失败样本与排障实验
    • 本轮操作记录:大模型全生态与基础原理科普文撰写
    • 本轮操作记录:大模型数据集样本与治理文档编写
    • 本轮操作记录:大模型训练与模型产物概念文撰写
    • 本轮操作记录:大模型推理与服务发布概念文撰写

存储 — NFS 动态 Provisioning

K8s 存储模型

应用声明需求(PVC)→ StorageClass 匹配 → Provisioner 自动创建 PV → Pod 挂载使用

三个核心概念

概念类比说明
PV (PersistentVolume)磁盘一块实际的存储空间
PVC (PersistentVolumeClaim)购买请求"我要 10Gi 的 ReadWriteOnce 存储"
StorageClass磁盘类型目录"NFS 动态/本地 SSD/云盘"

静态 vs 动态 Provisioning

方式流程场景
静态管理员手动创建 PV → PVC 绑定现有 PV遗留存储、特殊硬件
动态PVC 引用 StorageClass → Provisioner 自动创建 PV生产首选,自动化

我们的 NFS 存储架构

Worker-4 (154.219.104.66, 150G 磁盘)
  └── /srv/nfs/k8s          ← NFS 导出目录
        ├── pvc-xxx-prometheus/  ← 自动创建的子目录
        ├── pvc-xxx-grafana/
        ├── pvc-xxx-loki/
        └── pvc-xxx-harbor/

NFS Server 配置

# Worker-4 上
apt-get install -y nfs-kernel-server
mkdir -p /srv/nfs/k8s
echo '/srv/nfs/k8s *(rw,sync,no_subtree_check,no_root_squash)' > /etc/exports
exportfs -ra

参数解释:

  • * — 允许所有客户端挂载
  • rw — 读写
  • sync — 写操作同步到磁盘后才返回(数据安全)
  • no_subtree_check — 不检查父目录权限(性能优化)
  • no_root_squash — 允许客户端 root 权限(容器需要)

NFS CSI Provisioner

helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --set nfs.server=10.10.0.5 \
  --set nfs.path=/srv/nfs/k8s \
  --set storageClass.name=nfs-dynamic \
  --set storageClass.defaultClass=true    # 设为默认 StorageClass

安装后,任何 PVC 不指定 storageClassName 就会使用 nfs-dynamic。

当前 PVC 使用情况

Prometheus:    10Gi  (monitoring/prometheus-xxx)
Alertmanager:   2Gi  (monitoring/alertmanager-xxx)
Grafana:        5Gi  (monitoring/monitoring-grafana)
Loki:          10Gi  (monitoring/loki)
Harbor:        20Gi+ (harbor/多个组件)
Gitea:          5Gi  (gitea/postgresql + gitea-storage)
共计约 16 个 PVC,全部自动分配

Access Modes

Mode含义适用存储
ReadWriteOnce (RWO)单节点读写云盘、本地磁盘
ReadWriteMany (RWX)多节点读写NFS、CephFS
ReadOnlyMany (ROX)多节点只读静态内容分发

NFS 支持 RWX,这是它的优势——多个 Pod 可以同时挂载同一个 PVC。

Reclaim Policy

PVC 删除后 PV 怎么办?

Policy行为
DeletePV 和底层存储一起删除(我们的默认)
RetainPV 保留,数据不删,需要手动清理

面试题:为什么 StatefulSet 的 PVC 缩容后不删?

StatefulSet 缩容(3→2)时,web-2 的 PVC 保留。这是数据安全设计——万一是误操作,扩回来后 PVC 自动重新绑定,数据不丢。要真删需要手动 kubectl delete pvc。

→ 03-ingress-networkpolicy.md