使用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也可以分别用于日志和分布式追踪。