CCE容器网络扩展指标
插件简介
CCE容器网络扩展指标插件(dolphin)是一款容器网络流量监控管理插件,当前版本可支持CCE Turbo集群非主机网络容器的流量统计,以及节点内容器联通性健康检查。
当前支持Pod粒度和flow粒度的IP和TCP协议监控,且支持通过PodSelector来对监控后端作选择,支持多监控任务、可选监控指标,且支持用户获取Pod的label标签信息。监控信息已适配Prometheus格式,可以通过调用Prometheus接口查看监控数据。
使用约束
- 仅支持在v1.19及以上版本的CCE Turbo集群中安装此插件,插件实例仅支持部署在X86架构的EulerOS的节点上。
- 支持节点使用Containerd或Docker容器引擎。其中Containerd节点可实时跟踪Pod更新,Docker节点以轮询方式查询,非实时更新。
- 仅支持统计CCE Turbo集群安全容器(容器运行时为kata)以及普通容器(容器运行时为runc)的流量。
- 安装插件后默认将不进行流量监控,用户需通过创建MonitorPolicy来配置监控任务进行流量监控。
- 不支持HostNetwork类型Pod监控。
- 安装时请确保节点有足够的资源安装本插件。
- 监控标签及用户标签的来源必须为新创建Pod时就具有的。
- 用户指定的标签最多5个标签(1.3.4版本后最多支持10个标签),且不可以指定系统使用的label用作用户指定label。系统使用lable包括:pod、task、ipfamily、srcip、dstip、srcport、dstport、protocol。
安装插件
- 登录CCE控制台,单击CCE Turbo集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到CCE容器网络扩展指标插件,单击“安装”。
- 在安装插件页面,查看插件配置。
当前该插件无可配置参数。
- 单击“安装”。
待插件安装完成后,选择对应的集群,然后单击左侧导航栏的“插件中心”,可在“已安装插件”页签中查看相应的插件。
组件说明
容器组件 |
说明 |
资源类型 |
---|---|---|
dolphin |
dolphin负责CCE Turbo集群的容器网络流量监控。 |
DaemonSet |
支持的监控项
当前用户可通过创建MonitorPolicy的方式下发监控任务,当前用户可以通过API或登录工作节点kubectl apply的方式创建MonitorPolicy。一个MonitorPolicy代表着一个监控任务,提供selector、podLabel等可选参数。当前支持的监控指标如下:
监控指标 |
监控项名称 |
监控粒度 |
支持的运行时 |
支持的集群版本 |
支持的插件版本 |
支持的操作系统 |
---|---|---|---|---|---|---|
IPv4发送公网报文数 |
dolphin_ip4_send_pkt_internet |
pod |
runc/kata |
v1.19及以上 |
1.1.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IPv4发送公网字节数 |
dolphin_ip4_send_byte_internet |
pod |
runc/kata |
v1.19及以上 |
1.1.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IPv4接收报文数 |
dolphin_ip4_rcv_pkt |
pod |
runc/kata |
v1.19及以上 |
1.1.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IPv4接收字节数 |
dolphin_ip4_rcv_byte |
pod |
runc/kata |
v1.19及以上 |
1.1.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IPv4发送报文数 |
dolphin_ip4_send_pkt |
pod |
runc/kata |
v1.19及以上 |
1.1.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IPv4发送字节数 |
dolphin_ip4_send_byte |
pod |
runc/kata |
v1.19及以上 |
1.1.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
最近一次的健康检查健康状态 |
dolphin_health_check_status |
pod |
runc/kata |
v1.19及以上 |
1.2.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
健康检查成功累计次数 |
dolphin_health_check_successful_counter |
pod |
runc/kata |
v1.19及以上 |
1.2.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
健康检查失败累计次数 |
dolphin_health_check_failed_counter |
pod |
runc/kata |
v1.19及以上 |
1.2.2 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP接收报文数 |
dolphin_ip_receive_pkt |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP接收字节数 |
dolphin_ip_receive_byte |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP发送报文数 |
dolphin_ip_send_pkt |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP发送字节数 |
dolphin_ip_send_byte |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP接收报文数 |
dolphin_tcp_receive_pkt |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP接收字节数 |
dolphin_tcp_receive_byte |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP发送报文数 |
dolphin_tcp_send_pkt |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP发送字节数 |
dolphin_tcp_send_byte |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP重传报文数 |
dolphin_tcp_retrans |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP新建连接数 |
dolphin_tcp_connection |
pod |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP接收报文数 |
dolphin_flow_ip_receive_pkt |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP接收字节数 |
dolphin_flow_ip_receive_byte |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP发送报文数 |
dolphin_flow_ip_send_pkt |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
IP发送字节数 |
dolphin_flow_ip_send_byte |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP接收报文数 |
dolphin_flow_tcp_receive_pkt |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP接收字节数 |
dolphin_flow_tcp_receive_byte |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP发送报文数 |
dolphin_flow_tcp_send_pkt |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP发送字节数 |
dolphin_flow_tcp_send_byte |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP重传报文数 |
dolphin_flow_tcp_retrans |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
TCP smoothed round trip |
dolphin_flow_tcp_srtt |
flow |
runc |
v1.23及以上 |
1.3.5 |
EulerOS 2.9 x86 EulerOS 2.10 x86 |
下发监控任务
MonitorPolicy创建的模板如下:
apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task #监控任务名 namespace: kube-system #必填,namespace必须为kube-system spec: selector: #选填,配置dolphin插件监控的后端,形如labelSelector格式,默认将监控本节点所有容器 matchLabels: app: nginx matchExpressions: - key: app operator: In values: - nginx podLabel: [app] #选填,用户标签 ip4Tx: #选填,ipv4发送报文数和发送字节数这两个指标的开关,默认不开 enable: true ip4Rx: #选填,ipv4接收报文数和接收字节数这两个指标的开关,默认不开 enable: true ip4TxInternet: #选填,ipv4发送公网报文数和发送公网字节数这两个指标的开关,默认不开 enable: true healthCheck: #选填,本地节点 Pod 健康检查任务中最近一次健康检查是否健康、健康检查总健康&不健康次数这三个指标开关,默认不开 enable: true # true false failureThreshold: 3 #选填,健康检查不健康判定失败次数,默认1次健康检查失败即判定不健康 periodSeconds: 5 #选填,健康检查任务检查间隔时间,单位秒,默认60 command: "" #选填,健康检查任务检查命令,支持:ping、arping、curl,默认 ping ipFamilies: [""] #选填,健康检查IP地址族,支持:ipv4,默认ipv4 port: 80 #选填,使用curl时必选,端口号 path: "" #选填,使用curl时必选,http api 路径 monitor: ip: ipReceive: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 ipSend: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcp: tcpReceive: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcpSend: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcpRetrans: aggregateType: flow #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控 tcpRtt: aggregateType: flow #选填,支持填写"flow",表示流粒度监控,单位:微秒 tcpNewConnection: aggregateType: pod #选填,支持填写"pod",表示pod粒度监控
用户标签PodLabel:可输入多个Pod的label标签,以逗号分隔,如[app, version]。
标签需符合以下规则,对应正则表达式为(^[a-zA-Z_]$)|(^([a-zA-Z][a-zA-Z0-9_]|_[a-zA-Z0-9])([a-zA-Z0-9_]){0,254}$):
- 支持输入最多5个标签(1.3.4版本后最多支持10个标签),单个标签长度最长256个字符。
- 不能以数字和双下划线__开头。
- 单个标签格式需符合A-Za-z_0-9。
- 修改或删除监控任务,都将导致丢失原有监控任务所采集的监控数据,请谨慎操作。
- 用户卸载插件后,用户之前配置的监控任务MonitorPolicy将随着插件卸载一并销毁。
场景化示例如下:
- 以下示例将监控节点上满足app=nginx的labelselector的所有Pod,生成三个健康检查指标,默认使用ping方式检测本地Pod,若监控的容器携带test及app这两个标签,将在监控指标上携带对应label的key-value信息,否则对应label的value为“not found”。
apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task namespace: kube-system spec: selector: matchLabels: app: nginx podLabel: [test, app] healthCheck: enable: true failureThreshold: 3 periodSeconds: 5
- 以下示例将监控节点上满足app=nginx的labelselector的所有Pod,生成三个健康检查指标,自定义curl方式(此处curl只考虑网络连通性,不论程序返回的http code是什么,只要网络能连通就认为Pod是健康的)。若监控的容器携带test及app这两个标签,将在监控指标上携带对应label的key-value信息,否则对应label的value为“not found”。
apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task namespace: kube-system spec: selector: matchLabels: app: nginx podLabel: [test, app] healthCheck: enable: true failureThreshold: 3 periodSeconds: 5 command: "curl" port: 80 path: "healthz"
- 以下示例将监控节点上满足app=nginx的labelselector的所有Pod,监控Pod粒度的IP收发报文数、IP收发字节数、TCP收发报文数、TCP收发字节数、TCP重传报文数、TCP新建连接数,若监控的容器携带test及app这两个标签,将在监控指标上携带对应label的key-value信息,否则对应label的value为“not found”。
apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task namespace: kube-system spec: selector: matchLabels: app: nginx podLabel: [test, app] monitor: ip: ipReceive: aggregateType: pod ipSend: aggregateType: pod tcp: tcpReceive: aggregateType: pod tcpSend: aggregateType: pod tcpRetrans: aggregateType: pod tcpNewConnection: aggregateType: pod
- 以下示例将监控节点上满足app=nginx的labelselector的所有Pod,监控流粒度的IP收发报文数、IP收发字节数、TCP收发报文数、TCP收发字节数、TCP重传报文数、tcp round trip time(单位:微秒),若监控的容器携带test及app这两个标签,将在监控指标上携带对应label的key-value信息,否则对应label的value为“not found”。使用流粒度监控能力,用户可以更细腻的感知容器的流量信息。基于流的监控数据量较大,会占用更多的cpu和内存,请按需使用。
每开启一个基于流的IP监控任务(一个MonitorPolicy中开启一个和多个IP监控项)会占用内核2.6M内存;每开启一个基于流的TCP监控任务(一个MonitorPolicy中开启一个和多个TCP监控项)会占用内核14M内存。
apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task namespace: kube-system spec: selector: matchLabels: app: nginx podLabel: [test, app] monitor: ip: ipReceive: aggregateType: flow ipSend: aggregateType: flow tcp: tcpReceive: aggregateType: flow tcpSend: aggregateType: flow tcpRetrans: aggregateType: flow tcpRtt: aggregateType: flow
基于流的监控数据量比较大时,当数据量超过一定限制时,会导致超限的流统计丢失,当前限制如下:
- 10s内内核态最多统计5w条(每监控任务)TCP流信息。
- 10s内内核态最多统计1w条(每监控任务)IP流信息。
- 两次普罗拉取间隔最多缓存6w条(所有监控任务)流统计信息。
- 普罗长时间不拉取时,只缓存1小时内的监控数据。
- 以下示例将监控节点上所有Pod,生成IPv4发送报文数和发送字节数这两个指标,若监控的容器携带app这个标签,将在监控指标上携带对应label的key-value信息,否则对应label的value为“not found”。
apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task namespace: kube-system spec: podLabel: [app] ip4Tx: enable: true
- 以下示例将监控节点上满足app=nginx的labelselector的所有Pod,生成IPv4收发报文数、IPv4收发字节数、IPv4发送公网报文数和字节数等指标,若监控的容器携带test及app这两个标签,将在监控指标上携带对应label的key-value信息,否则对应label的value为“not found”。
apiVersion: crd.dolphin.io/v1 kind: MonitorPolicy metadata: name: example-task namespace: kube-system spec: selector: matchLabels: app: nginx podLabel: [test, app] ip4Tx: enable: true ip4Rx: enable: true ip4TxInternet: enable: true
查看流量统计
dolphin插件的监控信息以Prometheus exporter格式输出,有以下方式获取dolphin插件的监控信息:
获取的监控信息示例如下:
- 示例1(IPv4发送公网报文数):
dolphin_ip4_send_pkt_internet{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 241
如上示例中,Pod所在命名空间为default,Pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的发送公网报文数为241。
- 示例2(IPv4发送公网字节数):
dolphin_ip4_send_byte_internet{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task" } 23618
如上示例中,Pod所在命名空间为default,Pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的发送公网字节数为23618。
- 示例3(IPv4发送报文数):
dolphin_ip4_send_pkt{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 379
如上示例中,Pod所在命名空间为default,Pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的发送报文数为379。
- 示例4(IPv4发送字节数):
dolphin_ip4_send_byte{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 33129
如上示例中,Pod所在命名空间为default,Pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的发送字节数为33129。
- 示例5(IPv4接收报文数):
dolphin_ip4_rcv_pkt{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 464
如上示例中,Pod所在命名空间为default,Pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的接收报文数为464。
- 示例6(IPv4接收字节数):
dolphin_ip4_rcv_byte{app="nginx",pod="default/nginx-66c9c65dbf-zjg24",task="kube-system/example-task "} 34654
如上示例中,Pod所在命名空间为default,Pod名称为nginx-66c9c65dbf-zjg24,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的接收字节数为34654。
- 示例7(健康检查状态):
dolphin_health_check_status{app="nginx",pod="default/nginx-b74766f5f-7582p",task="kube-system/example-task"} 0
如上示例中,Pod所在命名空间为kube-system,Pod名称为default/nginx-deployment-b74766f5f-7582p,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的网络健康状态为0(健康),不健康值为 1。
- 示例8(健康检查成功次数):
dolphin_health_check_successful_counter{app="nginx",pod="default/nginx-b74766f5f-7582p",task="kube-system/example-task"} 5
如上示例中,Pod所在命名空间为kube-system,Pod名称为default/nginx-deployment-b74766f5f-7582p,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的网络健康检查成功次数为5。
- 示例9(健康检查失败次数):
dolphin_health_check_failed_counter{app="nginx",pod="default/nginx-b74766f5f-7582p",task="kube-system/example-task"} 0
如上示例中,Pod所在命名空间为kube-system,Pod名称为default/nginx-deployment-b74766f5f-7582p,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod的网络健康失败次数为0。
- 示例10(流粒度监控结果):
dolphin_flow_tcp_send_byte{app="nginx",dstip="192.168.0.89",dstport="80",ipfamily="ipv4",pod="kube-system/nginx-b74766f5f-7582p",srcip="192.168.1.67",srcport="12973",task="kube-system/example-task"} 1725 1700538280914
如上示例中,Pod所在命名空间为kube-system,Pod名称为nginx-b74766f5f-7582p,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,192.168.1.67:12973向192.168.0.89:80的发送IPv4 TCP字节数为1725,时间戳为1700538280914。
- 示例11(Pod粒度监控结果):
dolphin_tcp_send_pkt{app="nginx",ipfamily="ipv4",pod="kube-system/nginx-b74766f5f-7582p",task="kube-system/example-task"} 14 dolphin_tcp_send_pkt{app="nginx",ipfamily="ipv6",pod="kube-system/nginx-b74766f5f-7582p",task="kube-system/example-task"} 0
如上示例中,Pod所在命名空间为kube-system,Pod名称为nginx-b74766f5f-7582p,用户指定label为app,其值对应为nginx,该监控指标由名称为example-task的监控任务创建,该Pod发送IPv4报文数为14,发送的IPv6报文数为0。
若容器无用户指定的标签,返回体中标签值为not found。形如:
dolphin_ip4_send_byte_internet{test="not found", pod="default/nginx-66c9c65dbf-zjg24",task="default" } 23618