Weave Scope — Open Source-утилита для контроля за микросервисными приложениями, развернутыми в Docker и Kubernetes. Утилита визуализирует топологию приложения на уровне контейнеров, помогает находить проблемы и оптимизировать архитектуру. Управление организовано через простой веб-интерфейс; командная строка нужна только для установки и запуска приложения.

Weave Scope можно использовать бесплатно на локальном сервере. Также есть платная SaaS-версия. Создатели Weave Scope — компания Weaveworks, которая известна и другими популярными cloud native-решениями (например, Cortex и Flux).

Чтобы продемонстрировать возможности Weave Scope, развернем утилиту на хосте, потом в кластере Kubernetes, после чего попробуем подключить один из готовых плагинов, который расширяет базовую функциональность Weave Scope.

Установка на хост

Для начала установим утилиту на хост с Docker (волею судеб им оказался один из GitLab Runner’ов):

sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope

Запускаем:

# scope launch
Unable to find image 'weaveworks/scope:1.13.1' locally
1.13.1: Pulling from weaveworks/scope
c9b1b535fdd9: Pull complete
550073704c23: Pull complete
8738e5bbaf1d: Pull complete
0a8826d26027: Pull complete
387c1aa951b4: Pull complete
e72d45461bb9: Pull complete
75cc44b65e98: Pull complete
11f7584a6ade: Pull complete
a5aa3ebbe1c2: Pull complete
7cdbc028c8d2: Pull complete
Digest: sha256:4342f1c799aba244b975dcf12317eb11858f9879a3699818e2bf4c37887584dc
Status: Downloaded newer image for weaveworks/scope:1.13.1
094c702d56db92e59c3dd686971738e67088f85d8e98dfebd8f54da7bef993c1
Scope probe started
Weave Scope is listening at the following URL(s):
  * http://10.0.0.1:4040/

Проверим контейнер:

# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS               NAMES
094c702d56db        weaveworks/scope:1.13.1   "/home/weave/entrypo…"   46 seconds ago      Up 45 seconds                           weavescope

Важно. Для простоты у нашей машины внешний адрес. На ней нет никаких запрещающих правил iptables, поэтому всё работает «из коробки». В боевых условиях это опасно: любому человеку достаточно будет адреса вашей машины с Docker, чтобы получить полный доступ к интерфейсу Weave Scope, а значит, и к контейнерам.

Зайдем в наш контейнер через браузер:

Пусто! Действительно, на машине пока ничего нет.

Добавим что-нибудь интересное — запустим кролика в травку побегать контейнер с RabbitMQ:

# docker run -d --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

Теперь их двое, им хотя бы не будет скучно.

# docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                                                                                                         NAMES
0594046d0809        rabbitmq:3-management     "docker-entrypoint.s…"   40 seconds ago      Up 36 seconds       4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbitmq
094c702d56db        weaveworks/scope:1.13.1   "/home/weave/entrypo…"   11 minutes ago      Up 11 minutes                                                                                                                     weavescope

Наш «кролик» появился и в веб-интерфейсе. Нажимаем на контейнер и видим краткую информацию о нем, а также несколько управляющих кнопок: attach к контейнеру, exec в его терминале, рестарт, приостановка и остановка контейнера. Последние, впрочем, доступны только при использовании Scope на хосте (не в Kubernetes).

Слева внизу и вверху панели управления — набор кнопок для сортировки контейнеров по разным признакам и для переключения между разными режимами приложения. Например, можно посмотреть сеть у хоста и контейнеров:

Вернемся к этой панели, когда будем запускать утилиту в K8s — картина должна быть куда интереснее.

Есть также режим визуализации в виде таблицы:

И наконец, режим с метриками:

В каждом из режимов отображения можно нажимать на любой контейнер, чтобы увидеть подробности. Например:

Что ж, мы запустили Weave Scope на одном хосте — но это только для затравки.

Установка и первый запуск в Kubernetes

Развернем утилиту в реально работающем K8s-кластере (на базе платформы Deckhouse):

$ kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"
namespace/weave created
serviceaccount/weave-scope created
clusterrole.rbac.authorization.k8s.io/weave-scope created
clusterrolebinding.rbac.authorization.k8s.io/weave-scope created
deployment.apps/weave-scope-app created
service/weave-scope-app created
deployment.apps/weave-scope-cluster-agent created
daemonset.apps/weave-scope-agent created

На каждый узел к нам «прискакал» DaemonSet. Плюс в namespace’е weave поселился кластерный «агент» и само приложение:

