Pixie: рентгеновский аппарат для трафика Kubernetes


0. Введение и проблемы

Практика показывает, что недостаточно разработать полезное приложение или сервис и развернуть его в Kubernetes — необходимо также быть уверенным, что они работают стабильно.

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

Такая задача в децентрализованных системах всегда была сложной.
Изменчивый и динамичный характер рабочих нагрузок и ресурсов является основной причиной того, почему наблюдаемость Kubernetes настолько сложна. Вместо того чтобы иметь дело с одним сервером, теперь нам приходится иметь дело с неизвестным их количеством (благодаря автомасштабированию). Теперь у нас есть множество распределенных сервисов, а не одно монолитное приложение. Стало сложнее справляться с задержками, распределенными транзакциями, ошибками и другими проблемами.

Чем выше уровень абстракции в децентрализованной системе, тем сложнее рассуждать о ней, отлаживать и устранять неполадки.

Рассмотрим вызов HTTP(s) к API, работающему на кластере Kubernetes облачного провайдера. Упрощенная диаграмма последовательности действий (нарисованная Петром Заневски) показана ниже, с выделенными ключевыми частями:


🎨 Полноразмерное изображение доступно здесь.

В любой точке этой коммуникационной цепочки все может пойти не так, производительность может ухудшиться, могут возникнуть проблемы с безопасностью и т.д. Для успешной работы очень важно знать, что происходит в кластере, и иметь полное представление о каждом этапе цепи связи.

И хорошей новостью является то, что сегодня для решения этой задачи наблюдаемости у нас есть Pixie, еще один замечательный проект CNCF!

I. Почему Pixie — быстрый и точный инструмент

Pixie — это платформа наблюдаемости с открытым исходным кодом (3.4k⭐), созданная компанией New Relic. Очень удобно использовать Pixie для просмотра высокоуровневого состояния вашего кластера (карты сервисов, ресурсы кластера, трафик приложений), а также для более детального просмотра (состояние стручков, графики пламени, отдельные полные запросы приложений).

Pixie использует eBPF, что означает расширенный пакетный фильтр Беркли, для автоматического сбора телеметрических данных, таких как полные запросы, метрики ресурсов и сети, профили приложений и многое другое.

Он собирает, хранит и запрашивает все телеметрические данные локально в кластере. Обеспечение гранулярного уровня наблюдаемости возможно благодаря eBPF, который делает ядро программируемым безопасным и производительным способом.

Вместо того чтобы полагаться на датчики и статические счетчики, предоставляемые операционной системой, eBPF позволяет генерировать события видимости, собирать и агрегировать в ядре пользовательские метрики на основе широкого спектра потенциальных источников.

Давайте рассмотрим, как это работает для трассировки запросов приложений.

Когда Pixie развертывается на узлах вашего кластера, он развертывает зонды ядра eBPF, настроенные на срабатывание на системные вызовы Linux, используемые для работы в сети. Когда ваше приложение выполняет любые связанные с сетью вызовы — такие как send() и recv() — eBPF-зонды Pixie перехватывают данные и отправляют их в пограничный модуль Pixie (PEM, агент).

Пограничный модуль разбирает данные в соответствии с обнаруженным протоколом и сохраняет их в таблицах локально на узле. Забегая вперед, можно отметить, что эти таблицы данных могут быть запрошены и визуализированы с помощью Pixie API, CLI или веб-интерфейса.

Кстати, для вашего внимания, Лиз Райс из CNCF рассказала интересные вещи о преимуществах eBPF, которые имеют значение в нашей облачной сфере.

Это увеличивает глубину видимости, которая может быть достигнута, и значительно снижает общую нагрузку на систему. Это достигается за счет сбора только необходимых данных о видимости и построения гистограмм и подобных структур данных в источнике события, а не в зависимости от экспорта образцов.

Pixie поддерживает EKS, GKE и AKS. Инструмент скромен по ресурсам, он использует менее 5% процессора кластера, а в большинстве случаев даже менее 2%.

II. Работает ли он с локальным кластером?

🚦 Короткий ответ: «Да». Для локальной разработки создатели рекомендуют использовать Minikube с драйвером виртуальной машины (kvm2 в Linux, Kernel-based Virtual Machine driver). К сожалению для автора статьи, кластеры K3s/K3d не очень хорошо поддерживаются Pixie.

Что ж, начнем с этого: установим Minikube, запустим кластер и развернем в нем что-нибудь [до боли знакомое, но] популярное. Подробнее об этом ниже.

Установка Minikube на Ubuntu

