k8s(四)卷的管理

目录

(一)卷的概述

1:容器化带来的问题

2:卷的概念

3:卷的类型

4:如何使用卷

(二)临时卷

1:emptyDir卷

2:configMap卷

3:secret卷

 

(三)持久卷

1:hostPath卷

2:NFS卷

3:PV/PVC卷


(一)卷的概述

1:容器化带来的问题

  • #容器中的文件在磁盘上是临时存放的,这给容器中运行的重要的应用程序带来了一些问题。
  • Q1:当容器崩溃或重启时,kubelet会以干净的状态(镜像的状态)重启容器,容器内的历史数据会丢失。
  • Q2:当容器被删除时,容器内的数据也会一起被清理。
  • Q3:多个容器中有共享文件或目录的需求。

2:卷的概念

  • 卷是一个抽象化的存储设备。
  • 卷可以解决容器崩溃或重启后,历史数据丢失的问题。
  • 卷可以解决容器或pod被删除后,数据持久保存的问题。
  • 卷可以解决在多个容器内共享数据的问题。

3:卷的类型

  • k8s支持很多类型的卷。pod可以同时使用任意数目的卷类型;pod中的容器在崩溃或重启后数据都不会丢失。
  • 临时卷:临时卷类型的生命周期与pod相同。当pod不再存在时,临时卷也会被k8s销毁。提供存储空间,可以在多个容器间共享数据。
  • 持久卷:当pod执行结束或被删除以后,持久卷不会被k8s销毁。适用于需要长久保存的数据。

4:如何使用卷

  • 使用卷时,在spec.volumes中设置为pod提供卷,并在spec.containers[*].volumeMounts字段中声明卷在容器中的挂载位置。
  • 卷挂载在镜像中的路径下。pod配置中的每个容器必须独立指定各个卷的挂载位置。
  • 卷不能挂载到其他卷之上,也不能与其他卷有硬链接。
  • 不管使用哪种存储类型,都需要先把它们映射成卷,然后再在容器中使用这些卷,pod只能引用卷。
  • 如果同一个pod中的两个容器挂载的同一个卷,那么它们就能共享数据。

(二)临时卷

1:emptyDir卷

基本概述

  • emptyDir是一种临时卷。
  • emptyDir的本质是一个简单的空目录。
  • 当pod被创建时,emptyDir也会同时被创建,并且在pod在该节点上运行期间,一直存在。当pod被从节点上删除时,emptyDir卷中的数据也会永久被删除。

用途

  • 临时空间,例如缓存服务器、数据统计分析、归并排序。
  • 同一个pod中,容器共享数据。

如何配置?

---
apiVersion: v1
kind: Pod
metadata:
  name: web1
spec:
  terminationGracePeriodSeconds: 0
  restartPolicy: Always

  volumes:               # 卷配置
  - name: cache-volume   # 卷名称
    emptyDir: {}  # emptyDir 资源类型 ;{}表示空;默认就是宿主机的剩余磁盘

  containers:
  - name: nginx
    image: myos:nginx

    volumeMounts:  #在容器中引用卷
    - name: cache-volume     # 引用卷的名称
      mountPath: /var/cache  # 卷在容器中映射的路径。若不存在,会自动创建;若存在,会覆盖

    ports:
    - protocol: TCP
      containerPort: 80

2:configMap卷

基本概述

  • configMap是一种临时卷。
  • configMap提供向pod注入配置数据的方法,允许你将配置文件与镜像分离,使容器化的应用具有可移植性。
  • configMap在使用之前需要先创建它。configMap不是用来保存大量数据的,在其中保存的数据不可超过1MiB。

用途

  • 定义临时变量。
  • 修改各种配置文件的参数,数据库的地址,用户名密码等。

命令行创建

语法格式:kubectl create configmap  [选项/参数] 
例:kubectl create configmap mycm1 --from-literal=username=admin --from-literal=password=123

资源文件中配置configMap

#案例:实现nginx解析php

#把目录做成configMap

[root@master ~]# kubectl create configmap website --from-file=webphp 
(webphp中有网页文件和php页面)

#修改nginx配置文件,并做成configMap
.....

[root@master ~]# kubectl create configmap webconf --from-file=nginx.conf

