Kubernetes教程FG085-Kubernetes集群存储优化与实战
内容简介
本篇文章主要介绍Kubernetes集群存储优化的方法。风哥教程参考Kubernetes官方文档存储相关内容,结合生产环境实际操作场景,详细讲解如何优化Kubernetes集群的存储性能和可靠性。
目录大纲
Part01-基础概念与理论知识
1.1 存储架构概述
Kubernetes集群存储架构包括以下几个层次:
- 存储接口:
- PersistentVolume (PV):持久卷,集群级别的存储资源
- PersistentVolumeClaim (PVC):持久卷声明,Pod对存储的请求
- StorageClass:存储类,动态创建PV的模板
- 存储后端:
- 本地存储:节点本地磁盘
- 网络存储:NFS、iSCSI、Ceph等
- 云存储:AWS EBS、Azure Disk、GCE PD等
- 存储特性:
- 持久性:数据在Pod重启后保持不变
- 可扩展性:支持动态扩容
- 高可用性:支持数据冗余和故障转移
- 性能:满足应用的I/O需求
Kubernetes存储模型的核心原则包括:
- 存储抽象:通过PV和PVC抽象存储细节,使应用无需关心底层存储实现
- 动态 provisioning:通过StorageClass动态创建PV,简化存储管理
- 存储策略:支持不同的存储策略,如延迟、吞吐量等
- 跨节点访问:支持Pod在不同节点间迁移时保持存储访问
1.2 存储类型与选择
Kubernetes支持多种存储类型,主要包括:
- 本地存储:
- 优势:高性能,低延迟
- 劣势:不可迁移,单点故障
- 适用场景:缓存、临时数据、高性能计算
- NFS:
- 优势:简单易用,跨平台支持
- 劣势:性能一般,单点故障
- 适用场景:共享存储,中小型应用
- iSCSI:
- 优势:性能较好,支持块存储
- 劣势:配置复杂,需要专用设备
- 适用场景:数据库,需要块存储的应用
- Ceph:
- 优势:高性能,高可用,支持对象、块、文件存储
- 劣势:配置复杂,资源消耗大
- 适用场景:大规模集群,需要高可用的应用
- 云存储:
- 优势:简单易用,按需付费,高可用
- 劣势:成本高,依赖云厂商
- 适用场景:云原生应用,快速部署
Part02-生产环境规划与建议
2.1 存储规划
- 存储容量规划:
- 估算应用数据量:根据应用类型和用户规模估算
- 预留增长空间:考虑数据增长和备份需求
- 设置存储配额:避免单个应用占用过多存储
- 存储性能规划:
- IOPS需求:根据应用类型确定所需IOPS
- 吞吐量需求:根据数据传输量确定所需吞吐量
- 延迟要求:根据应用响应时间要求确定延迟目标
- 存储高可用规划:
- 数据冗余:采用RAID、多副本等方式
- 故障转移:支持存储节点故障时的自动切换
- 备份策略:定期备份数据,确保数据安全
- 存储网络规划:
- 网络带宽:确保存储网络有足够带宽
- 网络延迟:减少存储网络延迟
- 网络隔离:将存储网络与业务网络隔离
2.2 存储方案选择
- 根据应用类型选择:
- 数据库应用:选择块存储,如iSCSI、Ceph RBD
- 文件服务应用:选择文件存储,如NFS、Ceph FS
- 对象存储应用:选择对象存储,如Ceph RGW、S3
- 根据集群规模选择:
- 小规模集群(<100节点):NFS、本地存储
- 中规模集群(100-1000节点):iSCSI、Ceph
- 大规模集群(>1000节点):Ceph、云存储
,风哥提示:。
- 根据性能需求选择:
- 高性能需求:本地SSD、NVMe
- 高可靠性需求:Ceph、云存储
- 平衡需求:iSCSI、混合存储
- 根据成本预算选择:
- 低成本:本地存储、NFS
- 中等成本:iSCSI、Ceph
- 高成本:云存储、全闪存存储
Part03-生产环境项目实施方案
3.1 存储配置
配置存储系统,风哥提示:。
配置NFS存储
[root@fgedu-nfs ~]# yum install -y nfs-utils
# 创建共享目录
[root@fgedu-nfs ~]# mkdir -p /Kubernetes/fgdata/nfs
# 配置NFS共享
[root@fgedu-nfs ~]# cat > /etc/exports << EOF
/Kubernetes/fgdata/nfs 192.168.1.0/24(rw,sync,no_root_squash)
EOF
# 启动NFS服务
[root@fgedu-nfs ~]# systemctl enable nfs-server --now
# 查看NFS共享
[root@fgedu-nfs ~]# exportfs -v
配置iSCSI存储
[root@fgedu-iscsi ~]# yum install -y targetcli
# 启动iSCSI服务
[root@fgedu-iscsi ~]# systemctl enable targetcli –now
# 配置iSCSI存储
[root@fgedu-iscsi ~]# targetcli
/> /backstores/block create iscsi1 /dev/sdb1
/> /iscsi create iqn.2024-01.com.fgedu:iscsi1
/> /iscsi/iqn.2024-01.com.fgedu:iscsi1/tpg1/luns create /backstores/block/iscsi1
/> /iscsi/iqn.2024-01.com.fgedu:iscsi1/tpg1/acls create iqn.2024-01.com.fgedu:client1
/> /iscsi/iqn.2024-01.com.fgedu:iscsi1/tpg1/portals create 192.168.1.100
/> exit
配置Ceph存储
[root@fgedu-ceph ~]# yum install -y ceph-deploy
# 创建Ceph集群
[root@fgedu-ceph ~]# mkdir -p /Kubernetes/app/ceph
[root@fgedu-ceph ~]# cd /Kubernetes/app/ceph
[root@fgedu-ceph ceph]# ceph-deploy new fgedu-ceph-01 fgedu-ceph-02 fgedu-ceph-03
# 配置Ceph
[root@fgedu-ceph ceph]# cat >> ceph.conf << EOF
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 128
osd pool default pgp num = 128
EOF
# 部署Ceph
[root@fgedu-ceph ceph]# ceph-deploy install fgedu-ceph-01 fgedu-ceph-02 fgedu-ceph-03
[root@fgedu-ceph ceph]# ceph-deploy mon create-initial
[root@fgedu-ceph ceph]# ceph-deploy osd create fgedu-ceph-01:/dev/sdb fgedu-ceph-02:/dev/sdb fgedu-ceph-03:/dev/sdb
[root@fgedu-ceph ceph]# ceph-deploy admin fgedu-ceph-01 fgedu-ceph-02 fgedu-ceph-03
[root@fgedu-ceph ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
# 检查Ceph状态
[root@fgedu-ceph ceph]# ceph status
3.2 存储性能优化
优化存储性能。
内核参数优化
[root@fgedu-node-01 ~]# cat > /etc/sysctl.d/kubernetes-storage.conf << EOF # 存储优化 vm.dirty_background_ratio = 5 vm.dirty_ratio = 10 vm.swappiness = 0 vm.overcommit_memory = 1 # 提高文件系统性能,学习交流加群风哥微信: itpux-com。 fs.file-max = 655360 fs.nr_open = 655360 # 提高IO性能 blockdev --setra 65536 /dev/sdb EOF # 应用内核参数 [root@fgedu-node-01 ~]# sysctl -p /etc/sysctl.d/kubernetes-storage.conf
存储类配置
[root@fgedu-master ~]# cat > storageclass-high-performance.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: high-performance defaultClass: false provisioner: kubernetes.io/aws-ebs parameters: type: gp3 iopsPerGB: "10000" throughput: "250" reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer EOF # 应用存储类 [root@fgedu-master ~]# kubectl apply -f storageclass-high-performance.yaml
持久卷配置
[root@fgedu-master ~]# cat > persistentvolume.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-fgedu-db labels: app: fgedu-db spec: capacity: storage: 500Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: high-performance awsElasticBlockStore: volumeID: vol-0123456789abcdef0 fsType: ext4 EOF # 应用持久卷 [root@fgedu-master ~]# kubectl apply -f persistentvolume.yaml
持久卷声明配置
[root@fgedu-master ~]# cat > persistentvolumeclaim.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-fgedu-db namespace: fgedu-production spec: accessModes: - ReadWriteOnce resources: requests: storage: 500Gi storageClassName: high-performance selector: matchLabels: app: fgedu-db EOF # 应用持久卷声明 [root@fgedu-master ~]# kubectl apply -f persistentvolumeclaim.yaml
3.3 存储安全优化
优化存储安全。
存储加密
[root@fgedu-ceph ~]# ceph osd pool create encrypted_pool 128
[root@fgedu-ceph ~]# ceph osd pool encryption enable encrypted_pool
[root@fgedu-ceph ~]# ceph osd pool set encrypted_pool encryption_type cephx
存储访问控制
[root@fgedu-master ~]# cat > storage-rbac.yaml << EOF apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: storage-admin namespace: fgedu-production rules: - apiGroups: ["storage.k8s.io"] resources: ["storageclasses", "csinodes"] verbs: ["get", "list", "watch"],学习交流加群风哥QQ113257174。 - apiGroups: [""] resources: ["persistentvolumes", "persistentvolumeclaims"] verbs: ["get", "list", "watch", "create", "update", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: storage-admin-binding namespace: fgedu-productionsubjects: - kind: User name: fgedu apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: storage-admin apiGroup: rbac.authorization.k8s.io EOF # 应用存储访问控制策略 [root@fgedu-master ~]# kubectl apply -f storage-rbac.yaml
存储监控
[root@fgedu-master ~]# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
[root@fgedu-master ~]# helm install prometheus prometheus-community/kube-prometheus-stack –namespace monitoring –create-namespace
[root@fgedu-master ~]# cat > storage-alerts.yaml << EOF apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: storage-alerts namespace: monitoring spec: groups: - name: storage rules: - alert: HighStorageUsage expr: kubelet_volume_stats_available_bytes / kubelet_volume_stats_capacity_bytes * 100 < 20 for: 5m labels: severity: warning annotations: summary: "High storage usage on {{ $labels.persistentvolumeclaim }}" description: "Storage usage on {{ $labels.persistentvolumeclaim }} is above 80%" - alert: StorageIOError expr: rate(kubelet_volume_stats_io_time_seconds_total[5m]) > 0.1
for: 5m
labels:
severity: warning
annotations:
summary: “Storage IO error on {{ $labels.persistentvolumeclaim }}”
description: “Storage IO errors detected on {{ $labels.persistentvolumeclaim }}”
EOF
# 应用存储监控告警
[root@fgedu-master ~]# kubectl apply -f storage-alerts.yaml
Part04-生产案例与实战讲解
4.1 企业级集群存储优化案例
某企业的Kubernetes集群存储性能不佳,需要进行优化。
案例背景
- 集群规模:3个控制平面节点,20个工作节点
- 应用类型:数据库应用,包含MySQL、PostgreSQL等
- 存储问题:
- 存储延迟高
- 存储容量不足
- 数据备份不及时
优化方案
## 1.1 部署Ceph存储集群
mkdir -p /Kubernetes/app/ceph
cd /Kubernetes/app/ceph
ceph-deploy new fgedu-ceph-01 fgedu-ceph-02 fgedu-ceph-03
cat >> ceph.conf << EOF osd pool default size = 3 osd pool default min size = 2 osd pool default pg num = 128 osd pool default pgp num = 128 EOF ceph-deploy install fgedu-ceph-01 fgedu-ceph-02 fgedu-ceph-03 ceph-deploy mon create-initial ceph-deploy osd create fgedu-ceph-01:/dev/sdb fgedu-ceph-02:/dev/sdb fgedu-ceph-03:/dev/sdb ceph-deploy admin fgedu-ceph-01 fgedu-ceph-02 fgedu-ceph-03 chmod +r /etc/ceph/ceph.client.admin.keyring ## 1.2 配置Ceph存储类 cat > storageclass-ceph.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-rbd defaultClass: true,更多视频教程www.fgedu.net.cn。 provisioner: kubernetes.io/rbd parameters: monitors: 192.168.1.101:6789,192.168.1.102:6789,192.168.1.103:6789 adminId: admin adminSecretName: ceph-secret adminSecretNamespace: kube-system pool: rbd userId: kubernetes userSecretName: ceph-user-secret userSecretNamespace: kube-system imageFormat: "2" imageFeatures: layering reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer EOF kubectl apply -f storageclass-ceph.yaml # 2. 存储性能优化 ## 2.1 优化内核参数 cat > /etc/sysctl.d/kubernetes-storage.conf << EOF # 存储优化 vm.dirty_background_ratio = 5 vm.dirty_ratio = 10 vm.swappiness = 0 vm.overcommit_memory = 1 # 提高文件系统性能 fs.file-max = 655360 fs.nr_open = 655360 EOF sysctl -p /etc/sysctl.d/kubernetes-storage.conf ## 2.2 优化存储类参数 kubectl patch storageclass ceph-rbd --patch '{ "parameters": { "imageFeatures": "layering,exclusive-lock,object-map,fast-diff,deep-flatten" } }' # 3. 存储容量管理 ## 3.1 配置存储配额 cat > resourcequota-storage.yaml << EOF apiVersion: v1 kind: ResourceQuota metadata: name: storage-quota namespace: fgedu-production spec: hard: requests.storage: "2000Gi" persistentvolumeclaims: "50" EOF kubectl apply -f resourcequota-storage.yaml ## 3.2 配置存储监控 cat > storage-alerts.yaml << EOF apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: storage-alerts namespace: monitoring spec: groups: - name: storage rules: - alert: HighStorageUsage expr: kubelet_volume_stats_available_bytes / kubelet_volume_stats_capacity_bytes * 100 < 20 for: 5m labels: severity: warning annotations: summary: "High storage usage on {{ $labels.persistentvolumeclaim }}" description: "Storage usage on {{ $labels.persistentvolumeclaim }} is above 80%" - alert: StorageIOError expr: rate(kubelet_volume_stats_io_time_seconds_total[5m]) > 0.1
for: 5m
labels:
severity: warning
annotations:
summary: “Storage IO error on {{ $labels.persistentvolumeclaim }}”
description: “Storage IO errors detected on {{ $labels.persistentvolumeclaim }}”
EOF
kubectl apply -f storage-alerts.yaml
# 4. 数据备份策略
## 4.1 配置定时备份
cat > backup-job.yaml << EOF apiVersion: batch/v1 kind: CronJob metadata: name: database-backup namespace: fgedu-production spec: schedule: "0 2 * * *" concurrencyPolicy: Forbid jobTemplate: spec: template: spec: containers: - name: backup image: mysql:8.0 command: ["/bin/sh", "/scripts/backup.sh"] volumeMounts: - name: backup-script mountPath: /scripts - name: backup-volume mountPath: /backup volumes: - name: backup-script configMap: name: backup-script defaultMode: 0755,更多学习教程公众号风哥教程itpux_com。 - name: backup-volume persistentVolumeClaim: claimName: backup-pvc restartPolicy: OnFailure EOF kubectl apply -f backup-job.yaml # 5. 验证优化效果 ## 5.1 测试存储性能 kubectl run -i --tty --rm debug --image=busybox:1.34 -- dd if=/dev/zero of=/mnt/data/test bs=1M count=1024 ## 5.2 查看存储监控 kubectl port-forward -n monitoring svc/prometheus-server 9090:9090 kubectl port-forward -n monitoring svc/grafana 3000:3000
4.2 高数据量场景存储优化实战
某企业在大数据分析场景下面临存储挑战,需要优化存储系统。。
案例背景
- 集群规模:5个控制平面节点,50个工作节点
- 应用类型:大数据分析,包含Hadoop、Spark等
- 数据量:50TB+
- 存储需求:
- 高吞吐量
- 高可靠性
- 可扩展性
优化方案
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: cephfs-bigdata provisioner: kubernetes.io/cephfs parameters: monitors: 192.168.1.101:6789,192.168.1.102:6789,192.168.1.103:6789 adminId: admin adminSecretName: ceph-secret adminSecretNamespace: kube-system claimRoot: /volumes/kubernetes reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer EOF
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: apps/v1 kind: StatefulSet metadata: name: hadoop-namenode namespace: fgedu-bigdata spec: serviceName: hadoop-namenode replicas: 2 selector: matchLabels: app: hadoop-namenode template: metadata: labels: app: hadoop-namenode spec: containers: - name: hadoop-namenode image: hadoop:3.3.4 ports: - containerPort: 9870 - containerPort: 9000 volumeMounts: - name: hadoop-namenode mountPath: /hadoop/dfs/name volumeClaimTemplates: - metadata: name: hadoop-namenode spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 100Gi storageClassName: ceph-rbd EOF
[root@fgedu-master ~]# kubectl apply -f – << EOF apiVersion: apps/v1 kind: Deployment metadata: name: spark-master namespace: fgedu-bigdata spec: replicas: 1 selector: matchLabels: app: spark-master template: metadata:。 labels:,from K8S+DB视频:www.itpux.com。 app: spark-master spec: containers: - name: spark-master image: spark:3.3.1 ports: - containerPort: 7077 - containerPort: 8080 volumeMounts: - name: spark-config mountPath: /opt/spark/conf volumes: - name: spark-config configMap: name: spark-config EOF
[root@fgedu-master ~]# kubectl run -i –tty –rm debug –image=busybox:1.34 — sh
10240+0 records out
10737418240 bytes (10 GB, 10 GiB) copied, 45.231 seconds, 237 MB/s
Part05-风哥经验总结与分享
5.1 存储优化最佳实践
- 存储选择:
- 根据应用类型选择合适的存储类型
- 考虑性能、可靠性和成本的平衡
- 选择支持动态扩容的存储方案
- 存储规划:
- 合理规划存储容量,预留足够的增长空间
- 根据应用需求规划存储性能
- 制定数据备份和恢复策略
- 性能优化:
- 优化内核参数,提高存储性能
- 使用高性能存储设备,如SSD、NVMe
- 合理配置存储类参数
- 安全优化:
- 启用存储加密,保护数据安全
- 配置存储访问控制,限制访问权限
- 定期审计存储配置,发现安全隐患
- 监控与维护:
- 建立存储监控系统,及时发现问题
- 设置合理的告警阈值,快速响应问题
- 定期检查存储设备和配置,确保存储稳定
5.2 常见问题与解决方案
存储延迟高 存储设备性能不足或配置不当 升级存储设备,优化存储配置
存储容量不足 数据增长过快或规划不足 扩容存储,清理无用数据
数据备份失败 备份策略不当或存储空间不足 调整备份策略,增加备份空间
存储网络中断 网络故障或配置不当 检查网络连接,优化网络配置
存储节点故障 硬件故障或软件问题 修复硬件故障,更新软件版本
存储权限错误 权限配置不当或认证失败 检查权限配置,重置认证信息
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
