一、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
六、生产环境最佳实践
- 多租户隔离:
- 为每个租户创建独立的 Ceph 存储池和 IAM 账户
- 使用 Kubernetes 的 ResourceQuota 限制租户资源
- 资源配额管理:
# tenant-quota.yaml apiVersion: v1 kind: ResourceQuota metadata: name: tenant-a-quota spec: hard: persistentvolumeclaims: "10" storage.csi.ceph.com/rbd: "50Gi" - 滚动升级策略:
kubectl rollout strategy update deployment csi-rbdplugin-provisioner -n kube-system --type=RollingUpdate --rolling-update-max-unavailable=1
七、故障排查
-
常见问题处理:
- 镜像拉取失败:检查 CSI 驱动镜像地址是否正确,确保私有仓库认证配置
- PV 绑定失败:查看 Provisioner 日志(kubectl logs csi-rbdplugin-provisioner-xxx -n kube-system)
- 性能瓶颈:使用 fio 工具进行压力测试,分析 Ceph 集群的 IOPS / 带宽瓶颈
-
Ceph 集群健康检查:
ceph -s ceph osd tree ceph df
通过以上步骤,您可以完成从 Kubernetes StorageClass 设计到 Ceph 集成的全流程部署,并在生产环境中实现高可用、高性能的存储解决方案。建议结合具体业务需求调整配置参数,并定期进行灾难恢复演练。