Ceph CSI Helm 部署详解:Ceph Quincy 17.2.9 对接 Kubernetes 1.23.17
本文详细介绍如何使用 Helm 部署 Ceph CSI 插件,实现 Ceph Quincy 17.2.9 版本与 Kubernetes 1.23.17 的对接。
Helm3 安装说明
二进制方式安装 Helm3
# 下载 Helm 二进制包(示例版本 v3.5.2)
wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
# 解压文件
tar -zxf helm-v3.5.2-linux-amd64.tar.gz
# 将 Helm 移动到系统 PATH 路径中
mv linux-amd64/helm /usr/local/bin/
# 验证安装
helm version
如需获取 Helm 离线安装包及 devops 相关方面支持,可联系张师傅:
ggttxlss
使用 Helm 部署 Ceph CSI
方法一:使用官方 Ceph CSI Helm Chart
1. 添加 Helm 仓库
# 添加 Ceph CSI 官方 Helm 仓库
helm repo add ceph-csi https://ceph.github.io/csi-charts
helm repo update
2. 搜索可用的 Chart
# 查看可用的 CephFS Chart
helm search repo ceph-csi/ceph-csi-cephfs --versions
# 搜索特定版本
helm search repo ceph-csi/ceph-csi-cephfs --version v3.7.2
# 下载3.7.2 版本
helm pull ceph-csi/ceph-csi-cephfs --version v3.7.2
# 解压文件
tar -zxf ceph-csi-cephfs-3.7.2.tgz
cd ceph-csi-cephfs-3.7.2
cp -rp values.yaml values.yaml.bak
张师傅已经将ceph-csi-cephfs-3.7.2.tgz下载下来了,ceph-csi-cephfs-3.7.2.tgz
3. 创建 values.yaml 配置文件
根据环境创建 values.yaml 文件:
---
# RBAC 配置
rbac:
create: true
# ServiceAccount 配置
serviceAccounts:
nodeplugin:
create: true
name: cephfs-csi-nodeplugin
provisioner:
create: true
name: cephfs-csi-provisioner
# CSI 配置 - 连接 Ceph 集群
csiConfig:
- clusterID: "6fbff83e-d0e5-11f0-a088-5254005c5c5c"
monitors:
- "192.168.3.41:6789"
- "192.168.4.33:6789"
- "192.168.4.34:6789"
cephFS:
subvolumeGroup: "csi"
# 可选,如果需要网络命名空间隔离
# netNamespaceFilePath: "{{ .kubeletDir }}/plugins/{{ .driverName }}/net"
# 日志级别
logLevel: 5
sidecarLogLevel: 1
# Node Plugin 配置
nodeplugin:
name: csi-cephfsplugin
updateStrategy: RollingUpdate
priorityClassName: system-node-critical
httpMetrics:
enabled: true
containerPort: 8081
service:
enabled: true
servicePort: 8080
type: ClusterIP
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
clusterIP: ""
externalIPs: []
loadBalancerIP: ""
loadBalancerSourceRanges: []
profiling:
enabled: false
registrar:
image:
repository: registry.k8s.io/sig-storage/csi-node-driver-registrar
tag: v2.5.1
pullPolicy: IfNotPresent
resources: {}
plugin:
image:
repository: quay.io/cephcsi/cephcsi
tag: v3.7.2
pullPolicy: IfNotPresent
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
# 如果需要使用内核客户端(内核版本 < 4.17 支持配额)
# forcecephkernelclient: true
# 挂载选项
kernelmountoptions: ""
fusemountoptions: ""
# Pod Security Policy
podSecurityPolicy:
enabled: true
# Provisioner 配置
provisioner:
name: csi-cephfsplugin-provisioner
replicaCount: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 50%
timeout: 150s
# 集群名称(可选)
# clustername: "k8s-cluster-1"
priorityClassName: system-cluster-critical
enableHostNetwork: false
httpMetrics:
enabled: true
containerPort: 8081
service:
enabled: true
servicePort: 8080
type: ClusterIP
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
clusterIP: ""
externalIPs: []
loadBalancerIP: ""
loadBalancerSourceRanges: []
profiling:
enabled: false
provisioner:
image:
repository: registry.k8s.io/sig-storage/csi-provisioner
tag: v3.2.1
pullPolicy: IfNotPresent
resources: {}
# 设置卷的元数据
setmetadata: true
resizer:
name: resizer
enabled: true
image:
repository: registry.k8s.io/sig-storage/csi-resizer
tag: v1.5.0
pullPolicy: IfNotPresent
resources: {}
snapshotter:
image:
repository: registry.k8s.io/sig-storage/csi-snapshotter
tag: v6.0.1
pullPolicy: IfNotPresent
resources: {}
nodeSelector: {}
tolerations: []
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- csi-cephfsplugin-provisioner
topologyKey: "kubernetes.io/hostname"
podSecurityPolicy:
enabled: true
# SELinux 支持
selinuxMount: true
# StorageClass 配置
storageClass:
create: true
name: cephfs-csi
annotations:
storageclass.kubernetes.io/is-default-class: "true"
clusterID: "6fbff83e-d0e5-11f0-a088-5254005c5c5c"
fsName: "howlaisi_cephfs"
pool: ""
fuseMountOptions: ""
kernelMountOptions: ""
mounter: ""
volumeNamePrefix: ""
# Secret 配置
provisionerSecret: csi-cephfs-secret
provisionerSecretNamespace: default
controllerExpandSecret: csi-cephfs-secret
controllerExpandSecretNamespace: default
nodeStageSecret: csi-cephfs-secret
nodeStageSecretNamespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
# Secret 配置(建议手动创建,这里设置为不自动创建)
secret:
create: false
name: csi-cephfs-secret
adminID: admin
adminKey: ""
# Ceph 配置文件
cephconf: |
[global]
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
# 连接到您的 Ceph 监视器
mon_host = 192.168.3.41:6789,192.168.4.33:6789,192.168.4.34:6789
# 解决 http://tracker.ceph.com/issues/23446
fuse_set_user_groups = false
# 增加 fuse 写入缓冲区大小
fuse_big_writes = true
#########################################################
# 内部使用变量,请谨慎修改! #
#########################################################
# Socket 文件名称
provisionerSocketFile: csi-provisioner.sock
pluginSocketFile: csi.sock
# Kubelet 目录
kubeletDir: /var/lib/kubelet
# CSI 驱动名称
driverName: cephfs.csi.ceph.com
# ConfigMap 配置
configMapName: ceph-csi-config
# configMapKey:
externallyManagedConfigmap: false
cephConfConfigMapName: ceph-config
values.yaml 文件中,请根据实际情况进行修改。values.yaml
4.部署前的准备工作
在部署之前,需要创建文件系统,并且创建一个Ceph用户,并获取该用户的密钥。
# 创建文件系统
ceph fs volume create howlaisi_k8s_12317_cephfs
# 创建客户端用户,但权限不是很大,不满足k8s所需要的最小权限
ceph fs authorize howlaisi_k8s_12317_cephfs client.howlaisi_k8s_12317_cephfs / rw
# 赋更大的权限
ceph auth caps client.howlaisi_k8s_12317_cephfs \
mon 'allow r' \
mgr 'allow rw' \
mds 'allow rwps fsname=howlaisi_k8s_12317_cephfs' \
osd 'allow rw tag cephfs metadata=howlaisi_k8s_12317_cephfs,allow rw tag cephfs data=howlaisi_k8s_12317_cephfs'
创建 Secret:
apiVersion: v1
kind: Secret
metadata:
name: csi-cephfs-secret
namespace: default
type: kubernetes.io/rbd
data:
adminID: aG93bGFpc2lfazhzXzEyMzE3X2NlcGhmcw==
adminKey: QVFBeUprSnBJZ2l5Q3hBQVc2SUwxeGNkYjRRWGx1SmVwZzQ1VlE9PQ==
其中adminID,并不是指admin账号,而是Ceph集群中,有权限的账号。
[root@ceph1 ceph]# cat *howlaisi_k8s_12317_ceph*
[client.howlaisi_k8s_12317_cephfs]
key = AQAyJkJpIgiyCxAAW6IL1xcdb4QXluJepg45VQ==
caps mds = "allow rwps fsname=howlaisi_k8s_12317_cephfs"
caps mgr = "allow rw"
caps mon = "allow r fsname=howlaisi_k8s_12317_cephfs"
caps osd = "allow rw tag cephfs data=howlaisi_k8s_12317_cephfs"
[root@ceph1 ceph]# echo -n "howlaisi_k8s_12317_cephfs" | base64
aG93bGFpc2lfazhzXzEyMzE3X2NlcGhmcw==
[root@ceph1 ceph]# echo -n "AQAyJkJpIgiyCxAAW6IL1xcdb4QXluJepg45VQ==" | base64
QVFBeUprSnBJZ2l5Q3hBQVc2SUwxeGNkYjRRWGx1SmVwZzQ1VlE9PQ==
5. 安装 Helm Chart
cd ceph-csi-cephfs
# 安装
helm install ceph-csi-cephfs . -f values.yaml --namespace default
测试部署结果
创建一个 PVC 来测试部署是否成功:
# test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cephfs-test-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
storageClassName: cephfs-csi
resources:
requests:
storage: 1Gi
# 应用测试 PVC
kubectl apply -f test-pvc.yaml
# 检查 PVC 状态
kubectl get pvc cephfs-test-pvc

