您现在的位置是:首页 >技术交流 >k8s 存储类:storageclass网站首页技术交流
k8s 存储类:storageclass
上面介绍的 PV 和 和 PVC 模式都是需要先创建好PV,然后定义好 PVC 和 和 pv 进行一对一的 Bond ,但是如果 PVC 请求成千上万,那么就需要创建成千上万的 PV ,对于运维人员来说维护成本很高,Kubernetes 提供一种自动创建 PV 的机制,叫StorageClass** ,它的作用就是创建 PV 的模板。k8s 集群管理员通过创建storageclass 可以动态生成一个存储卷 pv 供 k8s pvc 使用。**
每个 StorageClass 都包含字段 provisioner ,parameters 和 reclaimPolic
具体来说,StorageClass 会定义以下两部分:
1 、PV 的属性 ,比如存储的大小、类型等;
2 、创建这种 PV 需要使用到的存储插件,比如 Ceph 、NFS 等
有了这两部分信息, Kubernetes 就能够根据用户提交的 PVC ,找到对应的 StorageClass ,然后
Kubernetes 就会调用 StorageClass 声明的存储插件,创建出需要的 PV
以 NFS 为例 , 要想使用 NFS ,我们需要一个 nfs-t client 的自动装载程序, 称之为 provisioner , 这个程序会使用我们已经配置好的NFS 服务器自动创建持久卷,也就是自动帮我们创建 PV.
.
K8S集群搭建NFS,请参考K8S持久化存储— nfs 卷的存储第2和第3部分
1. 安装 nfs provisioner ,用于 配合 存储类动态生成 pv
1.1 、创建 运行 nfs- -r provisioner 需要的 sa 账号
cat > serviceaccount.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
EOF
kubectl apply -f serviceaccount.yaml
kubectl get sa
什么是 sa ?
sa 的全称是 serviceaccount 。
serviceaccount 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的 。
指定了serviceaccount 之后,我们把pod 创建出来了,我们在使用这个pod 时,这个pod 就有了
我们指定的账户的权限了 。
1.2 、对 sa 授权
kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
1.3 、安装 nfs-provisioner 程序
mkdir /data/nfs_pro -p #把data/nfs_pro变成nfs共享的目录
cat >> /etc/exports << EOF
/data/nfs_pro *(rw,no_root_squash)
EOF
exportfs -arv #使NFS配置生效
cat > nfs-deployment.yaml << EOF
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
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
- name: NFS_SERVER
value: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IP
- name: NFS_PATH
value: /data/nfs_pro/
volumes:
- name: nfs-client-root
nfs:
server: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IP
path: /data/nfs_pro/
EOF
kubectl apply -f nfs-deployment.yaml
kubectl get pods |grep nfs #过滤看到pod运行正常
2. 创建 storageclass ,动态供给 pv
cat > nfs-storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs
provisioner: example.com/nfs
EOF
kubectl apply -f nfs-storageclass.yaml
kubectl get storageclass
[root@k8s-master nfs]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs example.com/nfs Delete Immediate false 118s
[root@k8s-master nfs]#
3. 创建 pvc , 通过 storageclass 动态 生成 pv
cat > claim.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim1
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Gi
storageClassName: nfs
EOF
kubectl apply -f claim.yaml
[root@k8s-master nfs]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs example.com/nfs Delete Immediate false 6m55s
[root@k8s-master nfs]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-78f20f02-755d-47f3-9a79-7772f0c7ccbb 1Gi RWX Delete Bound default/test-claim1 nfs 2m15s
[root@k8s-master nfs]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-claim1 Bound pvc-78f20f02-755d-47f3-9a79-7772f0c7ccbb 1Gi RWX nfs 2m18s
# 通过上面可以看到 test-claim1 的 pvc 已经成功创建了,绑定的 pv 是 pvc-78f20f02-755d-47f3-9a79-7772f0c7ccbb,这个 pv 是由storageclass 调用 nfs provisioner 自动生成的.
步骤总结:
1 、供应商:创建一个 nfs provisioner
2 、创建 storageclass ,storageclass 指定刚才创建的供应商
3 、创建 pvc ,这个 pvc 指定 storageclass
4. 创建 pod ,挂载 storageclass 动态生成的 pvc :test-claim1
cat > read.yaml << EOF
kind: Pod
apiVersion: v1
metadata:
name: read-pod
spec:
containers:
- name: read-pod
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-pvc
mountPath: /usr/share/nginx/html
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim1
EOF
kubectl apply -f read.yaml
[root@k8s-master nfs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-provisioner-54f4c55759-gg8rg 1/1 Running 0 17m
read-pod 1/1 Running 0 9m1s
[root@k8s-master nfs]#
5. 验证
5.1 查询pod是否自动获取到目录
#master服务器上也就是nfs共享服务器上
[root@k8s-master nfs]# cat /etc/exports
/data/nfs *(rw,no_root_squash)
/data/nfs_pro *(rw,no_root_squash)
[root@k8s-master nfs]# cd /data/nfs_pro/
[root@k8s-master nfs_pro]# ls #看到了pod的挂在目录
default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-master nfs_pro]#
#node1上查询挂载目录下
[root@k8s-node1 mnt]# cd /nfs/
[root@k8s-node1 nfs]# ll
total 0
drwxr-xr-x 2 root root 16 Apr 22 12:44 nfs
drwxr-xr-x 3 root root 74 Apr 22 13:48 nfs_pro
[root@k8s-node1 nfs]# cd nfs_pro/
[root@k8s-node1 nfs_pro]# ls
default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-node1 nfs_pro]#
#node2上查询挂载目录下
[root@k8s-node2 mnt]# cd /nfs/
[root@k8s-node2 nfs]# ls
nfs nfs_pro
[root@k8s-node2 nfs]# cd nfs_pro/
[root@k8s-node2 nfs_pro]# ls
default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-node2 nfs_pro]#
5.2 pod删除后容器目录依然存在
[root@k8s-master nfs_pro]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-provisioner-54f4c55759-gg8rg 1/1 Running 0 24m
read-pod 1/1 Running 0 15m
[root@k8s-master nfs_pro]# kubectl delete pods read-pod #删除pod
pod "read-pod" deleted
[root@k8s-master nfs_pro]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nfs-provisioner-54f4c55759-gg8rg 1/1 Running 0 24m
[root@k8s-master nfs_pro]# pwd
/data/nfs_pro
[root@k8s-master nfs_pro]# ll #pod删除后目录依然存在就OK
total 0
drwxrwxrwx 2 root root 6 Apr 22 13:46 default-test-claim1-pvc-17741113-526c-4276-815e-e684bfb09225
[root@k8s-master nfs_pro]#