目录

存储卷

概念

使用卷

卷类型:

持久卷

hostPath

概念

type对应类型:

使用hostPath卷保存日志

NFS

概念

Pod调用NFS卷

PV/PVC

概念

k8s支持的存储卷:

创建PV

创建PVC

临时卷

configMap

概念

用途

命令

使用清单文件创建ConfigMap

挂载 ConfigMap

secret

概念

用途

命令

登录认证仓库

emptyDir

概念

配置缓存目录

传递文件


存储卷

概念

卷是一个抽象化的存储设备

卷可以解决容器崩溃或重启后历史数据丢失的问题

卷可以解决容器或Pod被删除后数据持久保存的问题

卷可以解决在多个容器内共享数据的问题

Pod可以同时使用任意数目的卷

使用卷

首先编写一个Pod的资源清单文件

在Pod.spec下添加volumes字段,配置外部存储为卷

在Pod.spec.containers[*]中添加volumeMounts字段,声明卷在容器中的挂载位置

卷不能挂载到其他卷之上,也不能与其他卷有硬链接

Pod配置中的每个容器必须独立指定各个卷的挂载位置

卷类型:

持久卷——集群中的存储资源,在里面存储的数据不会随着Pod的删除而丢失

临时卷——卷会遵从Pod的生命周期,与Pod一起创建和删除

投射卷——允许将多个现有卷源映射到同一个目录。通过将这些不同类型的卷源组合成一个统一的卷,可以更方便地管理和使用这些资源

持久卷

hostPath
概念

本质是使用本地设备,例如磁盘、分区、目录等。

hostPath卷里的数据不会随着Pod的结束而消失

注意:配置相同的Pod,可能在不同的节点上表现不同,因为不同节点上映射的文件内容不同

type对应类型:

DirectoryOrCreate      卷映射对象是一个目录,如果不存在就创建

Directory              卷映射对象是一个目录,且必须存在

FileOrCreate           卷映射对象是一个文件,如果不存在就创建

File                   卷映射对象是一个文件,且必须存在

Socket                卷映射对象是一个Socket套接字,且必须存在

CharDevice            卷映射对象是一个字符设备,且必须存在

BlockDevice           卷映射对象是一个块设备,且必须存在

使用hostPath卷保存日志

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  volumes:                                  # 卷定义

  - name: logdata                            # 卷名称

    hostPath:                                # 资源类型

      path: /var/weblog                      # 宿主机路径,在节点上存放的路径

      type: DirectoryOrCreate                 # 目录不存在就创建

  containers:

  - name: nginx

    image: myos:nginx

    volumeMounts:                          # mount 卷

    - name: logdata                         # 卷名称

      mountPath: /usr/local/nginx/logs         # 容器内路径

NFS
概念

k8s中允许将nfs存储以卷的方式挂载到你的Pod中

在删除Pod时,nfs存储卷会被卸载,而不是被删除

nfs卷可以在不同节点的Pod之间共享数据

NFS最大的功能就是在不同节点的不同Pod中共享读写数据

本地NFS的客户端可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样

由于Pod是随机调度的,为了保证NFS存储卷可以正确加载,需要在所有node节点都安装NFS软件工具包

Pod调用NFS卷

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  volumes:

  - name: logdata

    hostPath:

      path: /var/weblog

      type: DirectoryOrCreate

  - name: website                       # 卷名称

    nfs:                                # NFS 资源类型

      server: 192.168.88.240              # NFS 服务器地址

      path: /var/webroot                 # NFS 共享目录

  containers:

  - name: nginx

    image: myos:nginx

    volumeMounts:

    - name: logdata

      mountPath: /usr/local/nginx/logs

    - name: website                     # 卷名称

      mountPath: /usr/local/nginx/html    # 路径

PV/PVC
概念

持久卷Persistent Volume

持久卷声明PersistentVolumeClaim

PV/PVC实现Pod对卷的部署管理和使用

PV是资源的提供者,根据集群的基础设施变化而变化

PVC是资源的使用者,根据业务服务的需求变化来配置,用户无需指定PV的技术细节,只需要声明你需求什么样的资源即可

PVC会根据用户声明的需求,自动找到PV完成绑定

