在 K3s 環境透過 Rancher 建立 LibreNMS

  1. 加入 helm repo

    helm repo add librenms https://www.librenms.org/helm-charts
    helm repo update

  2. 產生 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"

    https://raw.githubusercontent.com/tryweb/k3s/refs/heads/main/charts/librenms/scripts/create-secrets.sh

  3. 設定配置檔, 可下載這 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

  4. 執行安裝

    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

  5. 進入 Librenms 網頁 Exp. https://nms.k3s.ichiayi.com
    • 第一次進入網頁會轉到 install 設定頁面, 建立管理者帳號與密碼
  1. 找到 frontend 的 pod(或任意一個 librenms pod 都可以)
  2. 在容器內部執行建立帳號指令

    php /opt/librenms/artisan user:add admin \
      --password=librenms \
      [email protected] \
      --role=admin

已經在 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
  • helm search repo librenms/librenms -l

  • 看目前列出結果
  • tech/k3s/librenms.txt
  • 上一次變更: 2025/12/13 17:38
  • jonathan