volume存储
volume技术是为了实现kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,他和pod的生命周期一样,只要pod还在他就在,但是pod里面的容器停止和重启时一般不会影响volume中的数据。
根据需不需要指定目录主要有emptyDir和hostPath两种。
1.emptyDir类型
emptyDir类型的volume在pod分配到node上时被创建,不用指定目录,但是实际还是有的,由自动分配的
新建一个两个容器共享一个数据卷的deployment
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: emptydir-deployment-test #这个pod的名字 labels: namespace: space01 #声明一个新的命名空间 spec: replicas: 1 selector: matchLabels: edtestk: edtestv template: metadata: labels: edtestk: edtestv spec: volumes: #和containerst同级 - name: emptydir-volume emptyDir: {} containers: - name: redis01 #容器名 image: redis #镜像名字 volumeMounts: - name: emptydir-volume mountPath: /lqh-empty-dir #容器内挂载的目录 imagePullPolicy: IfNotPresent - name: nginx01 #容器名 image: nginx #镜像名字 volumeMounts: - name: emptydir-volume mountPath: /lqh-empty-dir #容器内挂载的目录 imagePullPolicy: IfNotPresent
2.hostpath类型
需要制定本地node的目录,master节点新建Pod时如果本地没有这个目录会报错。这也是他的缺点,无法知道新建pod会被指派到哪个node,要所有node都要新建这个目录。
新建一个两个容器共享/nodepath这个目录的deployment
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hostpath-deployment-test #这个pod的名字 labels: namespace: space01 #声明一个新的命名空间 spec: replicas: 1 selector: matchLabels: edtestk: edtestv template: metadata: labels: edtestk: edtestv spec: volumes: #和containerst同级 - name: hostpath-volume hostPath: path: /nodepath #确保node节点有这个目录,不然新建pod报错 type: Directory containers: - name: redis01 #容器名 image: redis #镜像名字 volumeMounts: - name: hostpath-volume mountPath: /lqh-hostpath #容器内挂载的目录 imagePullPolicy: IfNotPresent - name: nginx01 #容器名 image: nginx #镜像名字 volumeMounts: - name: hostpath-volume mountPath: /lqh-hostpath #容器内挂载的目录 imagePullPolicy: IfNotPresent
注意:把这个deployment的pod删除了,node目录下的内容还在,deployment新建的pod也会同步到这个目录,删除这个deployment这个node的目录还在
PersistentVolumeClaim(PVC)存储
PVC实际就是实现可以把pod容器里面的目录挂载到其他集群以外的机器上
PV 是Volume之类的卷插件,但具有独立于使用 PV的Pod 的生命周期。此API对象包含存储实现的细节,即 NFS、iSCSI 或特定于云供应商的存储系统。
PersistentVolume 类型以插件形式实现。Kubernetes 目前支持很多插件类型,以nfs为例。
新建多个pv和pvc,pod资源清单指定pvc,由pvc给pod匹配合适的pv挂载到pod的容器中,这种很解耦。
pvc在匹配的规则有:accessModes和storageClassName;pv的这两个属性和pod资源清单相同就可以被匹配挂载.
pv状态:
卷可以处于以下的某种状态:
Available(可用)——一块空闲资源还没有被任何声明绑定
Bound(已绑定)——卷已经被声明绑定
Released(已释放)——声明被删除,但是资源还未被集群重新声明
Failed(失败)——该卷的自动回收失败
新建三个pv的资源清单:
注意:pvc和pv的accessModes和storageClassName一定要保持一致,这两个还是必填,不一致pvc新建会报找不到pv
四者关系大致如下:
创建pv
apiVersion: v1 kind: PersistentVolume #k8s资源类型,PersistentVolume资源 metadata: #资源的元数据语句块,是针对kind对应资源的全局属性 name: pv001 #自定义名称pv001 namespace: space01 spec: #规格语句块 capacity: #PV的存储空间语句块 storage: 10M #PV的具体存储空间大小,Mi表示1024进制 volumeMode: Filesystem #卷模式,有两种,Filesystem(文件系统),Block(块) accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete storageClassName: "lqhnfs" nfs: #NFS文件系统配置语句块 path: /root/nfs #在NFS文件系统上创建的共享文件目录 server: 10.211.55.3 --- apiVersion: v1 kind: PersistentVolume #k8s资源类型,PersistentVolume资源 metadata: #资源的元数据语句块,是针对kind对应资源的全局属性 name: pv002 #自定义名称pv001 namespace: space01 spec: #规格语句块 capacity: #PV的存储空间语句块 storage: 10M #PV的具体存储空间大小,Mi表示1024进制 volumeMode: Filesystem #卷模式,有两种,Filesystem(文件系统),Block(块) accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete storageClassName: "lqhnfs" nfs: #NFS文件系统配置语句块 path: /root/nfs #在NFS文件系统上创建的共享文件目录 server: 10.211.55.3 --- apiVersion: v1 kind: PersistentVolume #k8s资源类型,PersistentVolume资源 metadata: #资源的元数据语句块,是针对kind对应资源的全局属性 name: pv003 #自定义名称pv001 namespace: space01 spec: #规格语句块 capacity: #PV的存储空间语句块 storage: 10M #PV的具体存储空间大小,Mi表示1024进制 volumeMode: Filesystem #卷模式,有两种,Filesystem(文件系统),Block(块) accessModes: ["ReadWriteOnce"] #访问模式,有三种,ReadWriteOnce(该卷可以被单个节点以读/写模式挂载),ReadOnlyMany,ReadWriteMany persistentVolumeReclaimPolicy: Retain #回收策略,有三种,Retain,Recycle,Delete storageClassName: "lqhnfs" nfs: #NFS文件系统配置语句块 path: /root/nfs/v3 #在NFS文件系统上创建的共享文件目录 server: 10.211.55.3
创建pvc
apiVersion: v1 #指定的api版本,要符合kubectl apiVersion规定,v1是稳定版本 kind: PersistentVolumeClaim #k8s资源类型,PersistentVolumeClaim资源, metadata: #资源的元数据语句块,是针对kind对应资源的全局属性元数据块 name: lqh-pvc1 #PVC名称,自定义 namespace: space01 spec: #规格语句块 accessModes: ["ReadWriteOnce"] #访问模式 resources: #访问模式下的资源语句块 requests: #请求语句块 storage: 25Mi #请求存储空间 storageClassName: "lqhnfs"
创建pod,并挂在pvc
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: pvc-deployment-test #这个pod的名字 labels: namespace: space01 #声明一个新的命名空间 spec: replicas: 1 selector: matchLabels: pvc1k: pvc1v template: metadata: labels: pvc1k: pvc1v spec: volumes: #和containerst同级 - name: pvc1 #这个pod的数据卷名字 persistentVolumeClaim: #指定pvc claimName: lqh-pvc1 #pvc名字 containers: - name: redis01 #容器名 image: redis #镜像名字 volumeMounts: - name: pvc1 mountPath: /lqh-nfspvs1 #容器内挂载的目录 imagePullPolicy: IfNotPresent - name: nginx01 #容器名 image: nginx #镜像名字 volumeMounts: - name: pvc1 mountPath: /usr/share/nginx/html/ #容器内挂载的目录 imagePullPolicy: IfNotPresent
对这个deployment进行扩容后的pod还是按照资源清单绑定到这个lqh-pvc1这个pvc,这个pvc只绑定这个pv001这个pv,不会变,所有就多个pod绑在一个pv下