#nginx解析php
[root@master ~]# vim myv2.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: web2
spec:
  terminationGracePeriodSeconds: 0    
 
  restartPolicy: Always 
  volumes:                # 卷配置   #设置为Pod提供的卷
  
- name: myphp     # 卷名称
    
configMap:   #资源对象类型,写卷的类型 
      
name: website   #configmap 名称(网页文件)  
  
- name: webconf         # 卷名称
    configMap:          # configmap 资源对象
      name: webconf       # configmap 名称(配置文件)

  containers:
 
 - name: nginx
    image: myos:nginx
    volumeMounts:         #挂载卷的配置
    - name: myphp    # 卷名称。要挂载的卷名,不同的卷下面写的参数不同
      mountPath: /usr/local/nginx/html/myphp #路径
    - name: webconf   # 卷名称
      subPath: nginx.conf # 如果是单一文件,需要指定键名称 #这一步就是让目录成为文件
      mountPath: /usr/local/nginx/conf/nginx.conf   # 路径
    ports:
    - protocol: TCP
      containerPort: 80
    
envFrom:  #引用一个卷来配置环境变量
    - configMapRef: #引用configMap资源对象
       
 name: timezone #引用configMap资源对象名称
  - name: php
    image: myos:phpfpm
    
volumeMounts:  #让php也能读取文件这里也必须挂载
    - name: myphp
      mountPath: /usr/local/nginx/html/myphp

3:secret卷

基本概述

  • secret卷是一种临时卷。
  • secret类似与configMap,但专门用于保存机密数据。
  • 在设置secret.data字段时,所有键值都必须是经过base64编码的字符串。

用途

  • 为容器配置环境变量。
  • 挂载配置文件/目录到容器上。
  • 由kubelet在为pod拉取镜像时使用(需要登录的仓库)

命令行创建
#语法:kubectl  create secret 子类型 名称 [选项/参数]
#例:kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123

子类型

  • 通用类型:kubectl create secret generic 名称 [选项/参数]
  • 用于创建访问docker仓库的子类型:kubectl create secret docker-registry 名称 [选项/参数]
  • 用于创建TLS证书的子类型:kubectl create secret tls 名称 [选项/参数]

登录认证仓库

#创建需要登录私有仓库的资源对象
kubectl create secret docker-registry harbor-auth \
--docker-server=harbor:443 \  #仓库主机端口号
--docker-username=admin \   #登录用户名
--docker-password=123 \   #密码

---
kind: Pod
apiVersion: v1
metadata: 
   name: myapp
spec:
   restartPolicy: Always
   imagePullScrets:  #镜像仓库认证数据
   - name: harbor-auth  #引用secret卷名称
   containers:
   - name: nginx
     image: harbor:443/myimg/myos:nginx
     imagePullScrets: Always 

创建secret资源文件

# 生成加密 base64 数据,创建认证文件
[root@web2 html]# htpasswd -nbm admin 123456 |base64

YWRtaW46JGFwcjEkdGJqOXJISUckdk9DRFpDaFZJUHl0ZHdGSXl1Qm91MAoK

# 使用 secret 设置密码
[root@master ~]# vim myv2.yaml 

---
kind: Secret
apiVersion: v1
metadata:
  name: myauth
type: Opaque   #数据类型
data:
  webauth: 
YWRtaW46JGFwcjEkdGJqOXJISUckdk9DRFpDaFZJUHl0ZHdGSXl1Qm91MAoK

---
apiVersion: v1
kind: Pod
metadata:
  name: web2
spec:
  terminationGracePeriodSeconds: 0
  restartPolicy: Always
  volumes:
  - name: webconf
    configMap:
      name: webconf

  - name: webauth       # 卷名称
    secret:       # secret 资源对象
      secretName: myauth    # secret 名称
      items:    # 枚举多个键值#声明映射的健值,可以配置多组,唯一一组时可省略
      - key: webauth        # 键值名称
        path: webauth       # 文件名称;映射后的文件名
        mode: 0644          # 权限 ;映射后的权限
  containers:
  - name: nginx
    image: myos:nginx
    volumeMounts:
    - name: webconf
      subPath: nginx.conf
      mountPath: /usr/local/nginx/conf/nginx.conf

   - name: webauth         # 卷名称
      subPath: webauth      # 键名称
 mountPath: 
