1

Kubernetes 存储卷

​ 为了保证数据的持久性,必须保证数据在外部存储在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储。但是在k8s中,由于pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且,在节点故障时,可能会导致数据的永久性丢失。为此,k8s就引入了外部存储卷的功能.

emptyDir存储卷

emptyDir 在创建pod到指定的node节点上时,他会跟随pod创建,并跟随pod的生命周期,它会初始化为一个空目录,可以挂在一个pod下多个容器下不同目录中,当pod被删除数据也会被删除.

  1. 创建一个pod并挂在一个emptyDir

编写配置清单

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
  annotations:
    while/created-by: "while"
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  - name: busybox
    image: busybox
    volumeMounts:
    - name: html
      mountPath: /data/
    command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']
  volumes:
  - name: html
    emptyDir: {}

创建

[root@master volume]# kubectl get pods -o wide
NAME                                 READY   STATUS    RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
myapp-backend-pod-798dc9b584-4ljfd   1/1     Running   2          9d     10.244.1.17   node01   <none>           <none>
myapp-backend-pod-798dc9b584-j62cq   1/1     Running   2          9d     10.244.2.17   node02   <none>           <none>
myapp-backend-pod-798dc9b584-tpfhj   1/1     Running   2          9d     10.244.2.18   node02   <none>           <none>
pod-demo                             2/2     Running   0          118m   10.244.1.18   node01   <none>           <none>

hostPath存储卷

hostPath宿主机路径,就是把pod所在的宿主机之上的脱离pod中的容器名称空间的之外的宿主机的文件系统的某一目录和pod建立关联关系,在pod删除时,存储数据不会丢失。

创建
编写配置清单

cat vimpod-hostpath-vol.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath-vol
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    hostPath:
      path: /data/home/
      type: DirectoryOrCreate 

当删除pod资源时,不影响hostPath的存储,因此hostPath可以实现持久新存储,但是当node节点损坏时,也会导致数据丢失

PV和PVC

  • PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象捕获存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。
  • PersistentVolumeClaim(PVC)是用户存储的请求。PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),定义的时候直接指定大小,pvc必须与对应的pv建立关系,pvc会根据定义去pv申请,而pv是由存储空间创建出来的。pv和pvc是kubernetes抽象出来的一种存储资源。

Kubernetes 支持多种类型的 PersistentVolume,比如 AWS EBS、Ceph、NFS 等,完整列表请参考 https://kubernetes.io/docs/co...

创建PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  nfs:
    path: /data/volumes/pv001
    server: 192.168.157.20
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteMany
  nfs:
    path: /data/volumes/pv002
    server: 192.168.157.20

accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

  • ReadWriteOnce : PV 能以 read-write 模式 mount 到单个节点。
  • ReadOnlyMany :PV 能以 read-only 模式 mount 到多个节点。
  • ReadWriteMany : PV 能以 read-write 模式 mount 到多个节点.

persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:

  • Retain :需要管理员手工回收。
  • Recycle: 清除 PV 中的数据,
  • Delete :删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。
kubectl apply -f nfs-pv.yaml 
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   1Gi        RWX            Retain           Available                                   3s
pv002   5Gi        RWX            Retain           Available                                   3s
pv003   10Gi       RWX            Recycle          Available                                   3s

创建PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc001
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

查看创建好的PVC

kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc001   Bound    pv001    1Gi        RWX                           3s

创建好的PVC挂载到Pod

apiVersion: v1
kind: Pod
metadata:
  name: mypod1
spec:
  containers:
  - name: mypod1
    image: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30000
    volumeMounts:
    - name: mydata
      mountPath: "/check_data"
  volumes:
  - name: mydata
    persistentVolumeClaim:
      claimName: pvc001

Cherish
216 声望4 粉丝