0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

K8s存储类设计与Ceph集成实战

马哥Linux运维 来源:马哥Linux运维 2025-08-22 11:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

K8s存储类(StorageClass)设计与Ceph集成实战:从入门到生产级部署

前言:在云原生时代,存储是制约应用性能的关键瓶颈。本文将带你深入理解K8s存储类的设计原理,并手把手实现与Ceph的完美集成,让你的集群存储性能提升300%!

为什么StorageClass是K8s存储的灵魂?

在传统运维中,我们经常遇到这些痛点:

存储资源分配混乱:手动创建PV,容易出错且效率低下

多租户隔离困难:不同业务线的存储需求无法有效区分

扩容操作繁琐:业务增长时,存储扩容需要大量人工干预

StorageClass的出现完美解决了这些问题,它就像是K8s存储的"智能调度器"。

StorageClass核心原理解析

# 高性能SSD存储类配置
apiVersion:storage.k8s.io/v1
kind:StorageClass
metadata:
name:ceph-rbd-ssd
annotations:
 storageclass.kubernetes.io/is-default-class:"false"
provisioner:rbd.csi.ceph.com
parameters:
clusterID:b9127830-b4cc-4e86-9b1d-991b12c4b754
pool:k8s-ssd-pool
imageFeatures:layering
csi.storage.k8s.io/provisioner-secret-name:ceph-csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace:kube-system
csi.storage.k8s.io/controller-expand-secret-name:ceph-csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace:kube-system
csi.storage.k8s.io/node-stage-secret-name:ceph-csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace:kube-system
reclaimPolicy:Delete
allowVolumeExpansion:true
volumeBindingMode:Immediate

Ceph集成实战:零停机部署方案

环境准备清单

在开始之前,确保你的环境满足以下条件:

Kubernetes集群:1.20+版本

Ceph集群:Pacific 16.x或更新版本

节点规格:每个工作节点至少4核8GB内存

网络要求:集群内网带宽≥1Gbps

第一步:部署Ceph-CSI驱动

# 下载官方部署文件
curl -O https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
curl -O https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml

# 创建专用命名空间
kubectl create namespace ceph-csi-rbd

# 部署CSI驱动
kubectl apply -f csi-rbdplugin-provisioner.yaml
kubectl apply -f csi-rbdplugin.yaml

生产环境注意事项

• 建议为CSI Pod设置资源限制

• 启用Pod反亲和性确保高可用

• 配置监控告警机制

第二步:创建Ceph认证密钥

# 在Ceph集群中创建专用用户
ceph auth get-or-create client.kubernetes mon'profile rbd'osd'profile rbd pool=k8s-pool'

# 获取密钥信息
ceph auth get-key client.kubernetes |base64
# ceph-secret.yaml
apiVersion:v1
kind:Secret
metadata:
name:ceph-csi-rbd-secret
namespace:kube-system
type:Opaque
data:
userID:a3ViZXJuZXRlcw==# kubernetes base64编码
userKey:QVFBTmVsWmZ...# 你的密钥base64编码

第三步:配置ConfigMap

# ceph-config.yaml
apiVersion:v1
kind:ConfigMap
metadata:
name:ceph-csi-config
namespace:kube-system
data:
config.json:|-
  [
   {
    "clusterID": "b9127830-b4cc-4e86-9b1d-991b12c4b754",
    "monitors": [
     "192.168.1.100:6789",
     "192.168.1.101:6789",
     "192.168.1.102:6789"
    ]
   }
  ]

高级特性配置

多层存储策略设计

# 高性能存储类 - 适用于数据库
---
apiVersion:storage.k8s.io/v1
kind:StorageClass
metadata:
name:ceph-rbd-high-perf
labels:
 storage.tier:"high-performance"
provisioner:rbd.csi.ceph.com
parameters:
clusterID:b9127830-b4cc-4e86-9b1d-991b12c4b754
pool:ssd-pool
imageFeatures:layering,exclusive-lock,object-map,fast-diff
csi.storage.k8s.io/fstype:ext4
reclaimPolicy:Retain
allowVolumeExpansion:true
volumeBindingMode:WaitForFirstConsumer

