kubernetes存储卷

k8s支持的卷类型多种多样,在此只练习常用的,不常用以及已弃用的类型包括所有参数均可从官方手册中查找

https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/

一、持久卷

持久卷使用本地设备如磁盘、分区、目录等完成数据持久化管理,卷的可用性随节点健康值而改变

hostPath卷

类型 (type) 说明
DirectoryOrCreate 卷映射对象是一个目录,如果路径不存在则自动创建它。
Directory 卷映射对象必须是一个已存在的目录,否则会报错。
FileOrCreate 卷映射对象是一个文件,如果路径不存在则自动创建它。
File 卷映射对象必须是一个已存在的文件,否则会报错。
Socket 卷映射对象必须是一个已存在的 Unix Socket 套接字
CharDevice 卷映射对象必须是一个已存在的字符设备文件(如 /dev/tty)。
BlockDevice 卷映射对象必须是一个已存在的块设备文件(如 /dev/sda)。
# 创建hostPath持久卷
kubectl apply -f nginx.yml
# 查看创建容器ip以及创建地址节点
kubectl get pods -o wide
# 在master使用curl访问容器后容器收集日志信息持久化保存在节点
tail -f access.log						#在计算节点宿主机中查看日志

测试文件

# 创建nginx.yml
---
kind: Pod
apiVersion: v1
metadata:
  name: apache
spec:
  volumes:                              # 定义hostPath持久卷
  - name: logdata                       # 卷名称
    hostPath:                           # 资源类型
      path: /var/weblog                 # 宿主机路径
      type: DirectoryOrCreate           # 目录不存在就创建
  containers:
  - name: nginx
    image: myos:nginx
    volumeMounts:                       # mount卷
    - name: logdata                     # 卷名称
      mountPath: /usr/local/nginx/logs  # 容器内路径

NFS卷

数据以卷的方式挂载Pod中,删除Pod时NFS卷会被卸载而不是删除,不同Pod之间通过NFS卷共享数据

# 在harbor主机创建网页持久卷的共享目录
mkdir -p /var/webroot
echo "nfs server" > /var/webroot/index.html

# 在harbor主机部署NFS服务并修改配置文件重启服务
dnf -y install nfs-utils
echo "/var/webroot 192.168.0.0/16(rw,no_root_squash)" > /etc/exports
systemctl enable nfs-server --now

# 节点配置nfs
ansible nodes -m shell -a "dnf -y install nfs-utils"
#由于Pod随机调度为了保证NFS正确加载在所有节点安装工具包

# 创建nfs持久卷
kubectl apply -f nfs.yml
# 查看创建容器详细信息
kubectl get pods -o wide
# 访问容器服务
curl http://...

测试文件

# nfs.yml
---
kind: Pod
apiVersion: v1
metadata:
  name: nfs
spec:
  volumes:
  - name: logdata
    hostPath:
      path: /var/weblog
      type: DirectoryOrCreate
  - name: webroot                       #卷名称
    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: webroot                     #卷名称
      mountPath: /usr/local/nginx/html  #路径

PV(持久卷)/PVC(持久卷声明)

通过API完成Pod对卷的部署管理与使用,一个PV只能绑定一个PVC,PV被绑后就不会绑定其他PVC,即便PVC被删除重建也无法绑定

# 创建pv
kubectl apply -f pv.yml
kubectl get pv
# 创建pvc持久卷声明
kubectl apply -f pvc.yml
kubectl get pvc
# 修改pod文件挂载pvc
# 重新创建Pod
kubectl replace --force -f nginx.yml

测试文件

# nginx.yml
---
kind: Pod
apiVersion: v1
metadata:
  name: apache
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
      mountPath: /usr/local/nginx/logs
    - name: website
      mountPath: /usr/local/nginx/html
# pv.yml
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-local
spec:
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Gi
  persistentVolumeReclaimPolicy: Retain		#Retain和delete两种value,区别在于Retain相当于umount数据需要手动删除,而delete类似于rm-rf数据自动删除
  hostPath:
    path: /var/weblog
    type: DirectoryOrCreate
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-nfs
spec:
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  - ReadOnlyMany
  - ReadWriteMany
  capacity:
    storage: 5Gi
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
  - nolock
  nfs:
    server: 192.168.88.240
    path: /var/webroot
#---------------------------------------------------------------------
# pvc.yml
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
spec:
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc2
spec:
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 3Gi

二、临时卷

configMap卷

提供了向Pod中注入数据的方法,可以将配置文件与镜像分离使容器具有可移植性。
configMap不是用来保存数据的而是用来配置环境变量、修改配置文件参数和数据库地址等等

容器时区修改
# 创建模板
kubectl create configmap timezone --from-literal=TZ="Asia/shanghai" --dry-run=client -o yaml > timezone.yml
# 创建资源清单并查看详细信息
kubectl apply -f timezone.yml
kubectl get configmaps
# 配置Pod时区
在nginx.yml中增加时区配置具体如测试文件中展示
# 创建Pod并进入容器中查看时区时间
kubectl apply -f web1.yaml 
kubectl exec -it web1 -- bash
echo $TZ;date +%H

