介绍
阿里云在部分ECS类型中提供了本地盘配置,本地盘具有低时延、高随机IOPS、高吞吐量和高性价比的优势,在一些对性能要求很高的应用中有很大优势。
在Kubernetes系统中使用本地盘可以通过HostPath、LocalVolume等类型的PV使用:
HostPath: 卷本身不带有调度信息,如果想对每个pod固定在某个节点上,就需要对pod配置nodeSelector等调度信息;
LocalVolume: 卷本身包含了调度信息,使用这个卷的pod会被固定在特定的节点上,这样可以很好的保证数据的连续性。
本文介绍一种通过LocalVolume方式使用阿里云本地盘的方法。
通过LocalVolume Provisioner自动创建LocalVolume,PV附带所属的节点信息;
创建pvc消费LocalVolume, 使用这个pvc的pod都会调度到pv所指定的节点;
Provisioner工作原理
1)本地盘介绍:
https://help.aliyun.com/document_detail/63138.html
本地盘不支持挂载、卸载;
本地盘必须与ECS共存,在创建ecs的时候就确定了本地盘数量;
一种类型的机器决定了本地盘的数量,并可以通过api获取;
默认情况下本地盘从/dev/vdb开始挂载,自定义镜像可能会有不同;
2)挂载原理:
Provisioner会在启动的时候把本地盘挂载到目标目录:
通过api查询本机器有本地盘的个数;
从起始设备(默认/dev/vdb)开始挂载,依次挂载到目标目录(起始设备可以配置);
设备会进行文件系统检测,如果设备没有格式化文件系统,则会创建一个文件系统;
Provisioner会实时的轮询检查目标目录,根据目标目录列表创建PV:
创建PV时,StorageClass可以支持reclaimPolicy、volumeBindingMode的配置;
LocalVolume PV删除后会自动重新创建;
PV的名字:local-pv-{节点名}-{设备名}, PV Name会加到label中;
部署Alibaba LocalVolume Provisioner
1)创建ConfigMap:
Provisioner的配置参数放在local-provisioner-config这个configmap中:
vendor: 可选,为alibabacloud时,启动阿里云本地盘功能;
hostDir: Local Disk在主机上的挂载目录;
mountDir: Local Disk在主机挂载目录,再次挂载到容器中的目录;
volumeMode: 挂载模式,支持文件系统、Block;
fsType: 文件系统类型,默认ext4;
deviceStartWith: 可选,默认vdb,本地盘的起始名称;
mkFSOptions:可选,默认空,表示进行“mkfs.*” 后面的参数;
mountOptions:可选,默认空,表示进行“mount -o”的参数;
apiVersion: v1
kind: ConfigMap
metadata:
name: local-provisioner-config
namespace: kube-system
data:
storageClassMap: |
local-volume:
vendor: alibabacloud
hostDir: /mnt/disks
mountDir: /mnt/disks
blockCleanerCommand:
- "/scripts/shred.sh"
- "2"
volumeMode: Filesystem
fsType: ext4
deviceStartWith: vdb
mkFSOptions: ""
mountOptions: "nodelalloc"
2)创建StorageClass
LocalVolume的StorageClass不会真正去Provisioner PV,而是用来定义reclaimPolicy、volumeBindingMode等配置细节;
reclaimPolicy: 支持Retain、Delete;
volumeBindingMode: 支持Immediate、WaitForFirstConsumer
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-volume
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
3)创建Provisioner服务
通过Daemonset部署,需要配置hostPID、hostNetwork为true;
添加privileged 权限;
支持通过AK、或STS方式部署;
支持STS免AK功能:
节点需要配置RAM Role信息,且role具有访问云盘权限;
使用STS功能时,不需要配置ACCESS_KEY_ID、ACCESS_KEY_SECRET参数;
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: local-volume-provisioner
namespace: kube-system
labels:
app: local-volume-provisioner
spec:
selector:
matchLabels:
app: local-volume-provisioner
template:
metadata:
labels:
app: local-volume-provisioner
spec:
hostPID: true
hostNetwork: true
serviceAccountName: admin
containers:
- image: registry.cn-hangzhou.aliyuncs.com/plugins/local-volume-provisioner:v1.12-7802d35-aliyun
imagePullPolicy: "Always"
name: provisioner
securityContext:
privileged: true
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: ACCESS_KEY_ID
value: ""
- name: ACCESS_KEY_SECRET
value: ""
volumeMounts:
- mountPath: /etc/provisioner/config
name: provisioner-config
readOnly: true
- mountPath: /mnt/disks
name: local
mountPropagation: "HostToContainer"
- mountPath: /etc/kubernetes
name: etc
volumes:
- name: provisioner-config
configMap:
name: local-provisioner-config
- name: local
hostPath:
path: /mnt/disks
- name: etc
hostPath:
path: /etc/kubernetes
消费LocalVolume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: local-volume
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/data"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim