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 地址。有效值为
LoadBalancerIP
或Network
。使用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
资源。
流程
为服务创建一个带有所需 IP 的
IPAddressPool
CR:创建一个文件,如
ip-addr-pool.yaml
,其内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: example-pool namespace: metallb-system spec: addresses: - 172.19.0.100/32
运行以下命令,为 IP 地址池应用配置:
$ oc apply -f ip-addr-pool.yaml
创建
Service
和EgressService
CR:创建一个文件,如
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: ""
注意如果使用
sourceIPBy: "LoadBalancerIP"
设置,您必须在BGPAdvertisement
自定义资源(CR) 中指定 load-balancer 节点。运行以下命令,为服务和出口服务应用配置:
$ oc apply -f service-egress-service.yaml
创建
BGPAdvertisement
CR 来公告服务:创建一个文件,如
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 的流量使用相同的返回路径。
验证
运行以下命令,验证您可以访问 MetalLB 服务后运行的 pod 的应用程序端点:
$ curl <external_ip_address>:<port_number> 1
- 1
- 更新外部 IP 地址和端口号,以适合您的应用程序端点。
-
如果您将
LoadBalancer
服务的入口 IP 地址分配为出口流量的源 IP 地址,请使用tcpdump
等工具分析外部客户端接收的数据包来验证此配置。