doc_memo/kubernetes/k3s_smokeping.md
2025-05-23 20:33:56 +03:00

7.7 KiB
Raw Blame History

Контейнер со smokeping в k3s

Полная жопа с домашним интеренетом? А поддержка провайдера, типа МГТС или Ростелеком, отвечает: "Проблем на линии нет, у нас все работает"? А может быть, вы хотите следить за доступностью и сетевыми задержками в доступности своих серверов в разных локациях, или в домашней сети?.. Smokeping -- это то, что вам нужно! Не такой громоздкий, как Zabbix, и не такой сложный в настройке, как Grafana (хотя к Grafana его тоже можно подключить), и главное супер-компактный и легкий.

И так, все манифесты в одном файле. Только поменяйте в манифесте smokeping-config меню, название и IP-адреса на свои, и укажите на какое доменное имя публикуете веб-панель (у меня -- http://sp.local). Ну и читайте пояснения и комментарии внутри манифестов:

# ~/k3s/smokeping/smokeping.yaml
# Все манифесты для smokeping 

# Манифест создания пространства имён `smokeping`. Если оно уже есть — kubectl apply ничего не изменит (т.е. безопасно.)
apiVersion: v1
kind: Namespace
metadata:
  name: smokeping

---
# Манифест ConfigMap с конфигурацией Targets для smokeping
apiVersion: v1
kind: ConfigMap
metadata:
  name: smokeping-config
  namespace: smokeping
data:
  # Это содержимое файла Targets. Здесь указываем, кого пинговать.
  Targets: |
    *** Targets ***

    probe = FPing

    menu = Top
    title = Network Latency Grapher
    remark = Привет тебе, путник. SmokePing website of Campany.\
             Тут ты узнаешь все о задержках в вашей сети.

    + HOME
    menu = HOME
    title = HOME

    ++ Router
    menu = Router
    title = Router
    alerts = someloss
    host = 192.168.1.1

    ++ NAS
    menu = NAS
    title = NAS
    alerts = someloss
    host = 192.168.1.xxx

    ++ K3S_VIP
    menu = K3S_VIP
    title = K3S_VIP
    alerts = someloss
    host = 192.168.1.xxx
    
    ++ YANDEX_ALISA
    menu = YANDEX_ALISA
    title = YANDEX_ALISA
    alerts = someloss
    host = 192.168.1.xxx


    + INTERNET
    menu = INTERNET
    title = INTERNET

    ++ HOSTING_RU
    menu = Russia
    title = MasterHost_ru
    alerts = someloss
    host = xxx.xxx.xxx.xxx

    ++ HOSTING_EU
    menu = Sweden
    title = xxxxxxx
    alerts = someloss
    host = xxx.xxx.xxx.xxx

    ++ HOSTING_AS
    menu = Tureky
    title = xxxxxxx
    alerts = someloss
    host = xxx.xxx.xxx.xxx


---
# Манифест PVC (Longhorn) -- том для хранения данных графиков, чтоб при перезапуске пода данные не пропадали
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: smokeping-data      # Имя PVC-хранилища
  namespace: smokeping      # Пространство имен `smokeping`
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn   # Используем Longhorn как класс хранения
  resources:
    requests:
      storage: 256Mi  # Хватит на мониторинг 20-30 узлов глубиной 1.5-2 года (!)


---
# Манифест для развертывания smokeping (Deployment)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: smokeping
  namespace: smokeping
spec:
  replicas: 1
  selector:
    matchLabels:
      app: smokeping
  template:
    metadata:
      labels:
        app: smokeping
    spec:
      containers:
      - name: smokeping
        # image: ghcr.io/linuxserver-arm64v8/smokeping      # dля arm64v8
        image: linuxserver/smokeping                        # оригинальный образ smokeping, и он заработал на amd64
        env:
        - name: TZ                  # Указываем временную зону
          value: Europe/Moscow      # ...чтобы на графиках не было UTC
        ports:
        - containerPort: 80
        volumeMounts:               # Монтируем файл Targets из ConfigMap в нужное место в контейнере
        - name: config
          mountPath: /config/Targets      # mountPath указывает, куда будет "вставлен" файл
          subPath: Targets                # subPath = берём только один файл из configMap
        - name: data
          mountPath: /data                # Данные графиков в Longhorn (PVC)
      volumes:
      - name: config              # Используем том ConfigMap с конфигурацией
        configMap:
          name: smokeping-config
      - name: data                # Используем PVC (Longhorn) для хранения данных
        persistentVolumeClaim:
          claimName: smokeping-data


---
# Service — внутренний сервис для доступа к smokeping по сети внутри кластера
apiVersion: v1
kind: Service
metadata:
  name: smokeping
  namespace: smokeping
spec:
  selector:
    app: smokeping
  ports:
  - protocol: TCP
    port: 80           # порт внутри кластера
    targetPort: 80     # порт, на котором работает контейнер
  type: ClusterIP      # только для доступа внутри кластера (Ingress подключится к нему)


---
# IngressRoute для Traefik (под твою конфигурацию)
# Это публикует smokeping по адресу http://sp.local (заменить на свой домен)
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: smokeping
  namespace: smokeping
spec:
  entryPoints:
    - web              # это должен быть один из entrypoints в Traefik (обычно "web" = порт 80)
  routes:
  - match: Host(`sp.local`)   # доменное имя, по которому будет доступен сервис
    kind: Rule
    services:
    - name: smokeping
      port: 80

---
######## Это я пытался сделать редирект на favicon, но не заработало. У самого smokeping нет favicon, и это бесило.
# Манифест Middleware для перенаправление всех запросов к /favicon.ico на другой URL (к сожалению у smokeping нет favicon.ico).
#apiVersion: traefik.io/v1alpha1
#kind: Middleware
#metadata:
#  name: favicon-redirect
#  namespace: smokeping
#spec:
#  redirectRegex:
#    regex: "^/favicon\\.ico$"
#    replacement: "http://ai.local/_graphmagnifier_118081.ico"
#    permanent: true

Сохраним файл в ~/k3s/smokeping/smokeping.yaml (или в другом месте, где вам удобно), и применим манифесты:

kubectl apply -f ~/k3s/smokeping/smokeping.yaml

После этого smokeping будет доступен по адресу http://sp.local (или по тому доменному имени, которое вы указали в манифесте IngressRoute) и увидите занятные графики (только дождитесь пока данные соберутся, ну часок-другой):

Примерно так выглядят графики