×

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

出站服务仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且功能可能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您抢先体验即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参见技术预览功能支持范围

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

  • 为负载均衡器服务背后的 Pod 的出站流量分配负载均衡器服务的 IP 地址作为源 IP 地址。

    在这种情况下,将负载均衡器 IP 地址分配为源 IP 地址对于呈现单一出站和入站点很有用。例如,在某些情况下,与负载均衡器服务背后的应用程序通信的外部系统可以预期应用程序的源 IP 地址和目标 IP 地址相同。

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

  • 将负载均衡器背后的 Pod 的出站流量分配到与默认节点网络不同的网络。

    这对于将负载均衡器背后应用程序的出站流量分配到与默认网络不同的网络很有用。通常,不同的网络是通过使用与网络接口关联的 VRF 实例实现的。

出站服务自定义资源

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的命名空间必须与您要修改的负载均衡器服务的命名空间匹配。出站服务是命名空间范围的。
3 指定服务背后 Pod 出站流量的源 IP 地址。有效值为LoadBalancerIPNetwork。使用LoadBalancerIP值将LoadBalancer服务入口 IP 地址分配为出站流量的源 IP 地址。指定Network将网络接口 IP 地址指定为出站流量的源 IP 地址。
4 可选:如果您对sourceIPBy规范使用LoadBalancerIP值,则单个节点将处理LoadBalancer服务流量。使用nodeSelector字段来限制可以为此任务分配哪个节点。选择一个节点来处理服务流量后,OVN-Kubernetes 将以以下格式标记该节点:egress-service.k8s.ovn.org/-: ""。当未指定nodeSelector字段时,任何节点都可以管理LoadBalancer服务流量。
5 可选:指定出站流量的路由表。如果您不包含network规范,则出站服务将使用默认主机网络。
出站服务规范示例
apiVersion: k8s.ovn.org/v1
kind: EgressService
metadata:
  name: test-egress-service
  namespace: test-namespace
spec:
  sourceIPBy: "LoadBalancerIP"
  nodeSelector:
    matchLabels:
      vrf: "true"
  network: "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/-: ""

      如果您使用sourceIPBy: "LoadBalancerIP"设置,则必须在BGPAdvertisement自定义资源 (CR) 中指定负载均衡器节点。

    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等工具分析外部客户端接收到的数据包来验证此配置。