由于 Kubernetes 环境和架构的复杂性,在实际使用过程中需要监测和排查各种问题。因此,我们需要更直观的手段来查看不同组件的配置、状态、日志和相互关系。为了满足这个需求,在 JuiceFS CSI Driver v0.23.0 中,我们引入了一个全新的仪表盘(dashboard),为用户提供一个集中的监测和管理界面。这一改进将帮助用户更轻松地诊断和解决问题,提高整体的可用性和可维护性。
JuiceFS CSI 驱动遵循 CSI 规范,实现了容器编排系统与 JuiceFS 文件系统之间的接口。在 Kubernetes 下,JuiceFS 可以用持久卷(PersistentVolume)的形式提供给 Pod 使用。
JuiceFS CSI 驱动一般包含以下组件:JuiceFS CSI Controller(StatefulSet)以及 JuiceFS CSI Node Service(DaemonSet),你可以方便地用 kubectl 查看:
$ kubectl -n kube-system get pod -l app.kubernetes.io/name=juicefs-csi-driver
NAME READY STATUS RESTARTS AGE
juicefs-csi-controller-0 2/2 Running 0 141d
juicefs-csi-node-8rd96 3/3 Running 0 141d
JuiceFS CSI 默认采用容器挂载(Mount Pod)模式,也就是让 JuiceFS 客户端运行在独立的 Pod 中,其架构如下:
当 Kubernetes 集群中有正在使用的 JuiceFS PersistentVolume 时,我们可以查看正在提供服务的 Mount Pod :
$ kubectl -n kube-system get pod -l app.kubernetes.io/name=juicefs-mount
NAME READY STATUS RESTARTS AGE
juicefs-minikube-pvc-883d8aef-691c-49af-b9dc-bbe8f57b1e36-ilenem 1/1 Running 1 (14d ago) 14d
juicefs-minikube-pvc-9a37fd2c-54ac-441a-8498-6c7622a1ef6b-cnojjs 1/1 Running 0 14d
常规 JuiceFS CSI 驱动监测/排查方法的局限
虽然 CSI 规范给我们赋予非常强大的云上数据管理能力,但高度的接口抽象和分散部署的系统组件同样给「问题排查」造成很大的阻碍。通常情况下我们使用 kubectl 或 Kubernetes 自带的 dashboard 排查 CSI 驱动相关的问题,由于它们功能(除资源图表外)基本一致,我们今天仅使用 kubectl 展示排查步骤。
kubectl 的基本使用
kubectl 是一个功能强大的 Kubernetes 命令行客户端,具有部署应用、监测和管理集群资源以及查看事件、日志等功能。它的简单使用方法如下: - 查看 Pod 列表
$ kubectl get po # 列出默认 namespace 下的 Pod
$ kubectl get po -n kube-system # 列出特定 namespace 下的 Pod
$ kubectl get po -A # 列出所有 Pod
- 查找特定 Pod
$ kubectl get po juicefs-csi-node-xy7sa # 使用 Pod 名字精确查找
$ kubectl get po -l app=juicefs # 使用 label 筛查
$ kubectl get po --field-selector spec.nodeName=n1 # 根据任意字段查找
- 描述 Pod 状态
$ kubectl describe po juicefs-csi-node-xy7sa
...
- 查看 Pod 日志
$ kubectl logs po juicefs-csi-node-xy7sa
$ kubectl logs -f po juicefs-csi-node-xy7sa # 查看并监听 log 更新
查找应用 Pod 对应的 Mount Pod
如果应用 Pod 创建后一直处于 ContainerCreating 状态;或者应用 Pod 正常运行中 JuiceFS 文件读写报错,我们都需要第一时间检查提供服务的 Mount Pod。假设应用 Pod 是 default/dynamic-ce
,以下是使用 kubectl 查找 Mount Pod 的路径:
$ kubectl describe po dynamic-ce | grep -A 5 Annotations
Annotations:
juicefs-mountpod-pvc-bffb9986-8433-4591-b86e-1f7fbb61d48e: kube-system/juicefs-minikube-pvc-bffb9986-8433-4591-b86e-1f7fbb61d48e-bodwcu
...
$ kubectl logs -n kube-system juicefs-minikube-pvc-bffb9986-8433-4591-b86e-1f7fbb61d48e-bodwcu
...
查找应用 Pod 对应的 CSI Node Pod
如果应用 Pod 出现问题但我们找不到 Mount Pod,就需要检查 CSI Node Pod 以确认 Mount Pod 无法创建/意外删除的原因。以下是使用 kubectl 查找 CSI Node Pod 的路径:
$ kubectl describe po dynamic-ce | grep Node:
Node: minikube/192.168.39.29
$ kubectl get -n kube-system po -l app=juicefs-csi-node --field-selector spec.nodeName=minikube
NAME READY STATUS RESTARTS AGE
juicefs-csi-node-bltwt 3/3 Running 0 141m
$ kubectl logs -n kube-system juicefs-csi-node-bltwt
...
根据 Mount Pod 反查应用 Pod
当我们已经确定某个 Mount Pod 存在问题,需要确定故障的扩散范围,并重启受影响的应用 Pod,该如何排查呢?假设 Mount Pod 是 kube-system/juicefs-minikube-pvc-bffb9986-8433-4591-b86e-1f7fbb61d48e-bodwcu
,查找对应的应用 Pod 的路径如下:
$ kubectl describe po -n kube-system juicefs-minikube-pvc-bffb9986-8433-4591-b86e-1f7fbb61d48e-bodwcu | grep -A 5 Annotations
Annotations:
juicefs-a61a8333c4cf3b2337faa3eeaff326a3d7c9fee00879c314cf6b157: /var/lib/kubelet/pods/e50fef20-8479-4eab-bf1c-d423efdec35a/volumes/kubernetes.io~csi/pvc-bffb9986-8433-4591-b86e-1f7fbb61d48e/mount
$ kubectl get po -A -o json | jq -r '.items[] | select(.metadata.uid=="e50fef20-8479-4eab-bf1c-d423efdec35a") | .metadata.namespace + "/" + .metadata.name '
default/dynamic-ce-7c5d795bb-g8dvj
$ kubectl describe po dynamic-ce-7c5d795bb-g8dvj
...
这些排查步骤虽然单个看起来并不算很复杂,但当需要排查多个资源时,它们的组合和重复会使得排查效率降低。而且这些排查步骤在不同版本会发生变化,对操作人员的熟练度要求极高。
JuiceFS CSI Dashboard 的安装和功能介绍
为了让 JuiceFS CSI 的问题排查流程更加简单顺畅,我们为它开发了 JuiceFS CSI Dashboard。
安装步骤
Dashboard 功能在 JuiceFS CSI v0.23.0 (Helm Chart v0.19.1) 中发布,我们推荐使用 helm 进行安装:
$ helm repo add juicefs https://juicedata.github.io/charts/
$ helm repo update
$ helm search repo juicefs
NAME CHART VERSION APP VERSION DESCRIPTION
juicefs/juicefs-csi-driver 0.19.1 0.23.1 A Helm chart for JuiceFS CSI Driver
juicefs/juicefs-s3-gateway 0.11.2 1.6.0 A Helm chart for JuiceFS S3 Gateway
$ helm install juicefs-csi-driver juicefs/juicefs-csi-driver \
-n kube-system \
--set dashboard.hostNetwork=true \
--set dashboard.replicas=1 \
--set dashboard.leaderElection.enabled=false
...
$ kubectl get po -n kube-system -l app.kubernetes.io/name=juicefs-csi-driver
NAME READY STATUS RESTARTS AGE
juicefs-csi-controller-0 4/4 Running 0 10s
juicefs-csi-controller-1 4/4 Running 0 10s
juicefs-csi-dashboard-9b546556-wltt8 1/1 Running 0 10s
juicefs-csi-node-bltwt 3/3 Running 0 10s
当以上 Pod 全部处于 READY 状态时,就意味着带有 Dashboard 组件的 JuiceFS CSI Driver 安装成功了!
功能介绍
当你参照上文中使用 hostNetwork 的方式安装 Dashboard 后,就可以通过 http://localhost:8088
来访问它。或者可以通过 kubectl port-forward 工具来访问 Pod 内的服务:
$ kubectl port-forward -n kube-system juicefs-csi-dashboard-9b546556-t569z 8088:8088
Forwarding from 127.0.0.1:8088 -> 8088
Forwarding from [::1]:8088 -> 8088
浏览器打开 http://localhost:8088
,默认情况下我们可以在这里看到所有使用了 JuiceFS CSI的应用 Pod 列表,展示的内容有 Pod 名称、命名空间、使用的 JuiceFS PV、提供服务的 Mount Pod、状态、创建时间和所属的 CSI Node。
列表默认按创建时间降序排列,我们也可以针对不同字段进行筛选、排序和调整展示内容。
如果有 Pod 的运行状态不正常,其名称后会有红色的提醒小图标,鼠标放在上面就可以看到大致的故障原因。
如果要查看 Pod 的具体信息,可以点击 Pod 名称链接,网站会跳转到 Pod 详情页面。
Pod 详情页展示的内容有基本信息、容器列表、提供服务的 Mount Pod 列表和 Pod Events。在基本信息里我们可以使用【点击查看】按钮来在线预览 Pod 的原始定义和状态。
我们可以点击浏览器的【返回】或者顶部的 Pod 名称以返回到 Pod 详情页,然后点击 Mount Pod 名称跳转到 Mount Pod 详情页。
我们可以看到 Mount Pod 最新的 Event 时 jfs-mount 容器失败,然后我们点击 jfs-mount 容器的【查看日志】按钮,可以查看它的错误日志。
我们可以看到 Mount Pod 的故障原因是无法连接 Mete Engine. 另一个例子是我们观察到有 Mount Pod 发生了重建(处于 Terminating 状态后又重新 Running),从而导致使用它的应用 Pod 发生业务故障。
借助 Dashboard,我们很快找到了所有使用它的应用 Pod,并对应用 Pod 进行了重建,业务恢复。
参考前文,使用常规方法根据 Mount Pod 反查应用 Pod 非常麻烦。
未来展望
PV 扩容
JuiceFS CSI Driver 在 v0.21.0 版本中支持了动态 PV 的扩容,但扩容操作需要使用 kubectl edit 的方式编辑 PVC,不易操作。
$ kubectl get sc dynamic-ce -o yaml | grep allowVolumeExpansion:
allowVolumeExpansion: true
$ kubectl edit pvc dynamic-ce-1
persistentvolumeclaim/dynamic-ce edited
我们后续计划在 Dashboard 中加入动态 PV 扩容的功能。
PV 用量展示
在应用 Pod 中我们可以使用 df 工具来查看 JuiceFS Volume 的容量和用量信息,但操作不方便且输出需要二次筛查。
$ kubectl exec dynamic-ce-7c5d795bb-g8dvj -c sleep -- df -h
Filesystem Size Used Avail Use% Mounted on
overlay 17G 14G 2.9G 83% /
tmpfs 64M 0 64M 0% /dev
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
JuiceFS:dynamic-ce 2.0G 72M 2.0G 4% /data
/dev/vda1 17G 14G 2.9G 83% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 16G 12K 16G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 7.9G 0 7.9G 0% /proc/asound
tmpfs 7.9G 0 7.9G 0% /proc/acpi
tmpfs 7.9G 0 7.9G 0% /proc/scsi
tmpfs 7.9G 0 7.9G 0% /sys/firmware
我们后续计划在 Dashboard 的列表页和 PV 详情页都加入用量/容量展示。