使用 helm 添加 observability 需要的服务
目录
背景#
已经在 homelab 搭建了 microk8s 集群,需要使用 helm 为集群添加 observability 功能,来监控和分析集群和软硬件的运行状态。
Obervability 主要包括以下几个方面:
- Metrics:使用 Prometheus 收集和存储各种指标数据。
- Visualization:使用 Grafana 创建仪表盘,展示指标数据。
- Logging:使用 Loki 收集和存储日志数据。
- Tracing:使用 Tempo 进行分布式追踪。
安装 helm#
首先需要在 microk8s 集群中安装 helm。如果还没有安装 helm,可以参考官方文档进行安装。
我的 mac 和 linux 系统上都安装了 brew,可以直接使用 brew 安装 helm:
brew install helm
Infrastructure 的存储#
在安装 observability 组件之前,需要先为它们创建存储类(StorageClass)和持久卷(PersistentVolume)。这里使用 NFS 作为存储后端。
这里使用nfs-subdir-external-provisioner
在 k8s 集群中直接使用helm chart安装nfs-subdir-external-provisioner即可。这个 repo 自带的helm chart已经处理掉了ServiceAccount和RoleBinding的创建问题。
注意:需要提前准备好 NFS 服务器,并创建好对应的共享目录。
setup-nfs-provisioner: add-repos
helm upgrade --install nfs-client nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--namespace default \
--values values/nfs-values.yaml
执行完成后,可以创建一个简单的 pod 来挂载 pvc,验证下是否可以使用nfs-client这个storageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-test-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
---
apiVersion: v1
kind: Pod
metadata:
name: nfs-test-pod
spec:
containers:
- name: test
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- mountPath: "/mnt"
name: nfs-vol
volumes:
- name: nfs-vol
persistentVolumeClaim:
claimName: nfs-test-pvc
执行
kubectl apply -f nfs-test.yaml
会看到 pod 创建成功。
pvc 也成功绑定了 pv

安装 Prometheus/Grafana/Loki/Tempo#
创建一个专门的 namespace-monitoring,用于安装 observability 相关的组件。
每个 component 都在 values 文件中指定了使用的 storageClassName 为nfs-client,以确保存储使用 NFS。且限制使用的 cpu 和 memory 资源,防止占用过多的集群资源。(毕竟分的3个 vm 都只有4C4G)
使用的 chart
所有的 helm 命令都用justfile来管理,方便统一执行。只需要执行即可自动创建 namespace,添加 repo,安装所有的 component。
just deploy-all
这里需要注意的是grafana的 admin 密码是通过secret来管理的,密码存放本地.env文件中,不要提交到 git 仓库。更安全的做法是使用vault等工具来管理密码。
create-grafana-secret:
#!/usr/bin/env bash
set -euo pipefail
if [ -z "${GRAFANA_ADMIN_PASSWORD:-}" ]; then
echo "Error: GRAFANA_ADMIN_PASSWORD not set in .env file"
exit 1
fi
kubectl create secret generic grafana-admin-credentials \
--from-literal=admin-user="admin" \
--from-literal=admin-password="$GRAFANA_ADMIN_PASSWORD" \
--namespace {{namespace}} \
--dry-run=client -o yaml | kubectl apply -f -
安装完成后,可以通过 port-forward 访问各个组件的 UI 界面。
grafana:
@echo "Grafana is available at http://localhost:3000"
@echo "Username: admin"
@echo "Password: (run 'just get-grafana-password' to retrieve)"
kubectl port-forward -n {{namespace}} svc/kube-prometheus-stack-grafana 3000:80
总结#
基本的 observability 组件已经安装完成,可以通过 Grafana 来创建仪表盘,展示 Prometheus 收集的指标数据。Loki 和 Tempo 也可以分别用于日志和分布式追踪。