监控 Kubernetes PVC 磁盘使用情况

7

我想监控Kubernetes PVC磁盘使用情况。我需要持久卷索赔使用的内存。我找到了命令:

kubectl get --raw / api / v1 / persistentvolumeclaims

返回:

"status":{
            "phase":"Bound",
            "accessModes":[
               "ReadWriteOnce"
            ],
            "capacity":{
               "storage":"1Gi"
            }
         }

但是它只给我磁盘的完整容量,正如我所说的,我需要已使用的容量

有人知道哪个命令可以将这些信息返回给我吗?

2个回答

5

我没有确切的答案,但希望这可以帮到你。如果有更好的答案,我也很感兴趣。

获取当前使用情况

持久化卷子系统(PersistentVolume subsystem)提供了一个API,可为用户和管理员提供抽象信息,从而将存储的提供方式与消耗方式分离。

-- 持久化卷 | Kubernetes

如Kubernetes文档所述,PV(PersistentVolume)和PVC(PersistentVolumeClaim)是对存储的抽象。因此,我认为您不能直接检查PV或PVC,但可以检查存储介质。

要获取使用情况,请创建一个调试Pod,它将使用您的PVC,然后您可以检查使用情况。这应该取决于您的存储提供程序。

# volume-size-debugger.yaml
kind: Pod
apiVersion: v1
metadata:
  name: volume-size-debugger
spec:
  volumes:
  - name: debug-pv
    persistentVolumeClaim:
      claimName: <pvc-name>
  containers:
  - name: debugger
    image: busybox
    command: ["sleep", "3600"]
    volumeMounts:
    - mountPath: "/data"
      name: debug-pv

使用 kubectl apply -f volume-size-debugger.yaml 应用上面的清单,然后在其中运行一个 shell,使用 kubectl exec -it volume-size-debugger sh。在 shell 内部运行 du -sh 以获得人类可读格式的使用情况。

监控

正如您所注意到的那样,这对于监控来说并不是特别有用。它可能对间歇性地进行一次检查有用,但不适合监控或低磁盘空间警报。
设置监控的一种方法是拥有一个类似我们上面的旁路容器 pod,并从那里收集我们的度量标准。一个这样的例子似乎是 node_exporter
另一种方法是使用CSI(容器存储接口)。我没有使用过 CSI,并且对它不太了解,无法详细说明。但是这里有一些相关问题和相关的 Kubernetes 文档:

5
+1 对 touchmarine 的回答。不过我想深入讨论一下并加上我的三分钱。

PVC 是一个抽象的概念,代表对存储的请求,它本身并不存储磁盘使用情况等信息。作为更高级别的抽象,它完全不关心底层存储是如何被其消费者使用的。

@touchmarine,我建议使用类似以下方式而不是使用只有sleep功能的 Pod,每次需要检查磁盘使用情况时都需要手动连接:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
      - name: media
        persistentVolumeClaim:
          claimName: media
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/data"
          name: media
      - name: busybox
        image: busybox
        command: ["/bin/sh"]
        args: ["-c", "while true; do du -sh /data; sleep 10;done"]
        volumeMounts:
        - mountPath: "/data"
          name: media

当然,它也可以是一个单一容器的 busybox Pod,就像 @touchmarine 的例子一样,但在这里,我决定展示一下如何将其用作旁路容器,与单个 Pod 中的 nginx 容器一起运行。

因为它运行了一个简单的 bash 脚本 - 一个无限循环,它会将当前磁盘使用情况打印到标准输出,所以可以通过 kubectl logs 来读取它,而不需要使用 kubectl exec 并附加到 Pod

$ kubectl logs nginx-deployment-56bb5c87f6-dqs5h busybox
20.0K   /data
20.0K   /data
20.0K   /data

我猜它也可以更有效地用于配置某种磁盘使用情况的监控。


这是一种简单而有用的方法,利用日志。 - touchmarine
我是kubernetes的新手,我看到你放了一个yaml文件。我该如何运行这个脚本?这是一个收集信息的命令吗? - Danilo Marquiori
如果您分享您的“部署”或“Pod”定义,回答您的问题会更容易。我猜您的“PVC”被某个“Pod”使用,因此您可以将第二个“busybox”容器添加到该定义中,其唯一功能是挂载相同的卷并检查其当前使用情况。“command: ["/bin/sh"]”和“args: ["-c", "while true; do du -sh /data; sleep 10;done"]”是关键行。 “du -sh /data”每10秒检查一次磁盘使用情况,并将其打印到标准输出,以便可以使用“kubectl logs <pod_name> <container_name>”轻松检查。您可以通过“kubectl apply -f”应用它。 - mario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接