$ kubectl -n weave get po -owide
NAME                                         READY   STATUS    RESTARTS   AGE   IP             NODE             NOMINATED NODE   READINESS GATES
weave-scope-agent-4nflf                      1/1     Running   0          53s   10.1.2.154   kube-front-1    <none>           <none>
weave-scope-agent-52ncg                      1/1     Running   0          53s   10.1.2.161   kube-master-3   <none>           <none>
weave-scope-agent-62s6g                      1/1     Running   0          53s   10.1.2.152   kube-system-1   <none>           <none>
weave-scope-agent-7wqdk                      1/1     Running   0          53s   10.1.2.159   kube-master-1   <none>           <none>
weave-scope-agent-jtv78                      1/1     Running   0          53s   10.1.2.162   kube-node-1     <none>           <none>
weave-scope-agent-mfgdx                      1/1     Running   0          53s   10.1.2.163   kube-node-2     <none>           <none>
weave-scope-agent-sl968                      1/1     Running   0          53s   10.1.2.155   kube-front-2    <none>           <none>
weave-scope-agent-t9vlp                      1/1     Running   0          53s   10.1.2.164   kube-node-3     <none>           <none>
weave-scope-agent-tjz92                      1/1     Running   0          53s   10.1.2.153   kube-system-2   <none>           <none>
weave-scope-agent-wnj6m                      1/1     Running   0          53s   10.1.2.160   kube-master-2   <none>           <none>
weave-scope-app-545ddf96b4-l98b4             1/1     Running   0          53s   10.2.7.248   kube-node-3     <none>           <none>
weave-scope-cluster-agent-74c596c6b7-wwrtb   1/1     Running   0          53s   10.2.7.247   kube-node-3     <none>           <none>

Дальше применим простой Ingress, чтобы попасть внутрь:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: weave
  namespace: weave
spec:
  rules:
  - host: weave.kokoko.kom
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: weave-scope-app
            port:
              name: app

Общий вид — графы, где вершинами являются контроллеры и Pod’ы, а ребрами — имеющиеся связи этих Pod’ов:

Графы строятся на лету, показывая взаимодействия между ресурсами кластера:

Ещё графы (входящие соединения в пространстве имен d8-monitoring):

На следующей иллюстрации — Pod’ы в namespace’е d8-monitoring (компоненты мониторинга) и их связь между собой, в режиме показа Services:

Нажимаем, например, на trickster и видим входящие/исходящие соединения:

Переключаемся в Controllers:

И далее — в Pods. Здесь уже более развесистое дерево:

Если нажата кнопка Live, происходящее в кластере транслируется «в живую». При этом графы периодически перестраиваются, и довольно сильно:

К сожалению, перестраиваются они буквально постоянно, что причиняет определенные неудобства. Например, в какой-то момент может получиться такая малоинформативная схема:

У некоторых из наших клиентов в одном namespace’е размещаются по 50-60 различных микросервисов вместе с инфраструктурными компонентами вроде Kafka и ZooKeeper. Страшно представить, как в таком случае будут выглядеть графы Weave Scope: вероятно, кнопка Pause будет нажата там большую часть времени.

Подключаем плагины

Попробуем подключить плагин IOWait. Это приложение, которое использует iostat. IOWait показывает информацию об ожидании и простое CPU хоста прямо в интерфейсе Weave Scope.

$ kubectl apply -f https://raw.githubusercontent.com/weaveworks-plugins/scope-iowait/master/deployments/k8s-iowait.yaml
error: unable to recognize "https://raw.githubusercontent.com/weaveworks-plugins/scope-iowait/master/deployments/k8s-iowait.yaml": no matches for kind "DaemonSet" in version "extensions/v1beta1"

Печально. Но мы не унываем и пробуем решить эту проблему очевидным способом:

$ curl https://raw.githubusercontent.com/weaveworks-plugins/scope-iowait/master/deployments/k8s-iowait.yaml -so k8s-iowait.yaml
$ sed -i 's/extensions\/v1beta1/apps\/v1/' k8s-iowait.yaml
$ kubectl -n scope apply -f k8s-iowait.yaml
error: error validating "k8s-iowait.yaml": error validating data: ValidationError(DaemonSet.spec): missing required field "selector" in io.k8s.api.apps.v1.DaemonSetSpec; if you choose to ignore these errors, turn validation off with --validate=false

Ладно, действительно: без селектора DaemonSet не DaemonSet. Исправим, добавив в spec DaemonSet’а:

spec:
  selector:
    matchLabels:
      app: weavescope

