不使用pv/pvc 直接挂载存储
以Azure File存储举例,先定义访问的用户名/密码
$ cat azure-secret.yml
apiVersion: v1
kind: Secret
metadata:
name: azure-secret
type: Opaque
data:
azurestorageaccountname: cm95c3RvcmU=
azurestorageaccountkey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2c9PQ==
再挂载资源
$ cat azure.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: azure
mountPath: /mnt/azure
volumes:
- name: azure
azureFile:
secretName: azure-secret
shareName: myshare
readOnly: false
应用:
$ kubectl apply -f azure-secret.yml
$ kubectl apply -f azure.yml
这种用法缺点:
- 用户需要知道存储的逻辑,并知道密码。
- 管理不方便,比如从Azure 移植到AWS,整套代码要重写
使用pv/pvc 方式
PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。
PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。
有了 PersistentVolumeClaim,用户只需要告诉 Kubernetes 需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息。这些 Storage Provider 的底层信息交给管理员来处理,只有管理员才应该关心创建 PersistentVolume 的细节信息。
创建PersistentVolume
定义PersistentVolume,这里使用hostPath作为存储底层。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
labels:
release: stable
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: /tmp/data
应用并检查状态
$ kubectl apply -f pv2.yml
persistentvolume/pv0003 created
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv0003 5Gi RWO Recycle Available 5m
创建PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
selector:
matchLabels:
release: stable
PVC是用户对存储资源PV的请求,根据PVC中指定的条件Kubernetes动态的寻找系统中的PV资源并进行绑定。目前PVC与PV匹配可以通过StorageClassName
、matchLabels
或者matchExpressions
三种方式。
应用并检查状态
$ kubectl apply -f pvc2.yml
persistentvolumeclaim/myclaim1 created
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim1 Bound pv0003 5Gi RWO 7s
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv0003 5Gi RWO Recycle Bound default/myclaim1 9m
pvc 的状态是Bound, pv的状态也从Available变成了Bound
PersistentVolume有四种状态:
Available – 可用状态
Bound – 绑定到PVC
Released – PVC被删掉,但是尚未回收
Failed – 自动回收失败
挂载Volume到Pod
apiVersion: v1
kind: Pod
metadata:
name: pvpod
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: mypd
mountPath: /var/www/html
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim1
应用并检查状态
$ kubectl apply -f mypod.yml
pod/pvpod created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pvpod 0/1 ContainerCreating 0 3s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
pvpod 1/1 Running 0 8s
$ ls /tmp/data
$ kubectl exec -it pvpod bash
root@pvpod:/# echo abc > /var/www/html/index.html
root@pvpod:/# exit
exit
$ ls /tmp/data
index.html
Azure file 静态PV PVC 方式
PV 配置
$ cat pv5.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv5
labels:
app: pg5
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
azureFile:
secretName: azure-secret
shareName: myshare
readOnly: false
mountOptions:
- uid=999
- gid=999
PVC 配置
$ cat pvc5.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc5
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
selector:
matchLabels:
app: pg5
通过matchLabels 方式来匹配 PV 和 PVC 之间的关系。
执行和检查
$ kubectl create -f pv5.yml
$ kubectl create -f pvc5.yml
$ $ kubectl get pv mypv5
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv5 5Gi RWO Retain Bound default/mypvc5 2d
部分参数解释
accessModes
用于定义资源的访问方式,受限于存储底层的支持,访问方式包括以下几种:
ReadWriteOnce – 被单个节点mount为读写rw模式
ReadOnlyMany – 被多个节点mount为只读ro模式
ReadWriteMany – 被多个节点mount为读写rw模式
persistentVolumeReclaimPolicy
用于定义资源的回收方式,也首先与存储底层的支持,现有的回收策略:
Retain – 手动回收
Recycle – 删除数据 (“rm -rf /thevolume/*”)
Delete – 通过存储后端删除卷,后端存储例如AWS EBS, GCE PD或Cinder等。
网友评论