/usr/local/nginx/conf/webauth  # 路径错误的话,验证检测不到会报403
  ....  

 


(三)持久卷

1:hostPath卷

基本概述

  • hostPath是持久卷。
  • hostPath卷的本质是使用本地设备,例如磁盘、分区、目录、Socket、CharDevice和BlockDevice等。
  • hostPath卷的可用性取决于底层节点的可用性,如果节点变得不健康,那么hostPath卷也将不可被访问。
  • configMap和secret是往容器里注入文件,hostPath 是把文件保存在宿主机,从而实现数据持久化,即使容器被删除,数据依然还在。
  • 局限性:不能实现跨主机的数据共享,只能在一个宿主机保存日志,适用于保存日志。

type对应类型

type类型

说明                

DirectoryOrCreate卷映射对象是一个目录,若不存在则自动创建
Directory卷映射对象是一个目录,且必须存在
FileOrCreate卷映射对象是一个文件,若不存在则自动创建

File

卷映射对象是一个文件,且必须存在
Socket卷映射对象是一个Socket套接字,且必须存在
CharDevice卷映射对象是一个字符设备,且必须存在
BlockDevice卷映射对象是一个块设备,且必须存在

创建hostPath资源文件

[root@master ~]# vim myv3.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: web3
spec:
  terminationGracePeriodSeconds: 0
  restartPolicy: Always

volumes:                 # 卷配置
  - name: logdata     # 卷名称
    hostPath:        # hostPath 资源类型
      path: /var/weblog     # 宿主机路径
      type: DirectoryOrCreate  # 目录不存在就创建
  containers:
  - name: nginx
    image: myos:nginx
    ports:
    - protocol: TCP
      containerPort: 80

    volumeMounts:    # 挂载卷的配置
    - name: logdata    # 引用卷名称
      mountPath: /usr/local/nginx/logs  # 路径

2:NFS卷

基本概述

  • NFS卷是持久卷。
  • NFS卷能将NFS挂载到pod中。
  • NFS卷的内容在删除pod时会被卸载(umount),而不是被删除。
  • NFS卷可以在不同节点的pod之间共享数据。

用途

  • 主要功能是实现不同节点的不同pod之间共享数据。

配置NFS卷

1:配置NFS服务器
—在registry主机上搭建NFS服务器
 

2:配置NFS客户端应用

—Pod随机调度到不同node节点上
—所有
节点都需要安装NFS客户端应用
 

3:pod调用NFS卷

[root@master ~]# vim myv3.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: web3
spec:
  terminationGracePeriodSeconds: 0
  restartPolicy: Always

volumes:  #定义卷
  - name: logdata
    hostPath:
      path: /var/weblog
      type: DirectoryOrCreate

 - name: website       # 卷名称
    nfs:               # NFS 资源类型
      server: registry     # NFS 服务器地址
      path: /var/webroot   # NFS 共享目录
  containers:
  - name: nginx
    image: myos:nginx
    ports:
    - protocol: TCP
      containerPort: 80

    volumeMounts:  #引用卷
    - name: logdata
      mountPath: /usr/local/nginx/logs

    - name: website       # 卷名称
      mountPath: /usr/local/nginx/html  # 路径

3:PV/PVC卷

 基本概述

  • PV是持久卷,PV卷是集群中的资源,是集群中的一块存储,可以由管理员事先制备。
  • PVC是持久卷申领,表示用户对存储的请求。

用途

  • 通过提供一种通用的API来完成pod对卷的部署管理、使用。
  • PV/PVC的引入让集群具备了存储的逻辑抽象能力。
  • 解决k8s存储的问题,并将所有的存储抽象化成三种特性。
    空间大小:
    访问模式:单用户读写、多用户读写、只能读不能写等等
    使用模式:块设备或文件系统

