• 使用 K8spacket 和 Grafana 对 Kubernetes 的 TCP 数据包流量可视化



    前言

    如何知道 K8S 集群内 Pod 之间建立了哪些 TCP 连接?集群之间存在哪些调用关系?

    使用 k8spacketGrafana,您可以可视化集群中的 TCP 流量。了解工作负载如何相互通信,以及建立了多少连接,交换了多少字节,这些连接处于活动状态的时间。

    介绍

    k8spacket是用 Golang 编写的工具,它使用gopacket第三方库来嗅探工作负载(传入和传出)上的 TCP 数据包。它在运行的容器网络接口上创建 TCP 侦听器。当 Kubernetes 创建一个新容器时,CNI 插件负责提供与其他容器进行通信的可能性。最常见的方法是用linux namespace隔离网络并用veth pair连接隔离的 namespace 与网桥。除了bridge 类型,CNI 插件还可以使用其他类型(vlan, ipvlan,macvlan),但都为容器创建了一个网络接口,它是k8spacket嗅探器的主要句柄。

    k8spacket有助于了解 Kubernetes 集群中的 TCP 数据包流量:

    • 显示集群中工作负载之间的流量
    • 通知流量在集群外路由到哪里
    • 显示有关连接关闭套接字的信息
    • 显示工作负载发送/接收的字节数
    • 计算建立连接的时间
    • 显示整个集群中工作负载之间的网络连接拓扑

    k8spacket是一个 Kubernetes API 客户端,可以将嗅探到的工作负载解析为可视化上可见的集群资源名称(PodsServices)。它作为DaemonSet Pod启动,使用 hostNetwork,并监听节点上的网络接口。

    k8spacket 收集 TCP 流、处理数据,使用 Node Graph API Grafana 数据源插件(详情请查看 Node Graph API 插件),通过 API 展示在Grafana面板。

    要安装k8spacket,需要同时安装 Grafana。下面将在Kind安装的 k8s 集群上做演示。

    安装 k8spacket

    使用 Helm 安装:

    helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart
    helm install k8spacket --namespace k8spacket k8spacket/k8spacket --create-namespace
    
    • 1
    • 2

    默认安装会使用下面的命令获取所有需要监听的网络接口:

    ip address | grep @ | sed -E 's/.* (\w+)@.*/\1/' | tr '\n' ',' | sed 's/.$//'
    
    • 1

    其中可能包含一些状态为Down的接口,此时启动k8spacket会报错:

    2022/08/15 00:17:34 error opening pcap handle: tunl0: That device is not up
    
    • 1

    报错中提示网络接口tunl0状态不是up

    所以需要自定义修改values.yaml中的参数。将charts包拉取到本地,解压之后再修改:

    mkdir k8spacket
    helm fecth k8spacket/k8spacket
    tar -zxf k8spacket-0.1.0.tgz
    cd k8spacket
    
    • 1
    • 2
    • 3
    • 4

    修改 values.yaml 中的内容,过滤掉tunl0

    k8sPacket:
      tcp:
        listener:
          interfaces:
            ## 实现容器网络接口的命令
            command: "ip address | grep @ | grep -v tunl0 | sed -E 's/.* (\\w+)@.*/\\1/' | tr '\\n' ',' | sed 's/.$//'"
            ## 多久刷新一次要监听的网络接口列表
            refreshPeriod: "10s"
          ## 每 (periodDuration) 秒,刷新在过去 (closeOlderThanDuration) 秒内没有看到活动的连接。
          flushing:
            periodDuration: "10s"
            closeOlderThanDuration: "20s"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • refreshPeriod参数表示多久刷新一次要监听的网络接口列表,增加新的网络接口监听,移除旧网络接口监听。
    • periodDuration秒,刷新在过去 closeOlderThanDuration秒内没有看到活动的连接。

    安装成功,包含以下Daemonset PodsService

    # k get pod -n k8spacket -o wide
    NAME              READY   STATUS    RESTARTS   AGE   IP             NODE                    NOMINATED NODE   READINESS GATES
    k8spacket-9m4cz   1/1     Running   0          10m   192.168.16.4   k8s118-control-plane    <none>           <none>
    k8spacket-b4q9k   1/1     Running   0          10m   192.168.16.6   k8s118-control-plane3   <none>           <none>
    k8spacket-b5nnp   1/1     Running   0          10m   192.168.16.7   k8s118-control-plane2   <none>           <none>
    k8spacket-c25jh   1/1     Running   0          10m   192.168.16.2   k8s118-worker           <none>           <none>
    k8spacket-cqqxh   1/1     Running   0          10m   192.168.16.5   k8s118-worker2          <none>           <none>
    k8spacket-h9hjc   1/1     Running   0          10m   192.168.16.3   k8s118-worker3          <none>           <none>
    
    # k get svc -n k8spacket -o wide
    NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE   SELECTOR
    k8spacket   ClusterIP   11.0.227.158   <none>        8080/TCP   31m   app.kubernetes.io/instance=k8spacket,app.kubernetes.io/name=k8spacket
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    k8spacket Pod 提供了 /metrics 接口暴露指标:

    curl 192.168.16.4:8080/metrics
    
    • 1

    安装 dashboards

    下载k8spacket项目,并将dashboards目录下的面板 configmaps 创建到 K8S 中:

    wget https://github.com/k8spacket/k8spacket/archive/refs/heads/master.zip
    unzip master.zip
    cd k8spacket-master
    kubectl  apply --recursive -f ./dashboards
    
    • 1
    • 2
    • 3
    • 4

    创建了 k8spacket-logs-dashboard、k8spacket-metrics-dashboard、k8spacket-node-graph-dashboard三个面板。

    其中的metrics面板公开了 Prometheus 指标,这里不做演示。只关心node-graph面板。

    安装 grafana

    使用 Helm 安装 grafana,helm-charts 包地址如下:

    https://github.com/grafana/helm-charts

    同样的拉取到本地:

    helm repo add grafana https://grafana.github.io/helm-charts
    helm fetch grafana/grafana
    tar -zxf grafana-6.32.13.tgz
    cd grafana/
    
    • 1
    • 2
    • 3
    • 4

    charts包版本为:6.32.13
    grafana版本为:9.0.5

    修改values.yaml,将 Node Graph API 插件和数据源,以及 node-graph dashboard configmaps 添加到 Grafana。同时开启数据持久化。例如:

    persistence:
      type: pvc
      enabled: true
    
    env:
      GF_INSTALL_PLUGINS: hamedkarbasi93-nodegraphapi-datasource
    
    dashboardProviders:
      dashboardproviders.yaml:
        apiVersion: 1
        providers:
        - name: 'default'
          orgId: 1
          folder: ''
          type: file
          disableDeletion: false
          editable: true
          options:
            path: /var/lib/grafana/dashboards/default
    
    dashboardsConfigMaps:
      default: k8spacket-node-graph-dashboard
    
    datasources:
      nodegraphapi-plugin-datasource.yaml:
          apiVersion: 1
          datasources:
          - name: "Node Graph API"
            jsonData:
              url: "http://k8spacket.k8spacket.svc.cluster.local:8080"
            access: "proxy"
            basicAuth: false
            isDefault: false
            readOnly: false
            type: "hamedkarbasi93-nodegraphapi-datasource"
            typeLogoUrl: "public/plugins/hamedkarbasi93-nodegraphapi-datasource/img/logo.svg"
            typeName: "node-graph-plugin"
            orgId: 1
            version: 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    values.yaml目录下执行创建命令:

    helm install grafana -f values.yaml  ./
    
    • 1

    获取到admin账号的密码:

    kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
    
    • 1

    开启临时端口转发,使得集群外可以访问grafana实例:

    kubectl --namespace default port-forward service/grafana 3000:80  --address 0.0.0.0
    
    • 1

    通过http://{Kind宿主机IP}:3000打开grafana面板,并使用上面获取到的密码登录,可以看到Node Graph API插件成功安装:

    node graph面板可以看到集群中网络连接拓扑:

    使用

    统计类型

    • connection:帮助了解工作负载之间以及与外部客户端之间建立了多少连接。它会告诉你哪些套接字保持打开状态并可能导致问题。
    • bytes:显示工作负载发送或接收的字节数。
    • duration:计算连接的生命周期。

    请添加图片描述

    过滤器

    • by namespace:选择一个或多个 k8s 命名空间
    • by names included:选择工作负载名称进行可视化
    • by names excluded:从可视化中排除工作负载名称

  • 相关阅读:
    Redis各数据类型特定的命令和用法 1.0版本
    手写数字识别——算法
    在linux上脱离hadoop安装hbase-2.5.6集群
    java基础10题
    SpringCloud微服务实战——搭建企业级开发框架(五十二):第三方登录-微信小程序授权登录流程设计和实现
    重构与优化-优化函数调用(5)
    【系统架构】REST风格
    使用pdf.js预览pdf文件时如何兼容chrome66版本
    Hadoop3:MapReduce之简介、WordCount案例源码阅读、简单功能开发
    SDK 控件
  • 原文地址:https://blog.csdn.net/ll837448792/article/details/126345541