k8s支持的存储卷:

cephfs——CephFS

csi——容器存储接口

fc——Fibre Channel存储

iscsi——iSCSI存储

hostPath——HostPath卷

nfs——网络文件系统

rbd——Rados块设备卷

创建PV

---

kind: PersistentVolume

apiVersion: v1

metadata:

  name: pv-local

spec:

  volumeMode: Filesystem               #提供资源的类型Filesystem/Block

  accessModes:                        #存储卷能提供的访问模式

  - ReadWriteOnce                     #卷支持的模式 hostPath只支持RWO

  capacity:

    storage: 10Gi                       #提供的磁盘空间大小

  persistentVolumeReclaimPolicy: Retain   #数据手工回收

  hostPath:                            #hostPath配置

    path: /var/weblog              

    type: DirectoryOrCreate

---

kind: PersistentVolume

apiVersion: v1

metadata:                      

  name: pv-nfs

spec:

  volumeMode: Filesystem               #资源类型:Filesystem、Block

  accessModes:                      #卷支持的多种访问模式:RWO ROX RWX RWOP

  - ReadWriteOnce                    

  - ReadOnlyMany

  - ReadWriteMany

  capacity:

    storage: 5Gi

  persistentVolumeReclaimPolicy: Retain   #数据回收方式

  mountOptions:                      #mount的参数

  - nolock

  nfs:                                #NFS配置

    server: 192.168.88.240              #NFS服务器IP地址

    path: /var/webroot                 #共享目录路径

创建PVC

---

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

  name: pvc1

spec:

  volumeMode: Filesystem             #需要使用Filesystem的存储卷

  accessModes:

  - ReadWriteOnce                   #需要支持RWO的存储卷

  resources:

    requests:

      storage: 8Gi                    #最小磁盘空间需求

---

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

  name: pvc2

spec:

  volumeMode: Filesystem

  accessModes:

  - ReadWriteMany                   #需要支持RWM的存储卷       

  resources:

    requests:

      storage: 3Gi

Pod 挂载 PVC,映射PVC为卷,使用PVC用户无需关心后端存储设备,系统会自动查找匹配PV——

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  volumes:                             # 卷定义

  - name: logdata                       # 卷名称

    persistentVolumeClaim:               # 通过PVC引用存储资源

      claimName: pvc1                   # PVC名称

  - name: website                       # 卷名称

    persistentVolumeClaim:               # 通过PVC引用存储资源

      claimName: pvc2                  # PVC名称

  containers:

  - name: nginx

    image: myos:nginx

    volumeMounts:

    - name: logdata                    #PVC卷名称

      mountPath: /usr/local/nginx/logs    #挂载路径

    - name: website                    #PVC卷名称

      mountPath: /usr/local/nginx/html   #挂载路径

临时卷

configMap
概念

提供了向Pod注入配置数据的方法,允许将配置文件与镜像分离,使容器化的应用具有可移植性

在使用之前要创建它,不能用来保存大量数据,在其中保存的数据不可超过1MiB

用途

配置环境变量

修改配置文件的参数,数据库的地址等

命令

创建configlMap

kubectl create configmap 名称 [选项/参数]

修改系统时区

kubectl create configmap timezone --from-literal=TZ="Asia/Shanghai" --dry-run=client -o yaml

使用清单文件创建ConfigMap

[root@master ~]# vim timezone.yaml

---

kind: ConfigMap

apiVersion: v1

metadata:

  name: timezone

data:

  TZ: Asia/Shanghai

修改系统时区——

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  volumes:

  - name: logdata

    persistentVolumeClaim:

      claimName: pvc1

  - name: website

    persistentVolumeClaim:

      claimName: pvc2

  containers:

  - name: nginx

    image: myos:nginx

    envFrom:              # 配置环境变量

    - configMapRef:        # 调用资源对象

        name: timezone    # 资源对象名称

    volumeMounts:

    - name: logdata

      mountPath: /usr/local/nginx/logs

    - name: website

      mountPath: /usr/local/nginx/html

在 Pod 中增加 php 容器,与 nginx 共享同一块网卡——