⚠️ Чтобы использовать драйверы VM, убедитесь, что в вашей системе включена поддержка виртуализации:

egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Если приведенная выше команда выдает no, убедитесь, что в BIOS включена аппаратная виртуализация.

Правильная установка KVM (и libvirt, которая входит в число требований) очень специфична для каждого дистрибутива Linux. Обязательно наличие 2 виртуальных процессоров или более, не менее 2 Гб свободной памяти и достаточного количества свободного дискового пространства. Вы можете найти инструкции по Ubuntu здесь. Некоторые авторские заметки могут быть полезны.

Вам необходимо убедиться, что ваше имя пользователя добавлено в группы libvirt и kvm!

$ sudo adduser `id -un` libvirt
Adding user '<username>' to group 'libvirt' ...
$ sudo adduser `id -un` kvm
Adding user '<username>' to group 'kvm' ...
Вход в полноэкранный режим Выход из полноэкранного режима

Не забудьте включить и запустить демон libvirt:

$ sudo systemctl enable libvirtd
$ sudo systemctl start libvirtd
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы сделать kvm2 драйвером по умолчанию:

$ minikube config set driver kvm2
Войдите в полноэкранный режим Выйти из полноэкранного режима

Запустите Minikube:

$ minikube start --driver=kvm2 --cni=flannel --cpus=2 --memory=4000 -p=pixie-cluster
☺️  [pixie-cluster] minikube v1.25.2 on Linuxmint 20.2
✨  Using the kvm2 driver based on user configuration
💾  Downloading driver docker-machine-driver-kvm2:
    > docker-machine-driver-kvm2-...: 65 B / 65 B [----------] 100.00% ? p/s 0s
    > docker-machine-driver-kvm2-...: 11.62 MiB / 11.62 MiB  100.00% 24.49 MiB
💿  Downloading VM boot image ...
    > minikube-v1.25.2.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.25.2.iso: 237.06 MiB / 237.06 MiB  100.00% 34.47 MiB p/s 7.1s
👍  Starting control plane node pixie-cluster in cluster pixie-cluster
🔥  Creating kvm2 VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐋  Preparing Kubernetes v1.23.3 on Docker 20.10.12 ...
    ▪️ kubelet.housekeeping-interval=5m
    ▪️ Generating certificates and keys ...
    ▪️ Booting up control plane ...
    ▪️ Configuring RBAC rules ...
🔗  Configuring Flannel (Container Networking Interface) ...
🔎  Verifying Kubernetes components...
    ▪️ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "pixie-cluster" cluster and "default" namespace by default
Войти в полноэкранный режим Выйти из полноэкранного режима

Имя кластера, за которым следует -p, не является обязательным. Задается для удобства, но если задано, то используется везде.

⚠️ Если вы получаете ошибку разрешения сокета

Failed to connect socket to '/var/run/libvirt/libvirt-sock'
Войдите в полноэкранный режим Выйдите из полноэкранного режима

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

$ exec sudo su -l $USER
Войти в полноэкранный режим Выйти из полноэкранного режима

III. Развертывание Pixie

☁️ Веб-интерфейс размещен в облаке. Посетите страницу продукта и зарегистрируйтесь, чтобы получить ключ API, который позволит вам использовать Pixie.

CLI Pixie — это самый быстрый и простой способ развертывания Pixie. Вы также можете развернуть Pixie с помощью YAML или Helm. Вы можете использовать эти шаги для установки Pixie на одном или нескольких кластерах.

Чтобы развернуть Pixie с помощью CLI:

# Deploy the Pixie Platform in your K8s cluster (No OLM present on cluster).
px deploy
# Deploy the Pixie Platform in your K8s cluster (OLM already exists on cluster).
px deploy --deploy_olm=false
# Deploy Pixie with a specific memory limit (2Gi is the default, 1Gi is the minimum recommended)
px deploy --pem_memory_limit=1Gi
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Давайте посмотрим, что выдает поток развертывания Pixie.

$ px deploy --pem_memory_limit=1Gi
Pixie CLI
Running Cluster Checks:
 ✔️    Kernel version > 4.14.0
 ✔️    Cluster type is supported
 ✔️    K8s version > 1.16.0
 ✔️    Kubectl > 1.10.0 is present
 ✔️    User can create namespace
 ✔️    Cluster type is in list of known supported types
