Deploying an egress service
You can deploy an egress service to manage egress traffic for pods behind a LoadBalancer service.
The following example configures the egress traffic to have the same source IP address as the ingress IP address of the LoadBalancer service.
-
Install the OpenShift CLI (
oc). -
Log in as a user with
cluster-adminprivileges. -
You configured MetalLB
BGPPeerresources.
-
Create an
IPAddressPoolCR with the desired IP for the service:-
Create a file, such as
ip-addr-pool.yaml, with content like the following example:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: example-pool namespace: metallb-system spec: addresses: - 172.19.0.100/32 -
Apply the configuration for the IP address pool by running the following command:
$ oc apply -f ip-addr-pool.yaml
-
-
Create
ServiceandEgressServiceCRs:-
Create a file, such as
service-egress-service.yaml, with content like the following example:apiVersion: v1 kind: Service metadata: name: example-service namespace: example-namespace annotations: metallb.io/address-pool: example-pool 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" nodeSelector: matchLabels: node-role.kubernetes.io/worker: ""where:
metadata.annotations.metallb.io/address-pool-
Specifies the
LoadBalancerservice uses the IP address assigned by MetalLB from theexample-poolIP address pool. spec.sourceIPBy-
This example uses the
LoadBalancerIPvalue to assign the ingress IP address of theLoadBalancerservice as the source IP address of egress traffic. spec.nodeSelector-
When you specify the
LoadBalancerIPvalue, a single node handles theLoadBalancerservice’s traffic. In this example, only nodes with theworkerlabel can be selected to handle the traffic. When a node is selected, OVN-Kubernetes labels the node in the following formategress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: "".If you use the
sourceIPBy: "LoadBalancerIP"setting, you must specify the load-balancer node in theBGPAdvertisementcustom resource (CR).
-
Apply the configuration for the service and egress service by running the following command:
$ oc apply -f service-egress-service.yaml
-
-
Create a
BGPAdvertisementCR to advertise the service:-
Create a file, such as
service-bgp-advertisement.yaml, with content like the following example:apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: example-bgp-adv namespace: metallb-system spec: ipAddressPools: - example-pool nodeSelectors: - matchLabels: egress-service.k8s.ovn.org/example-namespace-example-service: ""where:
spec.nodeSelectors.matchLabels-
In the example, the
EgressServiceCR configures the source IP address for egress traffic to use the load-balancer service IP address. Therefore, you must specify the load-balancer node for return traffic to use the same return path for the traffic originating from the pod.
-
-
Verify that you can access the application endpoint of the pods running behind the MetalLB service by running the following command:
$ curl <external_ip_address>:<port_number><external_ip_address>:<port_number-
Update the external IP address and port number to suit your application endpoint.
-
If you assigned the
LoadBalancerservice’s ingress IP address as the source IP address for egress traffic, verify this configuration by using tools such astcpdumpto analyze packets received at the external client.