kubernetes 的数据的存储 存储卷

根据应用本身是否 需要持久存储数据,以及某一此请求和此前的请求是否有关联性,可以分为四类应用:

  1.有状态要存储 2.有状态无持久存储 3.无状态无持久存储4.无状态有持久存储

在k8s上的数据持久性:1.emptyDir:只在节点本地使用,一旦pod删除存储卷也删除。只是用来做临时目录,可是做缓存用 没有任何持久性

             2.hostPath:主机路径,直接在宿主机上找一个目录与容器建立关联关系,也不具有真正意义上的持久性

             3.网络连接性存储 1)传统意义上的存储设备,本地的san(iscsi),nas(nfs,cifs)

                   2) 分布式存储 文件系统级别的(glusterfs,cephfs) 块存储级别的(ceph) 

                   3)云存储  EBS、Azure Disk、

 可以通过命令  kubectl explain pod.spec.volumes

一、emptyDir:同一个pod内的多个容器可以共享同一个存储卷,pod删除存储卷也删除。不能实现数据存储化

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

访问nginx就可以看到动态生成的index.html

二、hostPathsu宿主机路径,把pod所在的宿主机之上的文件 系统的某一目录,与pod建立关系,在pod被删除的时候,这个存储卷是不会被删除的。所以只要同一个pod能够调度到同一个节点上,对应的数据依然是存在的。这只是节点及的持久,节点down了数据也就没有了。存在数据丢失

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-hostpath
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html

  volumes:
  - name: html
    hostPath:
      path: /data/pod/volume1
      type: DirectoryOrCreate     #如果目录不存在就创建

三、nfs共享存储,节点挂在共享存储。无论调度在那个节点上所有数据能共享访问。

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-nfs
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html

  volumes:
  - name: html
    nfs:
      path: /k8s              #nfs所共享的目录
      server: 192.168.1.120   #nfs服务器地址

四、pvc(persistentVolumeClaim)

        

首先要制作pv,它是不包含名称空间中的。通过nfs共享目录的形式

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /k8s/v1
    server: 192.168.1.120
  accessModes: ["ReadWriteMany","ReadWriteOnce"]   #访问模式
capacity: #设置pv的大小 storage: 2Gi

制作pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]    #是pv的访问模式的子集
  resources:                        #所需pv的大小 
    requests:
      storage: 6Gi

pod 使用pvc

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-pvc
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html

  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc

pv的动态供给

原文地址:https://www.cnblogs.com/both/p/9662825.html