尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Cilium Gateway API Host Network 模式:将 Envoy 监听器直接暴露到宿主机网络

Cilium Gateway API Host Network 模式:将 Envoy 监听器直接暴露到宿主机网络 Cilium Gateway API Host Network 模式将 Envoy 监听器直接暴露到宿主机网络【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium本篇基于 Cilium 官方文档Documentation/network/servicemesh/gateway-api/host-network-mode.rst系统讲解 Cilium Gateway API 的 Host Network 模式它解决什么场景问题、如何通过 Helm 启用、监听端口如何选择、如何绑定特权端口NET_BIND_SERVICE、以及如何通过节点标签选择器把 Gateway API 监听器只部署到集群的部分节点上。读完本文你将能在没有 LoadBalancer Service 的环境开发集群、外部负载均衡器场景中直接通过节点网络接入 Cilium 的 Envoy 网关并结合 Helm values 文件 与 DaemonSet 模板 理解每个配置项在部署清单中的实际落点。适用场景与核心机制Host network mode 允许把 Cilium Gateway API 的 Gateway 直接暴露到宿主机网络上从 Cilium 1.16 开始支持见原文档版本说明。它的典型使用场景是LoadBalancer 类型 Service 不可用时——例如本地开发环境kind/minikube 无法申请云 LB IP或集群本身使用外部负载均衡器。默认情况下 Cilium 会为每个Gateway生成一个LoadBalancerService 来暴露监听器端口开启 Host Network 模式后Envoy 进程直接在节点的网络命名空间中监听流量路径上少了云厂商 LB 这一层。启用 Host Network 模式时有三个必须了解的行为约束原文档以 note/warning 形式强调与 LoadBalancer Service 模式互斥开启gatewayAPI.hostNetwork.enabledtrue会自动禁用 LoadBalancer 类型 Service 模式。这也可以从 Helm 值中得到印证——values.yaml 中gatewayAPI.externalTrafficPolicy的注释明确写着 Note that this value will be ignored whenhostNetwork.enabled true即外部流量策略在 Host Network 模式下不再起作用。监听器绑定所有接口IPv4 下绑定0.0.0.0IPv6 下绑定::。与TCPRoute和UDPRoute不兼容这两类路由的流量会绕过 Envoy、直达 Gateway 生成的 Service。而在 LoadBalancer Service 模式下该 Service 恰好暴露的就是Gateway监听器所配置的端口一旦开启 Host Network 模式这个 Service 会变成NodePort类型端口从 NodePort 随机分配区间中随机选取而不再是Gateway监听器上配置的端口流量语义因此被破坏。通过 Helm 启用 Host Network 模式最小启用配置如下继承自原文档gatewayAPI: enabled: true hostNetwork: enabled: true这两个字段在 values.yaml 中的定义与默认值分别为gatewayAPI: enabled: false # 开启 Gateway API 支持同时会自动设置 enable-envoy-config hostNetwork: enabled: false # Configure whether the Envoy listeners should be exposed on the host network. nodes: matchLabels: {} # Specify the nodes where the Ingress listeners should be exposed启用后Gateway的宿主机监听端口通过spec.listeners.port指定有两个硬性要求端口在每个Gateway资源内必须唯一建议选用大于 1023 的端口特权端口的处理见下文 绑定特权端口 一节。原文档同时给出警告配置失误可能导致端口冲突——需要为每个 Gateway 配置在所有暴露了 Gateway API 监听器的 Cilium 节点上都仍然空闲的唯一端口。另一个值得注意的实现细节Gateway状态中的GatewayStatusAddress字段最多承载 16 个地址。Cilium 在 Host Network 模式下会对节点地址自动排序保证多个节点上报的地址经过一致的选取逻辑从而使 Gateway 状态中的地址集合保持稳定而不是随节点列表顺序漂移。从部署链路看Helm 值最终会写入 cilium-agent 的配置cilium-configmap.yaml 中由gatewayAPI.hostNetwork.enabled渲染出gateway-api-hostnetwork-enabled配置项由gatewayAPI.hostNetwork.nodes.matchLabels渲染出gateway-api-hostnetwork-nodelabelselector经mapToString序列化为字符串cilium-agent 据此决定是否按节点标签暴露监听器。绑定特权端口≤1023默认情况下Cilium 的 L7 Envoy 进程不具备任何 Linux capability因此不允许监听 1023 及以下的特权端口。如果你需要监听1023的端口例如对外直接用 80/443需要做两件事设置 Helm 值envoy.securityContext.capabilities.keepCapNetBindServicetrue给对应的容器 capability 列表中添加NET_BIND_SERVICE。注意values.yaml 中的注释明确说明 NET_BIND_SERVICEis the only capability that can be passed to the Envoy process即这是唯一可以传递给 Envoy 进程的 capability同时注释也提醒要保留列表中已有的其他 capability只追加原文档注释 Add NET_BIND_SERVICE to the list (keep the others!)。capability 加在哪取决于 Envoy 的部署形态Standalone DaemonSet 模式Envoy 独立部署envoy.securityContext.capabilities.envoyEmbedded 模式Envoy 嵌入 cilium-agentsecurityContext.capabilities.ciliumAgent两种形态的完整 Helm 配置继承自原文档的 tabs 示例Standalone DaemonSet 模式gatewayAPI: enabled: true hostNetwork: enabled: true envoy: enabled: true securityContext: capabilities: keepCapNetBindService: true envoy: # Add NET_BIND_SERVICE to the list (keep the others!) - NET_BIND_SERVICEEmbedded 模式gatewayAPI: enabled: true hostNetwork: enabled: true envoy: securityContext: capabilities: keepCapNetBindService: true securityContext: capabilities: ciliumAgent: # Add NET_BIND_SERVICE to the list (keep the others!) - NET_BIND_SERVICE在模板层面可以验证这条链路cilium-envoy 独立 DaemonSet 以hostNetwork: true方式运行并且仅在keepCapNetBindService为真时才向容器传递NET_BIND_SERVICE——也就是说Host Network 模式下独立 Envoy 本身跑在宿主机网络命名空间里特权端口的绑定能力由上述 capability 配置解锁。只在部分节点上部署 Gateway API 监听器Cilium Gateway API 的 Envoy 监听器可以只暴露到节点子集上。这个能力仅在 Host Network 模式下可用通过 Helm 值中的节点标签选择器配置gatewayAPI: enabled: true hostNetwork: enabled: true nodes: matchLabels: role: infra component: gateway-api配置后Gateway API 的 Envoy 监听器只会部署在匹配这些标签的 Cilium 节点上空选择器matchLabels: {}则匹配所有节点功能继续在全部 Cilium 节点上暴露——这正是 values.yaml 中该字段的默认状态。values 文件里给出的官方示例用法是按操作系统或主机名过滤matchLabels: kubernetes.io/os: linux kubernetes.io/hostname: kind-worker这种专用网关节点的部署形态适合生产环境把网关流量收敛到打了专用标签的节点池既便于网络规划防火墙策略、专线接入也避免在所有节点上打开相同的监听端口、扩大潜在端口冲突面。小结Host Network 模式是 Cilium Gateway API 在缺少 LoadBalancer Service 时的替代暴露路径通过gatewayAPI.hostNetwork.enabled一键切换暴露模型监听器绑定所有接口、端口由spec.listeners.port控制建议 1023≤1023 需配合NET_BIND_SERVICEcapability并可用nodes.matchLabels把监听器收敛到节点子集。需要注意的三条边界——与 LoadBalancer 模式互斥、与TCPRoute/UDPRoute不兼容、跨节点端口冲突需自行规避——都是该模式的直接行为约束配置前务必确认目标环境满足这些前提。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表