中间件(英语:Middleware),又译中间件、中介层,是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。在现代信息技术应用框架如 Web 服务、面向服务的体系结构等项目中应用比较广泛。如数据库、Apache 的 Tomcat ,IBM 公司的 WebSphere ,BEA 公司的 WebLogic 应用服务器,东方通公司的 Tong 系列中间件,以及 Kingdee 公司的等都属于中间件。
[root@m3 test]# vim pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
storageClassName: nfs1
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.70.94
path: "/data/nfs/v1"
[root@m3 test]# kubectl apply -f pv-nfs.yaml
persistentvolume/pv-nfs created
[root@m3 test]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 1Gi RWX Retain Available nfs1 41s
[root@m3 test]# vim pvc-nfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100M
storageClassName: nfs1
[root@m3 test]# kubectl apply -f pvc-nfs.yaml
persistentvolumeclaim/pvc-nfs created
PersistentVolumeController 会不断地查看当前每一个 PVC,是不是已经处于 Bound(已绑定)状态。如果不是,那它就会遍历所有的、可用的 PV,并尝试将其与这个“单身”的 PVC 进行绑定。这样,Kubernetes 就可以保证用户提交的每一个 PVC,只要有合适的 PV 出现,它就能够很快进入绑定状态
[root@m3 test]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs Bound pvc-nfs 1Gi RWX nfs1 2m34s
[root@m3 test]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 1Gi RWX Retain Bound default/pvc-nfs nfs1 6m26s
[root@m3 test]# vim pvc-nfs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pvc-nfs-pod
spec:
containers:
- name: web
image: nginx:1.7.9
volumeMounts:
storageClassName- name: nfs
mountPath: "/usr/share/nginx/html"
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs1
[root@m3 test]# kubectl apply -f pvc-nfs-pod.yaml
pod/pvc-nfs-pod created
[root@m3 test]# kubectl get pod -o wide | grep pvc-nfs-pod
pvc-nfs-pod 1/1 Running 0 3m13s 10.100.130.101 s3 <none> <none>
[root@m3 test]# curl http://10.100.130.101
hello nfs
我们学习了 PV 和 PVC 的使用方法,但是前面的 PV 都是静态的,什么意思?就是我要使用的一个 PVC 的话就必须手动去创建一个 PV,我们也说过这种方式在很大程度上并不能满足我们的需求,比如我们有一个应用需要对存储的并发度要求比较高,而另外一个应用对读写速度又要求比较高,特别是对于 StatefulSet 类型的应用简单的来使用静态的 PV 就很不合适了,这种情况下我们就需要用到动态 PV,也就是我们今天要讲解的 StorageClass。
而 StorageClass 对象的作用,其实就是创建 PV 的模板。具体地说,StorageClass 对象会定义如下两个部分内容:
第一,PV 的属性。比如,存储类型、Volume 的大小等等。
第二,创建这种 PV 需要用到的存储插件。比如,Ceph 等等。
[root@m3 nfs]# cat nfs-client-provisioner.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: eip-nfs-client-provisioner
namespace: kube-system
[root@m3 nfs]# kubectl apply -f nfs-client-provisioner.yaml
serviceaccount/nfs-client-provisioner created
[root@m3 nfs]# cat nfs-client-provisioner-runner.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-client-provisioner-runner
namespace: kube-system
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 ]
[root@m3 nfs]# kubectl apply -f nfs-client-provisioner-runner.yaml
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
[root@m3 nfs]# cat run-nfs-client-provisioner.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: run-nfs-client-provisioner
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nfs-client-provisioner-runner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: kube-system
[root@m3 nfs]# kubectl apply -f run-nfs-client-provisioner.yaml
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
[root@m3 ~]# cat leader-locking-nfs-client-provisioner.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: leader-locking-nfs-client-provisioner
namespace: kube-system
rules:
- apiGroups:
- ‘‘
resources:
- endpoints
verbs:
- get
- list
- watch
- create
- update
- patch
[root@m3 ~]# kubectl apply -f leader-locking-nfs-client-provisioner.yaml
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
[root@m3 ~]# cat leader-locking-nfs-client-provisioner-bind.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: leader-locking-nfs-client-provisioner
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: kube-system
[root@m3 ~]# kubectl apply -f leader-locking-nfs-client-provisioner-bind.yaml
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
[root@m3 ~]# vim nfs-nfs3.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nfs-nfs3
name: nfs-nfs3
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: nfs-nfs3
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-nfs3
spec:
containers:
- env:
- name: PROVISIONER_NAME
value: nfs-nfs3
- name: NFS_SERVER
value: 192.168.70.120
- name: NFS_PATH
value: /data/nfs/v3
image: ‘quay.io/external_storage/nfs-client-provisioner:v3.1.0-k8s1.11‘
name: nfs-client-provisioner
volumeMounts:
- mountPath: /persistentvolumes
name: nfs-client-root
serviceAccountName: eip-nfs-client-provisioner
volumes:
- name: nfs-client-root
nfs:
path: /data/nfs/v3
server: 192.168.70.120
[root@m3 ~]# kubectl apply -f nfs-nfs3.yaml
deployment.apps/nfs-nfs3 created
[root@m3 nfs]# vim nfs-StorageClass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
k8s.eip.work/storageType: nfs_client_provisioner
name: nfs3
parameters:
archiveOnDelete: ‘false‘
provisioner: nfs-nfs3
reclaimPolicy: Delete
volumeBindingMode: Immediate
[root@m3 nfs]# kubectl apply -f nfs-StorageClass.yaml
storageclass.storage.k8s.io/nfs3 created
[root@m3 nfs]# kubectl get pod -n kube-system | grep nfs3
nfs-nfs3-66f4c9bcd5-5fd2x 1/1 Running 0 3m21s
[root@m3 nfs]# cat nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2M
storageClassName: nfs3
[root@m3 nfs]# kubectl apply -f nfs-pvc.yaml
persistentvolumeclaim/pvc-nfs created
[root@m3 ~]# kubectl get pvc | grep pvc-nfs
pvc-nfs Bound pvc-4773b235-aa7c-4c8e-bf81-85c97e0e28f6 2M RWX nfs3 78s
[root@m3 ~]# kubectl get pv | grep pvc-nfs
pvc-4773b235-aa7c-4c8e-bf81-85c97e0e28f6 2M RWX Delete Bound default/pvc-nfs nfs3 88s
k8s资源存储pv pvc 动态持久化存储StorageClass
原文:https://www.cnblogs.com/wangzhangtao/p/12171630.html