UDS Core 项目中 Cilium CNI 下的网络策略问题解析
在 Kubernetes 集群中使用 Cilium 作为容器网络接口(CNI)时,UDS Core 项目遇到了一个关于网络策略(NetworkPolicy)的重要问题。这个问题影响了集群内部服务间的通信,特别是当应用尝试通过内部服务主机名访问 Keycloak 时会出现连接超时。
问题的核心在于网络策略的选择器机制。在 Cilium CNI 环境下,基于 CIDR 的选择器无法正确匹配集群内部资源。具体表现为,当前 allow-keycloak-ingress-keycloak-backchannel-access 网络策略使用了 0.0.0.0/0 的 CIDR 选择器,这导致 Grafana 等应用无法通过 Keycloak 的内部服务主机名正常访问 Keycloak 服务。
从技术实现角度看,这个问题源于 Cilium 对网络策略处理方式的特殊性。与某些其他 CNI 插件不同,Cilium 不能仅通过 IP 地址选择器来识别集群内部资源。相反,它需要明确的命名空间选择器来识别集群内的通信流量。
解决方案有两个层面:
- 对于特定于 Keycloak 的网络策略,可以将 CIDR 选择器替换为
namespaceSelector: {},这将允许所有命名空间中的资源访问 Keycloak - 更通用的解决方案是修改 UDS Core 的"anywhere"端点定义,使其同时包含 CIDR 选择器和命名空间选择器,这样既能保持对外部流量的允许,又能正确处理集群内部通信
这个问题不仅影响 Keycloak 的访问,实际上任何依赖 IP 选择器来允许集群内资源间通信的网络策略都会受到影响。因此,建议对所有类似的网络策略进行全面检查,确保它们在 Cilium 环境下能正常工作。
从安全角度考虑,虽然解决方案中使用了允许所有命名空间的宽泛选择器,但在生产环境中,应根据最小权限原则,尽可能精确地定义允许访问的命名空间范围。
这个问题的发现和解决过程展示了在 Kubernetes 生态系统中,不同 CNI 实现之间的细微差异如何影响应用的行为,也强调了在跨平台部署时进行全面测试的重要性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



