Введение в Skydive
Skydive — это анализатор топологии сети и протоколов с открытым исходным кодом в реальном времени. Он направлен на то, чтобы предоставить исчерпывающий способ понять, что происходит в сетевой инфраструктуре.
Скриншот обьектов (поды, интерфейсы) в kubernetes
Официальная страница проекта: https://github.com/skydive-project/skydive
Kubernetes будет ниже.
А сейчас посмотрим более простой пример.
Для демонстрации установим на 3 сервера кластер Etcd. Для этого будем использовать galaxy роль frank6866.etcd.
ansible-galaxy install frank6866.etcd
Yaml ниже
- hosts: etcd
become: yes
roles:
- frank6866.etcd
Файл ansible.cfg ниже
[defaults]
inventory = inventory
remote_user = user
host_key_checking = False
stdout_callback=debug
файл inventory
frank6866-etcd-1 ansible_ssh_host=172.26.9.78 etcd_public_ip=172.26.9.78
frank6866-etcd-2 ansible_ssh_host=172.26.9.79 etcd_public_ip=172.26.9.79
frank6866-etcd-3 ansible_ssh_host=172.26.9.80 etcd_public_ip=172.26.9.80
[cluster1]
frank6866-etcd-[1:3]
[etcd:children]
cluster1
[etcd:vars]
etcd_tls_enabled='false'
Запускаем установку
ansible-playbook -i hosts.multiple etcd-cluster.yaml
После скачиваем репозиторий skydive
git clone https://github.com/skydive-project/skydive.git
Переходим в папку contrib/ansible/inventory
cd contrib/ansible/inventory
Правим IP в файле hosts.multiple
[analyzers]
IP для сервера анализатора
[agents]
Три IP etcd кластера
# Нужно раскоментировать эти строки для skydive-flow-matrix
# For skydive-flow-matrix add skydive_extra_config:
[agents:vars]
skydive_extra_config={'agent.topology.probes': ['socketinfo',]}
Запускаем установку skydive агентов и анализатора
ansible-playbook -i inventory/hosts.multiple playbook.yml.sample
После со своего компьютера заходим в IP для сервера анализатора:8082
И видим примерно такую картину
Skydive показывает обьекты: интерфейсы.
Топологию, которую вы видете когда заходите в Skydive, формируется в файле /etc/skydive/skydive.yml
Если вы будете устанавливать skydive в kubernetes, то он будем вам показывать поды.
Если закоментировать топологию в конфиге анализатора, то получим просто отдельные обьекты без связей.
Конфиг с закоментированой топологией:
analyzer:
auth:
cluster:
backend: cluster
password: secret
username: skydive
listen: 0.0.0.0:8082
# topology:
# fabric:
# - TOR1[Name=tor1] -> TOR1_PORT1[Name=port1, MTU=1500]
# - TOR1_PORT1 -> *[Type=host,Name=skydive-rpm-apatsev-2]/eth0
# - TOR1[Name=tor1] -> TOR1_PORT2[Name=port2, MTU=1500]
# - TOR1_PORT2 -> *[Type=host,Name=skydive-rpm-apatsev-3]/eth0
# - TOR1[Name=tor1] -> TOR1_PORT3[Name=port3, MTU=1500]
# - TOR1_PORT3 -> *[Type=host,Name=skydive-rpm-apatsev-4]/eth0
analyzers:
- 172.26.9.21:8082
auth:
cluster:
type: basic
users:
skydive: secret
etcd:
embedded: true
listen: 0.0.0.0:12379
name: skydive-rpm-apatsev-1
flow:
protocol: udp
host_id: skydive-rpm-apatsev-1
А теперь с помощью skydive-flow-matrix посмотрим активные коннекты между серверами.
Сначала установим skydive-flow-matrix на вашем рабочем компьютере.
git clone https://github.com/skydive-project/skydive-flow-matrix.git
cd skydive-flow-matrix/
apt install graphviz
sudo pip install virtualenv
virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install .
Получим активные коннективности в текстовом виде.
skydive-flow-matrix --analyzer IP для сервера анализатора:8082 --username admin --password password
protocol,server,server_ip,port,server_proc,server_procname,client,client_ip,client_proc,client_procname
TCP,skydive-apatsev-2,127.0.0.1,2379,/usr/bin/etcd,etcd,skydive-apatsev-2,127.0.0.1,/usr/bin/etcd,etcd
TCP,skydive-apatsev-2,127.0.0.1,4001,/usr/bin/etcd,etcd,skydive-apatsev-2,127.0.0.1,/usr/bin/etcd,etcd
TCP,skydive-apatsev-4,172.26.9.80,2380,/usr/bin/etcd,etcd,skydive-apatsev-2,172.26.9.78,/usr/bin/etcd,etcd
TCP,skydive-apatsev-2,172.26.9.78,2380,/usr/bin/etcd,etcd,skydive-apatsev-3,172.26.9.79,/usr/bin/etcd,etcd
TCP,skydive-apatsev-4,127.0.0.1,4001,/usr/bin/etcd,etcd,skydive-apatsev-4,127.0.0.1,/usr/bin/etcd,etcd
TCP,skydive-apatsev-3,127.0.0.1,4001,/usr/bin/etcd,etcd,skydive-apatsev-3,127.0.0.1,/usr/bin/etcd,etcd
TCP,skydive-apatsev-3,172.26.9.79,2380,/usr/bin/etcd,etcd,skydive-apatsev-2,172.26.9.78,/usr/bin/etcd,etcd
TCP,skydive-apatsev-3,172.26.9.79,2380,/usr/bin/etcd,etcd,skydive-apatsev-4,172.26.9.80,/usr/bin/etcd,etcd
TCP,skydive-apatsev-2,172.26.9.78,2380,/usr/bin/etcd,etcd,skydive-apatsev-4,172.26.9.80,/usr/bin/etcd,etcd
TCP,skydive-apatsev-4,127.0.0.1,2379,/usr/bin/etcd,etcd,skydive-apatsev-4,127.0.0.1,/usr/bin/etcd,etcd
TCP,skydive-apatsev-3,127.0.0.1,2379,/usr/bin/etcd,etcd,skydive-apatsev-3,127.0.0.1,/usr/bin/etcd,etcd
TCP,skydive-apatsev-4,172.26.9.80,2380,/usr/bin/etcd,etcd,skydive-apatsev-3,172.26.9.79,/usr/bin/etcd,etcd
Так же получим активные коннективности в графическом виде.
skydive-flow-matrix --analyzer IP для сервера анализатора:8082 --username admin --password password --format render
Если закоментировать топологию в конфиге анализатора и запустить анализ топологии, то мы все равно получим активные коннективности в графическом виде.
То есть топология на skydive-flow-matrix не влияет
Вывод:
Топология в главном окне skydive показывает ноды где установлен агент, интерфейсы, которые установлены на этой ноде.
В топологии ноды можно соединять между собой через интерфейсы. Для этого нужно поправить файл /etc/skydive/skydive.yml
Теперь установим skydive в Kubernetes
Skydive нужно установливать в Kubernetes версии не больше 1.16.
Для установки можно использовать kubespray.
Дальше запускаем установку skydive:
git clone https://github.com/skydive-project/skydive.git
cd skydive/contrib/kubernetes/
kubectl apply -f skydive.yaml
После установки skydive в kubernetes запускаем проброс порта 8082 на вашу рабочу станцию.
Эту команду нужно запускать с вашей рабочей станции.
Перед этим нужно создать config файл в директории .kube в домашней директории.
kubectl port-forward service/skydive-analyzer 8082:8082
Несколько скриншотов и видео обьектов (поды, интерфейсы) в kubernetes
Если нажем плюс, то обьектов будет еще больше.
Видео:
И под конец привожу откуда агенты могут брать информацию
- Docker (docker)
- Ethtool (ethtool)
- LibVirt (libvirt)
- LLDP (lldp)
- Lxd (lxd)
- NetLINK (netlink)
- NetNS (netns)
- Neutron (neutron)
- OVSDB (ovsdb)
- Opencontrail (opencontrail)
- runC (runc)
- Socket Information (socketinfo)
- VPP (vpp)
Откуда анализатор может брать топологию:
- Istio (istio)
- Kubernetes (k8s)
- OVN (ovn)
Широкая поддержка K8s
Построение графа нодов:
- general: cluster, namespace
- compute: node, pod, container
- storage: persistentvolumeclaim (pvc), persistentvolume (pv), storageclass
- network: networkpolicy, service, endpoints, ingress
- deployment: deployment, statefulset, replicaset, replicationcontroller, cronjob, job
- configuration: configmap, secret
Построение графа оконечных обьектов:
- k8s-k8s ownership (e.g. k8s.namespace – k8s.pod)
- k8s-k8s relationship (e.g. k8s.service – k8s.pod)
- k8s-physical relationship (e.g. k8s.node – host)
Отображнение метаданных ноды:
- indexed fields: standard fields such as
Type
,Name
plus k8s specific such asK8s.Namespace
- stored-only fields: the entire content of k8s resource stored under
K8s.Extra
Построение метаданных ноды:
- the
Status
node metadata field - with values Up (white) / Down (red)
- currently implemented for resources: pod, persistentvolumeclaim (pvc) and persistentvolume (pv)
Поддержка различных видов Flow
- sFlow
- AFPacket
- PCAP
- PCAP socket
- DPDK
- eBPF
- OpenvSwitch port mirroring
Сетевой поиск с помощью Ansible для Skydive описаны в 2 постах.
Ищутся люди, которые могли бы писать посты о других возможностях Skydive.
Телеграм чат по skydive.network: https://t.me/skydive_network_ru