Kubernetes 中的持久卷(Persistent Volume) 具体概念请阅读官方文档:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/

创建hostPath类型的PV和PVC

创建PV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-ssd-name
labels:
type: local
spec:
storageClassName: pv-ssd
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/ssd"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: v1
kind: PersistentVolume # PV资源类型
metadata:
name: pv-ssd-name
labels:
type: local
spec:
storageClassName: pv-ssd # 定义一个storageClass资源对象的名称
capacity: # 存储容量
storage: 10Gi # 定义PV的存储容量大小
volumeMode: Filesystem # 存储卷模式
# 针对 PV 持久卷,Kubernetes 支持两种卷模式(volumeModes):Filesystem(文件系统) 和 Block(块)。如果该参数被省略,默认的卷模式是 Filesystem。
accessModes: # 访问模式
- ReadWriteOnce
# Kubernetes 支持的访问模式如下
# - ReadWriteOnce(RWO): 读写权限,并且只能被单个Node挂载
# - ReadOnlyMany(ROX): 只读权限,允许被多个Node挂载
# - ReadWriteMany(RWX): 读写权限,允许被多个Node挂载

persistentVolumeReclaimPolicy: Retain # 回收策略
# - Retain: 保留数据,需要⼿⼯处理
# - Recycle: 简单清除⽂件的操作(例如运⾏rm -rf /dada/* 命令)
# - Delete: 与PV相连的后端存储完成Volume的删除操作

hostPath:
path: "/ssd"

创建PVC

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-ssd-name
spec:
storageClassName: pv-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim # PVC资源类型
metadata:
name: pvc-ssd-name
spec:
storageClassName: pv-ssd # 绑定storageClass资源对象的名称
accessModes: # 访问模式要跟绑定的PV定义一致
- ReadWriteOnce
resources: # 描述对存储资源的请求,设置需要的存储空间⼤⼩
requests: # 申请5Gi存储空间
storage: 5Gi # 必须小于等于PV定义的存储空间

创建资源并查看资源状态

1
2
3
4
kubectl apply -f pv.yaml
kubectl apply -f pv.yaml
kubectl get pv
kubectl get pvc

image-20221001141443164

image-20221001143229657

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 参数说明
NAME #PV/PVC名称
CAPACITY # 存储容量大小
ACCESS MODES # 访问模式
RECLAIM POLICY # 回收策略
STATUS
# Avaliable(可⽤):表示可⽤状态,还未被任何PVC绑定
# Bound(可绑定):表示PV已经被PVC绑定
# Released(已释放):PVC被删除,但是资源还未被集群重新声明
# Failed(失败):表示该PV的⾃动回收失败
VOLUME # 绑定的PV名称
CLAIM # 绑定的PVC名称
STORAGECLASS # 类名称
REASON # 原因
AGE # 创建多久的时间

通过查看pvc状态可以看到STATUS字段显示的状态为Bound,这⾥表示PVC已经与PV进⾏了绑定

创建POD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
name: pod-name
spec:
volumes:
- name: volumes-name
persistentVolumeClaim:
claimName: pvc-ssd-name
nodeSelector:
kubernetes.io/hostname: node1
containers:
- name: pod-name
image: nginx:1.14.0
ports:
- containerPort: 80
volumeMounts:
- name: volumes-name
mountPath: "/usr/share/nginx/html"
1
2
3
4
5
6
# 使用参数说明
persistentVolumeClaim: # PVC类型
claimName: pvc-ssd-name # Pod绑定PVC名称

# 创建POD资源
kubectl apply -f pod.yaml

测试挂载情况

1
kubectl exec -it pod-name -- /bin/bash

image-20221001162547455

image-20221001162650107


Kubernetes 中的存储类 具体概念请阅读官方文档:https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/

创建NFS类型PV和PVC

nfs配置

注意:Node节点也需要安装nfs客户端

1
2
3
4
5
6
7
8
yum install nfs-utils -y
cat > /etc/exports <<EOF
/data/k8s/nfs 172.16.32.0/8(rw,sync,no_root_squash)
EOF
systemctl restart nfs rpcbind
mkdir -p /data/k8s/nfs
chown -R nfsnobody:nfsnobody /data/k8s/nfs/
echo "nfs master ok" >> /data/k8s/nfs/index.html

创建PV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
labels:
type: nfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
server: 172.16.32.144
path: /data/k8s/nfs
1
2
3
4
5
6
7
# 创建PV资源
kubectl apply -f pv-nfs.yaml

# 使用参数说明
nfs: # 存储类型是NFS
server: 172.16.32.144 # NFS服务的IP地址
path: /data/nfs-volume/mysql # NFS的共享⽬录路径

创建PVC

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
storageClassName: nfs
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
1
2
# 创建PVC资源
kubectl apply -f pvc-nfs.yaml

创建POD使用PVC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc-nfs
spec:
volumes:
- name: pvc-nfs
persistentVolumeClaim:
claimName: pvc-nfs
containers:
- name: pod-pvc-nfs
image: nginx:1.14.0
ports:
- containerPort: 80
volumeMounts:
- name: pvc-nfs
mountPath: "/usr/share/nginx/html"
1
2
# 创建POD资源
kubectl apply -f pod-pvc-nfs.yaml

测试访问

1
2
# curl 10.2.2.2
nfs master ok

image-20221001153038060