需求背景
有时候希望在 pod 中查看挂载的磁盘使用情况,比如说监控磁盘使用率用于报警什么的。对于宿主机的已经确定的磁盘,我们在编排文件中编写相关的 volumes 和 volumeMounts 指定文件挂载目录即可。但是我们很多时候会使用 storageClass 动态创建云服务商的远程磁盘,然后通过云服务商提供的驱动程序自动绑定到宿主机上,那么这时又该怎么获取磁盘使用信息呢?
实现
其实动态创建绑定的远程磁盘会被挂载到一个特定的目录:/var/lib/kubelet/plugins/kubernetes.io/csi/pv
, 我们在 Kubernetes 集群的节点上执行命令: sudo df -h | grep /var/lib/kubelet/plugins/kubernetes.io/csi/pv
,就会看到类似下面的信息,前提是已经有动态创建的磁盘挂载。
ubuntu:~$ sudo df -h | grep /var/lib/kubelet/plugins/kubernetes.io/csi/pv
/dev/nvme7n1 4.8G 21M 4.8G 1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-c43946c8-e632-42b3-8bff-cd028eb728fd/globalmount
/dev/nvme2n1 4.8G 21M 4.8G 1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-3e9598d0-8767-4926-9959-64c3796103de/globalmount
/dev/nvme6n1 4.8G 21M 4.8G 1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-e58ca223-1358-475c-840a-8208cb79d3cb/globalmount
/dev/nvme5n1 4.8G 25M 4.8G 1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-47353d5a-13f7-4728-9757-ef2c29fece5d/globalmount
/dev/nvme1n1 4.8G 25M 4.8G 1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-8d239e88-a4d9-4ab6-a3d7-709dfd4e6303/globalmount
/dev/nvme4n1 4.8G 25M 4.8G 1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-0be57d22-3fd7-4055-9bfe-c069e1d285bb/globalmount
/dev/nvme3n1 4.8G 21M 4.8G 1% /var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-3f490912-7677-4916-b6e8-959256ec1aa3/globalmount
所有挂载的磁盘信息都会列出来,那么我们就可以在编排文件中指定 /var/lib/kubelet/plugins/kubernetes.io/csi/pv
目录映射到容器中,就可以通过 df -h
命令查看磁盘使用情况。配置如下:
volumes:
- name: ebs-pv
hostPath:
path: /var/lib/kubelet/plugins/kubernetes.io/csi/pv
volumeMounts:
- name: ebs-pv
mountPath: /var/lib/kubernetes/pv
mountPropagation: HostToContainer
这里需要注意指定: mountPropagation: HostToContainer
,配置这个的作用是,宿主机在后面新挂载的磁盘容器中也能感知的到。如果不配置的话,默认情况下容器是看不到新挂载的磁盘信息的。在某些部署环境中,挂载传播正常工作前,必须在 Docker 中正确配置挂载共享(mount share)。具体可参考:https://kubernetes.io/zh/docs/concepts/storage/volumes/#%E9%85%8D%E7%BD%AE。