3. 日志平台网络架构:典型日志平台(如ELK/Loki)的微服务拓扑与网络依赖关系
在实施Cilium网络策略之前,必须精确理解日志平台的微服务拓扑与网络依赖关系。日志平台并非单一单体应用,而是由多个独立组件构成的分布式系统,组件之间通过特定的端口和协议进行通信。版本漂移(如从ELK 7.x迁移至8.x,或从Loki 2.x升级至3.x)会引入新的gRPC服务、TLS加密端口或组件拆分,导致原有的网络策略失效。本节以ELK(Elasticsearch, Logstash, Kibana)和Loki(Grafana Loki, Promtail, Grafana)两大主流体系为例,梳理其标准微服务拓扑与网络依赖清单。
3.1 ELK体系微服务拓扑与端口依赖
ELK体系在版本漂移中变化最频繁的是Elasticsearch的传输层(Transport)与HTTP层端口,以及Kibana与Elasticsearch之间的认证握手方式。下表列出ELK核心组件在7.x与8.x版本中的典型端口与服务依赖:
| 组件 | 服务角色 | 7.x 默认端口 | 8.x 默认端口 | 协议 | 依赖方向 |
|---|---|---|---|---|---|
| Elasticsearch | 数据存储/检索 | 9200 (HTTP) 9300 (Transport) |
9200 (HTTP) 9300 (Transport) 9500 (gRPC, 可选) |
HTTP / TCP / gRPC | 被Logstash、Kibana、APM Server访问 |
| Logstash | 日志采集/解析 | 5044 (Beats) 9600 (监控API) |
5044 (Beats) 9600 (监控API) |
TCP / HTTP | 接收Beats/Filebeat数据;输出至Elasticsearch |
| Kibana | 可视化/UI | 5601 | 5601 | HTTP / HTTPS | 访问Elasticsearch 9200;被用户浏览器访问 |
| Filebeat | 轻量日志采集器 | 无监听端口(主动连接) | 无监听端口(主动连接) | TCP / TLS | 连接Logstash 5044 或 Elasticsearch 9200 |
| APM Server | 应用性能监控 | 8200 | 8200 | HTTP / gRPC | 接收APM Agent数据;输出至Elasticsearch |
版本漂移关键点: Elasticsearch 8.x 默认启用安全特性(TLS + 身份认证),HTTP端口9200必须使用HTTPS,且Transport端口9300强制要求证书交换。如果Cilium网络策略仅放行TCP 9200而未指定TLS握手所需的证书命名空间或SNI,会导致Kibana连接失败。此外,8.x新增的gRPC端口9500(用于跨集群搜索)在策略中极易被遗漏。
ELK体系的标准微服务拓扑呈现为扇入-汇聚-扇出模式:
- 采集层(扇入): Filebeat / Metricbeat / Heartbeat 等Beats采集器从业务Pod发送日志至Logstash或直接写入Elasticsearch。
- 处理层(汇聚): Logstash接收多路数据流,进行过滤、解析、缓冲后转发至Elasticsearch集群。
- 存储与查询层(扇出): Elasticsearch集群内部节点间通过Transport端口9300进行数据分片复制与选举;Kibana从Elasticsearch读取索引数据并提供给用户。
3.2 Loki体系微服务拓扑与端口依赖
Loki体系在版本漂移中主要变化集中在组件拆分与gRPC通信。Loki 2.x采用单体模式运行,而Loki 3.x(及更高版本)推荐微服务模式,将读取、写入、查询前端拆分为独立Deployment。下表列出Loki体系核心组件的端口与服务依赖:
| 组件 | 服务角色 | 2.x 默认端口 | 3.x 默认端口 | 协议 | 依赖方向 |
|---|---|---|---|---|---|
| Loki (单体) | 日志存储/查询 | 3100 (HTTP) 9095 (gRPC) |
—(已拆分) | HTTP / gRPC | 接收Promtail数据;被Grafana查询 |
| Loki Write | 写入路径 | — | 3100 (HTTP) 9095 (gRPC) |
HTTP / gRPC | 接收Promtail数据;转发至Ingester |
| Loki Read | 读取路径 | — | 3100 (HTTP) 9095 (gRPC) |
HTTP / gRPC | 接收Grafana查询;转发至Querier |
| Loki Query Frontend | 查询加速/缓存 | — | 3100 (HTTP) | HTTP | 接收Grafana查询;转发至Read |
| Promtail | 日志采集器 | 无监听端口(主动连接) | 无监听端口(主动连接) | HTTP / gRPC | 连接Loki Write 3100 或 单体Loki 3100 |
| Grafana | 可视化/UI | 3000 | 3000 | HTTP / HTTPS | 连接Loki Read 3100 或 Query Frontend 3100 |
| Minio / S3 | 对象存储(后端) | 9000 (API) | 9000 (API) | HTTP | 被Loki Ingester/Index Gateway访问 |
策略适配要点: Loki 3.x微服务模式下,Write、Read、Query Frontend、Ingester、Index Gateway等组件之间通过gRPC(端口9095)进行内部通信。Cilium网络策略必须显式放行这些组件之间的gRPC流量,且通常需要基于标签选择器(如
app.kubernetes.io/component: write)而非IP段来定义策略,以应对Pod重启后的IP变化。
Loki体系的标准微服务拓扑呈现为写路径与读路径分离的CQRS模式:
- 写路径: Promtail → Loki Write → Ingester → 对象存储(Minio/S3)。
- 读路径: Grafana → Loki Query Frontend → Loki Read → Querier → 对象存储。
- 内部协调: Ingester与Index Gateway之间通过gRPC同步元数据;Distributor负责负载均衡。
3.3 网络依赖关系清单与策略映射
基于上述拓扑分析,可以提炼出日志平台通用的网络依赖关系清单。该清单是后续编写Cilium网络策略的输入条件:
| 源组件 | 目标组件 | 端口/协议 | 用途 | 版本漂移风险 |
|---|---|---|---|---|
| Promtail / Filebeat | Loki Write / Logstash | 3100 (HTTP) / 5044 (TCP) | 日志推送 | 低(端口稳定) |
| Logstash | Elasticsearch | 9200 (HTTP/HTTPS) | 日志写入 | 高(8.x强制TLS) |
| Kibana / Grafana | Elasticsearch / Loki Read | 9200 (HTTPS) / 3100 (HTTP) | 查询/可视化 | 中(认证方式变化) |
| Elasticsearch 节点间 | Elasticsearch 节点间 | 9300 (TCP/TLS) | 集群内部复制 | 高(8.x证书交换) |
| Loki Write → Ingester | Loki Ingester | 9095 (gRPC) | 写入路径转发 | 中(3.x新增组件) |
| Loki Query Frontend → Read | Loki Read | 9095 (gRPC) | 查询路径转发 | 中(3.x新增组件) |
| Loki Ingester → Minio/S3 | Minio/S3 | 9000 (HTTP) | 数据持久化 | 低(端口稳定) |
策略映射原则: 每个依赖关系对应一条Cilium NetworkPolicy规则。规则中必须明确指定:
- 源端标签: 如
app.kubernetes.io/component: promtail - 目标端标签: 如
app.kubernetes.io/component: loki-write - 端口与协议: 如
port: 3100, protocol: TCP - TLS/SNI规则(如适用): 如
toFQDN: elasticsearch.example.com或serverNames: ["*.es.cluster.local"]