完整指南:安装、配置与监控)
云原生【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos2/mesos点击查看免费下载导读本文围绕 Apache Mesos 的Port Mapping Network Isolatornetwork/port_mapping展开讲解如何在所有容器共享 Agent 公共 IP的前提下实现按容器维度的网络监控与隔离防止单个容器耗尽可用端口、抢占不公平的网络带宽或显著延迟其他容器的报文传输。读完本文你将掌握该隔离器的内核与依赖前提、源码编译开关、Agent 启动参数、三段互不重叠端口范围的规划方法、容器出站限速与公平性调度配置以及通过/monitor/statistics端点采集每容器网络统计信息的完整实战方案。一、核心原理端口映射而非每容器独立 IP与network/cni隔离器为每个容器分配独立 IP 不同端口映射隔离器提供了一种不依赖每容器独立 IP的按容器网络监控与隔离手段。其核心机制参见 port_mapping.hpp 中PortMappingIsolatorProcess的类注释每个容器拥有独立的网络栈通过 Linux 网络命名空间 network namespace 实现所有容器仍然共享 Agent 的同一公共 IP因此服务发现机制无需改变Agent 为每个容器分配一段互不重叠的端口范围只有发往/来自这些端口的报文才会被送达容器应用通过绑定端口 0 请求内核分配端口时会从容器被分配的范围中拿到端口应用若绑定容器分配范围之外的端口报文会被主机静默丢弃。从源码结构看隔离器会为每个容器创建一对 veth 虚拟网卡前缀mesos见 port_mapping.hpp 中PORT_MAPPING_VETH_PREFIX()并将命名空间句柄 bind mount 到/var/run/netns以便使用iproute2工具族如ip netns show/exec查看或进入容器网络命名空间进行调试PORT_MAPPING_BIND_MOUNT_ROOT()。在 port_mapping.cpp 的头部注释中详细描绘了报文路径来自外部网络的流量经主机eth0入口ingress按目标端口路由到对应容器的 veth 出口接口再转发进容器容器发往外网的流量沿反向路径走。由于已知每个容器的端口分配可以直接把流量引导到正确的容器对于没有端口概念的 ICMP 和 ARP 报文则把报文复制给每个容器依赖网络栈丢弃不期望的报文。端口映射隔离器对运行在 Agent 上的大多数任务透明——尤其是那些绑定端口 0、由内核分配端口的任务。二、安装内核、依赖与编译开关2.1 先决条件内核要求按容器网络监控与隔离仅在Linux 内核 3.6 及以上版本受支持并且内核必须包含以下补丁这些补丁已于内核 3.15 合并6a662719c9868b3d6c7d26b3a085f0cd3cc15e640d5edc68739f1c1e0519acbea1d3f0c1882a15d7e374c618b1465f0292047a9f4c244bd71ab5f1f025f929fbff0d1bcebf2e92656d33025cd330cbf8Agent 运行依赖libnl3 3.2.26libnl 的 netlink 库iproute2 2.6.39仅调试用途时建议非必需源码编译依赖从源码构建 Mesos 还需要libnl3-devel / libnl3-dev 3.2.26。2.2 编译构建端口映射网络隔离器默认不支持需要额外安装上述依赖并在构建过程中显式启用。使用 Autotools 构建时$ ./configure --with-network-isolator $ make注意在当前仓库的 configure.ac 中--with-network-isolator已被标记为即将弃用构建脚本会提示改用--enable-port-mapping-isolatorAC_MSG_WARN([--with-network-isolator is being deprecated, please use --enable-port-mapping-isolator instead.])因此建议直接使用$ ./configure --enable-port-mapping-isolator $ make该开关在构建时定义ENABLE_PORT_MAPPING_ISOLATOR宏见 configure.ac 中的AC_DEFINE([ENABLE_PORT_MAPPING_ISOLATOR])。从源码结构看与端口映射隔离器相关的 Agent 启动参数如ephemeral_ports_per_container、egress_rate_limit_per_container等也都包裹在#ifdef ENABLE_PORT_MAPPING_ISOLATOR条件编译块中见 flags.cpp也就是说未启用编译开关时这些参数不会出现在 Agent 上。三、启用隔离器--isolation 参数在 Agent 的命令行--isolation标志中加入network/port_mapping即可启用--isolationnetwork/port_mapping如果 Agent 编译时未包含端口映射隔离器支持启动时会拒绝运行并打印如下错误参考 containerizer.cpp 中隔离器创建失败的分支逻辑I0708 00:17:08.080271 44267 containerizer.cpp:111] Using isolation: network/port_mapping Failed to create a containerizer: Could not create MesosContainerizer: Unknown or unsupported isolator: network/port_mapping3.1 启动自检源码级验证从PortMappingIsolatorProcess::create的实现port_mapping.cpp可以确认隔离器初始化时会做一系列严格的环境检查任何一项失败都会拒绝启动必须以root权限运行geteuid() ! 0直接报错内核需支持网络命名空间CLONE_NEWNET报错信息提示内核需新于 3.4校验 Linux路由库routing::check()校验依赖的 Linux 命令行工具可用tc、ethtool、ip解析--resources提取portsnon-ephemeral与ephemeral_ports两类资源校验ephemeral_ports不能为空每个容器至少需要一个临时端口用于 Agent 与执行器的通信校验ephemeral_ports与ports、与well-known ports0–1023均不重叠读取/proc/sys/net/ipv4/ip_local_port_range获取主机临时端口范围并校验容器ephemeral_ports与之不重叠校验--ephemeral_ports_per_container必须是2 的幂且不小于源码中定义的最小值MIN_EPHEMERAL_PORTS_SIZE 16见 port_mapping.cpp。这些校验正是下一节三段端口范围设计在实现层面的强制约束。四、规划三段互不重叠的端口范围未启用端口映射隔离器时主机上所有容器共享 Agent 的公共 IP可以绑定操作系统允许的任何端口。启用后每个容器只能使用分配给它的端口因此需要把端口划分为三个互不重叠的范围端口范围用途配置位置主机临时host ephemeral端口主机自身网络通信/etc/sysctl.confnet.ipv4.ip_local_port_range容器临时container ephemeral端口由 Agent 细分分配给每个容器Agent--resources中的ephemeral_ports容器非临时non-ephemeral端口提供给 Master再通过资源 offer 分配给框架Agent--resources中的ports4.1 主机临时端口范围任何时候都可通过sysctl net.ipv4.ip_local_port_range查看当前主机临时端口范围。若要为 Agent 容器腾出端口可在/etc/sysctl.conf中更新该范围更新后重启主机使改动生效并排除端口已被其他进程占用的可能。例如# net.ipv4.ip_local_port_range defines the host ephemeral port range, by # default 32768-61000. We reduce this range to allow the Mesos agent to # allocate ports 32768-57344 # net.ipv4.ip_local_port_range 32768 61000 net.ipv4.ip_local_port_range 57345 61000从源码看隔离器启动时会直接读取该 proc 文件并与--resources中的ephemeral_ports做重叠校验一旦相交便拒绝启动port_mapping.cpp。4.2 容器端口范围--resources容器临时端口与非临时端口范围通过 Agent 的--resources标志配置非临时端口ports会上报给 Master随后作为资源 offer 的一部分分配给框架供 executor/task 按需使用临时端口ephemeral_ports由 Agent 内部细分每个容器获得ephemeral_ports_per_container默认1024常量定义见 constants.hpp个端口。因此 Agent 上可容纳的最大容器数约等于number of ephemeral_ports / ephemeral_ports_per_container当临时端口范围耗尽时可使用 Master 的--max_executors_per_agent标志阻止在 Agent 上继续分配执行器。推荐实践非强制但能降低报文处理时的 CPU 开销将ephemeral_ports_per_container设为 2 的幂如 512、1024并让临时端口范围的下界为该值的整数倍。例如--resourcesports:[31000-32000];ephemeral_ports:[32768-57344] \ --ephemeral_ports_per_container512源码层面EphemeralPortsAllocatorport_mapping.hpp负责按容器分配临时端口区间并提供allocate/deallocate/isManaged接口测试套件中也通过设置很小的ephemeral_ports_per_container如 16、512验证了容器过多导致分配失败的行为见 port_mapping_tests.cpp 中的ROOT_TooManyContainers用例。此外flags.cpp 中还有--eth0_name与--lo_name两个可选参数用于显式指定公共网络接口如eth0与回环接口如lo不指定时隔离器会根据主机默认网关link::eth0()/link::lo()自动推断。4.3 为什么临时端口必须能被 2 的幂区间划分隔离器在每个容器上只维护一个临时端口区间对应的 IP 过滤规则这是为了降低报文处理开销并便于调试。源码create()中明确拒绝了非 2 的幂ephemeral_ports_per_container必须是 2 的幂且getPortRanges暴露给单元测试会把端口集合拆分成若干大小是 2^n 且起始地址按大小对齐的区间供单个 IP 过滤器使用——这正是推荐临时端口范围下界对齐的原因port_mapping.hpp。五、限速与出站流量公平隔离5.1 限制容器出站带宽为防止单个容器耗尽全部网络资源、损害同主机其他容器可对容器出站流量做速率限制。--egress_rate_limit_per_container指定每个容器允许的最大带宽字节/秒。超出限制的流量会被延迟到稍后传输TCP 协议会感知增大的延迟并主动降低发送速率从而无需丢包--egress_rate_limit_per_container100MB入站流量不做限速——因为只能在报文被主机接收后才能修改网络流此时拥塞已经发生限速无济于事port_mapping.cpp 中通过 HTBHierarchical Token Bucketqdisc 在容器内 egress 侧实现带宽限制。源码佐证egress_rate_limit_per_container使用 stout 库的Bytes类型解析flags.cpp未指定或指定为 0 时不设限测试用例ROOT_NC_SmallEgressLimit用很小的速率如 256KB/s实测容器传输数据量验证限速生效port_mapping_tests.cpp。5.2 出站流量隔离每容器独立 flow延迟发送可能增加接口上所有流量的延迟与抖动。为降低对同主机其他容器的影响Mesos 利用容器端口范围做流量分类与隔离为每个容器维护独立的 flow并借助FQ_Codel算法fq_codelqdisc用于缓解 buffer bloat / 队头阻塞公平调度这些 flow 的发送。使用--egress_unique_flow_per_container启用--egress_unique_flow_per_container源码细节该功能为每个容器分配一个独立的 flow IDCONTAINER_MIN_FLOWID 3起主机保留HOST_FLOWID 1ARP/ICMP 共享ARP_FLOWID ICMP_FLOWID 2在主机eth0egress 侧安装fq_codelqdisc保证各容器对主机接口的公平访问port_mapping.cpp。启用后若需调整 flow classifier 在 qdisc 层级中的安装位置可使用--egress_flow_classifier_parent默认root见 flags.cpp。5.3 完整配置示例一个完整的 Agent 启动命令启用端口映射隔离器、为主机临时端口保留 57345–61000、容器临时端口 32768–57344、非临时端口 31000–32000由框架分配、限制容器发送带宽为 300 Mbit/s37.5 MB并开启每容器独立 flowmesos-agent \ --isolationnetwork/port_mapping \ --resourcesports:[31000-32000];ephemeral_ports:[32768-57344] \ --ephemeral_ports_per_container1024 \ --egress_rate_limit_per_container37500KB \ --egress_unique_flow_per_container对应配置参数的完整说明与默认值可参见 Agent 配置文档ephemeral_ports_per_container默认 1024、eth0_name、lo_name、egress_rate_limit_per_container、egress_unique_flow_per_container、egress_flow_classifier_parent等条目。六、监控容器网络统计信息Mesos 通过 Agent 的/monitor/statistics端点暴露每个容器网络栈的统计信息该端点的 HTTP 实现位于 http.cpp 的Http::statistics它会汇总各隔离器上报的ResourceStatistics并以 JSON 返回。隔离器在容器内通过PortMappingStatistics子命令进入容器网络命名空间后读取/proc与流量控制统计收集数据port_mapping.cpp。6.1 基础网络计数器以下计数器来自容器内网络接口自容器创建起累计位于返回 JSON 的statistics键下MetricDescriptionTypenet_rx_bytes接收字节数Counternet_rx_dropped接收时丢弃的报文数Counternet_rx_errors接收时报告的错误数Counternet_rx_packets接收的报文数Counternet_tx_bytes发送字节数Counternet_tx_dropped发送时丢弃的报文数Counternet_tx_errors发送时报告的错误数Counternet_tx_packets发送的报文数Counter6.2 流量控制Traffic Control统计此外Linux 流量控制子系统可为实现带宽限制与 buffer bloat 缓解的 qdisc 元素上报统计位于statistics/net_traffic_control_statistics键下。隔离器上报两个元素bw_limit带宽限制对应CONTAINER_TX_HTB_HANDLE下的 HTB 类与bloat_reduction对应 fq_codel见 port_mapping.cpp 中NET_ISOLATOR_BW_LIMIT/NET_ISOLATOR_BLOAT_REDUCTION常量。每个元素包含MetricDescriptionTypebacklog排队待发送的字节数 [1]Gaugebytes发送字节数Counterdrops发送时丢弃的报文数Counteroverlimits接口试图发送报文时超过其发送上限的次数 [2]Counterpackets发送报文数Counterqlen排队待发送的报文数Gaugeratebps发送速率字节/秒 [3]Gaugeratepps发送速率报文/秒 [3]Gaugerequeues因资源争用如内核锁而发送失败的报文数 [3]Counter脚注[1]backlog仅在bloat_reduction元素上报告[2]overlimits仅在bw_limit元素上报告[3] 这三个字段当前总是被底层 Traffic Control 元素报告为 0。6.3 实测输出示例启用网络监控后访问 Agent 的/monitor/statistics端点本示例为本地 5051 端口使用python2.6 -mjson.tool格式化输出可得到类似如下的结果$ curl -s http://localhost:5051/monitor/statistics | python2.6 -mjson.tool [ { executor_id: job.1436298853, executor_name: Command Executor (Task: job.1436298853) (Command: sh -c iperf ....), framework_id: 20150707-195256-1740121354-5150-29801-0000, source: job.1436298853, statistics: { cpus_limit: 1.1, cpus_nr_periods: 16314, cpus_nr_throttled: 16313, cpus_system_time_secs: 2667.06, cpus_throttled_time_secs: 8036.840845388, cpus_user_time_secs: 123.49, mem_anon_bytes: 8388608, mem_cache_bytes: 16384, mem_critical_pressure_counter: 0, mem_file_bytes: 16384, mem_limit_bytes: 167772160, mem_low_pressure_counter: 0, mem_mapped_file_bytes: 0, mem_medium_pressure_counter: 0, mem_rss_bytes: 8388608, mem_total_bytes: 9945088, net_rx_bytes: 10847, net_rx_dropped: 0, net_rx_errors: 0, net_rx_packets: 143, net_traffic_control_statistics: [ { backlog: 0, bytes: 163206809152, drops: 77147, id: bw_limit, overlimits: 210693719, packets: 107941027, qlen: 10236, ratebps: 0, ratepps: 0, requeues: 0 }, { backlog: 15481368, bytes: 163206874168, drops: 27081494, id: bloat_reduction, overlimits: 0, packets: 107941070, qlen: 10239, ratebps: 0, ratepps: 0, requeues: 0 } ], net_tx_bytes: 163200529816, net_tx_dropped: 0, net_tx_errors: 0, net_tx_packets: 107936874, perf: { duration: 0, timestamp: 1436298855.82807 }, timestamp: 1436300487.41595 } } ]可观察到该容器持续以接近限速上限的速率发送流量bw_limit元素的overlimits高达 2 亿多次说明 HTB 限速频繁触发延迟而bloat_reduction元素有较大的backlog与drops体现 fq_codel 在拥塞时的排队与主动丢包行为。6.4 扩展统计开关可选除了上述基础指标flags.cpp 还为network/port_mapping隔离器提供了三个可选的统计采集开关--network_enable_socket_statistics_summary采集每个容器的 socket 统计摘要如活跃 TCP 连接数net_tcp_active_connections、TIME_WAIT 连接数实现上读取容器/proc/net/sockstat见 port_mapping.cpp 的PortMappingStatistics::execute--network_enable_socket_statistics_details采集 socket 统计细节如 TCP RTT--network_enable_snmp_statistics采集 SNMP 统计细节如 TCPRetransSegs。七、源码与测试佐证小结如需深入验证或二次开发以下仓库路径是核心入口隔离器实现port_mapping.cppcreate的环境与端口校验、HTB/fq_codel 流量控制链、PortMappingStatistics子命令隔离器类与分配器port_mapping.hppPortMappingIsolatorProcess、EphemeralPortsAllocator、getPortRanges、veth 前缀与 bind mount 路径Agent 参数定义flags.cpp#ifdef ENABLE_PORT_MAPPING_ISOLATOR保护的六个参数与 constants.hpp默认值 1024构建开关configure.ac--enable-port-mapping-isolator--with-network-isolator已弃用测试用例port_mapping_tests.cpp容器间 TCP/UDP、主机到容器、ICMP/ARP/DNS、ROOT_TooManyContainers、ROOT_NC_SmallEgressLimit、ROOT_NC_PortMappingStatistics等配置参数参考Agent 配置文档八、适用前提与注意事项端口映射隔离器仅适用于 Linux内核 ≥ 3.6 且包含 3.15 合并的补丁要求root 权限和Linux launcher三段端口范围主机临时、容器临时、容器非临时必须互不重叠否则隔离器启动自检会直接拒绝运行容器临时端口总量与ephemeral_ports_per_container共同决定 Agent 的容器容量上限建议与 Master 的--max_executors_per_agent配合使用该隔离器不做入站限速只对出站做 HTB 限速与 fq_codel 公平调度启用网络统计扩展开关socket/SNMP会带来额外的采集开销请按需开启。赞分享云原生【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos2/mesos点击查看免费下载相关推荐Apache Mesos Port Mapping 网络隔离器基于端口映射的容器网络监控与隔离实践指南Apache Mesos Port Mapping 网络隔离器基于端口映射的容器网络监控与隔离实践指南 导读 本文系统讲解 Apache Mesos 中 n集群管理任务调度后端Apache Mesos 网络端口隔离器network/ports isolator完全指南安装、配置与工作原理Apache Mesos 网络端口隔离器network/ports isolator完全指南安装、配置与工作原理 导读 当任务运行在宿主机网络命名空间h集群管理任务调度后端Caddy ECH 完整指南3 步开启加密客户端 Hello让 SNI 不再明文泄露Caddy ECH 完整指南3 步开启加密客户端 Hello让 SNI 不再明文泄露 连公共 WiFi 时即使流量已走 HTTPS握手时的 SNI 字段后端API网关网络创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考