Kubernetes存储

Kubernetes存储

在Docker的设计实现中,容器数据是临时性的,当容器销毁或重启时存储在容器内部数据将全部丢失
但实际上很多容器化应用是需要持久化保存数据,K8S的POD和容器一样,重建销毁数据就会丢失,
K8S也通过挂载数据卷的方式为POD数据持久能力,这些数据卷以Pod为最小单位进行存储,
通过共享存储或分布式存储在POD之间实现共享。

存储使用场景

K8S是由Master节点以及Node节点组成,在Master节点中通过了etcd存储了K8S集群的节点信息、POD信息、容器信息、配置信息。
Node节点主要对外提供容器服务。

  1. 无转态服务:这种服务无需持久化存储,Pod重建也不会有任何影响。只要确保服务可靠性即可。
  2. 普通有状态服务:这类服务需要保留服务转态,通常有K8S提供vloume以及Persistent Volume、Persistent Volume Claim 来保存状态
  3. 有转态集群服务:这类服务除了保存服务转态,还需要提供集群管理接口和功能。此功能需要保存集群相关数据。

K8S中设计存储的主要使用场景

  1. 容器集群相关配置信息及运行时信息保存,这类存储在etcd中。
  2. 服务的配置信息及证书信息。
  3. 服务的状态存储、数据信息。
  4. 集群内不同服务交换共享的数据信息。
    存储

数据持久化的方式

  • 临时文件形式:同一个POD中容器之间通过共享内存方式访问,会创建一个空目录,交换完毕后会删除
  • HostPath方式:同一个Node中不同的POD之间信息共享使用HostPath方式。如果配置了EmptyDir数据卷,则Pod生命周期中都会存在。
  • PV及PVC:K8S的持久化存储机制的核心是PV、PVC。PV是Volume插件,关联到真正的存储系统。
    PVC从PV中申请PV资源,无需关心PV提供方。 POD获取PV资源,PVC提供资源。
  • 网络方式: 不同的NODE节点之间数据共享通过网络方式使用,通常采用分布式存储。有GlusterFS和Ceph等分布式存储

Kubernetes提供了许多Volume类型:

  1. emptyDir
  2. hostPath
  3. gcePersistentDisk
  4. awsElasticBlockStore
  5. nfs
  6. iscsi
  7. flocker
  8. glusterfs
  9. rbd
  10. cephfs
  11. gitRepo
  12. secret
  13. persistentVolumeClaim
  14. downwardAPI
  15. azureDisk
  16. azureFileVolume
  17. vsphereVolume
  18. Quobyte
#emptyDir
apiVersion: v1
kind: Pod
metadata:
  name: emptyDir-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
#HostPath
apiVersion: v1
kind: Pod
metadata:
  name: HostPath-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
#pv-pvc-nfs.yml
#----------------创建pv---------------------
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-pv01              #创建的pv名称可创建多个.
  namespace: mt-math             #属于的命名空间
  labels:
    pv: pv-nfs-01                #定义pv标签,后续通过pvc绑定特定的pv标签。通常如果不写标签则默认通过访问方式和storage大小进行批量绑定。(重要)
spec:
  capacity:
    storage: 1Gi                 #创建的pv-nfs-pv01大小为1G
  accessModes:
  - ReadWriteMany
  nfs:                           #创建的pv数据来源
    path: /NFS/pv01              #数据源目录
    server: 192.168.0.14         #数据源ip

---

#-----------------创建pvc------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-data-pvc             #创建的pvc名称
  namespace: mt-math             #属于的命名空间 
spec:
  accessModes:
    - ReadWriteMany                       
  resources:
    requests:
      storage: 100Gi             #请求大小为1G
  selector:                      #定义标签选择器,此时k8s会根据标签,storage,访问方式 进行匹配。三者同时满足才会绑定。如果不定义,则系统会根据storage的大小和访问方式进行匹配绑定.
    matchLabels:
      pv: pv-nfs-01              #定义请求标签为pv-nfs-pv01的pv且大小为1G

Flex Volume存储方案管理

由于K8S提供PV、PVC创建时静态额,不够灵活,所以需要扩展。灵活存储有点:

  1. 方便用户存储,只需要UI或API中指定所需持久卷的名称和容量。然后用存储组件自动完成PVC、PV、Volume的动态创建。
  2. 存储组件使用唯一标识确定用户名的持久卷,并和分布存储(GlusterFS)真正物理Volume保存唯一映射。
  3. 在Pod进行重建或者迁移到其他节点是,POD可以自动挂载会原来的存储卷。
  4. 多个Pod可以共享一个持久卷。达到容器间文件共享目的。
发布了21 篇原创文章 · 获赞 2 · 访问量 2858

猜你喜欢

转载自blog.csdn.net/ysf465639310/article/details/104898146