八、持久卷使用

1、emptyDir

EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时, EmptyDir中的数据也会被永久删除。

apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: web-volume
      mountPath: /usr/share/nginx/html
      readOnly: true
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command:
    - "/bin/sh"
    args:
    - "-c"
    - "while true;do echo $(date) >> /data/index.html;sleep 1;done"
    volumeMounts:
    - name: web-volume
      mountPath: /data
  volumes:
  - name: web-volume
    emptyDir:
      medium: Memory
      sizeLimit: 10Mi

验证

[root@master volume]# kubectl get po pod-emptydir -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-emptydir   2/2     Running   0          29s   10.244.1.132   node2   <none>           <none>
[root@master volume]# curl 10.244.1.132
Thu Dec 2 14:01:16 UTC 2021
Thu Dec 2 14:01:17 UTC 2021
Thu Dec 2 14:01:18 UTC 2021
......

2、hostPath

HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。

apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: web-hostpath
      mountPath: /usr/share/nginx/html
      readOnly: true
  volumes:
  - name: web-hostpath
    hostPath:
      path: /data/web
      type: DirectoryOrCreate

验证

[root@master volume]# kubectl get po pod-hostpath -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          58s   10.244.1.134   node2   <none>           <none>
[root@node2 ~]# echo myWeb_hostPath > /data/web/index.html
[root@master volume]# curl 10.244.1.134
myWeb_hostPath

关于type字段的说明:
DirectoryOrCreate 目录存在就使用,不存在就先创建后使用
Directory 目录必须存在
FileOrCreate 文件存在就使用,不存在就先创建后使用
File 文件必须存在
Socket unix套接字必须存在
CharDevice 字符设备必须存在
BlockDevice 块设备必须存在

3、第三方存储卷配置

emptyDir和hostPath的数据并不能真正意义上保存,如果真正意义上保存还需要使用第三方存储。k8s支持的第三方后端存储有awsElasticBlockStore、azureDisk、cephfs、glusterfs、cinder、fc、iscsi、nfs、rbd、scaleIO等
具体支持的第三方设备及其配置参数可查看官方文档https://kubernetes.io/docs/concepts/storage/volumes/

以nfs为例

[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
kind: Pod
metadata:
  name: pod-nfs
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: web-nfs
      mountPath: /usr/share/nginx/html
      readOnly: true
  volumes:
  - name: web-nfs
    nfs:
      path: /data/volume1
      server: 192.168.1.51

验证

[root@master volume]# kubectl get po pod-nfs -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-nfs   1/1     Running   0          18s   10.244.2.124   node1   <none>           <none>
[root@master volume]# echo test-nfs-volume > /data/volume1/index.html
[root@master volume]# curl 10.244.2.124
test-nfs-volume

4、PV,PVC

管理存储是管理计算的一个明显问题。该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim

PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。

PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。

4.1PV创建

[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
/data/volume2 192.168.1.0/24(rw,root_squash,sync)
/data/volume3 192.168.1.0/24(rw,root_squash,sync)

以nfs为例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv-volume1
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  nfs:
    path: /data/volume1
    server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv-volume2
spec:
  accessModes:
  - ReadOnlyMany
  capacity:
    storage: 5Gi
  nfs:
    path: /data/volume2
    server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv-volume3
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 3Gi
  nfs:
    path: /data/volume3
    server: 192.168.1.51

验证

NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
test-pv-volume1   10Gi       RWO            Retain           Available                                   28s
test-pv-volume2   5Gi        ROX            Retain           Available                                   55s
test-pv-volume3   3Gi        RWX            Retain           Available                                   7s
  • 存储类型
    底层实际存储的类型,kubernetes支持多种存储类型,每种存储类型的配置都有所差异
  • 存储能力(capacity)
    用于存储空间的设置
  • 访问模式(accessModes)
    用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
  • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
  • ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载
    需要注意的是,底层不同的存储类型可能支持的访问模式不同
  • 回收策略(persistentVolumeReclaimPolicy)
    当PV不再被使用了之后,对其的处理方式。目前支持三种策略:
  • Retain (保留) 保留数据,需要管理员手工清理数据
  • Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
  • Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务
    需要注意的是,底层不同的存储类型可能支持的回收策略不同
  • 存储类别
    PV可以通过storageClassName参数指定一个存储类别
  • 具有特定类别的PV只能与请求了该类别的PVC进行绑定
  • 未设定类别的PV则只能与不请求任何类别的PVC进行绑定
  • 状态(status)
    一个 PV 的生命周期中,可能会处于4中不同的阶段:
  • Available(可用): 表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定): 表示 PV 已经被 PVC 绑定
  • Released(已释放): 表示 PVC 被删除,但是资源还未被集群重新声明
  • Failed(失败): 表示该 PV 的自动回收失败

4.2PVC创建

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test1-volume
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

验证

[root@master volume]# kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                  STORAGECLASS   REASON   AGE
test-pv-volume1   10Gi       RWO            Retain           Available                                                  14m
test-pv-volume2   5Gi        ROX            Retain           Available                                                  14m
test-pv-volume3   3Gi        RWX            Retain           Bound       default/test1-volume                           13m
[root@master volume]# kubectl get pvc
NAME           STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test1-volume   Bound    test-pv-volume3   3Gi        RWX                           23s

4.3pod使用

apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: test1-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: test1-volume
    persistentVolumeClaim:
      claimName: test1-volume
      readOnly: false

验证

[root@master volume]# echo test1-pvc > /data/volume3/index.html 
[root@master volume]# kubectl get po pod-pvc -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-pvc   1/1     Running   0          94s   10.244.2.126   node1   <none>           <none>
[root@master volume]# curl 10.244.2.126
test1-pvc

5、configMap

ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。

[root@master volume]# kubectl create cm wordpress --from-literal=wordpress-db-host=wordpress-mysql 
configmap/wordpress created
[root@master volume]# kubectl get cm wordpress
NAME        DATA   AGE
wordpress   1      4m15s

6、secret

在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。

[root@master volume]# kubectl create secret generic wordpress --from-literal=wordpress-db-password=wordpresspwd --from-literal=mysql-root-password=wordpresspwd
[root@master volume]# kubectl get secret wordpress
NAME        TYPE     DATA   AGE
wordpress   Opaque   2      69s
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容