一、Pod中使用PVC
在PVC创建成功之后,Pod就可以存储卷的方式使用PVC的存储资源了。。PVC受限于命名空间,Pod在使用PVC时必须PVC同处于一个命名空间。
Kubernetes为Pod挂载PVC的过程如下:
系统在Pod所在的命名空间中找到其配置的PVC,然后找到PVC绑定的后端PV,将PV存储挂载到Pod所在的Node目录下,最后将Node目录挂载到Pod的容器内。
在Pod中使用PVC时,需要在YAML配置中设置PVC类型的Volume,然后再容器中通过volumeMount.mountPath设置容器内的挂载目录:
#创建PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-local-pv
labels:
release: stable
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /test/disks/ssd1 #Pod被调度到的Node上该目录必须存在
nodeAffinity: #设置了节点的亲和性,Pod所调度到的Node上必须打上该标签
required:
nodeSelectorTerms:
- matchExpressions:
- key: kuberneter.io/hostname
operator: In
values:
- master
#创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteOnce #访问模式(与PV模式相同) ReadWriteOnce,读写权限,并且只能被单个Node使用
volumeMode: Filesystem
resources:
requests:
storage: 3Gi #申请3G存储空间
storageClassName: local-storage #要求系统中提交存在名为local-storage的storageClass
selector:
matchLabels:
release: "stable"
#创建Pod
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
- mountPath: /pvtest
name: testpv
volumes:
- name: testpv
persistentVolumeClaim:
claimName: test-pvc
遇到的问题,
1. PV中设置了nodeAffinity,而任何Node上没有打该标签
2. Pod要调度到的Node上没有创建PV中local path;
#问题解决在master 的node上打上kuberneter.io/hostname=master标签
kubectl label node master kuberneter.io/hostname=master
2.在master节点上创建路径 /test/disks/ssd1
成功创建,修改Pod中YAML
此时Pod创建失败,因为PV中设置了NodeAffinity,所以PV不能挂载到node2,导致Pod不能使用PV从而导致Pod不能被合法调度。
所以Pod创建成功的前提,是PV必须能够成功挂载到Pod所被调度的Node上。
二、存储卷为块设备(Block)
如果存储卷为块设备(Block),则PVC的配置与默认模式(Filesystem)略有不同。
apiVersion: v1
kind: PersistentVolume
metadata:
name: blocl-test-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
volumeMode: Block
persistentVolumeReclaimPolicy: Retain
fc: #光纤通道
targetWWNs: ["5006e801056"] #指定单个或多个目标 WWN(World Wide Names
lun: 0 #
readOnly: false
PVC的YAML配置:
apiVersion: v1
kind: persistentVolumeClaim
metadata:
name: block-test-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
resources:
requests:
storage: 10Gi
使用块设备PVC的Pod定义,与文件系统模式的PVC的用法不用,容器内不适用volumeMounts设置挂载目录,而是通过volumeDevices字段设置块设备的路径devicePath
apiVersion: v1
kind: Pod
metedata:
name: pod-with-block-volume
spec:
containers:
- name: fc-container
image: busybox
command: ["/bin/bash", "-c"]
args: ["tail -f /dev/null"]
volumeDevices:
- name: data
devicePath: /dev/xvda
volumes:
- name: data
persistentVolumeClaim:
claimName: block-test-pv
某些应用场景中,同一个Volume可能会被多个Pod或者提供Pod中的多个容器共享,此时可能存在各应用程序需要使用不同子目录的需求。这个可以通过Pod的volumeMounts挂载定义的subPath字段进行设置。通过对subPath
设置,在容器中将以subPath设置的目录而不是在Volume中提供的默认根目录作为根目录使用。
apiVersion: v1
kind: Pod
metadata:
name: mysql
spec:
containers:
- name: mysql
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpasswd"
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php:7.0-apache
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: site-data-pvc
subPath中的路径不能以"/"开头,需要用相对路径的形式。