/dev:/dev
目录lsblk --output NAME,ROTA
查看磁盘类型,ROTA=1为HDD磁盘 ROTA=0为SSD磁盘)项目部署,可用kubectl get pods -n kube-system | grep carina
命令查看部署进度
$ cd deploy/kubernetes
$ ./deploy.sh
$ kubectl get pods -n kube-system |grep carina
carina-scheduler-6cc9cddb4b-jdt68 0/1 ContainerCreating 0 3s
csi-carina-node-6bzfn 0/2 ContainerCreating 0 6s
csi-carina-node-flqtk 0/2 ContainerCreating 0 6s
csi-carina-provisioner-7df5d47dff-7246v 0/4 ContainerCreating 0 12s
项目卸载
$ cd deploy/kubernetes
$ ./deploy.sh uninstall
注意事项
基于Kubernetes CSI进行设计开发,使用常规的storageclass、pvc
即可创建volume卷
下边我们结合storageclass
和pvc
进行讲解使用细节
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-carina-sc
provisioner: carina.storage.io # 这是该CSI驱动的名称,不允许更改
parameters:
# 这是kubernetes内置参数,我们支持xfs,ext4两种文件格式,如果不填则默认ext4
csi.storage.k8s.io/fstype: xfs
# 这是选择磁盘分组,该项目会自动将SSD及HDD磁盘分组
# SSD:ssd HDD: hdd
# 如果不填会随机选择磁盘类型
carina.storage.io/disk-group-name: hdd
reclaimPolicy: Delete
allowVolumeExpansion: true # 支持扩容,定为true便可
# WaitForFirstConsumer表示被容器绑定调度后再创建pv
volumeBindingMode: WaitForFirstConsumer
# 支持挂载参数设置,默认为空
# 如果没有特殊的需求,为空便可满足大部分要求
mountOptions:
- rw
volumeBindingMode
支持Immediate
参数,但是对于本地存储通常设置为WaitForFirstConsumer
storageclass
支持allowedTopologies
,只有在volumeBindingMode:Immediate
模式下生效apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-carina-pvc
namespace: carina
spec:
accessModes:
- ReadWriteOnce # 本地存储只能被一个节点上Pod挂载
resources:
requests:
storage: 7Gi
storageClassName: csi-carina-sc
volumeMode: Filesystem # block便会创建块设备
创建bcache类型磁盘并使用,如果要创建bcache类型磁盘需要在storageclass中设置特殊的参数
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-carina-sc
provisioner: carina.storage.io
parameters:
# file system
csi.storage.k8s.io/fstype: xfs
# 数据存储磁盘类型
carina.storage.io/backend-disk-group-name: hdd
# 缓存磁盘类型
carina.storage.io/cache-disk-group-name: ssd
# 1-100 Cache Capacity Ratio
# 假设pvc为10G,则会创建5G的ssd类型的缓存盘
carina.storage.io/cache-disk-ratio: "50"
# 三种缓存模式writethrough/writeback/writearound
carina.storage.io/cache-policy: writethrough
reclaimPolicy: Delete
allowVolumeExpansion: true
# WaitForFirstConsumer表示被容器绑定调度后再创建pv
volumeBindingMode: WaitForFirstConsumer
mountOptions:
备注①:观察上述配置实际是hdd作为后端存储盘,ssd作为缓存盘,缓存比率为50%,也就是说如果pvc.spec.resource.request.storage=10G
则会创建一个10G的hdd存储卷和一个5G的ssd存储卷,ssd存储卷作为hdd卷的缓存使用
备注②:缓存有三种模式分别为writethrough/writeback/writearound
备注③:由于bcache技术限制,当pvc扩容后需pod重启后才会生效,正常存储卷无需pod重启即刻生效
备注④:可以使用命令echo 0 > /sys/block/loop0/queue/rotational
将loop0设置模拟成ssd磁盘
测试关注点:
①每个节点服务启动时会自动将SSD及HDD裸盘添加到VG卷组
②每隔五分钟扫描本地磁盘,如果有新发现的裸盘则会自动加入VG卷组,扫描时间可配置最少五分钟
③节点服务启动后会将磁盘容量信息存储到node.status.capacity
可使用如下命令查看
$ kubectl get node 10.20.9.154 -o template --template={{.status.capacity}}
map[carina.storage.io/carina-vg-hdd:160 carina.storage.io/carina-vg-ssd:0 cpu:2 ephemeral-storage:208655340Ki hugepages-1Gi:0 hugepages-2Mi:0 memory:3880376Ki pods:110]
$ kubectl get node 10.20.9.154 -o template --template={{.status.allocatable}}
map[carina.storage.io/carina-vg-hdd:150 carina.storage.io/carina-vg-ssd:0 cpu:2 ephemeral-storage:192296761026 hugepages-1Gi:0 hugepages-2Mi:0 memory:3777976Ki pods:110]
carina.storage.io/carina-vg-hdd:160
,SSD磁盘:carina.storage.io/carina-vg-ssd:0
单位为Gicapacity-allocatable=10G
为系统预留node.status.allocatable
,这变更会有点延迟④项目启动时配置文件
$ kubectl get configmap carina-csi-config -n kube-system
NAME DATA AGE
carina-csi-config 1 116m
config.json: |-
{
"diskSelector": ["loop*", "vd*"], # 磁盘匹配策略,支持正则表达式
"diskScanInterval": "300", # 300s 磁盘扫描间隔,0表示关闭本地磁盘扫描
"diskGroupPolicy": "type", # 磁盘分组策略,只支持按照磁盘类型分组,更改成其他值无效
"schedulerStrategy": "spreadout" # binpack,spreadout支持这两个参数
}
# v0.9.1 配置已变更,详细文档参考[docs/design/design-diskGroup-zh.md]
{
"diskSelector": [
{
"name": "carina-vg-ssd",
"re": ["loop2+"],
"policy": "LVM",
"nodeLabel": "kubernetes.io/hostname"
},
{
"name": "carina-vg-hdd",
"re": ["loop3+"],
"policy": "LVM",
"nodeLabel": "kubernetes.io/hostname"
},
{
"name": "exist-vg-group",
"re": ["loop4+"],
"policy": "LVM",
"nodeLabel": "kubernetes.io/hostname"
},
{
"name": "new-vg-group",
"re": ["loop5+"],
"policy": "LVM",
"nodeLabel": "kubernetes.io/hostname"
},
{
"name": "raw",
"re": ["vdb+", "sd+"],
"policy": "RAW",
"nodeLabel": "kubernetes.io/hostname"
}
],
"diskScanInterval": "300",
"schedulerStrategy": "spreadout"
}
diskSelector
若是A磁盘已经加入了VG卷组,修改为不在匹配A盘,如果该盘尚未使用则会在VG卷组中移除该磁盘schedulerStrategy
中binpack
为pv选择磁盘容量刚好满足requests.storage
的节点 ,spreadout
为pv选择磁盘剩余容量最多的节点schedulerStrategy
在storageclass volumeBindingMode:Immediate
模式中选择只受磁盘容量影响,即在spreadout
策略下Pvc创建后会立即在剩余容量最大的节点创建volumeschedulerStrategy
在storageclass volumeBindingMode:WaitForFirstConsumer
模式pvc受pod调度影响,它影响的只是调度策略评分,这个评分可以通过自定义调度器日志查看kubectl logs -f carina-scheduler-6cc9cddb4b-jdt68 -n kube-system
⑤服务器组件启动成功,会收集各个节点的存储使用情况更新到configmap:carina-node-storag
$ kubectl get configmap carina-node-storage -n kube-system -o yaml
data:
node: '[{
"allocatable.carina.storage.io/carina-vg-hdd": "150",
"allocatable.carina.storage.io/carina-vg-ssd": "0",
"capacity.carina.storage.io/carina-vg-hdd": "160",
"capacity.carina.storage.io/carina-vg-ssd": "0",
"nodeName": "10.20.9.154"
}, {
"allocatable.carina.storage.io/carina-vg-hdd": "146",
"allocatable.carina.storage.io/carina-vg-ssd": "0",
"capacity.carina.storage.io/carina-vg-hdd": "170",
"capacity.carina.storage.io/carina-vg-ssd": "0",
"nodeName": "10.20.9.153"
}]'
node.status.capacity
及node.status.allocatable
⑥关于topo(topologyKey: topology.carina.storage.io/node
)使用方法参考examples/kubernetes/topostatefulset.yaml
执行测试
可执行测试脚本进行基本的功能验证
$ cd examples/kubernetes
$ ./test.sh help
-------------------------------
./test.sh ===> install all test yaml
./test.sh uninstall ===> uninstall all test yaml
./test.sh expand ===> expand all pvc
./test.sh scale ===> scale statefulset replicas
./test.sh delete ===> delete all pod
./test.sh exec ===> show pod filesystem
测试细节
该项目有一个CRD资源,可使用命令kubectl get lv
查看
$ kubectl get lv
NAME SIZE GROUP NODE STATUS
pvc-319c5deb-f637-423b-8b52-42ecfcf0d3b7 7Gi carina-vg-hdd 10.20.9.154 Success
pvc-5b3703d8-f262-48e3-818f-dfbc35c67d90 3Gi carina-vg-hdd 10.20.9.154 Success
查看创建的lvm卷
$ kubectl exec -it csi-carina-node-cmgmm -c csi-carina-node -n kube-system bash
$ pvs
PV VG Fmt Attr PSize PFree
/dev/vdc carina-vg-hdd lvm2 a-- <80.00g <79.95g
/dev/vdd carina-vg-hdd lvm2 a-- <80.00g 41.98g
$ vgs
VG #PV #LV #SN Attr VSize VFree
carina-vg-hdd 2 10 0 wz--n- 159.99g <121.93g
$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
thin-pvc-319c5deb-f637-423b-8b52-42ecfcf0d3b7 carina-vg-hdd twi-aotz-- 7.00g 0.15 10.79
volume-pvc-319c5deb-f637-423b-8b52-42ecfcf0d3b7 carina-vg-hdd Vwi-aotz-- 7.00g thin-pvc-319c5deb-f637-423b-8b52-42ecfcf0d3b7 0.15
lvs
命令看到的卷组可能与容器内不同,这是由于节点lvm缓存所致,执行lvscan
刷新节点缓存便可以了thin pool
和lvm卷,可以观察到卷名称为volume-
和pv name
组成磁盘限速
支持设备限速,在pod annotations中添加如下注解(参考examples/kubernetes/deploymentspeedlimit.yaml)
metadata:
annotations:
carina.storage.io/blkio.throttle.read_bps_device: "10485760"
carina.storage.io/blkio.throttle.read_iops_device: "10000"
carina.storage.io/blkio.throttle.write_bps_device: "10485760"
carina.storage.io/blkio.throttle.write_iops_device: "100000"
---
# 该annotations会被设置到如下文件
/sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
/sys/fs/cgroup/blkio/blkio.throttle.read_iops_device
/sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
/sys/fs/cgroup/blkio/blkio.throttle.write_iops_device
dd if=/dev/zero of=out.file bs=1M count=512 oflag=dsync
清理孤儿卷
每十分钟会遍历本地volume,然后检查k8s中是否有对应的logicvolume,若是没有则删除本地volume
每十分钟会遍历k8s中logicvolume,然后检查logicvolume是否有对应的pv,若是没有则删除logicvolume
当节点被删除时,在这个节点的上的所有volume将在其他节点重建
# 示例
$ kubectl get lv
NAME SIZE GROUP NODE STATUS
pvc-177854eb-f811-4612-92c5-b8bb98126b94 5Gi carina-vg-hdd 10.20.9.154 Success
pvc-1fed3234-ff89-4c58-8c65-e21ca338b099 5Gi carina-vg-hdd 10.20.9.153 Success
pvc-527b5989-3ac3-4d7a-a64d-24e0f665788b 10Gi carina-vg-hdd 10.20.9.154 Success
pvc-b987d27b-39f3-4e74-9465-91b3e6b13837 3Gi carina-vg-hdd 10.20.9.154 Success
$ kubectl delete node 10.20.9.154
# volume进行重建,重建会丢失原先的volume数据
$ kubectl get lv
NAME SIZE GROUP NODE STATUS
pvc-177854eb-f811-4612-92c5-b8bb98126b94 5Gi carina-vg-hdd 10.20.9.153 Success
pvc-1fed3234-ff89-4c58-8c65-e21ca338b099 5Gi carina-vg-hdd 10.20.9.153 Success
pvc-527b5989-3ac3-4d7a-a64d-24e0f665788b 10Gi carina-vg-hdd 10.20.9.153 Success
pvc-b987d27b-39f3-4e74-9465-91b3e6b13837 3Gi carina-vg-hdd 10.20.9.153 Success
指标监控
carina-node 为host网络模式部署并监听 8080
端口,其中8080为metrics,可通过如下配置进行修改
- "--metrics-addr=:8080"
备注:若是修改监听端口,务必同步修改service:csi-carina-node
carina-controller 监听8080 8443
,其中8080为metrics、8443为webhook,可通过如下配置进行修改
- "--metrics-addr=:8080"
- "--webhook-addr=:8443"
carina-node和carina-controller,自定义指标
# vg剩余容量: carina-devicegroup-vg_free_bytes
# vg总容量: carina-devicegroup-vg_total_bytes
# volume容量: carina-volume-volume_total_bytes
# volume使用量: carina-volume-volume_used_bytes
df -h
统计不同,误差在几十兆①该项目总共有哪些组件,各个组件功能职责是怎么样的
共有三个组件,carina-scheduler、carina-controller、carina-node
carina-scheduler:自定义调度器,凡是Pod绑定了由该驱动提供服务的Pvc,则由该调度器进行调度
carina-controller:负责监听pvc创建等,当pv调度到指定节点,则创建CRD(logicvolume)
carina-node:负责管理本地磁盘节点,并监听CRD(logicvolume),管理本地lvm卷
通过查看各个服务日志,可以获取详细的服务运行信息
②已知问题,在集群性能极差或者磁盘性能极差情况下,会出现pv无法创建情况
kubectl get lv
观察到错误响应③pv创建成功后,还能进行Pod迁移吗
④如何让Pod和PVC在指定节点运行
spec.nodeName
指定节点名称将跳过调度器WaitForFirstConsumer
策略的StorageClass,在PVC Annotations增加 volume.kubernetes.io/selected-node: nodeName
可指定pv调度节点⑤k8s节点删除,应如何处理调度到节点上的pv
⑥如何创建磁盘以方便测试
loop device
for i in $(seq 1 10); do
truncate --size=200G /tmp/disk$i.device && \
losetup -f /tmp/disk$i.device
done
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。