Kubernetes 课程笔记系列六之存储

第七章 存储

  • 卷 Volume
  • 卷类型
  • 卷的使用方式
  • 常见卷类型使用详解

1 卷 Volume

容器中的文件在磁盘上是临时存放的,这给在容器中运行较重要的应用带来一些问题。 当容器崩溃或停止时会出现一个问题。此时容器状态未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。 在崩溃期间,kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时,会出现另一个问题。 跨所有容器设置和访问共享文件系统具有一定的挑战性。

Kubernetes 卷(Volume)这一抽象概念能够解决这两个问题。

2 卷的类型

Kubernetes 支持很多类型的卷。 Pod可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同, 但持久卷可以比 Pod 的存活期长。 当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁持久卷。 对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。

卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。常见的卷(volume)类型有以下几种:

  1. emptyDir: 当 Pod 被分配到节点时创建的临时目录,Pod 删除时,数据也会被删除。用于临时存储,例如缓存数据
  2. persistentVolumeClaim (PVC): 用户请求持久化存储卷的一种方式,由管理员创建和管理。
  3. configMap: 将配置数据作为文件或环境变量注入到容器中。上一章节已介绍。
  4. secret: 将敏感数据(如密码、令牌)作为文件或环境变量注入到容器中。上一章节已介绍。
  5. nfs: Network File System,允许 Pod 通过网络挂载 NFS 目录。共享存储,适用于需要多个pod共享同一存储的情况。
  6. hostPath: 将节点上的文件或目录挂载到 Pod 中。
  7. local: 将节点上的本地存储设备作为卷挂载到 Pod 中

3 卷的使用方式

使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。 容器中的进程看到的文件系统视图是由它们的容器镜像的初始内容以及挂载在容器中的卷(如果定义了的话)所组成的。 其中根文件系统同容器镜像的内容相吻合。 任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。

4 常见卷类型使用详解

4.1 以 vloume 形式挂载到容器

这种形式的话主要是configMap和Secret,这在第六章节已经介绍过了。

4.2 宿主机本地存储类型
4.2.1 emptyDir
apiVersion: v1
kind: Pod
metadata:
  name: emptydir-pod
spec:
  containers:
  - name: busybox
    image: busybox:latest
    command: ["/bin/sh", "-c", "sleep 3600"]
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

创建并验证

$ kubectl apply -f emptydir-pod.yaml
# 进入容器
$ kubectl exec -it emptydir-pod -- /bin/sh
# 验证
$ echo "test data" > /cache/testfile
$ cat /cache/testfile
4.2.2 hostPath 不推荐

风险是会随着pod调度换节点

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  containers:
  - name: busybox
    image: busybox
    command: ["/bin/sh", "-c", "echo 'test data' > /data/data.txt ;sleep 3600"]
    volumeMounts:
    - mountPath: /data
      name: host-volume
  volumes:
  - name: host-volume
    hostPath:
      path: /data/hostpath

创建并验证

$ kubectl apply -f hostpath-pod.yaml
# 查看调度到哪个节点 进入指定节点 查看/data/hostpath 目录下是否有data.txt文件且内容为test data
4.3 持久化存储和网路存储 PV&PVC&StorageClass(重点)
4.3.1 定义

持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。

持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以挂载为 ReadWriteOnce、ReadOnlyMany、ReadWriteMany 或 ReadWriteOncePod

尽管 PersistentVolumeClaim 允许用户消耗抽象的存储资源, 常见的情况是针对不同的问题用户需要的是具有不同属性(如,性能)的 PersistentVolume 卷。 集群管理员需要能够提供不同性质的 PersistentVolume, 并且这些 PV 卷之间的差别不仅限于卷大小和访问模式,同时又不能将卷是如何实现的这些细节暴露给用户。 为了满足这类需求,就有了存储类(StorageClass) 资源。

它们之间的关系大概如下图:
在这里插入图片描述

4.3.2 手动创建pv方式

创建pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /mnt/data

accessModes 支持的模式有三种:ReadWriteOnce(只能被某个节点以读写的方式挂载)、ReadOnlyMany(能被多个节点以只读的方式挂载)、ReadWriteMany(能被多个节点以读写的方式挂载)

persistentVolumeReclaimPolicy 回收策略有三种:Retain(保留)、Delete(删除)、Recycle(复用)

storageClassName sc 名称

创建pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

查看绑定状态

$ kubectl get pv
$ kubectl get pvc

使用pvc在pod中挂载卷

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-container
    image: nginx
    ports:
        - containerPort: 80
          name: "http-server"
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: test-volume
  volumes:
  - name: test-volume
    persistentVolumeClaim:
      claimName: pvc

验证

# 调度到的节点 创建目录 没有的话
$ mkdir /mnt/data
# 调度到的节点 /mnt/data 目录中创建一个 index.html 文件
$ sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"
# 验证 mster node 进入容器
$ kubectl exec -it test-pod -- sh
# 访问nginx
$ curl http://localhost/
# 出现刚刚创建的index.html内容说明成功
Hello from Kubernetes storage
4.3.3 storageClass 方式

创建 StorageClass

定义了存储类型和存储提供者的配置。

创建一个名为 fast 的 StorageClass,使用 kubernetes.io/gce-pd 作为存储提供者,并且配置为 ssd 磁盘类型。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd

创建pvc

创建一个名为 my-pvc 的 PVC,请求 10Gi 的存储,并指定使用 fast StorageClass。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: fast

在 pod 中使用pvc

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - mountPath: /mnt/data # 挂载目录
      name: my-storage
  volumes:
  - name: my-storage
    persistentVolumeClaim:
      claimName: my-pvc  # 刚创建的pvc

验证

# 确保StorageClass 已经创建
$ kubectl get storageclass
# 确保 pvc 已经创建并且状态应该是 Bound:
$ kubectl get pvc my-pvc
# 验证pod
$ kubectl get pods my-pod
# 验证挂载
$ kubectl exec -it my-pod -- /bin/sh
cd /mnt/data
echo "Hello, Kubernetes!" > testfile.txt
# 看到 Hello, Kubernetes! 输出,表示 PVC 挂载成功并且可以正常使用存储
cat testfile.txt 
# 验证持久化 删除重建查看目录
$ kubectl delete -f my-pod.yml
重复验证挂载步骤

也可以搭建 StorageClass + nfs-client-provisioner ,实现 NFS 的动态 PV 创建

这边有一篇参考博客

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张的编程旅途

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值