kubernetes存储卷
k8s支持的卷类型多种多样,在此只练习常用的,不常用以及已弃用的类型包括所有参数均可从官方手册中查找。
·
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 #路径
更多推荐


所有评论(0)