目录
1 安装nfs provisioner,用于配合存储类动态生成pv
4 创建pod,挂载storageclass动态生成的pvc:test-claim1
文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘
链接:https://pan.baidu.com/s/10KKMiitavxqdZdMpea95WA
提取码:l0ux
k8s存储类:storageclass
每个StorageClass都包含字段provisioner,parameters和reclaimPolicy。
具体来说,StorageClass会定义以下两部分:
1、PV的属性 ,比如存储的大小、类型等;
2、创建这种PV需要使用到的存储插件,比如Ceph、NFS等
有了这两部分信息,Kubernetes就能够根据用户提交的PVC,找到对应的StorageClass,然后Kubernetes就会调用 StorageClass声明的存储插件,创建出需要的PV。
#查看定义的storageclass需要的字段
[root@xianchaomaster1 ~]# kubectl explain storageclass
KIND: StorageClass
VERSION: storage.k8s.io/v1
DESCRIPTION:
StorageClass describes the parameters for a class of storage for which
PersistentVolumes can be dynamically provisioned.
StorageClasses are non-namespaced; the name of the storage class according
to etcd is in ObjectMeta.Name.
FIELDS:
allowVolumeExpansion <boolean>
allowedTopologies <[]Object>
apiVersion <string>
kind <string>
metadata <Object>
mountOptions <[]string>
parameters <map[string]string>
provisioner <string> -required-
reclaimPolicy <string>
volumeBindingMode <string>
provisioner:供应商,storageclass需要有一个供应者,用来确定我们使用什么样的存储来创建pv,常见的provisioner如下
(https://kubernetes.io/zh/docs/concepts/storage/storage-classes/):
provisioner既可以由内部供应商提供,也可以由外部供应商提供,如果是外部供应商可以参考GitHub - kubernetes-retired/external-storage: [EOL] External storage plugins, provisioners, and helper libraries下提供的方法创建。
GitHub - kubernetes-sigs/sig-storage-lib-external-provisioner
以NFS为例,要想使用NFS,我们需要一个nfs-client的自动装载程序,称之为provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。
reclaimPolicy:回收策略
allowVolumeExpansion:允许卷扩展,PersistentVolume 可以配置成可扩展。将此功能设置为true时,允许用户通过编辑相应的 PVC 对象来调整卷大小。当基础存储类的allowVolumeExpansion字段设置为 true 时,以下类型的卷支持卷扩展。
注意:此功能仅用于扩容卷,不能用于缩小卷。
1 安装nfs provisioner,用于配合存储类动态生成pv
#把nfs-subdir-external-provisioner.tar.gz上传到xianchaonode2和xianchaonode1上,手动解压。
[root@xianchaonode2 ~]# ctr -n=k8s.io images import nfs-subdir-external-provisioner.tar.gz
[root@xianchaonode1 ~]# ctr -n=k8s.io images import nfs-subdir-external-provisioner.tar.gz
1、创建运行nfs-provisioner需要的sa账号
[root@xianchaomaster1 nfs]# cat serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-provisioner
[root@xianchaomaster1 nfs]# kubectl apply -f serviceaccount.yaml
serviceaccount/nfs-provisioner created
sa的全称是serviceaccount。
serviceaccount是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的。
指定了serviceaccount之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了。
2、对sa授权
[root@xianchaomaster1]# kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
3、安装nfs-provisioner程序
[root@xianchaomaster1 ~]# mkdir /data/nfs_pro -p
#把/data/nfs_pro变成nfs共享的目录
[root@xianchaomaster1 ~]# cat /etc/exports
/data/volumes 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)
/data/nfs_pro 192.168.40.0/24(rw,no_root_squash)
[root@xianchaomaster1 ~]# exportfs -arv
exporting 192.168.40.0/24:/data/nfs_pro
exporting 192.168.40.0/24:/data/volume_test/v10
exporting 192.168.40.0/24:/data/volume_test/v9
exporting 192.168.40.0/24:/data/volume_test/v8
exporting 192.168.40.0/24:/data/volume_test/v7
exporting 192.168.40.0/24:/data/volume_test/v6
exporting 192.168.40.0/24:/data/volume_test/v5
exporting 192.168.40.0/24:/data/volume_test/v4
exporting 192.168.40.0/24:/data/volume_test/v3
exporting 192.168.40.0/24:/data/volume_test/v2
exporting 192.168.40.0/24:/data/volume_test/v1
exporting 192.168.40.0/24:/data/volumes
[root@xianchaomaster1 ~]# 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
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.40.180
- name: NFS_PATH
value: /data/nfs_pro
volumes:
- name: nfs-client-root
nfs:
server: 192.168.40.180
path: /data/nfs_pro
#更新资源清单文件
[root@xianchaomaster1 ~]# kubectl apply -f nfs-deployment.yaml
deployment.apps/nfs-provisioner created
#查看nfs-provisioner是否正常运行
[root@xianchaomaster1 nfs]# kubectl get pods | grep nfs
nfs-provisioner-cd5589cfc-pjwsq 1/1 Running
2 创建storageclass,动态供给pv
[root@xianchaomaster1]# cat nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
metadata:
name: nfs
provisioner: example.com/nfs
[root@xianchaomaster1]# kubectl apply -f nfs-storageclass.yaml
#查看storageclass是否创建成功
[root@xianchaomaster1 nfs]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE
nfs example.com/nfs Delete Immediate
#显示内容如上,说明storageclass创建成功了
注意:provisioner处写的example.com/nfs应该跟安装nfs provisioner时候的env下的PROVISIONER_NAME的value值保持一致,如下:
env:
- name: PROVISIONER_NAME
value: example.com/nfs
3 创建pvc,通过storageclass动态生成pv
[root@xianchaomaster1]# cat claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim1
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Gi
storageClassName: nfs
[root@xianchaomaster1]# kubectl apply -f claim.yaml
persistentvolumeclaim/test-claim1 created
#查看是否动态生成了pv,pvc是否创建成功,并和pv绑定
[root@xianchaomaster1 nfs]# kubectl get pvc
#通过上面可以看到test-claim1的pvc已经成功创建了,绑定的pv是pvc-da737fb7-3ffb-43c4-a86a-2bdfa7f201e2,这个pv是由storageclass调用nfs provisioner自动生成的。
步骤总结:
1、供应商:创建一个nfs provisioner
2、创建storageclass,storageclass指定刚才创建的供应商
3、创建pvc,这个pvc指定storageclass
4 创建pod,挂载storageclass动态生成的pvc:test-claim1
[root@xianchaomaster1]# cat read-pod.yaml
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
#更新资源清单文件
[root@xianchaomaster1 nfs]# kubectl apply -f read-pod.yaml
pod/read-pod created
#查看pod是否创建成功
[root@xianchaomaster1 nfs]# kubectl get pods | grep read
read-pod 1/1 Running 0