k8s-NFS Provisioner 为 NFS 提供StorageClass的动态存储动态分配卷-8

网友投稿 1047 2022-05-29

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

k8s-NFS Provisioner 为 NFS 提供StorageClass的动态存储动态分配卷-8

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 $1}'` -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小时内删除侵权内容。

上一篇:做了「负载均衡」就可以随便加机器了吗?这三招来帮你!
下一篇:《分布式系统》教学大纲
相关文章