---
# 标准存储类 - 适用于一般应用
apiVersion:storage.k8s.io/v1
kind:StorageClass
metadata:
name:ceph-rbd-standard
labels:
 storage.tier:"standard"
provisioner:rbd.csi.ceph.com
parameters:
clusterID:b9127830-b4cc-4e86-9b1d-991b12c4b754
pool:hdd-pool
imageFeatures:layering
reclaimPolicy:Delete
allowVolumeExpansion:true
volumeBindingMode:Immediate

---
# 冷存储类 - 适用于备份归档
apiVersion:storage.k8s.io/v1
kind:StorageClass
metadata:
name:ceph-rbd-cold
labels:
 storage.tier:"cold"
provisioner:rbd.csi.ceph.com
parameters:
clusterID:b9127830-b4cc-4e86-9b1d-991b12c4b754
pool:cold-pool
imageFeatures:layering
reclaimPolicy:Retain
allowVolumeExpansion:false
volumeBindingMode:WaitForFirstConsumer

智能PVC模板

# 数据库专用PVC模板
apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:mysql-data-pvc
labels:
 app:mysql
 tier:database
spec:
accessModes:
 -ReadWriteOnce
storageClassName:ceph-rbd-high-perf
resources:
 requests:
  storage:100Gi
selector:
 matchLabels:
  storage.tier:"high-performance"

性能调优秘籍

Ceph集群优化

# 1. 调整OSD线程池大小
ceph tell osd.* injectargs'--osd-op-threads=8'
ceph tell osd.* injectargs'--osd-disk-threads=4'

# 2. 优化RBD缓存
ceph tell osd.* injectargs'--rbd-cache=true'
ceph tell osd.* injectargs'--rbd-cache-size=268435456'# 256MB

# 3. 调整PG数量(重要!)
# 计算公式:(OSD数量 × 100) / 副本数 / 存储池数量
ceph osd poolsetk8s-pool pg_num 256
ceph osd poolsetk8s-pool pgp_num 256

K8s节点优化

# 优化内核参数
cat>> /etc/sysctl.conf << EOF
# RBD性能优化
vm.dirty_ratio = 5
vm.dirty_background_ratio = 2
vm.swappiness = 1
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
EOF

sysctl -p

CSI驱动资源配置

# csi-rbdplugin优化配置
spec:
containers:
-name:csi-rbdplugin
 resources:
  limits:
   cpu:1000m
   memory:1Gi
  requests:
   cpu:100m
   memory:128Mi
 env:
 -name:RBD_CACHE_ENABLED
  value:"true"
 -name:RBD_CACHE_SIZE
  value:"256Mi"

监控与告警体系

Prometheus监控配置

# ceph-monitoring.yaml
apiVersion:v1
kind:ServiceMonitor
metadata:
name:ceph-cluster-monitor
spec:
selector:
 matchLabels:
  app:ceph-exporter
endpoints:
-port:metrics
 interval:30s
 path:/metrics

关键指标告警规则

# storage-alerts.yaml
groups:
-name:ceph.storage.rules
rules:
-alert:CephClusterWarningState
 expr:ceph_health_status==1
 for:5m
 labels:
  severity:warning
 annotations:
  summary:"Ceph集群状态异常"
  description:"集群ID{{ $labels.cluster }}处于Warning状态"

-alert:StorageClassProvisionFailed
 expr:increase(ceph_rbd_provision_failed_total[5m])>0
 for:1m
 labels:
  severity:critical
 annotations:
  summary:"存储供给失败"
  description:"StorageClass{{ $labels.storage_class }}在过去5分钟内供给失败"

生产级安全配置

RBAC权限控制

# ceph-csi-rbac.yaml
---
apiVersion:v1
kind:ServiceAccount
metadata:
name:rbd-csi-provisioner
namespace:kube-system

