八、Pod数据持久化Volume

Volume
  Kubernetes中的Volume提供了在容器中挂载外部存储的能力
  Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可 以使用相应的Volume
 
k8s支持的卷类型
  大致可以分类为以下四种,其中比较常用的如下
    本地卷(只用于当前node节点):hostPath、emptyDir
    网络卷(可以在任意节点访问):nfs,rbd,cephfs,glusterfs
    公有云:nfs,rbd,cephfs,glusterfs
    k8s资源:secret,configMap
 
k8s创建的空卷的位置
  在对应的node节点,因为pod是由kubelet管理的,所有空卷也是有kubelet创建的,查看kubelet的目录,默认在/var/lib/kubelet,然后进入pods/,里面可能有很多名称为pod id的目录,使用docker ps查看一下pod对应的id,然后进入那个pod id的目录,里面有volemes目录,进入后有对应的数据卷目录,再次进入就可以看到
  例如目录:/var/lib/kubelet/pods/{pod id}/volumes/kubernetes.io~empty-dir/data
 
yaml文件示例
# 创建一个空卷,挂载到Pod中的容器。Pod删除该卷也会被删除
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  # 容器一 ,负责写
  - name: write
    image: centos
    command: ["bash","-c","for i in {1..100};do echo $i>> /data/hello;sleep 1;done"]
    volumeMounts:
      # 与下面的卷来源名称关联
      - name: data
       # 挂载到容器中的目录
        mountPath: /data
  # 容器二,负责读
  - name: read
    image: centos
    command: ["bash","-c","tail -f /data/hello"]
    volumeMounts:
      - name: data
      mountPath: /data
 # 定义卷的来源与类型,定义多个卷可以在下面继续写- name
  volumes:
  - name: data
    emptyDir: {}

 

hostPath.yaml文件
将宿主机(node)上的/tmp路径,挂载到容器的/data目录中,容器/data目录和宿主机/tmp目录会同时更新
应用场景:当Pod中的容器需要访问宿主机文件时
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: busybox
    image: busybox
    # 防止busybox退出,休眠36000秒
    args:
    - /bin/sh
    - -c
    - sleep 36000
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    hostPath:
      # 指定宿主机上的路径
      path: /tmp
      # 指定挂载的类型,目录或者文件
      type: Directory

 

NFS
一款主流的文件共享服务器软件,能让使用者访问网络上的文件像在使用自己的计算机一样
如果想要使用nfs.yaml部署,所有节点所需要装nfs的包:yum install nfs-utils -y
然后最好先测试一下是否可以挂载成功,然后再用k8s进行nfs挂载,
测试方式如下:
  使用systemctl start nfs启动,systemctl enable nfs设置开机启动
  然后vi /etc/exports(可以写多行)
  写入 /ifs/kubernetes *(rw,no_root_squash)
    表示将宿主机上/ifs/kubernetes这个目录暴露到互联网上,*表示所有ip都能访问,括号里表示访问权限和以root权限运行,然后systemctl restart nfs重启服务
    然后可以在其他机器运行mount -t nfs {上面的机器IP}:/ifs/kuberneres {本机挂载的目录},表示将本机目录挂载到/ifs/kuberneres,如果不需要挂载,可以使用umount {本机挂载的目录} 进行卸载
 
nfs.yaml文件
将node挂载到nfs远程存储
一般比较少用到nfs远程存储,一般都会把应用程序都打到镜像里,不依赖于外部存储
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
     labels:
      app: nginx
    spec:
      containers: 
      - name: nginx
      image: nginx
      volumeMounts: 
      # 与下面的卷来源名称关联
      - name: wwwroot
        # 挂载到容器中的哪个目录,就是容器需要把哪个目录共享出来
        mountPath: /usr/share/nginx/html
      ports: 
      - containerPort: 80
    # 定义卷的来源与类型
    volumes: 
    - name: wwwroot
    nfs:
      # 写nfs的服务器
      server: 192.168.22.135
      # 挂载的路径
      path: /data/nfs

 

PersistentVolume的作用
  为了让应用者(测试、开发)不需要关心使用什么存储,使用哪台服务器,应用者只需要关心需要多少存储等
  PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节
  PersistentVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理
  一般会有开发编写pod和pvc的yaml,运维任务则定义pv,根据开发需求提供对应的pv进行存储
 
pv.yaml文件
创建三个不同容量的pv,可通过kubectl get pv查看创建的pv,一般由运维人员来完成
pv访问模式:
  ReadWriteOnce(RWO) 单个pod读写 ,应用场景:数据独立,一般块设备
  ReadOnlyMany(ROX) 所有pod只读
  ReadWriteMany(RWX) 所有pod读写,应用场景:数据共享,文件系统
  pv使用过之后就不会再次使用了,如果数据还有需要就备份后删除
 
pv回收策略:
  Delete:直接删除PV+数据 【不推荐】
  Recycle:清除数据,保留PV 【被废弃】
  Retain:保留PV&数据 [推荐]
 
PV可能会处于4中不同的阶段:
  Available(可用):表示可用状态,还未被任何 PVC 绑定
  Bound(已绑定):表示 PVC 已经被 PVC 绑定
  Released(已释放):PVC 被删除,但是资源还未被集群重新声明
  Failed(失败): 表示该 PV 的自动回收失败
piVersion: v1
kind: PersistentVolume
metadata:
  name: pv01
spec:
  # 定义pv容量
  capacity:
    storage: 5Gi
   # pv访问模式,所有节点都能读写,有三个模式:所有节点只读/单节点读写
  accessModes:
    - ReadWriteMany
  # nfs后端存储
  nfs:
    path: /k8s/nfs/pv01
    server: 192.168.0.200
    apiVersion: v1
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv02
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /ifs/k8s/pv02
    server: 192.168.22.134
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv03
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /ifs/k8s/pv03
    server: 192.168.22.134
 
pod.yaml文件
  创建应用yaml文件,一般由开发人员来完成
  可通过kubectl get pvc查看绑定了哪块pv,一个pvc只能绑定一个pv
  PVC与PV匹配条件:
    1、容量
    2、访问模式
    3、标签
  如果pvc用不到pv后,原本产生在pv提供的数据存储还是保留着数据,需要手动删除
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
        resources: {}
        volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
      # 数据卷持久化至pvc
      valumes:
      - name: data
        persistentVolumeClaim:
          # 名称,要与下面的name一致
          claimName: my-pvc
---

# 定义pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  # 与上面的claimName名称一致
  name: my-pvc
spec:
  accessModes:
    # 指定访问模式
    - ReadWriteMany
  resources:
    requests:
      # 指定绑定的pv容量大小
      storage: 5Gi

 

PersistentVolume 静态供给和PersistentVolume 动态供给
上面的时PersistentVolume 静态供给,需要提前准备好pvc,比如10G、20G、30G,然后pv去进行匹配,而PersistentVolume 动态供给在PVC和PV中间增加了StrageClass,意思是PVC需要多少容量的存储,通过StrageClass动态去生成,而不需要提前生成好
 
 
Kubernetes支持动态供给的存储插件: 里面打勾的代表官方支持动态供给
 
对于官方不支持的动态供给类型,可以在社区找一下有没有提供支持的插件
 

 
 
 

posted @ 2020-10-22 21:52  SoleMemory  阅读(463)  评论(0)    收藏  举报