k8s-NFS Provisioner 为 NFS 提供StorageClass的动态存储动态分配卷-8
k8s-NFS Provisioner 为 NFS 提供StorageClass的动态存储动态分配卷-8
1.StorageClass的动态存储概述
Kubernetes集群管理员通过提供不同的存储类,可以满足用户不同的服务质量级别、备份策略和任意策略要求的存储需求。动态存储卷供应使用StorageClass进行实现,其允许存储卷按需被创建。如果没有动态存储供应,Kubernetes集群的管理员将不得不通过手工的方式类创建新的存储卷。通过动态存储卷,Kubernetes将能够按照用户的需要,自动创建其需要的存储。
1)集群管理员预先创建存储类(StorageClass);
2)用户创建使用存储类的持久化存储声明(PVC:PersistentVolumeClaim);
3)存储持久化声明通知系统,它需要一个持久化存储(PV: PersistentVolume);
4)系统读取存储类的信息;
5)系统基于存储类的信息,在后台自动创建PVC需要的PV;
6)用户创建一个使用PVC的Pod;
7)Pod中的应用通过PVC进行数据的持久化;
8)而PVC使用PV进行数据的最终持久化处理。
上面介绍了StorageClass整体体系工作原理,下面根据他的原理来实施部署。
部署nfs提供数据持久化存储
配置ServiceAccount 授权NFS Provisioner操作权限
部署NFS Provisioner 绑定nfs存储卷
部署StorageClass 存储类 绑定存储提供者NFS Provisioner
创建PVC用户通过在PersistentVolumeClaim中包含一个存储类,来请求动态供应存储。
创建pod声明需要的pvc资源
2.部署nfs
持久化存储最终是要有一个存储的载体来存储数据,这个存储服务可以选择不同的产品。这里我们使用的是nfs服务共享文件夹存储我们的数据。因此首先要搭建这篇文章的基础层nfs存储服务。
在k8s所有节点上安装nfs并启动
# 安装nfs服务 yum install nfs-utils rpcbind -y # 启动nfs服务 systemctl start nfs && systemctl enable nfs systemctl start rpcbind && systemctl enable rpcbind
1
2
3
4
5
以下操作只需要在共享目录的节点上操作,该节点就为nfs服务端节点。
mkdir -p /data/nfs/ chmod 777 /data/nfs/
1
2
vim /etc/exports
1
配置文件内容
/data/nfs 172.16.8.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
1
我配置了将 /data/nfs 文件目录设置为允许 IP 为该 172.16.8.0/24 区间的客户端挂载,(注意这个IP地址范围要改成你当前nfs服务所在主机的ip地址)当然,如果客户端 IP 不在该区间也想要挂载的话,可以设置 IP 区间更大或者设置为 * 即允许所有客户端挂载,例如:/home *(ro,sync,insecure,no_root_squash) 设置 /home 目录允许所有客户端只读挂载。
重启nfs服务
systemctl restart rpcbind systemctl restart nfs
1
2
测试配置nfs是否可用
#在nfs服务端测试 showmount -e localhost Export list for localhost: /data/nfs 172.16.8.0/24 #在其他node节点上测试nfs # IP地址是nfs部署所在节点的IP地址 showmount -e 172.16.8.113 Export list for 172.16.8.113: /data/nfs 172.16.8.0/24
1
2
3
4
5
6
7
8
9
10
11
3.配置授权
k8s授权使用RBAC,我们创建一个ServiceAccount授权NFS Provisioner 操作权限。
如果曾经配置过nfs的授权,先清理再创建。第一次创建则不需要执行清理步骤
kubectl delete -f nfs-rbac.yaml -n kube-system
1
cat >nfs-rbac.yaml<<-EOF --- kind: ServiceAccount apiVersion: v1 metadata: name: nfs-client-provisioner --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-client-provisioner-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner namespace: kube-system roleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: leader-locking-nfs-client-provisioner subjects: - kind: ServiceAccount name: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: kube-system roleRef: kind: Role name: leader-locking-nfs-client-provisioner apiGroup: rbac.authorization.k8s.io EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#创建授权 kubectl apply -f nfs-rbac.yaml -n kube-system
1
2
4.部署 nfs-client-provisioner
# 下载源文件 git clone https://github.com/kubernetes-incubator/external-storage.git # 复制源文件中deploy到自己的工作目录。 cp -R external-storage/nfs-client/deploy/ /opt/k8s # 进入deploy目录 cd deploy
1
2
3
4
5
6
清理NFS Provisioner
如果之前配置过可用下面的命令清理
kubectl delete -f nfs-provisioner-deploy.yaml -n kube-system
1
-nfs服务地址配置到环境变量
将上面搭建好的nfs服务器IP地址和共享的目录配置到环境变量中
export NFS_ADDRESS='172.16.8.113' export NFS_DIR='/data/nfs'
1
2
配置yaml文件
cat >nfs-provisioner-deploy.yaml<<-EOF --- kind: Deployment apiVersion: apps/v1 metadata: name: nfs-client-provisioner spec: replicas: 1 selector: matchLabels: app: nfs-client-provisioner strategy: type: Recreate #---设置升级策略为删除再创建(默认为滚动更新) template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: nfs-client #---nfs-provisioner的名称,以后设置的storageclass要和这个保持一致 - name: NFS_SERVER value: ${NFS_ADDRESS} #---NFS服务器地址,和 valumes 保持一致 - name: NFS_PATH value: ${NFS_DIR} #---NFS服务器目录,和 valumes 保持一致 volumes: - name: nfs-client-root nfs: server: ${NFS_ADDRESS} #---NFS服务器地址 path: ${NFS_DIR} #---NFS服务器目录 EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 启动 kubectl apply -f nfs-provisioner-deploy.yaml -n kube-system #查看状态 kubectl get pod -o wide -n kube-system|grep nfs-client #查看pod日志 kubectl logs -f `kubectl get pod -o wide -n kube-system|grep nfs-client|awk '{print }'` -n kube-system
1
2
3
4
5
6
5.创建 StorageClass
创建StorageClass主要是绑定我们创建的NFS Provisioner ,在配置的是否需要注意provisioner 参数的名字要和上面我们配置nfs-provisioner-deploy.yaml文件中定义的PROVISIONER_NAME名字相同。
如果之前配置可用下面命令清除
kubectl delete -f nfs-storage.yaml
1
cat >nfs-storage.yaml<<-EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage annotations: storageclass.kubernetes.io/is-default-class: "true" #---设置为默认的storageclass provisioner: nfs-client #---动态卷分配者名称,必须和上面创建的"PROVISIONER_NAME"变量中设置的Name一致 parameters: archiveOnDelete: "true" #---设置为"false"时删除PVC不会保留数据,"true"则保留数据 mountOptions: - hard #指定为硬挂载方式 #指定NFS版本,这个需要根据 NFS Server 版本号设置,查看版本号命令 nfsstat -s - nfsvers=4 EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#启动 kubectl apply -f nfs-storage.yaml #查看创建的storageclass(这里可以看到nfs-storage已经变为默认的storageclass了) kubectl get sc ------------------------------------ NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-storage (default) nfs-client Delete Immediate false 8m25s
1
2
3
4
5
6
7
6.创建pvc
配置pvc文件
cat >test-claim.yaml<<\EOF kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-claim spec: storageClassName: nfs-storage #---需要与上面创建的storageclass的名称一致 accessModes: - ReadWriteMany resources: requests: storage: 100Gi #需要的资源大小根据自己的实际情况修改 EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
启动pvc
kubectl apply -f test-claim.yaml -n kube-public
1
查看pvc绑定的storageclass
kubectl get pvc -n kube-public
1
查看nfs自动创建的数据卷
进入nfs共享共享目录查看volume name的目录已经创建出来了。其中volume的名字是namespace,PVC name以及uuid的组合
7.测试pod
创建一个pod使用上面创建好的pvc,查看数据是否存储到nfs共享目录。
cat > test-pod.yaml <<\EOF kind: Pod apiVersion: v1 metadata: name: test-pod spec: containers: - name: test-pod image: busybox:latest command: - "/bin/sh" args: - "-c" - "touch /mnt/SUCCESS && exit 0 || exit 1" volumeMounts: - name: nfs-pvc mountPath: "/mnt" restartPolicy: "Never" volumes: - name: nfs-pvc persistentVolumeClaim: claimName: test-claim EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
kubectl apply -f test-pod.yaml -n kube-public
1
kubectl get pod -o wide -n kube-public
1
#进入nfs共享目录下的pvc数据卷 cd /data/nfs/kube-public-test-claim-pvc-baf9196b-9307-4cea-9963-12ad7105890b/ # 查看pvc数据卷下显示pod创建的SUCCESS文件
1
2
3
Kubernetes
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。