k8s 使用local-pv
基本概念
kubernetes從1.10版本開始支持local volume(本地卷),workload(不僅是statefulsets類型)可以充分利用本地快速SSD影晓,從而獲取比remote volume(如cephfs英岭、RBD)更好的性能.
下面兩種類型應(yīng)用適合使用local volume诡曙。
數(shù)據(jù)緩存谁不,應(yīng)用可以就近訪問數(shù)據(jù),快速處理震嫉。
分布式存儲系統(tǒng)森瘪,如分布式數(shù)據(jù)庫Cassandra ,分布式文件系統(tǒng)ceph/gluster
下面會先以手動方式創(chuàng)建PV票堵、PVC扼睬、Pod的方式,介紹如何使用local volume悴势,然后再介紹external storage提供的半自動方式窗宇,最后介紹社區(qū)的一些發(fā)展。
手動創(chuàng)建local-pv
手動創(chuàng)建local-pv 需要創(chuàng)建storageclass, pv. 如果你的資源申請pv使用使用的persistvolumetemplate, pvc 會自動創(chuàng)建.
storageclass
首先需要有一個名為local-volume的sc特纤。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-volume
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
sc的provisioner是 kubernetes.io/no-provisioner军俊。
WaitForFirstConsumer表示PV不要立即綁定PVC,而是直到有Pod需要用PVC的時候才綁定捧存。調(diào)度器會在調(diào)度時綜合考慮選擇合適的local PV粪躬,這樣就不會導(dǎo)致跟Pod資源設(shè)置,selectors昔穴,affinity and anti-affinity策略等產(chǎn)生沖突镰官。很明顯:如果PVC先跟local PV綁定了,由于local PV是跟node綁定的吗货,這樣selectors泳唠,affinity等等就基本沒用了,所以更好的做法是先根據(jù)調(diào)度策略選擇node宙搬,然后再綁定local PV.
手動創(chuàng)建pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-local-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-volume
local:
path: /data/local/vol1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 192.168.100.1
這里使用實(shí)際存儲是192.168.100.1 上的/data/local/vol1 目錄.
所以你要手動建立這些目錄給pv掛載使用,可以使用下面的方式使用loop掛載的方式掛載到目錄.
cat lpfs.sh
#!/bin/bash
# Usage: sudo loopm ount file size m ount-point
touch $1
truncate -s $2 $1
mke2fs -t ext4 -F $1 1> /dev/null 2> /dev/null
if [[ ! -d $3 ]]; then
echo $3 " not exist, creating..."
mkdir $3
fi
mount $1 $3
df -h |grep $3
lpfs.sh /data0/k8spv/data0 5G /data/local/vol1
綁定pv,使用pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-volume
---
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
自動創(chuàng)建
安裝網(wǎng)絡(luò)pv的使用慣例,我們使用storageclass指定了provisioner后,按理說可以使用自動化的pv創(chuàng)建的,這種手動創(chuàng)建pv的方式太low太麻煩了笨腥,還不nodeselector好了.官方也提供了自動化的創(chuàng)建pv的方式.下篇文章介紹.