需求背景

有时候希望在 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

参考

Logo

开源、云原生的融合云平台

更多推荐