本示例中会创建多个pv、pvc示例以验证pvc在挑选pvc时的策略,pv所使用的后端存储为nfs。

创建nfs共享目录

在nfs-server上创建出共享的目录

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
27
28
29
30
31
32
# 创建出目录
[root@nfs ~]# mkdir /data/redis00{1,2,3,4,5}

# 修改nfs配置文件
[root@nfs data]# vim /etc/exports
/data/redis 172.16.11.0/24(rw)
/data/redis001 172.16.11.0/24(rw)
/data/redis002 172.16.11.0/24(rw)
/data/redis003 172.16.11.0/24(rw)
/data/redis004 172.16.11.0/24(rw)
/data/redis005 172.16.11.0/24(rw)

# 重新导出目录
[root@nfs data]# exportfs -ar
[root@nfs data]# exportfs
/data/redis 172.16.11.0/24
/data/redis001 172.16.11.0/24
/data/redis002 172.16.11.0/24
/data/redis003 172.16.11.0/24
/data/redis004 172.16.11.0/24
/data/redis005 172.16.11.0/24

# 将该目录下目录的属主改为999
[root@nfs data]# chown 999 ./*
[root@nfs data]# ll
total 24
drwxr-xr-x 2 systemd-coredump root 4096 Jul 13 14:47 redis
drwxr-xr-x 2 systemd-coredump root 4096 Jul 13 17:49 redis001
drwxr-xr-x 2 systemd-coredump root 4096 Jul 13 17:47 redis002
drwxr-xr-x 2 systemd-coredump root 4096 Jul 13 17:49 redis003
drwxr-xr-x 2 systemd-coredump root 4096 Jul 13 17:49 redis004
drwxr-xr-x 2 systemd-coredump root 4096 Jul 13 17:49 redis005

PV定义示例

1.创建资源清单

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# pv-nfs-demo资源清单,大小5Gi,多路读写
root@k8s-master01:~/yaml/chapter05# vim pv-nfs-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-demo
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany # 多路读写
persistentVolumeReclaimPolicy: Retain # PV回收策略为保留
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: "/data/redis001"
server: 172.16.11.79

# pv-nfs-001资源清单,访问模式RWM,大小10Gi
root@k8s-master01:~/yaml/chapter05# vim pv-nfs-002.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-002
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: "/data/redis002"
server: 172.16.11.79

# pv-nfs-003资源清单,访问模式RWO,大小1Gi
root@k8s-master01:~/yaml/chapter05# vim pv-nfs-003.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-003
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: "/data/redis003"
server: 172.16.11.79

2.创建出pv

1
2
3
4
5
6
7
8
9
10
11
root@k8s-master01:~/yaml/chapter05# kubectl apply -f pv-nfs-demo.yaml -f pv-nfs-002.yaml -f pv-nfs-003.yaml 
persistentvolume/pv-nfs-demo created
persistentvolume/pv-nfs-002 created
persistentvolume/pv-nfs-003 created

# get pv资源
root@k8s-master01:~/yaml/chapter05# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs-002 10Gi RWX Retain Available 98m
pv-nfs-003 1Gi RWO Retain Available 98m
pv-nfs-demo 5Gi RWX Retain Available 98m

pvc定义示例

1.创建资源清单

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
27
28
29
30
31
32
33
# 创建pvc资源清单,要求访问模式RWM,指定pv大小,最大10Gi最小3Gi
root@k8s-master01:~/yaml/chapter05# vim pvc-demo-001.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo-001
namespace: default
spec:
accessModes: ["ReadWriteMany"]
volumeMode: Filesystem
resources:
requests:
storage: 3Gi # 最小3Gi
limits:
storage: 10Gi # 最大10Gi

# 创建pvc资源清单,要求pv的访问模型为RWO,PV大小最大2Gi,最小5Gi
root@k8s-master01:~/yaml/chapter05# vim pvc-demo-002.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo-002
spec:
accessMode: ["ReadWriteOnce"]
volumeMode: Filesystem
resource:
requests:
storage: 2Gi
limits:
storage: 5Gi
selector:
matchLabels:
usedof: "redisdata"

2.应用pvc配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
root@k8s-master01:~/yaml/chapter05# kubectl apply -f pvc-demo-001.yaml 
persistentvolumeclaim/pvc-demo-001 created

# 可以看到pvc资源已经被创建
root@k8s-master01:~/yaml/chapter05# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-demo-001 Bound pv-nfs-demo 5Gi RWX 6s

# 查看哪个pv被关联
root@k8s-master01:~/yaml/chapter05# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs-002 10Gi RWX Retain Available 117m
pv-nfs-003 1Gi RWO Retain Available 117m
pv-nfs-demo 5Gi RWX Retain Bound default/pvc-demo-001 117m
# 5G的pv被关联,因为pvc-demo-001请求的大小为2Gi,RWM,Filesystem,而5Gi大小的PV符合其要求。

Pod中使用PVC来挂载卷

1.创建资源清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@k8s-master01:~/yaml/chapter05# vim volumes-pvc-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: volumes-pvc-demo
namespace: default
spec:
containers:
- name: redis
image: redis:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
name: redisport
volumeMounts:
- mountPath: /data
name: redis-rbd-vol
securityContext:
runAsUser: 999
runAsGroup: 999
volumes:
- name: redis-rbd-vol # 定义卷名称
persistentVolumeClaim: # 使用PVC
claimName: pvc-demo-001 # 绑定创建的pvc-demo-001的pvc

2.应用配置清单

1
2
3
4
5
6
7
root@k8s-master01:~/yaml/chapter05# kubectl apply -f volumes-pvc-demo.yaml 
pod/volumes-pvc-demo created

# 创建成功
root@k8s-master01:~/yaml/chapter05# kubectl get pods volumes-pvc-demo
NAME READY STATUS RESTARTS AGE
volumes-pvc-demo 1/1 Running 0 10s

3.进入容器验证

1
2
3
# 可以看到已经被挂载
root@k8s-master01:~/yaml/chapter05# kubectl exec volumes-pvc-demo -- mount | grep "data"
172.16.11.79:/data/redis001 on /data type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.11.83,local_lock=none,addr=172.16.11.79)

总结

以上可以看出用户只需要定义pvc,以及pod,而存储相关的细节只需要交给管理员即可。