Installing Vizier version: 0.11.1
Generating YAMLs for Pixie
Deploying Pixie to the following cluster: pixie-cluster
Is the cluster correct? (y/n) [y] : y
Found 1 nodes
 ✔️    Installing OLM CRDs
 ✔️    Deploying OLM
 ✔️    Deploying Pixie OLM Namespace
 ✔️    Installing Vizier CRD
 ✔️    Deploying OLM Catalog
 ✔️    Deploying OLM Subscription
 ✔️    Creating namespace
 ✔️    Deploying Vizier
 ✔️    Waiting for Cloud Connector to come online
Waiting for Pixie to pass healthcheck
 ✔️    Wait for PEMs/Kelvin
 ⠇    Wait for healthcheck
 ✔️    Wait for PEMs/Kelvin
 ✔️    Wait for healthcheck
==> Next Steps:
Run some scripts using the px cli. For example:
- px script list : to show pre-installed scripts.
- px run px/service_stats : to run service info for sock-shop demo application (service selection coming soon!).
Check out our docs: https://docs.withpixie.ai:443.
Visit : https://work.withpixie.ai:443 to use Pixie's UI.
Вход в полноэкранный режим Выход из полноэкранного режима

IV. Подготовка полезной нагрузки

В качестве полезной нагрузки и для большей близости к людям автор предлагает развернуть сайт WordPress и базу данных MySQL. Оба приложения используют PersistentVolumes и PersistentVolumeClaims для хранения данных.

🐘 Вы можете уменьшить значение storage: 20Gi в YAMLs, например, до 2Gi.

Убедитесь, что PVs провизионированы и привязаны (это может занять до нескольких минут), а pods запущены. Затем выполните следующую команду, чтобы получить IP-адрес службы WordPress:

$ kubectl get svc
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes        ClusterIP      10.96.0.1      <none>        443/TCP        14h
wordpress         LoadBalancer   10.105.33.77   <pending>     80:30140/TCP   5h31m
wordpress-mysql   ClusterIP      None           <none>        3306/TCP       5h31m
Войдите в полноэкранный режим Выход из полноэкранного режима

⚠️ Minikube может открывать Службы только через NodePort. EXTERNAL-IP всегда pending.

$ minikube service wordpress --url -p=pixie-cluster
Вход в полноэкранный режим Выход из полноэкранного режима

