k8s 使用外部存储介绍
在 Kubernetes (k8s) 中使用外部存储可以提高数据的持久性、可扩展性和高可用性。以下是常见的外部存储解决方案及其使用方式:
1. 常见的 Kubernetes 外部存储
存储类型 | 示例 | 适用场景 |
---|---|---|
NFS (Network File System) | NFS 服务器 | 共享存储,适用于多个 Pod 访问同一数据 |
Ceph | CephFS, RBD, Object Storage | 分布式存储,适用于高可用集群 |
GlusterFS | GlusterFS | 分布式文件存储,适用于大规模存储 |
iSCSI | SAN 设备 | 低延迟、高性能存储 |
AWS EBS | Amazon Elastic Block Store | AWS 云上的块存储 |
Google Persistent Disk (GCE PD) | GCP 云存储 | Google Cloud 持久磁盘 |
Azure Disk | Microsoft Azure Managed Disks | Azure 云存储 |
CSI (Container Storage Interface) | 适用于多种存储后端 | 推荐方式,支持动态存储 |
2. 使用 NFS 作为外部存储
适用场景: 适用于共享存储,如多个 Pod 需要访问相同数据的情况。
步骤 1:在服务器上搭建 NFS
-
安装 NFS 服务(在存储服务器上)
yum install -y nfs-utils systemctl enable --now nfs-server
-
创建共享目录
mkdir -p /data/nfs chmod -R 777 /data/nfs echo "/data/nfs *(rw,sync,no_root_squash)" >> /etc/exports
-
重启 NFS 服务
exportfs -r systemctl restart nfs-server
-
验证 NFS 是否可用
showmount -e <NFS服务器IP>
步骤 2:在 Kubernetes 中使用 NFS 存储
-
创建 PersistentVolume (PV)
apiVersion: v1 kind: PersistentVolume metadata:name: nfs-pv spec:capacity:storage: 10GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /data/nfsserver: <NFS服务器IP>
-
创建 PersistentVolumeClaim (PVC)
apiVersion: v1 kind: PersistentVolumeClaim metadata:name: nfs-pvc spec:accessModes:- ReadWriteManyresources:requests:storage: 5GivolumeName: nfs-pv
-
在 Pod 中使用 NFS
apiVersion: v1 kind: Pod metadata:name: nfs-test spec:containers:- name: test-containerimage: busyboxcommand: [ "sleep", "3600" ]volumeMounts:- mountPath: "/mnt/data"name: nfs-storagevolumes:- name: nfs-storagepersistentVolumeClaim:claimName: nfs-pvc
-
验证
kubectl apply -f nfs-pv.yaml kubectl apply -f nfs-pvc.yaml kubectl apply -f nfs-pod.yaml
3. 使用 Ceph 作为外部存储
适用场景: 适用于高可用存储,支持CephFS、块存储(RBD)和对象存储。
步骤 1:安装 Ceph
可以使用 rook-ceph
作为 Ceph Operator:
kubectl create -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml
kubectl create -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
步骤 2:创建 Ceph PV
apiVersion: v1
kind: PersistentVolume
metadata:name: ceph-pv
spec:capacity:storage: 20GiaccessModes:- ReadWriteOncecephfs:monitors:- <Ceph-Monitor-IP>:6789user: adminsecretRef:name: ceph-secretreadOnly: false
4. 使用 AWS EBS 作为外部存储
适用场景: Kubernetes 部署在 AWS 云 时,推荐使用 EBS 作为块存储。
步骤 1:创建 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: aws-ebs
provisioner: kubernetes.io/aws-ebs
parameters:type: gp2
步骤 2:创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: aws-ebs-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: aws-ebs
5. 使用 CSI (Container Storage Interface)
CSI 是 Kubernetes 推荐的存储方式,支持动态存储。
步骤 1:安装 CSI
不同云服务提供不同的 CSI:
- AWS:
aws-ebs-csi-driver
- GCP:
gce-pd-csi-driver
- Azure:
azure-disk-csi-driver
安装 AWS CSI:
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr"
步骤 2:创建 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: csi-ebs
provisioner: ebs.csi.aws.com
parameters:type: gp3fsType: ext4
步骤 3:创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: csi-ebs-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 20GistorageClassName: csi-ebs
6. 选择合适的存储
需求 | 推荐存储 |
---|---|
共享存储(多个 Pod 访问同一目录) | NFS、CephFS |
高可用、分布式存储 | Ceph、GlusterFS |
高性能、低延迟 | iSCSI、AWS EBS |
云存储(AWS/GCP/Azure) | EBS、GCE PD、Azure Disk |
Kubernetes 官方推荐 | CSI |
7. 总结
- NFS 适合共享存储,适用于多个 Pod 访问相同数据。
- Ceph 适用于分布式存储,支持文件、块、对象存储。
- AWS/GCP/Azure 适用于云环境,推荐使用 CSI 进行动态存储管理。
- CSI 是 Kubernetes 官方推荐方式,支持多种存储后端。