24.12. 配置出口服务


作为集群管理员,您可以使用 egress 服务为负载均衡器服务后面的 pod 配置出口流量。

重要

出口服务只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

您可以使用以下方法使用 EgressService 自定义资源(CR)管理出口流量:

  • 将负载均衡器服务 IP 地址分配为负载均衡器服务后面的 pod 的源 IP 地址。

    将负载均衡器 IP 地址分配在这个上下文中的源 IP 地址对于显示单个出口和入口点很有用。例如,在某些情况下,与负载均衡器服务后面的应用程序通信的外部系统可能会预期应用程序的源和目标 IP 地址相同。

    注意

    当您将负载均衡器服务 IP 地址分配给服务后面的 pod 的出口流量时,OVN-Kubernetes 会将入口和出口点限制为单一节点。这限制了 MetalLB 通常提供的流量的负载均衡。

  • 将负载均衡器后面的 pod 的出口流量分配给与默认节点网络不同的网络。

    这可用于将负载均衡器后面的应用程序的出口流量分配给与默认网络不同的网络。通常,不同的网络通过使用与网络接口关联的 VRF 实例来实施。

24.12.1. 出口服务自定义资源

EgressService 自定义资源中定义出口服务的配置。以下 YAML 描述了配置出口服务的字段:

apiVersion: k8s.ovn.org/v1
kind: EgressService
metadata:
  name: <egress_service_name> 1
  namespace: <namespace> 2
spec:
  sourceIPBy: <egress_traffic_ip> 3
  nodeSelector: 4
    matchLabels:
      node-role.kubernetes.io/<role>: ""
  network: <egress_traffic_network> 5
1
指定出口服务的名称。EgressService 资源的名称必须与您要修改的负载均衡器服务的名称匹配。
2
指定出口服务的命名空间。EgressService 的命名空间必须与您要修改的负载均衡器服务的命名空间匹配。egress 服务是命名空间范围的。
3
为服务后面的 pod 指定出口流量的源 IP 地址。有效值为 LoadBalancerIPNetwork。使用 LoadBalancerIP 值将 LoadBalancer 服务入口 IP 地址分配为出口流量的源 IP 地址。指定 Network 将网络接口 IP 地址分配为出口流量的源 IP 地址。
4
可选: 如果您将 LoadBalancerIP 值用于 sourceIPBy 规格,则单一节点处理 LoadBalancer 服务流量。使用 nodeSelector 字段来限制哪些节点可以被分配。当选择节点来处理服务流量时,OVN-Kubernetes 以以下格式标记节点:egress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""。如果没有指定 nodeSelector 字段,任何节点都可以管理 LoadBalancer 服务流量。
5
可选:指定出口流量的路由表。如果没有 network 规格,egress 服务将使用默认主机网络。

出口服务规格示例

apiVersion: k8s.ovn.org/v1
kind: EgressService
metadata:
  name: test-egress-service
  namespace: test-namespace
spec:
  sourceIPBy: "LoadBalancerIP"
  nodeSelector:
    matchLabels:
      vrf: "true"
  network: "2"

24.12.2. 部署出口服务

您可以部署出口服务,以管理 LoadBalancer 服务后面的 pod 的出口流量。

以下示例将出口流量配置为具有与 LoadBalancer 服务的入口 IP 地址相同的源 IP 地址。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。
  • 已配置了 MetalLB BGPPeer 资源。

流程

  1. 为服务创建一个带有所需 IP 的 IPAddressPool CR:

    1. 创建一个文件,如 ip-addr-pool.yaml,其内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      metadata:
        name: example-pool
        namespace: metallb-system
      spec:
        addresses:
        - 172.19.0.100/32
    2. 运行以下命令,为 IP 地址池应用配置:

      $ oc apply -f ip-addr-pool.yaml
  2. 创建 ServiceEgressService CR:

    1. 创建一个文件,如 service-egress-service.yaml,其内容类似以下示例:

      apiVersion: v1
      kind: Service
      metadata:
        name: example-service
        namespace: example-namespace
        annotations:
          metallb.universe.tf/address-pool: example-pool 1
      spec:
        selector:
          app: example
        ports:
          - name: http
            protocol: TCP
            port: 8080
            targetPort: 8080
        type: LoadBalancer
      ---
      apiVersion: k8s.ovn.org/v1
      kind: EgressService
      metadata:
        name: example-service
        namespace: example-namespace
      spec:
        sourceIPBy: "LoadBalancerIP" 2
        nodeSelector: 3
          matchLabels:
            node-role.kubernetes.io/worker: ""
      1
      LoadBalancer 服务使用 MetalLB 从 example-pool IP 地址池分配的 IP 地址。
      2
      本例使用 LoadBalancerIP 值来分配 LoadBalancer 服务的入口 IP 地址,作为出口流量的源 IP 地址。
      3
      当您指定 LoadBalancerIP 值时,单个节点处理 LoadBalancer 服务的流量。在本例中,只能选择具有 worker 标签的节点来处理流量。当选择节点时,OVN-Kubernetes 会以 egress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: "" 格式标记节点。
      注意

      如果使用 sourceIPBy: "LoadBalancerIP" 设置,您必须在 BGPAdvertisement 自定义资源(CR) 中指定 load-balancer 节点。

    2. 运行以下命令,为服务和出口服务应用配置:

      $ oc apply -f service-egress-service.yaml
  3. 创建 BGPAdvertisement CR 来公告服务:

    1. 创建一个文件,如 service-bgp-advertisement.yaml,其内容类似以下示例:

      apiVersion: metallb.io/v1beta1
      kind: BGPAdvertisement
      metadata:
        name: example-bgp-adv
        namespace: metallb-system
      spec:
        ipAddressPools:
        - example-pool
        nodeSelector:
        - matchLabels:
            egress-service.k8s.ovn.org/example-namespace-example-service: "" 1
      1
      在本例中,EgressService CR 将出口流量的源 IP 地址配置为使用负载均衡器服务 IP 地址。因此,您必须指定负载均衡器节点返回流量,以便为来自 pod 的流量使用相同的返回路径。

验证

  1. 运行以下命令,验证您可以访问 MetalLB 服务后运行的 pod 的应用程序端点:

    $ curl <external_ip_address>:<port_number> 1
    1
    更新外部 IP 地址和端口号,以适合您的应用程序端点。
  2. 如果您将 LoadBalancer 服务的入口 IP 地址分配为出口流量的源 IP 地址,请使用 tcpdump 等工具分析外部客户端接收的数据包来验证此配置。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.