# 以下为新增加内容

  - name: php                           

    image: myos:php-fpm

    envFrom:                             # 不同容器需要单独配置时区

    - configMapRef:

        name: timezone

    volumeMounts:

    - name: website                      # 不同容器需要单独挂载NFS

      mountPath: /usr/local/nginx/html

挂载 ConfigMap

---

kind: Pod

apiVersion: v1

metadata:

  name: web1

spec:

  volumes:

  - name: logdata

    persistentVolumeClaim:

      claimName: pvc1

  - name: website

    persistentVolumeClaim:

      claimName: pvc2

  - name: nginx-php                          # 卷名称

    configMap:                               # 引用资源对象

      name: nginx-php                        # 资源对象名称

  containers:

  - name: nginx

    image: myos:nginx

    envFrom:

    - configMapRef:

        name: timezone

    volumeMounts:

    - name: nginx-php                         # 卷名称

      subPath: nginx.conf                       # 键值(文件名称)

      mountPath: /usr/local/nginx/conf/nginx.conf  # 路径

    - name: logdata

      mountPath: /usr/local/nginx/logs

    - name: website

      mountPath: /usr/local/nginx/html

  - name: php

    image: myos:php-fpm

    envFrom:

    - configMapRef:

        name: timezone

    volumeMounts:

    - name: website

      mountPath: /usr/local/nginx/html

secret
概念

类似于ConfigMap,但专门用于保存机密数据

在设置Secret.data字段时,所有键值都必须时经过base64编码的字符串

用途

配置一些需要加密的环境变量或文件,例如:https证书

访问需要认证登录的私有镜像仓库,例如:harbor私有仓库

命令

创建secret

kubectl create secret 子类型 名称 [选项/参数]

通用子类型创建

kubectl create secret generic 名称 [选项/参数]

用于认证登录私有仓库的子类型

kubectl create secret docker-registry 名称 [选项/参数]

用于创建TLS证书的子类型

kubectl create secret tls 名称 [选项/参数]

创建需要登录私有仓库的资源对象

kubectl create secret docker-registry 私有仓库名 \

                      --docker-server="仓库主机名:端口号" \

                      --docker-username="登录用户名" \

                      --docker-password="密码"

登录认证仓库

---

kind: Pod

apiVersion: v1

metadata:

  name: web2

spec:

  imagePullSecrets:             #引用secret数据

  - name: harbor-auth        #资源对象名称

  containers:

  - name: apache

    image: harbor:443/private/httpd:latest  #使用私有仓库里的镜像

emptyDir
概念

本质是一个简单的空目录

可以提供临时空间,同一个Pod中容器也可以用来共享数据

随Pod创建而创建,Pod在该节点上运行时一直存在。当Pod被从节点上删除时,临时卷中的数据也将会被永久删除

重启Pod中的容器不会造成emptyDir数据的丢失

配置缓存目录

---

kind: Pod

apiVersion: v1

metadata:

  name: web2

spec:

  imagePullSecrets:

  - name: harbor-auth

  volumes:                   # 卷配置

  - name: cache              # 卷名称

    emptyDir: {}             # 资源类型

  containers:

  - name: apache

    image: harbor:443/private/httpd:latest

    volumeMounts:            # 挂载卷

    - name: cache            # 卷名称

      mountPath: /var/cache  # 路径

传递文件

---

kind: Pod

apiVersion: v1

metadata:

  name: web2

spec:

  imagePullSecrets:

  - name: harbor-auth

  volumes:

  - name: cache

    emptyDir: {}

  initContainers:

  - name: task1

    image: myos:latest

    volumeMounts:

    - name: cache

      mountPath: /var/cache

    command: ["sh"]

    args:

    - -c

    - |

      echo -e "\n#-----------------#" |tee -a /var/cache/init.log

      ID=${RANDOM}

      echo "获取随机数: ${ID}" |tee -a /var/cache/init.log

      echo "执行初始化任务" |tee -a /var/cache/init.log

      echo "随机数取余 $((ID%2))" |tee -a /var/cache/init.log

      echo "执行初始化任务完成" |tee -a /var/cache/init.log

      sleep 1

      exit $((ID%2))

  containers:

  - name: apache

    image: harbor:443/private/httpd:latest

    volumeMounts:

    - name: cache

      mountPath: /var/cache

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