k8s持久卷
k8s持久卷:
所有存储都是持久卷的一种类型,可做成pv
普通存储:
数据持久化方式:
基于CSI,支持docker引擎
- emptyDir 临时卷,对应docker的临时目录
- hostPath 主机卷,对应docker的目录映射
- 网络附加存储
- SAN iscsi
- NAS nfs、cifs
- 分布式存储 glusterfs、rbd(ceph)、cephfs
- 云存储 EBS
存储卷资源:
kubectl explain pod.spec.volumes
配置格式
pod.spec
containers:
volumeMounts <[]Object> #使用哪些存储卷
- name #挂载的卷名称
mountPath #挂载路径
readOnly #是否只读挂载
subPath #挂载到哪个子目录
volumes:
- name <str> #对存储卷的命名
cephfs
configMap
name #cm的名称
emptyDir
medium: 媒介类型 #存数据的方式
#"",空字符为使用磁盘,默认。指定路径时以路径为准
#Memory,定义为使用内存
sizeLimit: 使用上限 #仅内存时生效,避免把内存占完
gitRepo #git仓库当做存储卷,依赖物理机git命令
#实际上,基于empty,但启动后回去git找代码,克隆过来
glusterfs
hostPath
path #宿主机路径
type #宿主机目录操作类型
#DirectoryOrCreate,存在使用,不存在则创建
#Directory,目录在宿主机必须存在
#FileOrCreate,文件不存在就创建空文件
#File,文件必须存在
#Socket,套接字必须存在
#CharDevice,必须是字符设备
#BlockDevice,必须是块设备
iscsi
name
nfs #就版本k8s需要提前在node节点挂载nfs,1.20版是不需要提前挂载了
path #共享文件路径
readOnly #是否只读挂载
server #nfs服务主机名(集群可识别)、ip地址都可以
persistentVolumeClaim #PVC,持久存储卷申请
claimName #pvc的名称
readOnly
rbd
vsphereVolume
...
案例:
例1: 一个pod中创建两个容器,使用emptyDir卷
apiVersion: apps/v1
kind: Deployment
metadata:
name: emp-dep
namespace: default
spec:
replicas: 1
selector:
metadata:
matchLabels:
app: empdir-pod
template:
metadata:
labels:
app: empdir
spec:
containers:
- name: alpine
image: alpine
magePullPolicy: IfNotPresent
command: ["/bin/sh"]
args: ["-c","while true;do echo `date` >> /data/index.html; sleep 2;done"]
volumeMounts: #挂载创建的临时卷
- name: file #临时卷名称
mountPath: /data/ #容器中挂载的目录,自动创建
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: file
mountPath: /usr/share/nginx/html/
volumes: #创建一个临时卷给pod
- name: file #临时卷名称,方便调用
emptyDir: {} #{},代表默认用磁盘空间
例2: 使用hostPath
#2个node节点准备文件
mkdir -p /data/web ;echo `hostname` >> /data/web/index.html
#配置文件
cat > hostdir.yml <<eof
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx
spec:
replicas: 1
selector:
matchLabels:
app: hostdir
template:
metadata:
labels:
app: hostdir
spec:
volumes:
- name: html
hostPath:
path: /data/web
type: DirectoryOrCreate
containers:
- name: hostdir
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
eof
#创建pod
kubectl apply -f pod-hostPath.yml
kubectl get po -o wide
curl测试
例3: 使用nfs存储
1)所有主机都需要nfs工具
#全部节点装
yum install -y nfs-utils
#nfs服务主机开启共享文件
vim /etc/exports
/data/xx 2.2.0.0/16(rw,no_root_squash)
exportfs -av
3)写pod文件
cat > nfs-dir.yml<<eof
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-nfs
spec:
replicas: 1
selector:
matchLabels:
app: nfs-dir
template:
metadata:
labels:
app: nfs-dir
spec:
volumes:
- name: html
nfs:
path: /data/xx
server: node1
readOnly: false
containers:
- name: ngx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
eof
#创建pod
kubectl apply -f pod-nfs.yml
3)在nfs目录写入数据,测试
echo `hostname -i` >> xx/index.html
curl pod-ip

浙公网安备 33010602011771号