常用管理命令
在日常使用和故障排查过程中,可能会用到以下命令:
# 检查所有相关资源
kubectl get all -n default | grep ceph
# 检查 StorageClass
kubectl get storageclass
# 检查创建的 PVC
kubectl get pvc cephfs-test-pvc
# 查看 PVC 详细信息
kubectl describe pvc -n default cephfs-test-pvc
# 查看所有命名空间中的 PVC
kubectl get pvc -A
# 编辑 StorageClass
kubectl edit storageclass cephfs-csi
# 卸载 Helm Release
helm uninstall ceph-csi-cephfs --namespace default
# 重新安装 Helm Release
helm install ceph-csi-cephfs . -f values.yaml --namespace default
参数说明
以下是配置文件中的关键参数说明:
| 参数 | 含义 | 可选值 | 默认值 |
|---|---|---|---|
csiConfig.clusterID | Ceph 集群唯一标识符 | UUID 字符串 | 必填 |
csiConfig.monitors | Ceph Monitor 地址列表 | IP:PORT 数组 | 必填 |
cephFS.subvolumeGroup | CephFS 子卷组名称 | 字符串 | "csi" |
provisioner.replicaCount | Provisioner 副本数 | 数字 | 3 |
storageClass.fsName | CephFS 文件系统名称 | 字符串 | 必填 |
storageClass.reclaimPolicy | PV 回收策略 | Delete/Retain | Delete |
logLevel | 日志级别 | 0-5 | 5 |
快照功能配置
helm安装后,默认的存储类名称为 cephfs-csi,默认的快照类名称为 cephfs-csi:
apiVersion: snapshot.storage.k8s.io/v1beta1
deletionPolicy: Delete
driver: cephfs.csi.ceph.com
kind: VolumeSnapshotClass
metadata:
creationTimestamp: '2025-12-17T06:27:08Z'
generation: 3
managedFields:
- apiVersion: snapshot.storage.k8s.io/v1
fieldsType: FieldsV1
fieldsV1:
'f:deletionPolicy': {}
'f:driver': {}
manager: controller-manager
operation: Update
time: '2025-12-17T06:27:08Z'
- apiVersion: snapshot.storage.k8s.io/v1beta1
fieldsType: FieldsV1
fieldsV1:
'f:parameters':
.: {}
'f:clusterID': {}
'f:csi.storage.k8s.io/snapshotter-secret-name': {}
'f:csi.storage.k8s.io/snapshotter-secret-namespace': {}
'f:userID': {}
manager: Mozilla
operation: Update
time: '2025-12-17T06:38:13Z'
name: cephfs-csi
resourceVersion: '184233'
uid: f302fcb8-796a-43fb-aa48-64f207cae6b1
但目前创建快照存储类,有问题,原因是没有parameters参数,所以快照存储类创建失败,需要加上:
apiVersion: snapshot.storage.k8s.io/v1beta1
deletionPolicy: Delete
driver: cephfs.csi.ceph.com
kind: VolumeSnapshotClass
metadata:
...
parameters:
clusterID: 82867a6c-d994-11f0-9c30-5254005c5c5c # ceph集群唯一标识符
csi.storage.k8s.io/snapshotter-secret-name: csi-cephfs-secret # 密钥名称
csi.storage.k8s.io/snapshotter-secret-namespace: default # 密钥命名空间

总结
通过 Helm 部署 Ceph CSI 是一种标准化且易于维护的方式。相比手动部署 YAML 文件,Helm 提供了更好的配置管理和版本控制能力。本文介绍了官方 Ceph CSI Helm Chart 的使用方法,并提供了针对 Ceph Quincy 17.2.9 和 Kubernetes 1.23.17 的具体配置示例。
评论区