$ kubectl -n weave get po
NAME                                         READY   STATUS    RESTARTS   AGE
weave-scope-agent-2h4dj                      1/1     Running   0          89m
weave-scope-agent-94zkx                      1/1     Running   0          93m
weave-scope-agent-9tfbc                      1/1     Running   0          88m
weave-scope-agent-ccbfs                      1/1     Running   0          90m
weave-scope-agent-h22xn                      1/1     Running   0          92m
weave-scope-agent-kz2nc                      1/1     Running   0          91m
weave-scope-agent-lj49z                      1/1     Running   0          89m
weave-scope-agent-nxkpm                      1/1     Running   0          92m
weave-scope-agent-ps25k                      1/1     Running   0          90m
weave-scope-agent-rg6lb                      1/1     Running   0          94m
weave-scope-app-5f9f566559-8rkcb             1/1     Running   0          94m
weave-scope-cluster-agent-6b6f974dc6-6bt9k   1/1     Running   0          94m
weavescope-iowait-plugin-2djqv               1/1     Running   0          2m1s
weavescope-iowait-plugin-2xgrr               1/1     Running   0          2m1s
weavescope-iowait-plugin-6s6tq               1/1     Running   0          2m1s
weavescope-iowait-plugin-ph8gh               1/1     Running   0          2m1s
weavescope-iowait-plugin-pzxvg               1/1     Running   0          2m1s
weavescope-iowait-plugin-vd7xl               1/1     Running   0          2m1s

Плагин запустился!

Теперь можно увидеть, что у одного из узлов процессор бездействует 70% времени:

У Weave Scope есть и другие готовые плагины. Например, HTTP Statistics, который показывает статистику HTTP с помощью eBPF (если есть поддержка в ядре).

Статус проекта

Перед заключением хотелось бы также отдельно указать на актуальный статус Weave Scope. Дело в том, что его последние релизы выходили очень редко: версия 1.13.1 вышла в мае 2020 года, а следующая — 1.13.2 — аж в апреле 2021 г. И с тех пор новых релизов не видно.

Коммиты в репозитории появляются чуть чаще, однако все они от одного человека, причем данный проект — явно не основной фокус его работы.

С другой стороны, явных упоминаний о каком-либо deprecation сообщений не видно, а количество звёзд на GitHub (5000+) говорит о потенциально большом интересе к проекту со стороны пользователей.

В общем, выглядит так, что Weave Scope не имеет активного развития, и это важно учитывать при намерении брать его на вооружение.

Резюме

Утилита предлагает несколько неплохих визуализаций происходящего в Kubernetes-кластере или на отдельном Docker-узле. С помощью Weave Scope можно:

  • смотреть на узлы и их загрузку;

  • смотреть на контейнеры, их входящие и исходящие соединения;

  • перезапускать контейнеры и удалять Pod’ы;

  • смотреть логи;

  • в Kubernetes — смотреть describe нужных ресурсов;

  • расширять функциональность утилиты готовыми и пользовательскими плагинами.

Нужна ли эта утилита SRE-инженеру? Дело вкуса и вопрос необходимости. Точно полезной в некоторых ситуациях может оказаться возможность мониторить входящие/исходящие соединения в виде таблицы (но в виде системы графов — вряд ли).

Я убежден, что хорошо настроенный комплект из Grafana + Prometheus закроет 99,9% потребностей по мониторингу и для SRE, и для разработчика. Визуализация — это хорошо и полезно, но для мониторинга и observability (наблюдаемости) гораздо важнее возможность написать алерт к метрике, чем красивая картинка.

P.S. А для тех, кому важен одновременно и полностью работающий мониторинг (с настроенными метриками и алертами), и подобная визуализация, можно посоветовать посмотреть на готовые Kubernetes-платформы вроде Deckhouse. Доступный там веб-интерфейс от Istio поможет отслеживать соединения в приложениях даже с большей детализацией, чем предлагает Scope.

P.P.S.

Читайте также в нашем блоге:

Комментарии (2)


  1. il_da_r
    01.10.2021 13:32
    +2

    Для простоты у нашей машины внешний адрес. На ней нет никаких запрещающих правил iptables, поэтому всё работает «из коробки». В боевых условиях это опасно: любому человеку достаточно будет адреса вашей машины с Docker, чтобы получить полный доступ к интерфейсу Weave Scope, а значит, и к контейнерам.

    т.е. прикрученной авторизации никакой нет?


    1. bmar Автор
      05.10.2021 09:22
      +1

      Из коробки - да, авторизации нет.