k8s支持的插件
#PV 持久卷是用插件的形式来实现的。

  • cephfs - CephFS volume
  • csi - 容器存储接口 (CSI)
  • fc - Fibre Channel (FC) 存储
  • hostPath - HostPath 卷 (仅供单节点测试使用;不适用于多节点集群;请尝试使用 local 卷作为替代)
  • iscsi - iSCSI (SCSI over IP) 存储
  • local - 节点上挂载的本地存储设备
  • nfs - 网络文件系统 (NFS) 存储
  • rbd - Rados 块设备 (RBD) 

如何使用PV/PVC?

  • PV是资源的提供者,根据集群的基础设施变化而变化,由k8s集群管理员配置
  • PVC是资源的使用者,根据业务服务的需求变化来配置。作为用户,无需知道PV的技术细节,只需要声明需要的资源类型即可。
  • PVC会根据用户声明的需求,自动找到PV完成绑定。

PV资源文件(模板)
#PV的状态在变成bound之前不能使用

---
kind: PersistentVolume
apiVersion: v1
metadata: 
   name: mypv
spec:
   volumeMode: Filesystem   #提供资源的类型[Filesystem,Block]
   accessModes:   #存储卷能提供的访问模式
      - ReadWriteOnce  #卷支持的模式,支持多种
      - ReadOnlyMany  #RWO,ROX,RWX,RWOP
   capacity:   #存储卷能提供的存储空间
     storage: 30Gi  #空间大小
   persistentVolumeReclaimPolicy: Retain  #数据回收方式[Retain,Recycle,Delete]
   ...   ...    #存储配置

PV资源文件(hostPath) 

---
kind: PersistentVolume
apiVersion: v1
metadata: 
   name: pv-local
spec:
   volumeMode: Filesystem   #提供资源的类型[Filesystem,Block]
   accessModes:   #存储卷能提供的访问模式
      - ReadWriteOnce  #卷支持的模式,支持多种
   capacity:   #存储卷能提供的存储空间
     storage: 30Gi  #空间大小
   persistentVolumeReclaimPolicy: Retain  #数据回收方式[Retain,Recycle,Delete]
   hostPath: 
      path: /var/weblog
      type: DirectoryOrCreate

 PV资源文件(NFS)

---
kind: PersistentVolume
apiVersion: v1
metadata: 
   name: pv-nfs
spec:
   volumeMode: Filesystem   #提供资源的类型[Filesystem,Block]
   accessModes:   #存储卷能提供的访问模式
      - ReadWriteOnce  #卷支持的模式,支持多种
      - ReadOnlyMany
      - ReadWriteMany  
   capacity:   #存储卷能提供的存储空间
     storage: 20Gi  #空间大小
   persistentVolumeReclaimPolicy: Retain  #数据回收方式[Retain,Recycle,Delete]
   nfs: 
      server: registry
      path: /var/webroot

 PVC资源文件

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata: 
   name: pvc1
spec:     #定义需求
   volumeMode: Filesystem   #需要使用Filesystem的存储卷
   accessModes:   

      - ReadWriteOnce  #需要支持RWO的存储卷
   resources:
     requests:
        storage
: 18Gi  #最小磁盘空间需求

pod调用PVC
#映射PVC为卷
#存储卷挂载

 ---
apiVersion: v1
kind: Pod
metadata:
  name: web3
spec:
  terminationGracePeriodSeconds: 0
  restartPolicy: Always
  
volumes:       #定义存储卷 
  
- name: logdata  # 存储卷名称
   
 persistentVolumeClaim:   # (定义资源对象)通过PVC引用存储资源
      
claimName: pvc1  # PVC名称(资源对象PVC1)
 
 - name: website   # 存储卷名称
    
persistentVolumeClaim:   #(定义资源对象) 通过PVC引用存储资源
      
claimName: pvc2        # PVC名称(资源对象PVC2)
  containers:
  - name: nginx
    image: myos:nginx
    ports:
    - protocol: TCP
      containerPort: 80
    
volumeMounts: #引用存储卷
    - name: logdata  #PVC卷名称
      
mountPath: /usr/local/nginx/logs #挂载路径
    - name: website  #PVC卷名称
      mountPath: /usr/local/nginx/html #挂载路径
 

#由于k8s支持的存储卷类型较多,而每一种存储卷对应的PV/PVC资源文件的参数都不一样,在实际配置过程中可查阅官方手册,以下是链接。
持久卷 | Kubernetes


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值