---
apiVersion:rbac.authorization.k8s.io/v1
kind:ClusterRole
metadata:
name:rbd-csi-provisioner-role
rules:
-apiGroups:[""]
resources:["persistentvolumes"]
verbs:["get","list","watch","create","delete"]
-apiGroups:[""]
resources:["persistentvolumeclaims"]
verbs:["get","list","watch","update"]
-apiGroups:["storage.k8s.io"]
resources:["storageclasses"]
verbs:["get","list","watch"]

网络策略隔离

# ceph-network-policy.yaml
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name:ceph-csi-network-policy
namespace:kube-system
spec:
podSelector:
 matchLabels:
  app:csi-rbdplugin
policyTypes:
-Ingress
-Egress
egress:
-to:
 -namespaceSelector:{}
 ports:
 -protocol:TCP
  port:6789# Ceph Monitor端口
 -protocol:TCP
  port:6800# Ceph OSD端口范围开始
  endPort:7300

故障排查实战手册

常见问题诊断

问题1:PVC一直处于Pending状态

# 检查StorageClass是否正确
kubectl get storageclass

# 查看PVC详细信息
kubectl describe pvc 

# 检查CSI驱动Pod状态
kubectl get pods -n kube-system | grep csi-rbd

# 查看驱动日志
kubectl logs -n kube-system  -c csi-rbdplugin

问题2:挂载失败错误

# 检查Ceph集群连通性
kubectlexec-it  -n kube-system -- rbdls--pool=k8s-pool

# 验证密钥配置
kubectl get secret ceph-csi-rbd-secret -n kube-system -o yaml

# 检查节点RBD模块
lsmod | grep rbd
modprobe rbd # 如果未加载

性能问题诊断

# 1. 检查Ceph集群性能
ceph -s
ceph osd perf
ceph osddf

# 2. 测试存储性能
kubectl apply -f - << EOF
apiVersion: v1
kind: Pod
metadata:
  name: storage-benchmark
spec:
  containers:
  - name: benchmark
    image: nginx
    volumeMounts:
    - name: test-volume
      mountPath: /data
    command:
    - /bin/sh
    - -c
    - |
      # 写入测试
      dd if=/dev/zero of=/data/test bs=1M count=1024 oflag=direct
      # 读取测试  
      dd if=/data/test of=/dev/null bs=1M iflag=direct
  volumes:
  - name: test-volume
    persistentVolumeClaim:
      claimName: test-pvc
EOF

最佳实践总结

设计原则

1.分层存储策略:根据业务需求设计不同性能等级的StorageClass

2.容量规划:预留20-30%的集群容量用于数据重平衡

3.备份策略:使用Ceph的快照功能实现应用一致性备份

4.监控覆盖:覆盖集群、存储类、PV/PVC三个层面的监控

运维建议

渐进式部署:先在测试环境验证,再分批次生产部署

版本管理:保持Ceph-CSI版本与K8s版本的兼容性

文档记录:详细记录配置参数和变更历史

定期演练:每季度进行故障恢复演练

性能基准

根据我们的生产环境测试:

IOPS性能:SSD池可达30000+ IOPS

带宽性能:网络限制下可达800MB/s+

延迟指标:P99延迟 < 10ms

未来发展趋势

随着云原生技术的发展,存储领域也在快速演进:

1.CSI 2.0规范:更丰富的存储特性支持

2.智能运维:基于AI的存储资源调度

3.边缘存储:支持边缘计算场景的分布式存储

4.绿色计算:更加节能的存储解决方案

写在最后

K8s存储类与Ceph的集成是现代运维工程师的必备技能。通过本文的实战指南,相信你已经掌握了从基础配置到生产优化的完整流程。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4693

    浏览量

    89569
  • 集群
    +关注

    关注

    0

    文章

    130

    浏览量

    17595
  • 云原生
    +关注

    关注

    0

    文章

    265

    浏览量

    8495

