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

一、Ceph 集群基础配置

1. 部署 Ceph 集群

  • 存储池创建
    ceph osd pool create k8s-rbd 128 128 replicated
    ceph osd pool application enable k8s-rbd rbd
    
  • 用户授权
    ceph auth get-or-create client.k8s mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=k8s-rbd' -o /etc/ceph/ceph.client.k8s.keyring
    

二、Kubernetes 集成 Ceph CSI 驱动

1. 部署 Ceph CSI 驱动

  • 下载资源文件
    git clone https://github.com/ceph/ceph-csi.git
    cd ceph-csi/deploy/rbd/kubernetes
    
  • 创建 ConfigMap 和 Secret
    kubectl create configmap ceph-config --from-file=ceph.conf -n kube-system
    kubectl create secret generic ceph-secret --from-literal=key=$(ceph auth get-key client.k8s) -n kube-system
    
  • 部署 RBAC 和 CSI 组件
    kubectl apply -f csi-provisioner-rbac.yaml -n kube-system
    kubectl apply -f csi-nodeplugin-rbac.yaml -n kube-system
    kubectl apply -f csi-rbdplugin-provisioner.yaml -n kube-system
    kubectl apply -f csi-rbdplugin.yaml -n kube-system
    

2. 创建 StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: ceph-cluster
  pool: k8s-rbd
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: ceph-secret
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - discard

三、动态卷供给与验证

1. 创建 PVC 和 Pod

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-rbd-sc

# pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: rbd-test-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: rbd-volume
  volumes:
  - name: rbd-volume
    persistentVolumeClaim:
      claimName: rbd-pvc

2. 验证部署

kubectl apply -f pvc.yaml && kubectl apply -f pod.yaml
kubectl get pvc,pv,pod
# 检查Ceph集群中的RBD镜像
rbd ls k8s-rbd

四、生产级部署优化

1. 高可用性增强

  • 多副本配置
    # StorageClass参数调整
    parameters:
      pool: k8s-rbd
      imageFormat: "2"
      imageFeatures: "layering"
     副本数: "3"  # 生产环境建议3副本
    
  • 多 CSI 控制器实例
    kubectl scale deployment csi-rbdplugin-provisioner -n kube-system --replicas=3
    

2. 性能调优

  • OSD 参数优化
    ceph config set global osd_max_write_size 512
    ceph config set global osd_journal_size 20000
    
  • PG 数量计算
    # 公式:PG数 = (OSD数量 × 100) / 副本数
    ceph osd pool set k8s-rbd pg_num 256
    ceph osd pool set k8s-rbd pgp_num 256
    

3. 监控与告警

  • Prometheus 监控配置
    # prometheus-config.yaml
    global:
      scrape_interval: 15s
    scrape_configs:
    - job_name: 'ceph'
      static_configs:
      - targets: ['ceph-monitor:9283']
    
  • Grafana 仪表盘
    导入 Ceph 官方仪表盘(ID: 11861),监控 OSD 利用率、IOPS、延迟等指标。

4. 安全加固

  • Cephx 认证
    # StorageClass参数
    parameters:
      csi.storage.k8s.io/provisioner-secret-name: ceph-secret
      csi.storage.k8s.io/node-stage-secret-name: ceph-secret
    
  • 网络策略
    # network-policy.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: ceph-csi-policy
    spec:
      podSelector:
        matchLabels:
          app: ceph-csi
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: kubernetes
    

五、灾难恢复与备份

1. 数据备份

# 使用RBD快照
rbd snap create k8s-rbd/volume-name@snap1
rbd snap protect k8s-rbd/volume-name@snap1

# 备份到对象存储(S3兼容)
rbd export k8s-rbd/volume-name - | s3cmd put - s3://backup-bucket/volume-name.export

2. 恢复流程

# 从快照恢复
rbd snap rollback k8s-rbd/volume-name@snap1

# 从对象存储恢复
s3cmd get s3://backup-bucket/volume-name.export - | rbd import - k8s-rbd/volume-name

六、生产环境最佳实践

  1. 多租户隔离
    • 为每个租户创建独立的 Ceph 存储池和 IAM 账户
    • 使用 Kubernetes 的 ResourceQuota 限制租户资源
  2. 资源配额管理
    # tenant-quota.yaml
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: tenant-a-quota
    spec:
      hard:
        persistentvolumeclaims: "10"
        storage.csi.ceph.com/rbd: "50Gi"
    
  3. 滚动升级策略
    kubectl rollout strategy update deployment csi-rbdplugin-provisioner -n kube-system --type=RollingUpdate --rolling-update-max-unavailable=1
    

七、故障排查

  1. 常见问题处理
    • 镜像拉取失败:检查 CSI 驱动镜像地址是否正确,确保私有仓库认证配置
    • PV 绑定失败:查看 Provisioner 日志(kubectl logs csi-rbdplugin-provisioner-xxx -n kube-system)
    • 性能瓶颈:使用 fio 工具进行压力测试,分析 Ceph 集群的 IOPS / 带宽瓶颈
  2. Ceph 集群健康检查
    ceph -s
    ceph osd tree
    ceph df
    
通过以上步骤,您可以完成从 Kubernetes StorageClass 设计到 Ceph 集成的全流程部署,并在生产环境中实现高可用、高性能的存储解决方案。建议结合具体业务需求调整配置参数,并定期进行灾难恢复演练。
阅读剩余
THE END