k8s 基于NFS部署storageclass pv自动供给
在k8s中部署有状态应用时,通常需要做数据持久化存储。
后端存储的方式有以下几种:
1.基于宿主机本地的存储方式;
(重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节点上没有该应用存储过的数据,所以并不持久化)
2.基于本地过云存储服务的方式,如:(NFS、glusterfs、cephfs、awsElasticBlockStore、azureDisk、gcePersistentDisk等)
(在资源清单中指明URL地址和共享挂载卷目录即可实现数据持久化存储)
3.基于存储类,实现PV自动供给;
(创建存储类,在资源清单中指明地址和共享挂载卷目录即可实现持久化存储)
我们这里就介绍一下基于存储类的PV自动供给实现的数据持久化存储
官网概念说明:
https://kubernetes.io/docs/concepts/storage/storage-classes/
项目地址:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
项目架构:
原理:
1.存储工程师创建存储类。
2.集群管理员维护集群中的存储资源。
3.用户或开发人员提交需求,(如在sts中只要在资源清单中编辑好volumeClaimTemplates中的需求,确保资源清单无误即可运行)这个过程不需要人工手动创建PVC。
当然图是这样画的,分工明细,但现实中相信一个人把这些活都揽的也不计其数。kube、kube拼音就一苦比,但是多学点没坏处。
从官网中可以看出目前NFS并不支持做存储类,但是我们可以使用NFS的插件来支持。
NFS插件在Github中的项目地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
搭建
1.搭建NFS服务(与k8s集群同一网段下的主机)
1 安装nfs服务:yum -y install nfs-utils (集群中的每个节点也要安装否则不支持)
2
3 启动nfs并设为开机自启:systemctl start nfs && systemctl enable nfs
4
5 创建共享挂载目录: mkdir -pv /data/volumes/{v1,v2,v3}
6
7 编辑/etc/exports文件,将目录共享到192.168.1.0/24这个网段中:
8
9 vi /etc/exports
10
11 /data/volume/v1 192.168.1.0/24(rw,no_root_squash)
12 /data/volume/v2 192.168.1.0/24(rw,no_root_squash)
13 /data/volume/v3 192.168.1.0/24(rw,no_root_squash)
14
15 发布:exportfs -avr
16
17 exporting 192.168.1.0/24:/data/volume/v3
18 exporting 192.168.1.0/24:/data/volume/v2
19 exporting 192.168.1.0/24:/data/volume/v1
20
21 查看:showmount -e
22
23 /data/volume/v3 192.168.1.0/24
24 /data/volume/v2 192.168.1.0/24
25 /data/volume/v1 192.168.1.0/24
2.在kubernetes中部署NFS插件(项目地址在上面)
1 下载项目:for file in class.yaml deployment.yaml rbac.yaml test-claim.yaml ; do wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/$file ; done
2
3 修改资源清单(红色地方需要修改):
4
5 vim deployment.yaml
6
7 apiVersion: v1
8 kind: ServiceAccount
9 metadata:
10 name: nfs-client-provisioner
11 ---
12 kind: Deployment
13 apiVersion: extensions/v1beta1
14 metadata:
15 name: nfs-client-provisioner
16 spec:
17 replicas: 1
18 strategy:
19 type: Recreate
20 template:
21 metadata:
22 labels:
23 app: nfs-client-provisioner
24 spec:
25 serviceAccountName: nfs-client-provisioner
26 containers:
27 - name: nfs-client-provisioner
28 image: quay.io/external_storage/nfs-client-provisioner:v2.0.0 ##默认是latest版本
29 volumeMounts:
30 - name: nfs-client-root
31 mountPath: /persistentvolumes
32 env:
33 - name: PROVISIONER_NAME
34 value: fuseim.pri/ifs ##这里的供应者名称必须和class.yaml中的provisioner的名称一致,否则部署不成功
35 - name: NFS_SERVER
36 value: k8s-nfs ##这里写NFS服务器的IP地址或者能解析到的主机名
37 - name: NFS_PATH
38 value: /data/volume/v1 ##这里写NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)
39 volumes:
40 - name: nfs-client-root
41
42 nfs:
43 server: k8s-nfs ##NFS服务器的IP或可解析到的主机名
44 path: /data/volume/v1 ##NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)
3.部署
切换到此项目的目录中
1 kubectl apply -f ./
4.查看
查看此NFS插件的pod是否部署成功:
1 kubectl get pods
2
3 NAME READY STATUS RESTARTS AGE
4
5 nfs-client-provisioner-8664fb9f68-57wkf 1/1 Running 0 5m43s
5.测试
部署一个pvc或者声明存储的应用,测试是否自动创建出PV而且自动绑定PVC,
1 例:PVC 2
3 4
5 vim test.yaml
6
7 kind: PersistentVolumeClaim
8 apiVersion: v1
9 metadata:
10 name: test-claim
11 annotations:
12 volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
13 spec:
14 accessModes:
15 - ReadWriteMany
16 resources:
17 requests:
18 storage: 1Mi
19
20 例:StatefulSet方式部署的nginx应用
21
22 vim nginx-demo.yaml
23
24 apiVersion: v1
25 kind: Service
26 metadata:
27 name: nginx
28 labels:
29 app: nginx
30 spec:
31 ports:
32 - port: 80
33 name: web
34 clusterIP: None
35 selector:
36 app: nginx
37 ---
38
39 apiVersion: apps/v1
40 kind: StatefulSet
41 metadata:
42 name: web
43 spec:
44 selector:
45 matchLabels:
46 app: nginx
47 serviceName: "nginx"
48 replicas: 3
49 template:
50 metadata:
51 labels:
52 app: nginx
53 spec:
54 terminationGracePeriodSeconds: 10
55 containers:
56 - name: nginx
57 image: nginx
58 ports:
59 - containerPort: 80
60 name: web
61 volumeMounts:
62 - name: www
63 mountPath: /usr/share/nginx/html
64 volumeClaimTemplates:
65 - metadata:
66 name: www
67 spec:
68 accessModes: [ "ReadWriteOnce" ]
69 storageClassName: "managed-nfs-storage"
70 resources:
71 requests:
72 storage: 1Gi
73
74 部署: 75 kubectl apply -f test.yaml nginx-demo.yaml
76 77 查看pod、svc、pv、pvc状态:
78 79 kubectl get pv
80 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
81 pvc-5d66051e-9674-11e9-9021-000c29cc70d4 1Mi RWX Delete Bound default/test-claim managed-nfs-storage 7m6s
82 pvc-73235c07-9677-11e9-9021-000c29cc70d4 1Gi RWO Delete Bound default/www-web-1 managed-nfs-storage 6m15s
83 pvc-8a58037f-9677-11e9-9021-000c29cc70d4 1Gi RWO Delete Bound default/www-web-2 managed-nfs-storage 5m36s
84 pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4 1Gi RWO Delete Bound default/www-web-0 managed-nfs-storage 7m6s
85
86 87 kubectl get pvc
88 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
89 test-claim Bound pvc-5d66051e-9674-11e9-9021-000c29cc70d4 1Mi RWX managed-nfs-storage 28m
90 www-web-0 Bound pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4 1Gi RWO managed-nfs-storage 12m
91 www-web-1 Bound pvc-73235c07-9677-11e9-9021-000c29cc70d4 1Gi RWO managed-nfs-storage 6m32s
92 www-web-2 Bound pvc-8a58037f-9677-11e9-9021-000c29cc70d4 1Gi RWO managed-nfs-storage 5m53s
93
94 kubectl get pods -owide 95 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-client-provisioner-f9776d996-dpk6z 1/1 Running 0 12m 10.244.1.65 k8s-node1 <none> <none>
web-0 1/1 Running 0 16m 10.244.1.66 k8s-node1 <none> <none>
web-1 1/1 Running 0 10m 10.244.2.181 k8s-node2 <none> <none>
web-2 1/1 Running 0 10m 10.244.2.182 k8s-node2 <none> <none>
kubectl get svc
现在查看nfs服务器中的v1目录下:
1 default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4 default-www-web-2-pvc-d3944c4a-968f-11e9-9021-000c29cc70d4
2 default-www-web-1-pvc-ccd2a50b-968f-11e9-9021-000c29cc70d4
上面这些是k8s集群映射的目录,用来和其他存储挂载使用,从创建pod时的日志可以看出:
1 Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/7d7c45bc-968c-11e9-9021-000c29cc70d4/volumes/kubernetes.io~nfs/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4 --scope -- mount -t nfs k8s-nfs:/data/volume/v2/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4 /var/lib/kubelet/pods/7d7c45bc-968c-11e9-9021-000c29cc70d4/volumes/kubernetes.io~nfs/default-www-web-0-pvc-e6b67079-968b-11e9-9021-000c29cc70d4
在这些目录中创建默认访问页:
1 cd default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4
2
3 echo "<h1>NFS Server</h1>" > index.html
4
5 此时使用curl命令访问此nginx pod
6
7 curl 10.244.1.66
8
9 NFS Server
好了,以上就是全部内容了