KubeSphere教程FG019-KubeSphere持久化存储与CSI插件配置实战
内容简介
本文档详细介绍KubeSphere持久化存储与CSI插件配置的实战操作,包括持久化存储的核心概念、KubeSphere存储系统架构、CSI插件的配置与部署、持久化存储的使用等内容。风哥教程参考KubeSphere官方文档存储相关章节,将官方内容转化为生产实用指南。
通过本文的学习,读者将掌握如何在KubeSphere中配置和使用持久化存储,以及如何部署和配置CSI插件,实现应用数据的持久化存储,提高系统的可靠性和稳定性。
目录大纲
Part01-基础概念与理论知识
1.1 持久化存储核心概念
持久化存储是容器化应用的重要组成部分,核心概念包括:
- 持久卷(PV):集群级别的存储资源,由管理员创建和管理
- 持久卷声明(PVC):用户对存储资源的请求,由用户创建和使用
- 存储类(StorageClass):定义存储的类型和特性,用于动态创建PV
- 卷(Volume):Pod中挂载的存储,是PV或PVC的使用方式
- 挂载点(Mount Point):Pod中容器挂载存储的路径
- 访问模式(Access Mode):存储的访问方式,如ReadWriteOnce、ReadOnlyMany、ReadWriteMany
- 回收策略(Reclaim Policy):PV的回收方式,如Retain、Delete、Recycle
1.2 KubeSphere存储系统架构
KubeSphere存储系统架构包括以下组件:
- 存储插件:包括CSI插件和内置存储插件
- 存储类:定义存储的类型和特性
- 持久卷:集群级别的存储资源
- 持久卷声明:用户对存储资源的请求
- 存储管理界面:KubeSphere提供的存储管理功能
1.3 CSI插件原理与架构
CSI(Container Storage Interface)插件是Kubernetes存储的标准接口,原理与架构包括:
- CSI架构:
- CSI Controller:负责存储卷的创建、删除等操作
- CSI Node:负责存储卷的挂载、卸载等操作
- CSI Driver:具体的存储实现,如NFS、Ceph等
- CSI工作流程:
- 创建PVC:用户创建PVC,请求存储资源
- 创建PV:StorageClass动态创建PV,或使用静态PV
- 绑定PVC:将PVC与PV绑定
- 挂载存储:Pod挂载PVC,CSI Node执行挂载操作
- 使用存储:应用使用存储
- 卸载存储:Pod删除时,CSI Node执行卸载操作
- 删除PV:PVC删除时,根据回收策略处理PV
Part02-生产环境规划与建议
2.1 存储方案规划
存储方案规划需要考虑以下因素:
- 存储类型:
- 本地存储:性能高,可靠性低
- 网络存储:性能中等,可靠性高
- 分布式存储:性能和可靠性都较高
- 存储协议:
- NFS:网络文件系统,适合共享存储
- iSCSI:块存储协议,适合数据库等应用
- Ceph:分布式存储系统,提供块、文件和对象存储
- GlusterFS:分布式文件系统,适合大数据应用
- 部署模式:
- 单节点存储:适合测试环境
- 高可用存储:适合生产环境
- 分布式存储:适合大规模应用
2.2 CSI插件选择建议
不同场景下的CSI插件选择建议:
- 测试环境:
- local:本地存储,部署简单
- hostPath:主机路径,适合开发测试
- 生产环境:
- NFS:适合共享存储需求
- Ceph:适合高性能、高可靠的存储需求
- iSCSI:适合数据库等块存储需求
- 云存储:如AWS EBS、Azure Disk等,适合云环境
- 大数据应用:
- GlusterFS:适合大数据存储
- Ceph:适合高性能计算
2.3 存储容量与性能规划
存储容量与性能规划需要考虑以下因素:
- 容量规划:
- 根据应用需求计算存储容量
- 预留20-30%的缓冲空间
- 考虑数据增长趋势
- 性能规划:
- IOPS:每秒输入输出操作数
- 吞吐量:每秒数据传输量
- 延迟:操作响应时间
- 高可用性:
- 多副本存储:提高数据可靠性
- 故障转移:确保存储服务连续性
- 数据备份:定期备份数据
Part03-生产环境项目实施方案
3.1 CSI插件部署
CSI插件部署的步骤如下: 风哥提示:
# 步骤2:进入集群管理页面
# 步骤3:选择存储管理 -> 存储插件
# 步骤4:选择要部署的CSI插件
# 步骤5:点击部署
# 步骤6:填写部署信息
# 名称:nfs-csi
# 命名空间:kube-system
# 配置参数:根据实际情况填写
# 点击确定
# 步骤7:验证部署
kubectl get pods -n kube-system | grep csi
nfs-csi-controller-xyz 3/3 Running 0 10m
nfs-csi-node-abc 3/3 Running 0 10m
nfs-csi-node-def 3/3 Running 0 10m
nfs-csi-node-ghi 3/3 Running 0 10m
3.2 StorageClass配置
StorageClass配置的步骤如下:
# 步骤2:进入集群管理页面
# 步骤3:选择存储管理 -> 存储类
# 步骤4:点击创建
# 步骤5:填写存储类信息
# 名称:nfs-storage
# 提供者:nfs.csi.k8s.io
# 回收策略:Delete
# 参数:
# server: 192.168.1.100
# share: /nfs/share
# 点击确定
# 步骤6:验证存储类
kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-storage nfs.csi.k8s.io Delete Immediate false 5m
3.3 持久化存储使用
持久化存储使用的步骤如下:
cat > fgedu-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fgedu-pvc
namespace: fgedu-project
spec:
storageClassName: nfs-storage
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f fgedu-pvc.yaml
persistentvolumeclaim/fgedu-pvc created
# 步骤2:验证PVC
kubectl get pvc -n fgedu-project
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
fgedu-pvc Bound pvc-xyz123 10Gi RWO nfs-storage 2m
# 步骤3:在Pod中使用PVC
cat > fgedu-app.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: fgedu-app
namespace: fgedu-project
spec:
replicas: 3
selector:
matchLabels:
app: fgedu-app
template:
metadata:
labels:
app: fgedu-app
spec:
containers:
– name: fgedu-app
image: nginx:latest
volumeMounts:
– name: data
mountPath: /usr/share/nginx/html
volumes:
– name: data
persistentVolumeClaim:
claimName: fgedu-pvc
EOF
kubectl apply -f fgedu-app.yaml
deployment.apps/fgedu-app created
Part04-生产案例与实战讲解
4.1 NFS CSI插件部署实战
NFS CSI插件部署的实战案例: 学习交流加群风哥微信: itpux-com
# 在NFS服务器上执行
sudo yum install nfs-utils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
–> Running transaction check
—> Package nfs-utils.x86_64 1:2.3.3-46.el8 will be installed
–> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
nfs-utils x86_64 1:2.3.3-46.el8 baseos 491 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 491 k
Installed size: 1.6 M
Is this ok [y/N]: y
Downloading Packages:
nfs-utils-2.3.3-46.el8.x86_64.rpm 491 kB/s | 491 kB 00:01
——————————————————————————–
Total 491 kB/s | 491 kB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Preparing : 1/1
Installing : nfs-utils-1:2.3.3-46.el8.x86_64 1/1
Running scriptlet: nfs-utils-1:2.3.3-46.el8.x86_64 1/1
Verifying : nfs-utils-1:2.3.3-46.el8.x86_64 1/1
Installed:
nfs-utils-1:2.3.3-46.el8.x86_64
Complete!
# 创建共享目录
sudo mkdir -p /nfs/share
sudo chmod 777 /nfs/share
# 配置NFS共享
sudo vi /etc/exports
# 添加以下内容
/nfs/share 192.168.1.0/24(rw,sync,no_root_squash)
# 启动NFS服务
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
sudo exportfs -a
# 2. 部署NFS CSI插件
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
“csi-driver-nfs” has been added to your repositories
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs –namespace kube-system
NAME: csi-driver-nfs
LAST DEPLOYED: 2024-01-01 10:00:00.000000000 +0000 UTC
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
NOTES:
The CSI Driver NFS has been installed.
# 3. 验证部署
kubectl get pods -n kube-system | grep csi-driver-nfs
csi-driver-nfs-controller-xyz 3/3 Running 0 10m
csi-driver-nfs-node-abc 3/3 Running 0 10m
csi-driver-nfs-node-def 3/3 Running 0 10m
csi-driver-nfs-node-ghi 3/3 Running 0 10m
4.2 Ceph CSI插件部署实战
Ceph CSI插件部署的实战案例: 学习交流加群风哥QQ113257174
# 风哥教程参考Ceph官方文档部署Ceph集群
# 2. 获取Ceph集群信息
ceph -s
cluster:
id: ceph-cluster-id
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c
mgr: a(active)
osd: 6 osds: 6 up, 6 in
rgw: 1 daemon active
data:
pools: 3 pools, 192 pgs
objects: 2.09k objects, 8.0 GiB
usage: 18 GiB used, 102 GiB / 120 GiB avail
pgs: 192 active+clean
# 3. 创建Ceph用户和池
ceph auth get-or-create client.kube mon ‘allow r’ osd ‘allow rwx pool=kube’
[client.kube]
key = AQAz1234567890=
# 4. 部署Ceph CSI插件
helm repo add ceph-csi https://ceph.github.io/csi-charts
“ceph-csi” has been added to your repositories
helm install ceph-csi ceph-csi/ceph-csi –namespace kube-system –set configMap.cephClusterConfig=”[global]\nmon_host = 192.168.1.101,192.168.1.102,192.168.1.103″ –set csiConfig[0].clusterID=”ceph-cluster-id” –set csiConfig[0].monitors=”192.168.1.101:6789,192.168.1.102:6789,192.168.1.103:6789″
NAME: ceph-csi
LAST DEPLOYED: 2024-01-01 10:00:00.000000000 +0000 UTC
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
NOTES:
The Ceph CSI Driver has been installed.
# 5. 验证部署
kubectl get pods -n kube-system | grep ceph
csi-cephfsplugin-xyz 3/3 Running 0 10m
csi-cephfsplugin-provisioner-abc 6/6 Running 0 10m
csi-rbdplugin-def 3/3 Running 0 10m
csi-rbdplugin-provisioner-ghi 6/6 Running 0 10m
4.3 持久化存储使用实战
持久化存储使用的实战案例:
cat > ceph-storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: ceph-cluster-id
pool: kube
imageFormat: “2”
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: kube-system
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
EOF
kubectl apply -f ceph-storageclass.yaml
storageclass.storage.k8s.io/ceph-rbd created
# 2. 创建Secret
cat > csi-rbd-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: kube-system
stringData:
userID: kube
userKey: AQAz1234567890=
EOF
kubectl apply -f csi-rbd-secret.yaml
secret/csi-rbd-secret created
# 3. 创建PVC
cat > fgedu-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fgedu-pvc
namespace: fgedu-project
spec:
storageClassName: ceph-rbd
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF
kubectl apply -f fgedu-pvc.yaml
persistentvolumeclaim/fgedu-pvc created
# 4. 验证PVC
kubectl get pvc -n fgedu-project
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
fgedu-pvc Bound pvc-xyz123 20Gi RWO ceph-rbd 2m
# 5. 在StatefulSet中使用PVC
cat > fgedu-statefulset.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: fgedu-app
namespace: fgedu-project
spec:
serviceName: fgedu-app
replicas: 3
selector:
matchLabels:
app: fgedu-app
template:
metadata:
labels:
app: fgedu-app
spec:
containers:
– name: fgedu-app
image: nginx:latest
volumeMounts:
– name: data
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
– metadata:
name: data
spec:
storageClassName: ceph-rbd
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 10Gi
EOF
kubectl apply -f fgedu-statefulset.yaml
statefulset.apps/fgedu-app created
4.4 存储性能优化实战
存储性能优化的实战案例: 更多视频教程www.fgedu.net.cn
# 在NFS服务器上执行
sudo vi /etc/sysctl.conf
# 添加以下内容
# NFS性能优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
sudo sysctl -p
# 2. 优化Ceph存储性能
# 在Ceph集群上执行
ceph osd pool set kube size 3
set pool 1 size to 3
ceph osd pool set kube min_size 2
set pool 1 min_size to 2
ceph osd pool set kube pg_num 128
set pool 1 pg_num to 128
ceph osd pool set kube pgp_num 128
set pool 1 pgp_num to 128
# 3. 优化Kubernetes存储配置
cat > optimized-storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: optimized-nfs
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.1.100
share: /nfs/share
mountOptions:
– nfsvers=4.1
– rsize=1048576
– wsize=1048576
– hard
– timeo=600
– retrans=2
– noresvport
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
EOF
kubectl apply -f optimized-storageclass.yaml
storageclass.storage.k8s.io/optimized-nfs created
4.5 KubeSphere数据库持久化存储实战案例
KubeSphere数据库持久化存储的实战案例: 更多学习教程公众号风哥教程itpux_com
cat > mysql-storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mysql-storage
provisioner: ceph.csi.ceph.com
parameters:
clusterID: ceph-cluster-id
pool: mysql
imageFormat: “2”
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: kube-system
csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: kube-system
csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
EOF
kubectl apply -f mysql-storageclass.yaml
storageclass.storage.k8s.io/mysql-storage created
# 2. 创建数据库PVC
cat > mysql-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
namespace: fgedu-db
spec:
storageClassName: mysql-storage
accessModes:
– ReadWriteOnce
resources:
requests:
storage: 50Gi
EOF
kubectl apply -f mysql-pvc.yaml
persistentvolumeclaim/mysql-data created
# 3. 部署MySQL
cat > mysql-deployment.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: fgedu-mysql
namespace: fgedu-db
spec:
replicas: 1
selector:
matchLabels:
app: fgedu-mysql
template:
metadata:
labels:
app: fgedu-mysql
spec:
containers:
– name: mysql
image: mysql:8.0
env:
– name: MYSQL_ROOT_PASSWORD
value: “root123”
– name: MYSQL_DATABASE
value: “fgedudb”
– name: MYSQL_USER
value: “fgedu”
– name: MYSQL_PASSWORD
value: “fgedu123”
volumeMounts:
– name: data
mountPath: /var/lib/mysql
volumes:
– name: data
persistentVolumeClaim:
claimName: mysql-data
—
apiVersion: v1
kind: Service
metadata:
name: fgedu-mysql
namespace: fgedu-db
spec:
selector:
app: fgedu-mysql
ports:
– port: 3306
targetPort: 3306
EOF
kubectl apply -f mysql-deployment.yaml
deployment.apps/fgedu-mysql created
service/fgedu-mysql created
# 4. 验证部署
kubectl get pods -n fgedu-db
NAME READY STATUS RESTARTS AGE
fgedu-mysql-xyz123 1/1 Running 0 5m
kubectl get pvc -n fgedu-db
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-data Bound pvc-abc456 50Gi RWO mysql-storage 10m
Part05-风哥经验总结与分享
5.1 持久化存储最佳实践
在使用持久化存储时,应根据应用的特点选择合适的存储方案,并合理配置存储参数,确保存储性能和可靠性。 from K8S+DB视频:www.itpux.com
- 根据应用类型选择合适的存储方案:数据库应用适合使用块存储,文件服务适合使用文件存储
- 使用StorageClass动态创建PV,简化存储管理
- 设置合理的存储容量,预留足够的缓冲空间
- 选择合适的访问模式,如ReadWriteOnce适合单节点应用,ReadWriteMany适合多节点应用
- 配置适当的回收策略,如Retain适合重要数据,Delete适合临时数据
- 定期备份存储数据,确保数据安全
5.2 CSI插件管理最佳实践
- 插件选择:
- 根据存储类型选择合适的CSI插件
- 选择官方维护的CSI插件,确保兼容性和稳定性
- 定期更新CSI插件版本,获取最新特性和修复
- 插件配置:
- 根据存储系统的特点配置CSI插件参数
- 设置合理的超时和重试机制
- 配置适当的资源限制,确保插件正常运行
- 插件监控:
- 监控CSI插件的运行状态
- 监控存储操作的性能和错误
- 设置告警机制,及时发现和解决问题
5.3 常见问题与解决方案
在使用持久化存储和CSI插件时,常见的问题包括存储挂载失败、存储性能下降、存储容量不足等,需要根据具体情况进行排查和解决。
- 问题:存储挂载失败
- 解决方案:检查CSI插件状态;检查网络连接;检查存储系统状态;检查权限配置
- 问题:存储性能下降
- 解决方案:检查存储系统负载;优化存储配置;调整应用访问模式;考虑使用更高级的存储系统
- 问题:存储容量不足
- 解决方案:扩展存储容量;清理不必要的数据;设置合理的存储配额
- 问题:PV绑定失败
- 解决方案:检查StorageClass配置;检查存储系统可用性;检查权限配置
- 问题:CSI插件崩溃
- 解决方案:检查插件日志;检查资源配置;更新插件版本;重启插件
,持久化存储是容器化应用的重要组成部分,建议在生产环境中使用高可用的存储方案,并定期进行存储性能测试和优化。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