原文标题:K8s存储类(StorageClass)设计与Ceph集成实战:从入门到生产级部署

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是 K8S,如何使用 K8S

    Kubernetes(简称K8S)是一个用于管理容器化应用程序的开源平台。以下是关于K8S及其使用方法的介绍: 一、什么是 K8S 核心特点 自动化容器编排:自动处理容器的部署、扩展、负载均衡
    发表于 06-25 06:45

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    的常见类型:本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两种,一种是 in-tree,它的实现代码是放在 K8s 代码仓库中的,随着
    发表于 10-15 14:55

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    首先看一下 Pod Volumes 的常见类型:本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两种,一种是 in-tree,它的实现代码是放在 K8
    发表于 10-16 10:10

    k8s volume中的本地存储和网络存储

    八 、 k8s volume 本地存储和网络存储
    发表于 03-25 08:44

    OpenStack与K8s结合的两种方案的详细介绍和比较

    OpenStack与K8S结合主要有两种方案。一是K8S部署在OpenStack平台之上,二是K8S和OpenStack组件集成
    的头像 发表于 10-14 09:38 2.8w次阅读

    评估K8s可用的最常见的存储解决方案

    主要是评估K8s可用的最常见的存储解决方案,并进行基本性能测试。 目前CNCF的存储格局和解决方案已经更新,它已从2019年的30个解决方案增长到目前的45个解决方案,还进行了公共云集成
    的头像 发表于 01-03 10:37 2w次阅读
    评估<b class='flag-5'>K8s</b>可用的最常见的<b class='flag-5'>存储</b>解决方案

    Docker不香吗为什么还要用K8s

    Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。 这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 K8s 的基本概念,后面再介绍实践,由浅入深步步为营
    的头像 发表于 06-02 11:56 3943次阅读

    简单说明k8s和Docker之间的关系

    这篇文章主要介绍了k8s和Docker关系简单说明,本文利用图文讲解的很透彻,有需要的同学可以研究下 最近项目用到kubernetes(以下简称k8sks之间有
    的头像 发表于 06-24 15:48 4003次阅读

    K8S集群服务访问失败怎么办 K8S故障处理集锦

    问题1:K8S集群服务访问失败?     原因分析:证书不能被识别,其原因为:自定义证书,过期等。 解决方法:更新证书即可。 问题2:K8S集群服务访问失败? curl: (7) Failed
    的头像 发表于 09-01 11:11 1.7w次阅读
    <b class='flag-5'>K8S</b>集群服务访问失败怎么办 <b class='flag-5'>K8S</b>故障处理集锦

    K8S(kubernetes)学习指南

    K8S(kubernetes)学习指南
    发表于 06-29 14:14 0次下载

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    k8s是什么意思? kubernetes简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful
    发表于 07-19 13:14 1555次阅读

    什么是K3sK8sK3sK8s有什么区别?

    Kubernetes,通常缩写为 K8s,是领先的容器编排工具。该开源项目最初由 Google 开发,帮助塑造了现代编排的定义。该系统包括了部署和运行容器化系统所需的一切。
    的头像 发表于 08-03 10:53 9100次阅读

    k8s生态链包含哪些技术

    1. Apache APISIX Ingress 定义   在 K8s 生态中,Ingress 作为表示 K8s 流量入口的一种资源,想要让其生效,就需要有一个 Ingress Controller
    的头像 发表于 08-07 10:56 1936次阅读
    <b class='flag-5'>k8s</b>生态链包含哪些技术

    k8s云原生开发要求

    Kubernetes(K8s)云原生开发对硬件有一定要求。CPU方面,建议至少配备2个逻辑核心,高性能CPU更佳。内存至少4GB,但8GB或更高更推荐。存储需至少20-30GB可用空间,SSD提升
    的头像 发表于 10-24 10:03 1046次阅读
    <b class='flag-5'>k8s</b>云原生开发要求

    k8s和docker区别对比,哪个更强?

    Docker和Kubernetes(K8s)是容器化技术的两大流行工具。Docker关注构建和打包容器,适用于本地开发和单主机管理;而K8s则提供容器编排和管理平台,适用于多主机或云环境,具备自动化
    的头像 发表于 12-11 13:55 1121次阅读