Скопируйте IP-адрес (т.е. http://192.168.39.74:30140) и загрузите страницу в браузере для просмотра вашего сайта.

Вы должны увидеть страницу настройки WordPress, похожую на следующий скриншот:


⚠️ Не оставляйте установку WordPress на этой странице.
Продолжайте установку WordPress как обычно — создавая имя пользователя и пароль, обновляя плагины и темы и т.д. Таким образом, можно будет накопить базу данных запросов и трафика для анализа. Обновление страницы в браузере (клавишей F5) также помогает в этом.

V. Основные концепции веб-интерфейса Pixie

Интерфейс можно условно разделить на

  • основное выпадающее меню, содержащее px скрипт для выполнения,
  • панель для визуализации сервисов в кластере,
  • панели отчетов и протоколирования,
  • скрытую информационную панель, которая экономит место на экране и сдвигается вверх, и
  • боковое меню.

Общий вид будет выглядеть примерно так:


🎨 Полноразмерное изображение доступно здесь.

Элементы на панели визуализации услуг (вверху) можно перетаскивать, а также использовать колесико мыши для масштабирования.

По сути, весь веб-интерфейс является отображением вывода скриптов с различными параметрами и объектами внутри кластера.

VI. Список скриптов

$ px script list
Pixie CLI
Table ID: script_list
  NAME                                DESCRIPTION                                         
  bpftrace/capable                    Capable                                             
  bpftrace/dc_snoop                   DC Snoop                                            
  bpftrace/exec_snoop                 Exec Snoop                                          
  bpftrace/md_flush                   MD Flush                                            
  bpftrace/nap_time                   NAP Time                                            
  bpftrace/oom_kill                   OOM Killer                                          
  bpftrace/sync_snoop                 Sync Snoop                                          
  bpftrace/tcp_drops                  TCP drops                                           
  bpftrace/tcp_retransmits            TCP retransmissions                                 
  px/agent_status                     Get agent status.                                   
  px/cluster                          Cluster Overview                                    
  px/cql_data                         Sample CQL Data                                     
  px/cql_stats                        CQL Pod LET metrics                                 
  px/dns_data                         Raw DNS Data                                        
  px/dns_flow_graph                   DNS Flow Graph                                      
  px/dns_query_summary                DNS Queries Overview                                
  px/funcs                            Get a list all of all funcs available in Pixie.     
  px/http_data                        HTTP Data                                           
  px/http_data_filtered               Sample HTTP Data                                    
  px/http_post_requests               Sample HTTP POST Data                               
  px/http_request_stats               HTTP Requests Statistics by Service                 
  px/inbound_conns                    Inbound Connections                                 
  px/ip                               Traffic to/from IP                                  
  px/jvm_data                         JVM stats                                           
  px/jvm_stats                        JVM Stats per Pod                                   
  px/kafka_consumer_rebalancing       Kafka Consumer Rebalancing Events                   
  px/kafka_data                       Kafka messages                                      
  px/kafka_overview                   Kafka Overview                                      
  px/kafka_producer_consumer_latency  Kafka producer-consumer latency                     
  px/largest_http_request             Largest HTTP Request                                
  px/most_http_data                   Pod, Endpoint pair with most HTTP Data Transferred  
  px/mysql_data                       MySQL Data                                          
  px/mysql_flow_graph                 MySQL Flow Graph                                    
  px/mysql_stats                      MySQL Pod LET metrics                               
  px/namespace                        Namespace Overview                                  
  px/namespaces                       Namespaces Overview                                 
  px/nats_data                        NATS data                                           
  px/net_flow_graph                   Network Flow                                        
  px/network_stats                    Network Stats                                       
  px/node                             Node overview                                       
  px/nodes                            Nodes overview                                      
  px/outbound_conns                   Outbound Connections                                
  px/perf_flamegraph                  Flamegraph                                          
  px/pgsql_data                       Postgres Data                                       
  px/pgsql_flow_graph                 PostgreSQL Flow Graph                               
  px/pgsql_stats                      PostgreSQL Pod LET metrics                          
  px/pid_memory_usage                 Memory Usage of Processes.                          
  px/pixie_quality_metrics            Metrics that sample Pixie's collectors              
  px/pod                              Pod Overview                                        
  px/pod_edge_stats                   Pod to Pod SLAs                                     
  px/pod_lifetime_resource            Total resource usage over pod lifetime.             
  px/pod_memory_usage                 Memory Usage of Processes                           
  px/pods                             Pods Overview                                       
  px/redis_data                       Redis RPC messages                                  
  px/redis_flow_graph                 Redis Flow Graph                                    
  px/redis_stats                      Redis Pod LET metrics                               
  px/schemas                          Get all the table schemas available in the system   
  px/service                          Service Overview                                    
  px/service_edge_stats               Basic Service to Service SLAs                       
  px/service_resource_usage           Resource Usage of Services.                         
  px/service_stats                    Basic service SLAs.                                 
  px/services                         Services Overview                                   
  px/slow_http_requests               Sample of Slow Requests                             
  px/sql_queries                      Normalized SQL Queries                              
  px/sql_query                        SQL Query Params                                    
  px/tcp_drops                        TCP drops                                           
  px/tcp_retransmits                  TCP retransmissions                                 
  px/tracepoint_status                Tracepoint Overview                                 
  px/upids                            UPIDs                                               
  pxbeta/pii_cluster_egress           Traffic containing PII leaving the cluster          
  pxbeta/service_endpoint             Endpoint Overview                                   
  pxbeta/service_endpoints            Endpoints Overview                                  
  pxbeta/vfs_snoop                    VFS Write/Delete Snoop                              
  sotw/dns_external_fqdn_list         Lists external FQDNs from DNS traffic.              
  sotw/dns_queries_filtered           All DNS queries filtered by a specific query nameTTP Data                                           
  px/http_data_filtered               Sample HTTP Data                                    
  px/http_post_requests               Sample HTTP POST Data                               
  px/http_request_stats               HTTP Requests Statistics by Service                 
  px/inbound_conns                    Inbound Connections                                 
  px/ip                               Traffic to/from IP                                  
  px/jvm_data                         JVM stats                                           
  px/jvm_stats                        JVM Stats per Pod                                   
  px/kafka_consumer_rebalancing       Kafka Consumer Rebalancing Events                   
  px/kafka_data                       Kafka messages                                      
  px/kafka_overview                   Kafka Overview                                      
  px/kafka_producer_consumer_latency  Kafka producer-consumer latency                     
  px/largest_http_request             Largest HTTP Request                                
  px/most_http_data                   Pod, Endpoint pair with most HTTP Data Transferred  
  px/mysql_data                       MySQL Data                                          
  px/mysql_flow_graph                 MySQL Flow Graph                                    
  px/mysql_stats                      MySQL Pod LET metrics                               
  px/namespace                        Namespace Overview                                  
  px/namespaces                       Namespaces Overview                                 
  px/nats_data                        NATS data                                           
  px/net_flow_graph                   Network Flow                                        
  px/network_stats                    Network Stats                                       
  px/node                             Node overview                                       
  px/nodes                            Nodes overview                                      
  px/outbound_conns                   Outbound Connections                                
  px/perf_flamegraph                  Flamegraph                                          
  px/pgsql_data                       Postgres Data                                       
  px/pgsql_flow_graph                 PostgreSQL Flow Graph                               
  px/pgsql_stats                      PostgreSQL Pod LET metrics                          
  px/pid_memory_usage                 Memory Usage of Processes.                          
  px/pixie_quality_metrics            Metrics that sample Pixie's collectors              
  px/pod                              Pod Overview                                        
  px/pod_edge_stats                   Pod to Pod SLAs                                     
  px/pod_lifetime_resource            Total resource usage over pod lifetime.             
  px/pod_memory_usage                 Memory Usage of Processes                           
  px/pods                             Pods Overview                                       
  px/redis_data                       Redis RPC messages                                  
  px/redis_flow_graph                 Redis Flow Graph                                    
  px/redis_stats                      Redis Pod LET metrics                               
  px/schemas                          Get all the table schemas available in the system   
  px/service                          Service Overview                                    
  px/service_edge_stats               Basic Service to Service SLAs                       
  px/service_resource_usage           Resource Usage of Services.                         
  px/service_stats                    Basic service SLAs.                                 
  px/services                         Services Overview                                   
  px/slow_http_requests               Sample of Slow Requests                             
  px/sql_queries                      Normalized SQL Queries                              
  px/sql_query                        SQL Query Params                                    
  px/tcp_drops                        TCP drops                                           
  px/tcp_retransmits                  TCP retransmissions                                 
  px/tracepoint_status                Tracepoint Overview                                 
  px/upids                            UPIDs                                               
  pxbeta/pii_cluster_egress           Traffic containing PII leaving the cluster          
  pxbeta/service_endpoint             Endpoint Overview                                   
  pxbeta/service_endpoints            Endpoints Overview                                  
  pxbeta/vfs_snoop                    VFS Write/Delete Snoop                              
  sotw/dns_external_fqdn_list         Lists external FQDNs from DNS traffic.              
  sotw/dns_queries_filtered           All DNS queries filtered by a specific query name
Вход в полноэкранный режим Выход из полноэкранного режима

VII. Как насчет практики? Популярные запросы

С помощью Pixie наблюдаемость может включать:

  • 🐞 полные HTTP-запросы приложений,
  • 🐞 профили приложений,
  • 🐞 метрики здоровья сети,
  • 🐞 показатели здоровья инфраструктуры,
  • 🐞 профили запросов к базе данных.

🐞 Полный HTTP-запрос

Задействованные скрипты: px/http_data_filtered и `px/http_request_stats.


🎨 Полноразмерное изображение доступно здесь.

💡 Заменяя коды ошибок HTTP, такие как 500, вы можете исследовать проблемные сервисы или капсулы.

🐞 Профили приложений

Задействованными скриптами являются px/namespace и px/pod.

🐞 Метрики здоровья сети

Задействованные скрипты: px/net_flow_graph, px/dns_flow_graph, px/tcp_drops.

🐞 Метрики здоровья инфраструктуры

Задействованные скрипты — px/nodes.


🎨 Полноразмерное изображение доступно здесь.

🐞 Профили запросов к базам данных

Задействованными скриптами являются px/mysql_stats и px/sql_queries.


🎨 Полноразмерное изображение доступно здесь.

Задержки запросов также видны с первого взгляда:

На основе этих данных можно думать дальше, оптимизировать работу СУБД, но это уже совсем другая история, выходящая за рамки данной статьи.

VII. Заключение

Pixie — один из немногих инструментов наблюдаемости, предлагающих eBPF или наблюдаемость на уровне ядра. Другие — это Cilium, см. авторскую часть 5, и CVF.

С помощью одной команды CLI разработчики могут видеть все метрики, события, журналы и трассировки своих приложений. Технология Pixie избавляет разработчиков от необходимости добавлять код инструментария, настраивать специальные приборные панели или перемещать данные из кластера, экономя драгоценное время, чтобы они могли сосредоточиться на создании лучшего программного обеспечения.

Пропустите изменения кода и получите мгновенную наблюдаемость Kubernetes! Удачи.

Автор выражает благодарность Пиюшу Дага, Петру Заневски, Стивену Вогану-Николсу и Фонду eBPF.

Оцените статью
Procodings.ru
Добавить комментарий