Kubernetes教程FG061-Kubernetes存储卷(PersistentVolume)配置与实战
内容简介
本篇文章主要介绍Kubernetes中存储卷(PersistentVolume)的配置与使用方法。风哥教程参考Kubernetes官方文档存储相关内容,结合生产环境实际操作场景,详细讲解PersistentVolume的配置方法、类型和最佳实践。
目录大纲
Part01-基础概念与理论知识
1.1 存储卷概述
存储卷(Volume)是Kubernetes中用于持久化数据的机制,它可以:
- 持久化数据:即使Pod被删除,数据仍然保留
- 共享数据:多个Pod可以共享同一个存储卷
- 支持多种存储后端:如NFS、iSCSI、云存储等
1.2 PersistentVolume与PersistentVolumeClaim
PersistentVolume(PV)和PersistentVolumeClaim(PVC)是Kubernetes中用于管理存储的两个核心概念:
- PersistentVolume(PV):
- 由集群管理员创建的存储资源
- 独立于Pod的生命周期
- 可以被多个PVC申请使用
- PersistentVolumeClaim(PVC):
- 由用户创建的存储请求
- 绑定到一个PV
- Pod通过PVC使用存储
Part02-生产环境规划与建议
2.1 存储卷类型选择
- NFS:
- 优点:易于配置,支持共享
- 缺点:性能相对较低
- 适用场景:开发测试环境,低I/O要求的应用
- iSCSI:
- 优点:性能较好,支持块存储
- 缺点:配置复杂
- 适用场景:数据库等对I/O要求较高的应用
- 云存储:
- 优点:管理简单,高可用
- 缺点:成本较高
- 适用场景:云环境中的应用
- 本地存储:
- ,风哥提示:。
- 优点:性能最佳
- 缺点:不支持Pod迁移
- 适用场景:对性能要求极高的应用
2.2 存储容量规划
- 数据量估算:根据应用的数据量和增长趋势估算存储容量
- 冗余考虑:考虑数据备份和冗余需求
- 性能需求:根据应用的I/O要求选择合适的存储类型
- 扩展性:考虑未来存储容量的扩展需求
Part03-生产环境项目实施方案
3.1 PersistentVolume配置
配置NFS类型的PersistentVolume,风哥提示:。
创建NFS服务器
# 安装NFS服务器
[root@fgedu-nfs ~]# yum install -y nfs-utils
[root@fgedu-nfs ~]# yum install -y nfs-utils
# 创建共享目录
[root@fgedu-nfs ~]# mkdir -p /Kubernetes/nfs/data
[root@fgedu-nfs ~]# mkdir -p /Kubernetes/nfs/data
# 配置NFS共享
[root@fgedu-nfs ~]# cat > /etc/exports << EOF /Kubernetes/nfs/data 192.168.1.0/24(rw,sync,no_root_squash) EOF
[root@fgedu-nfs ~]# cat > /etc/exports << EOF /Kubernetes/nfs/data 192.168.1.0/24(rw,sync,no_root_squash) EOF
# 启动NFS服务
[root@fgedu-nfs ~]# systemctl start nfs-server
[root@fgedu-nfs ~]# systemctl enable nfs-server
[root@fgedu-nfs ~]# systemctl start nfs-server
[root@fgedu-nfs ~]# systemctl enable nfs-server
创建PersistentVolume
# 创建PV配置文件
[root@fgedu-master ~]# cat > pv-nfs.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs labels: type: nfs spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: 192.168.1.100 path: /Kubernetes/nfs/data EOF
[root@fgedu-master ~]# cat > pv-nfs.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs labels: type: nfs spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: 192.168.1.100 path: /Kubernetes/nfs/data EOF
# 应用PV配置
[root@fgedu-master ~]# kubectl apply -f pv-nfs.yaml
[root@fgedu-master ~]# kubectl apply -f pv-nfs.yaml
persistentvolume/pv-nfs created
查看PV状态
# 查看PV状态
[root@fgedu-master ~]# kubectl get pv
[root@fgedu-master ~]# kubectl get pv
,学习交流加群风哥微信: itpux-com。
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 10Gi RWX Retain Available 1m
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 10Gi RWX Retain Available 1m
3.2 PersistentVolumeClaim配置
创建PersistentVolumeClaim。
创建PVC配置文件
# 创建PVC配置文件
[root@fgedu-master ~]# cat > pvc-nfs.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: type: nfs EOF
[root@fgedu-master ~]# cat > pvc-nfs.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: type: nfs EOF
# 应用PVC配置
[root@fgedu-master ~]# kubectl apply -f pvc-nfs.yaml
[root@fgedu-master ~]# kubectl apply -f pvc-nfs.yaml
persistentvolumeclaim/pvc-nfs created
查看PVC状态
# 查看PVC状态
[root@fgedu-master ~]# kubectl get pvc
[root@fgedu-master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs Bound pv-nfs 10Gi RWX 1m
pvc-nfs Bound pv-nfs 10Gi RWX 1m
3.3 存储卷使用
在Pod中使用PVC:
创建使用PVC的Pod
# 创建Pod配置文件
[root@fgedu-master ~]# cat > pod-with-pvc.yaml << EOF apiVersion: v1 kind: Pod metadata: name: nginx-with-pvc labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: nginx-data mountPath: /usr/share/nginx/html volumes: - name: nginx-data persistentVolumeClaim: claimName: pvc-nfs EOF
[root@fgedu-master ~]# cat > pod-with-pvc.yaml << EOF apiVersion: v1 kind: Pod metadata: name: nginx-with-pvc labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: nginx-data mountPath: /usr/share/nginx/html volumes: - name: nginx-data persistentVolumeClaim: claimName: pvc-nfs EOF
# 应用Pod配置
[root@fgedu-master ~]# kubectl apply -f pod-with-pvc.yaml
[root@fgedu-master ~]# kubectl apply -f pod-with-pvc.yaml
,学习交流加群风哥QQ113257174。
pod/nginx-with-pvc created
验证存储卷挂载
# 查看Pod状态
[root@fgedu-master ~]# kubectl get pod nginx-with-pvc
[root@fgedu-master ~]# kubectl get pod nginx-with-pvc
NAME READY STATUS RESTARTS AGE
nginx-with-pvc 1/1 Running 0 1m
nginx-with-pvc 1/1 Running 0 1m
# 验证存储卷挂载
[root@fgedu-master ~]# kubectl exec -it nginx-with-pvc — df -h
[root@fgedu-master ~]# kubectl exec -it nginx-with-pvc — df -h
Filesystem Size Used Avail Use% Mounted on
overlay 50G 10G 40G 20% /
tmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
192.168.1.100:/Kubernetes/nfs/data 50G 5G 45G 10% /usr/share/nginx/html
tmpfs 799M 0 799M 0% /run/secrets/kubernetes.io/serviceaccount
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 3.9G 0 3.9G 0% /sys/firmware
overlay 50G 10G 40G 20% /
tmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
192.168.1.100:/Kubernetes/nfs/data 50G 5G 45G 10% /usr/share/nginx/html
tmpfs 799M 0 799M 0% /run/secrets/kubernetes.io/serviceaccount
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 3.9G 0 3.9G 0% /sys/firmware
Part04-生产案例与实战讲解
4.1 企业级存储方案部署
某企业需要部署一个企业级的存储方案,用于支持多个应用的持久化存储需求。。
案例背景
- 应用数量:10个微服务应用
- 存储需求:
- 数据库:需要高性能块存储
- 文件服务:需要共享存储
- 日志存储:需要大容量存储
- 性能要求:
- 数据库:IOPS > 10000
- 文件服务:吞吐量 > 1GB/s
部署方案
# 1. 部署iSCSI存储服务器
# 用于数据库等需要高性能块存储的应用
# 安装iSCSI服务
yum install -y targetcli
# 配置iSCSI存储
targetcli
/> cd /backstores/block
/> create db-store /dev/sdb
/> cd /iscsi
/> create iqn.2023-07.com.fgedu:db
/> cd iqn.2023-07.com.fgedu:db/tpg1/luns
/> create /backstores/block/db-store
/> cd ../acls
/> create iqn.2023-07.com.fgedu:client
/> exit
# 启动iSCSI服务
systemctl start target
systemctl enable target
# 2. 部署NFS存储服务器
# 用于文件服务等需要共享存储的应用
# 安装NFS服务
yum install -y nfs-utils
# 创建共享目录
mkdir -p /Kubernetes/nfs/files,更多视频教程www.fgedu.net.cn。
mkdir -p /Kubernetes/nfs/logs
# 配置NFS共享
cat > /etc/exports << EOF /Kubernetes/nfs/files 192.168.1.0/24(rw,sync,no_root_squash) /Kubernetes/nfs/logs 192.168.1.0/24(rw,sync,no_root_squash) EOF # 启动NFS服务 systemctl start nfs-server systemctl enable nfs-server # 3. 创建PersistentVolume # 创建iSCSI PV cat > pv-iscsi.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-iscsi-db labels: type: iscsi spec: capacity: storage: 50Gi accessModes: - ReadWriteOnce iscsi: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:db lun: 0 fsType: ext4 readOnly: false EOF # 创建NFS PV cat > pv-nfs-files.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-files labels: type: nfs purpose: files spec: capacity: storage: 100Gi accessModes: - ReadWriteMany nfs: server: 192.168.1.100 path: /Kubernetes/nfs/files EOF # 应用PV配置 kubectl apply -f pv-iscsi.yaml kubectl apply -f pv-nfs-files.yaml # 4. 创建PersistentVolumeClaim # 创建数据库PVC cat > pvc-iscsi-db.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-iscsi-db namespace: fgedu-production spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi selector: matchLabels: type: iscsi EOF # 创建文件服务PVC cat > pvc-nfs-files.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs-files namespace: fgedu-production spec: accessModes: - ReadWriteMany resources: requests:,更多学习教程公众号风哥教程itpux_com。 storage: 50Gi selector: matchLabels: type: nfs purpose: files EOF # 应用PVC配置 kubectl apply -f pvc-iscsi-db.yaml kubectl apply -f pvc-nfs-files.yaml
# 用于数据库等需要高性能块存储的应用
# 安装iSCSI服务
yum install -y targetcli
# 配置iSCSI存储
targetcli
/> cd /backstores/block
/> create db-store /dev/sdb
/> cd /iscsi
/> create iqn.2023-07.com.fgedu:db
/> cd iqn.2023-07.com.fgedu:db/tpg1/luns
/> create /backstores/block/db-store
/> cd ../acls
/> create iqn.2023-07.com.fgedu:client
/> exit
# 启动iSCSI服务
systemctl start target
systemctl enable target
# 2. 部署NFS存储服务器
# 用于文件服务等需要共享存储的应用
# 安装NFS服务
yum install -y nfs-utils
# 创建共享目录
mkdir -p /Kubernetes/nfs/files,更多视频教程www.fgedu.net.cn。
mkdir -p /Kubernetes/nfs/logs
# 配置NFS共享
cat > /etc/exports << EOF /Kubernetes/nfs/files 192.168.1.0/24(rw,sync,no_root_squash) /Kubernetes/nfs/logs 192.168.1.0/24(rw,sync,no_root_squash) EOF # 启动NFS服务 systemctl start nfs-server systemctl enable nfs-server # 3. 创建PersistentVolume # 创建iSCSI PV cat > pv-iscsi.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-iscsi-db labels: type: iscsi spec: capacity: storage: 50Gi accessModes: - ReadWriteOnce iscsi: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:db lun: 0 fsType: ext4 readOnly: false EOF # 创建NFS PV cat > pv-nfs-files.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-files labels: type: nfs purpose: files spec: capacity: storage: 100Gi accessModes: - ReadWriteMany nfs: server: 192.168.1.100 path: /Kubernetes/nfs/files EOF # 应用PV配置 kubectl apply -f pv-iscsi.yaml kubectl apply -f pv-nfs-files.yaml # 4. 创建PersistentVolumeClaim # 创建数据库PVC cat > pvc-iscsi-db.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-iscsi-db namespace: fgedu-production spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi selector: matchLabels: type: iscsi EOF # 创建文件服务PVC cat > pvc-nfs-files.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs-files namespace: fgedu-production spec: accessModes: - ReadWriteMany resources: requests:,更多学习教程公众号风哥教程itpux_com。 storage: 50Gi selector: matchLabels: type: nfs purpose: files EOF # 应用PVC配置 kubectl apply -f pvc-iscsi-db.yaml kubectl apply -f pvc-nfs-files.yaml
4.2 数据库存储配置实战
某企业需要在Kubernetes中部署MySQL数据库,需要配置持久化存储。。
案例背景
- 应用:MySQL 8.0
- 存储需求:100GB,高性能
- 高可用:需要主从复制
配置方案
# 创建存储类
[root@fgedu-master ~]# cat > storageclass-iscsi.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: iscsi-storage provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:db lun: 0 fsType: ext4 readOnly: "false" EOF
[root@fgedu-master ~]# cat > storageclass-iscsi.yaml << EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: iscsi-storage provisioner: kubernetes.io/iscsi parameters: targetPortal: 192.168.1.101:3260 iqn: iqn.2023-07.com.fgedu:db lun: 0 fsType: ext4 readOnly: "false" EOF
# 应用存储类配置
[root@fgedu-master ~]# kubectl apply -f storageclass-iscsi.yaml
[root@fgedu-master ~]# kubectl apply -f storageclass-iscsi.yaml
# 创建MySQL主节点PVC
[root@fgedu-master ~]# cat > pvc-mysql-master.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-mysql-master namespace: fgedu-production spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: iscsi-storage EOF
[root@fgedu-master ~]# cat > pvc-mysql-master.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-mysql-master namespace: fgedu-production spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: iscsi-storage EOF
# 应用PVC配置
[root@fgedu-master ~]# kubectl apply -f pvc-mysql-master.yaml
[root@fgedu-master ~]# kubectl apply -f pvc-mysql-master.yaml
# 创建MySQL主节点Deployment
[root@fgedu-master ~]# cat > deployment-mysql-master.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: mysql-master namespace: fgedu-production spec: replicas: 1 selector: matchLabels: app: mysql role: master。 template:,from K8S+DB视频:www.itpux.com。 metadata: labels: app: mysql role: master spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: "fgedu123" - name: MYSQL_DATABASE value: "fgedudb" - name: MYSQL_USER value: "fgedu" - name: MYSQL_PASSWORD value: "fgedu123" ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumes: - name: mysql-data persistentVolumeClaim: claimName: pvc-mysql-master EOF
[root@fgedu-master ~]# cat > deployment-mysql-master.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: mysql-master namespace: fgedu-production spec: replicas: 1 selector: matchLabels: app: mysql role: master。 template:,from K8S+DB视频:www.itpux.com。 metadata: labels: app: mysql role: master spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: "fgedu123" - name: MYSQL_DATABASE value: "fgedudb" - name: MYSQL_USER value: "fgedu" - name: MYSQL_PASSWORD value: "fgedu123" ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumes: - name: mysql-data persistentVolumeClaim: claimName: pvc-mysql-master EOF
# 应用Deployment配置
[root@fgedu-master ~]# kubectl apply -f deployment-mysql-master.yaml
[root@fgedu-master ~]# kubectl apply -f deployment-mysql-master.yaml
Part05-风哥经验总结与分享
5.1 存储卷配置最佳实践
- 选择合适的存储类型:根据应用的性能要求和访问模式选择合适的存储类型
- 合理设置存储容量:根据应用的数据量和增长趋势设置合理的存储容量
- 使用StorageClass:使用StorageClass实现存储的动态 provisioning
- 设置合适的访问模式:
- ReadWriteOnce(RWO):单个节点读写
- ReadOnlyMany(ROX):多个节点只读
- ReadWriteMany(RWX):多个节点读写
- 配置存储备份:定期备份存储中的数据
- 监控存储使用情况:监控存储的使用情况,及时扩容
- 使用标签和注解:使用标签和注解管理存储资源
5.2 常见问题与解决方案
问题 原因 解决方案
PV和PVC绑定失败 存储配置错误 检查存储服务器配置和网络连接
存储卷挂载失败 权限问题或文件系统错误 检查存储权限和文件系统状态
存储性能问题 存储类型选择不当 选择更适合的存储类型
存储容量不足 初始容量规划不足 及时扩容或清理数据
数据丢失 未配置备份策略 配置定期备份策略
PV和PVC绑定失败 存储配置错误 检查存储服务器配置和网络连接
存储卷挂载失败 权限问题或文件系统错误 检查存储权限和文件系统状态
存储性能问题 存储类型选择不当 选择更适合的存储类型
存储容量不足 初始容量规划不足 及时扩容或清理数据
数据丢失 未配置备份策略 配置定期备份策略
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
