背景#

已经在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已经处理掉了ServiceAccountRoleBinding的创建问题。

注意:需要提前准备好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

source code

执行完成后,可以创建一个简单的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创建成功。 nfs-test-pod pvc也成功绑定了pv pvc-bound

安装Prometheus/Grafana/Loki/Tempo#

创建一个专门的namespace-monitoring,用于安装observability相关的组件。

每个component都在values文件中指定了使用的storageClassName为nfs-client,以确保存储使用NFS。且限制使用的cpu和memory资源,防止占用过多的集群资源。(毕竟分的3个vm都只有4C4G)

使用的chart

source code

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