挂载在宿主机的目录 hostPath
#cat pod-vol-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-hostpath
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
- name: html
hostPath:
path: /data/pod/volume1
type: DirectoryOrCreate
##类型有:-DirectoryOrCreate: 它可以是宿主机上的一个已存在的目录,也可不存在,若不存在则自动创建.
-Directory: 它必须是宿主机上一个已经存在的目录。
-FileOrCreate: 它可以是宿主机上的一个文件,若此文件不存在则创建一个空文件来挂载。
-File:宿主机上的一个已经存在的文件,若不存在则报错。
-Socket:宿主机上一个已经存在的Unix Socket文件.
-CharDevice: 宿主机上一个已存在的字符类型的设备文件.
-BlockDevice: 宿主机上一个已存在的块类型的设备文件。
在node01节点上创建
mkdir -p /data/pod/volume1
echo node01 >> /data/pod/volume1/index.html
在node02节点上创建
mkdir -p /data/pod/volume1
echo node02>> /data/pod/volume1/index.html
master机器上运行
kuebctl apply -f pod-hostpath-vol.yaml
kubectl get pods -o wide
curl pod-vol-hostpath-ip
kubectl delete -f pod-vol-hosstpath.yaml
kuebctl apply -f pod-hostpath-vol.yaml
kubectl get pods -o wide
curl pod-vol-hostpath-ip
nfs:
选择1个nfs服务器(yum install nfs-utils -y,systemctl start nfs)
node节点上要有mount命令,没有的话(yum -y install nfs-utils )
注意每个节点下/etc/host/添加nfs服务器主机名 nfshost
测试是否可以挂载
mount -t nfs nfshost:/data/volumes /mnt
cd /data/volumes
echo store01 >> index.html
在nfshost主机上操作:
yum -y install nfs-utils
mkdir -p /data/volumes
vim /etc/exports
/data/volumes 网段(rw,no_root_squash)
/data/volumes 网段(rw,no_root_squash)
systemctl start nfs
查看服务:ss -tnl
2049被监听
master节点上
vim pod-vol-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-nfs
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
- name: html
nfs:
path: /data/volumes
server: nfshost
kubectl apply -f pod-vol-nfs.yaml
kubectl get pods -i wide ###pod被重构,数据依然存在
curl pod-vol-nfs-ip
pv,pvc
accessModes:(PV的访问模型)
ReadWriteOnce【简写:RWO】: 单路读写,即仅能有一个节点挂载读写
ReadOnlyMany【ROX】: 多路只读
ReadWriteMany【RWX】:多路读写
pv
准备:nfshost
#mkdir /data/volumes/{v1,v2,v3}
#vim /etc/exports
/data/volumes/v1 网段(rw,no_root_squash)
/data/volumes/v2 网段(rw,no_root_squash)
/data/volumes/v3 网段(rw,no_root_squash)
#exportfs -arv
#showmount -e
先定义pv (pv属于集群级别,不属于名称空间中,每一个名称空间都可以使用)
#vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /data/volumes/v1
server: nfshost
accessModes: [“ReadWriteMany”,“ReadWriteOnce”]
capacity:
storage: 2Gi
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /data/volumes/v2
server: nfshost
accessModes: [“ReadWriteOnce”]
capacity:
storage: 5Gi
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /data/volumes/v3
server: nfshost
accessModes: [“ReadWriteMany”,“ReadWriteOnce”]
capacity:
storage: 20Gi
#kubectl apply -f pv-demo.yaml
#kubectl get pv
创建pvc
#cat pod-vol-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: default
spec:
accessModes: [“ReadWriteMany”] ###必须是现有pv的子集
resources:
requests:
storage: 6Gi
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-pvc
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
- name: html
persistentVolumeClaim:
claimName: mypvc
kubectl apply -f pod-vol-pvc.yaml
kubectl get pv
kubectl get pvc
kubectl describe pods pod-vol-pvc
删除pv pvc,先删除pvc
#kubectl delete pvc myapp
删除所有pv
#kubectl delete pv --all
pv回收的策略,即若Pod绑定了一个PVC,PVC绑定了一个PV,后来Pod删除了,那么PV中的数据要怎么处理?
-Retain: 保留,Retain是默认回收策略,即这些数据保留着,以便Pod再次创建时还能使用。
-Released: 这种回收策略是, 不保留数据, 即Pod删除,则PV自动回收,清空里面的数据,并允许其他Pod绑定使用.
-Delete: 删除,即PVC和PV解除绑定后,PV自动删除.数据也就被清空了。