StorageClass的作用主要有以下几个方面:
每个 StorageClass 都有一个供应商(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定,官网提供供应商如下表:
卷插件 | 内置制备器 | 配置示例 |
---|---|---|
AWSElasticBlockStore | ✓ | AWS EBS |
AzureFile | ✓ | Azure File |
AzureDisk | ✓ | Azure Disk |
CephFS | - | - |
Cinder | ✓ | OpenStack Cinder |
FC | - | - |
FlexVolume | - | - |
GCEPersistentDisk | ✓ | GCE PD |
iSCSI | - | - |
NFS | - | NFS |
RBD | ✓ | Ceph RBD |
VsphereVolume | ✓ | vSphere |
PortworxVolume | ✓ | Portworx Volume |
Local | - | Local |
本文章以NFS为例,要想使用NFS,我们需要一个nfs-client的自动装载程序,称之为provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。
注意:K8S集群所有Node节点都需要安装 nfs-utils
包
yum -y install nfs-utils
mkdir /data/nfs_pro -p
vim /etc/exports
/data/nfs_pro *(rw,no_root_squash)
加载生效 && 启动NFS服务
exportfs -arv
systemctl enable nfs --now
第一步:创建运行nfs-provisioner需要使用的SA账号
cat nfs-serviceaccount.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
执行 YAML 文件 && 查看创建的 SA 账号:
kubectl apply -f nfs-serviceaccount.yaml
kubectl get sa nfs-provisioner
第二步:针对SA账号进行授权:
kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
第三步:安装nfs-provisioner程序 YAML 如下:
cat nfs-deployment.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-provisioner
spec:
selector:
matchLabels:
app: nfs-provisioner
replicas: 1
strategy: # 更新策略
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner
spec:
serviceAccount: nfs-provisioner # 指定SA账号
containers:
- name: nfs-provisioner
image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: example.com/nfs # NFS供应商名称
- name: NFS_SERVER
value: 16.32.15.200 # NFS服务端地址
- name: NFS_PATH
value: /data/nfs_pro/ # NFS共享目录
volumes:
- name: nfs-client-root
nfs:
server: 16.32.15.200 # NFS服务端地址
path: /data/nfs_pro/ # NFS共享目录
执行YAML 文件 && 查看 Pod状态:
kubectl apply -f nfs-deployment.yaml
kubectl get pods
cat nfs-storageclass.yaml
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: nfs
provisioner: example.com/nfs # 指定NFS供应商名称,和上面对应上
注意:provisioner处写的 example.com/nfs
应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致。
执行YAML文件 && 查看storageclass 状态:
kubectl apply -f nfs-storageclass.yaml
kubectl get sc nfs
cat nfs-pvc.yaml
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: storageclass-pvc-demo
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Gi
storageClassName: nfs # 指定使用storageclass的名称,来自动生产PV
执行YAML 文件 && 查看是否自动生成PV
kubectl apply -f nfs-pvc.yaml
kubectl get pvc
如上图已经自动创建PV,并绑定上PVC了
cat nfs-pod-demo.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: nfs-pod-demo
labels:
type: nfs
spec:
volumes:
- persistentVolumeClaim:
claimName: storageclass-pvc-demo # 指定PVC
name: nfs-storage # 卷名称
containers:
- name: nfs-pod-demo
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-storage # 指定上面卷名称
mountPath: /usr/share/nginx/html # 容器挂载目录
执行 YAML 文件 && 查看Pod状态:
kubectl apply -f nfs-pod-demo.yaml
kubectl get pods nfs-pod-demo
在 PVC 绑定宿主机目录,创建 index.html 文件
echo "storageclass demo successd...." > /data/nfs_pro/default-storageclass-pvc-demo-pvc-d4e47c42-d969-44d5-983d-bf36994b6c86/index.html
获取Pod IP访问网站:
kubectl get pods nfs-pod-demo -o wide
1、搭建NFS服务端
2、搭建NFS供应商,指定NFS服务端IP地址及共享目录
3、创建StorageClass资源,指定使用NFS供应商
4、创建PVC,使用storageClassName
自动指定使用StorageClass
5、创建Pod,使用PVC