测试文件

# nginx.yml
---
kind: Pod
apiVersion: v1
metadata:
  name: apache
spec:
  volumes:
  - name: logdata
    persistentVolumeClaim:
      claimName: pvc1
  - name: webroot
    persistentVolumeClaim:
      claimName: pvc2
  containers:
  - name: nginx
    image: myos:nginx
    envFrom:              # 配置环境变量
    - configMapRef:       # 调用资源对象
        name: timezone    # 资源对象名称
    volumeMounts:
    - name: logdata
      mountPath: /usr/local/nginx/logs
    - name: webroot
      mountPath: /usr/local/nginx/html
配置nginx解析php
# 在Pod中增加php容器,与nginx共享同一块网卡并启动容器
kubectl apply -f nginx.yml
# 使用nginx配置文件创建configMap
kubectl cp -c nginx apache:/usr/local/nginx/conf/nginx.conf nginx.conf
# 修改配置文件,解析php
vim +61 nginx.conf
location ~ \.php$ {
	root           html;
	fastcgi_pass   127.0.0.1:9000;
	fastcgi_index  index.php;
	include        fastcgi.conf;
}
# 使用模板创建configMap
kubectl create configmap nginx-php --from-file=nginx.conf --dry-run=client -o yaml > nginx-conf.yml
# 修改Pod配置挂载configMap并重启容器
kubectl replace --force -f nginx.yml

# 验证解析,拷贝一个php文件到habor宿主机的/var/webroot目录下
# 查看创建nginx镜像并测试php解析
kubectl get pods -o wide
curl http://.../info.php

测试文件

# 第一次修改nginx.yml添加php容器
---
kind: Pod
apiVersion: v1
metadata:
  name: apache
spec:
  volumes:
  - name: logdata
    persistentVolumeClaim:
      claimName: pvc1
  - name: webroot
    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
  - name: php                            # 以下为新增加内容
    image: myos:php-fpm
    envFrom:                             # 不同容器需要单独配置时区
    - configMapRef:
        name: timezone
    volumeMounts:
    - name: webroot                      # 不同容器需要单独挂载NFS
      mountPath: /usr/local/nginx/html
#------------------------------------------------------------------
# 第二次修改nginx.yml为Pod挂载configMap
---
kind: Pod
apiVersion: v1
metadata:
  name: apache
spec:
  volumes:
  - name: logdata
    persistentVolumeClaim:
      claimName: pvc1
  - name: webroot
    persistentVolumeClaim:
      claimName: pvc2
  - name: nginx-php									#卷名称
    configMap:										#引用资源对象
      name: nginx-php								#资源对象名称
  containers:
  - name: nginx
    image: myos:nginx
    volumeMounts:
    - name: logdata
      mountPath: /usr/local/nginx/logs
    - name: webroot
      mountPath: /usr/local/nginx/html
    - name: nginx-php								#卷名称
      subPath: nginx.conf							#键值(文件名称)
      mountPath: /usr/local/nginx/conf/nginx.conf	#路径
    envFrom:
    - configMapRef:
        name: timezone
  - name: php
    image: myos:php-fpm
    envFrom:
    - configMapRef:
        name: timezone
    volumeMounts:
    - name: webroot
      mountPath: /usr/local/nginx/html

secret卷

类似configMap但密文存储数据,比configMap多一个登录harbor仓库的功能

# 创建认证登录仓库的模板
kubectl create secret docker-registry harbor-auth \
--docker-server=harbor:443 \
--docker-username="user" \
--docker-password="ABCdef123"
# 查看模板
kubectl get secrets harbor-auth -o aml
# 在harbor创建一个私有项目并上传镜像,创建Pod拉取私有镜像
...
# 创建容器并查看拉取成功
kubectl apply -f harbor.yml
kubectl get pods -o wide

在这里插入图片描述

测试文件

# harbor.yml
---
kind: Pod
apiVersion: v1
metadata:
  name: harbortest
spec:
  imagePullSecrets:
  - name: harbor-auth
  containers:
  - name: httpd
    image: harbor:443/dockerdemo/httpd:latest

emptyDir卷

作为 一种共享数据的方式不需要外挂存储,使用系统缓存与内存来提供临时空间。随Pod创建而创建随Pod删除而删除,但重启Pod不会造成卷数据丢失。常用于缓存服务器、数据统计分析、排序等

# 创建Pod只需要声明类型不需要创建空间
kubectl apply -f emptydir.yml
# 进入容器测试数据与挂载
kubectl get pods -o wide
kubectl exec -it emptydirtest -- bash
mount -l |grep cache
cat /var/cache/init.log

在这里插入图片描述

测试文件

# emptydir.yml
---
kind: Pod
apiVersion: v1
metadata:
  name: emptydirtest
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: web
    image: harbor:443/dockerdemo/httpd:latest
    volumeMounts:            #挂载卷
    - name: cache            #卷名称
      mountPath: /var/cache  #路径
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