在 K3s 環境透過 Rancher 建立 LibreNMS
- 採用 K3s 環境已經定義好的
- ingress + tls Exp. nms.k3s.ichiayi.com
- nfs storage Exp. nfs-client
- 使用官方提供的 helm chart 進行安裝配置
安裝程序
- 加入 helm repo
helm repo add librenms https://www.librenms.org/helm-charts helm repo update
- 產生 namespace 與所需要的帳號密碼, 可下載這 script 執行後自動產生
https://raw.githubusercontent.com/tryweb/k3s/refs/heads/main/charts/librenms/scripts/create-secrets.sh
#!/bin/bash # LibreNMS Kubernetes Secrets 建立腳本 # 此腳本會建立 LibreNMS 所需的所有 Secrets # # 用法: # ./create-secrets.sh # 使用預設值 # NAMESPACE=my-ns RELEASE_NAME=my-release ./create-secrets.sh # # 環境變數: # NAMESPACE - Kubernetes 命名空間 (預設: librenms) # RELEASE_NAME - Helm release 名稱 (預設: librenms) # 此預設值與 fleet.yaml 中的 helm.releaseName 一致 # 若 fleet.yaml 未設定 releaseName,Fleet 會自動生成: # <GitRepo名稱>-<路徑>(例如:k3s-librenms-app-charts-librenms) set -e # 顏色定義 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 預設命名空間和 release 名稱 NAMESPACE="${NAMESPACE:-librenms}" RELEASE_NAME="${RELEASE_NAME:-librenms}" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}LibreNMS Secrets 建立腳本${NC}" echo -e "${GREEN}========================================${NC}" echo "" # 檢查 kubectl 是否可用 if ! command -v kubectl &> /dev/null; then echo -e "${RED}錯誤: kubectl 未安裝或不在 PATH 中${NC}" exit 1 fi # 檢查叢集連線 if ! kubectl cluster-info &> /dev/null; then echo -e "${RED}錯誤: 無法連線到 Kubernetes 叢集${NC}" exit 1 fi echo -e "${YELLOW}命名空間: ${NAMESPACE}${NC}" echo -e "${YELLOW}Release 名稱: ${RELEASE_NAME}${NC}" echo "" # 建立命名空間(如果不存在) echo "正在建立命名空間..." kubectl create namespace "$NAMESPACE" --dry-run=client -o yaml | kubectl apply -f - echo -e "${GREEN}✓ 命名空間已就緒${NC}" echo "" # 生成密碼 echo "正在生成密碼..." APP_KEY="base64:$(head -c 32 /dev/urandom | base64)" MYSQL_ROOT_PASSWORD=$(openssl rand -base64 24) MYSQL_PASSWORD=$(openssl rand -base64 24) REDIS_PASSWORD=$(openssl rand -base64 24) echo -e "${GREEN}✓ 密碼已生成${NC}" echo "" # 建立 LibreNMS App Secret echo "正在建立 librenms-app-secret..." kubectl create secret generic librenms-app-secret \ --namespace "$NAMESPACE" \ --from-literal=appkey="$APP_KEY" \ --dry-run=client -o yaml | kubectl apply -f - echo -e "${GREEN}✓ librenms-app-secret 已建立${NC}" # 建立 MySQL Secret (Bitnami MySQL chart 格式) # 用於 values.yaml 中的 mysql.auth.existingSecret echo "正在建立 librenms-mysql-secret..." kubectl create secret generic librenms-mysql-secret \ --namespace "$NAMESPACE" \ --from-literal=mysql-root-password="$MYSQL_ROOT_PASSWORD" \ --from-literal=mysql-password="$MYSQL_PASSWORD" \ --dry-run=client -o yaml | kubectl apply -f - echo -e "${GREEN}✓ librenms-mysql-secret 已建立${NC}" # 建立 MySQL Secret (LibreNMS poller 使用) # LibreNMS chart 的 poller 模板硬編碼使用 {{ .Release.Name }}-mysql 作為 Secret 名稱 # 因此需要額外建立這個 Secret 供 poller 使用 POLLER_MYSQL_SECRET="${RELEASE_NAME}-mysql" echo "正在建立 ${POLLER_MYSQL_SECRET} (供 poller 使用)..." kubectl create secret generic "$POLLER_MYSQL_SECRET" \ --namespace "$NAMESPACE" \ --from-literal=mysql-root-password="$MYSQL_ROOT_PASSWORD" \ --from-literal=mysql-password="$MYSQL_PASSWORD" \ --dry-run=client -o yaml | kubectl apply -f - echo -e "${GREEN}✓ ${POLLER_MYSQL_SECRET} 已建立${NC}" # 建立 Redis Secret echo "正在建立 librenms-redis-secret..." kubectl create secret generic librenms-redis-secret \ --namespace "$NAMESPACE" \ --from-literal=redis-password="$REDIS_PASSWORD" \ --dry-run=client -o yaml | kubectl apply -f - echo -e "${GREEN}✓ librenms-redis-secret 已建立${NC}" # 建立 Fleet Helm Values Secret # 解決 Bitnami MySQL chart 升級時的密碼驗證問題 # Fleet 會從此 Secret 的 values.yaml key 讀取 YAML 格式的值 # 參考:https://fleet.rancher.io/ref-fleet-yaml echo "正在建立 librenms-helm-values (供 Fleet 升級時使用)..." HELM_VALUES_YAML=$(cat <<EOF mysql: auth: rootPassword: "${MYSQL_ROOT_PASSWORD}" password: "${MYSQL_PASSWORD}" EOF ) kubectl create secret generic librenms-helm-values \ --namespace "$NAMESPACE" \ --from-literal=values.yaml="$HELM_VALUES_YAML" \ --dry-run=client -o yaml | kubectl apply -f - echo -e "${GREEN}✓ librenms-helm-values 已建立${NC}" echo "" # 驗證 echo "正在驗證 Secrets..." kubectl get secrets -n "$NAMESPACE" | grep -E "librenms|${RELEASE_NAME}" echo "" # 輸出密碼 echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}Secrets 建立完成!${NC}" echo -e "${GREEN}========================================${NC}" echo "" echo -e "${YELLOW}⚠️ 請將以下密碼安全保存!${NC}" echo "" echo "App Key: $APP_KEY" echo "MySQL Root Password: $MYSQL_ROOT_PASSWORD" echo "MySQL User Password: $MYSQL_PASSWORD" echo "Redis Password: $REDIS_PASSWORD" echo "" echo -e "${GREEN}========================================${NC}" echo "" echo "已建立的 Secrets:" echo " - librenms-app-secret (App Key)" echo " - librenms-mysql-secret (MySQL - Bitnami chart 用)" echo " - ${POLLER_MYSQL_SECRET} (MySQL - LibreNMS poller 用)" echo " - librenms-redis-secret (Redis)" echo " - librenms-helm-values (Fleet 升級時傳遞 MySQL 密碼)" echo "" echo "下一步:" echo "1. 將密碼安全保存到密碼管理器" echo "2. 透過 Rancher Fleet 部署 LibreNMS" echo "3. 詳見 README.md 的部署說明" echo "" echo -e "${YELLOW}提示:如果 Fleet release 名稱不是 '${RELEASE_NAME}',請重新執行:${NC}" echo " RELEASE_NAME=<your-release-name> ./create-secrets.sh" - 設定配置檔, 可下載這 values-custom.yaml 來修改成自己需要的內容
https://raw.githubusercontent.com/tryweb/k3s/refs/heads/main/charts/librenms/values-custom.yaml
# LibreNMS Helm Chart - 自訂值 # 此檔案只包含與官方預設值不同的設定 # 官方預設值參考: https://github.com/librenms/helm-charts/blob/main/charts/librenms/values.yaml # # 敏感資訊(密碼、密鑰)請使用 Kubernetes Secret 管理 # 參閱 README.md 的「敏感資訊管理」章節 # ============================================================ # LibreNMS 核心配置 # ============================================================ librenms: # APP_KEY 從 Secret 載入 # 必須先建立 Secret: librenms-app-secret (包含 appkey) existingSecret: librenms-app-secret # 從 Secret 載入 Redis 密碼 extraEnvs: - name: REDIS_PASSWORD valueFrom: secretKeyRef: name: librenms-redis-secret key: redis-password # Frontend 持久化儲存 (預設: 1Gi, storageClassName: "") #frontend: # persistence: # storageClassName: "nfs-client" # chart 7.0.1 移除這設定 # Poller 配置 (預設: 2) poller: replicas: 3 # SNMP Scanner 配置 (預設: disabled) snmp_scanner: enabled: true cron: "23 */4 * * *" # 每 4 小時的 23 分執行一次 (預設: 15 * * * *, 即每小時的第 15 分鐘) # RRDcached 持久化儲存 rrdcached: persistence: journal: storageClassName: "nfs-client" rrdcached: size: 5Gi # 預設: 10Gi storageClassName: "nfs-client" # ============================================================ # Ingress 配置 (預設: disabled) # ============================================================ ingress: enabled: true className: "nginx" annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/proxy-body-size: "64m" nginx.ingress.kubernetes.io/ssl-redirect: "false" hosts: - host: nms.k3s.ichiayi.com paths: - path: / pathType: Prefix tls: - secretName: wildcard-k3s-ichiayi-com-tls hosts: - nms.k3s.ichiayi.com # ============================================================ # MySQL 配置 (Bitnami subchart) # ============================================================ mysql: auth: # 密碼從 Secret 載入 (預設: 自動生成) existingSecret: librenms-mysql-secret primary: persistence: enabled: true storageClass: "nfs-client" size: 10Gi # ============================================================ # Redis 配置 (Bitnami subchart) # ============================================================ redis: auth: enabled: true # 預設: false existingSecret: librenms-redis-secret existingSecretPasswordKey: redis-password master: persistence: storageClass: "nfs-client"
https://raw.githubusercontent.com/tryweb/k3s/refs/heads/main/charts/librenms/values-custom.yaml
- 執行安裝
helm install librenms -f values-custom.yaml librenms/librenms -n librenms- 如果安裝後要調整參數(修改 values-custom.yaml), 需要修改後執行 helm upgrade
helm upgrade librenms -f values-custom.yaml librenms/librenms -n librenms
- 進入 Librenms 網頁 Exp. https://nms.k3s.ichiayi.com
- 第一次進入網頁會轉到 install 設定頁面, 建立管理者帳號與密碼
FAQ
1. 如果無法使用預設帳號密碼登入
- 找到 frontend 的 pod(或任意一個 librenms pod 都可以)
- 在容器內部執行建立帳號指令
php /opt/librenms/artisan user:add admin \ --password=librenms \ [email protected] \ --role=admin
2. 啟用 Auto Discovery 功能出現 Error: lnms must not run as root. 狀況
已經在 heml chart librenms-6.1.0 版解決這問題
- 透過修改 librenms-values.yaml 內加入
librenms: : snmp_scanner: enabled: true # 啟用此項 cron: "*/15 * * * *" # 每 15 分鐘執行 resources: requests: cpu: 200m memory: 256Mi securityContext: runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 :
執行 helm upgrade 讓修改生效
helm upgrade librenms -f values-custom.yaml librenms/librenms -n librenms
3. 列出目前所有的 librenms helm chart 版本
helm search repo librenms/librenms -l
