apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  namespace: metallb-system
  name: doc-example-peer
spec:
  peerAddress: 10.0.0.1
  peerASN: 64501
  myASN: 64500
  routerID: 10.10.10.10
As a cluster administrator, you can add, modify, and delete Border Gateway Protocol (BGP) peers.
The MetalLB Operator uses the BGP peer custom resources to identify which peers that MetalLB speaker pods contact to start BGP sessions.
The peers receive the route advertisements for the load-balancer IP addresses that MetalLB assigns to services.
The fields for the BGP peer custom resource are described in the following table.
| Field | Type | Description | 
|---|---|---|
  | 
  | 
Specifies the name for the BGP peer custom resource.  | 
  | 
  | 
Specifies the namespace for the BGP peer custom resource.  | 
  | 
  | 
Specifies the Autonomous System Number (ASN) for the local end of the BGP session.
In all BGP peer custom resources that you add, specify the same value .
The range is   | 
  | 
  | 
Specifies the ASN for the remote end of the BGP session.
The range is   | 
  | 
  | 
Detects the ASN to use for the remote end of the session without explicitly setting it.
Specify   | 
  | 
  | 
Specifies the IP address of the peer to contact for establishing the BGP session.
If you use this field, you cannot specify a value in the   | 
  | 
  | 
Specifies the interface name to use when establishing a session.
Use this field to configure unnumbered BGP peering.
You must establish a point-to-point, layer 2 connection between the two BGP peers.
You can use unnumbered BGP peering with IPv4, IPv6, or dual-stack, but you must enable IPv6 RAs (Router Advertisements).
Each interface is limited to one BGP connection.
If you use this field, you cannot specify a value in the   | 
  | 
  | 
Optional: Specifies the IP address to use when establishing the BGP session. The value must be an IPv4 address.  | 
  | 
  | 
Optional: Specifies the network port of the peer to contact for establishing the BGP session.
The range is   | 
  | 
  | 
Optional: Specifies the duration for the hold time to propose to the BGP peer.
The minimum value is 3 seconds (  | 
  | 
  | 
Optional: Specifies the maximum interval between sending keep-alive messages to the BGP peer.
If you specify this field, you must also specify a value for the   | 
  | 
  | 
Optional: Specifies the router ID to advertise to the BGP peer. If you specify this field, you must specify the same value in every BGP peer custom resource that you add.  | 
  | 
  | 
Optional: Specifies the MD5 password to send to the peer for routers that enforce TCP MD5 authenticated BGP sessions.  | 
  | 
  | 
Optional: Specifies name of the authentication secret for the BGP Peer. The secret must live in the   | 
  | 
  | 
Optional: Specifies the name of a BFD profile.  | 
  | 
  | 
Optional: Specifies a selector, using match expressions and match labels, to control which nodes can connect to the BGP peer.  | 
  | 
  | 
Optional: Specifies that the BGP peer is multiple network hops away.
If the BGP peer is not directly connected to the same network, the speaker cannot establish a BGP session unless this field is set to   | 
  | 
  | 
Specifies how long BGP waits between connection attempts to a neighbor.  | 
| 
 The   | 
As a cluster administrator, you can add a BGP peer custom resource to exchange routing information with network routers and advertise the IP addresses for services.
Install the OpenShift CLI (oc).
Log in as a user with cluster-admin privileges.
Configure MetalLB with a BGP advertisement.
Create a file, such as bgppeer.yaml, with content like the following example:
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  namespace: metallb-system
  name: doc-example-peer
spec:
  peerAddress: 10.0.0.1
  peerASN: 64501
  myASN: 64500
  routerID: 10.10.10.10
Apply the configuration for the BGP peer:
$ oc apply -f bgppeer.yaml
This procedure illustrates how to:
Configure a set of address pools (pool1 and pool2).
Configure a set of BGP peers (peer1 and peer2).
Configure BGP advertisement to assign pool1 to peer1 and pool2 to peer2.
Install the OpenShift CLI (oc).
Log in as a user with cluster-admin privileges.
Create address pool pool1.
Create a file, such as ipaddresspool1.yaml, with content like the following example:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  namespace: metallb-system
  name: pool1
spec:
  addresses:
    - 4.4.4.100-4.4.4.200
    - 2001:100:4::200-2001:100:4::400
Apply the configuration for the IP address pool pool1:
$ oc apply -f ipaddresspool1.yaml
Create address pool pool2.
Create a file, such as ipaddresspool2.yaml, with content like the following example:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  namespace: metallb-system
  name: pool2
spec:
  addresses:
    - 5.5.5.100-5.5.5.200
    - 2001:100:5::200-2001:100:5::400
Apply the configuration for the IP address pool pool2:
$ oc apply -f ipaddresspool2.yaml
Create BGP peer1.
Create a file, such as bgppeer1.yaml, with content like the following example:
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  namespace: metallb-system
  name: peer1
spec:
  peerAddress: 10.0.0.1
  peerASN: 64501
  myASN: 64500
  routerID: 10.10.10.10
Apply the configuration for the BGP peer:
$ oc apply -f bgppeer1.yaml
Create BGP peer2.
Create a file, such as bgppeer2.yaml, with content like the following example:
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  namespace: metallb-system
  name: peer2
spec:
  peerAddress: 10.0.0.2
  peerASN: 64501
  myASN: 64500
  routerID: 10.10.10.10
Apply the configuration for the BGP peer2:
$ oc apply -f bgppeer2.yaml
Create BGP advertisement 1.
Create a file, such as bgpadvertisement1.yaml, with content like the following example:
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: bgpadvertisement-1
  namespace: metallb-system
spec:
  ipAddressPools:
    - pool1
  peers:
    - peer1
  communities:
    - 65535:65282
  aggregationLength: 32
  aggregationLengthV6: 128
  localPref: 100
Apply the configuration:
$ oc apply -f bgpadvertisement1.yaml
Create BGP advertisement 2.
Create a file, such as bgpadvertisement2.yaml, with content like the following example:
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: bgpadvertisement-2
  namespace: metallb-system
spec:
  ipAddressPools:
    - pool2
  peers:
    - peer2
  communities:
    - 65535:65282
  aggregationLength: 32
  aggregationLengthV6: 128
  localPref: 100
Apply the configuration:
$ oc apply -f bgpadvertisement2.yaml
You can expose a service through a virtual routing and forwarding (VRF) instance by associating a VRF on a network interface with a BGP peer.
| 
 Exposing a service through a VRF on a BGP peer is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process. For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.  | 
By using a VRF on a network interface to expose a service through a BGP peer, you can segregate traffic to the service, configure independent routing decisions, and enable multi-tenancy support on a network interface.
| 
 By establishing a BGP session through an interface belonging to a network VRF, MetalLB can advertise services through that interface and enable external traffic to reach the service through this interface. However, the network VRF routing table is different from the default VRF routing table used by OVN-Kubernetes. Therefore, the traffic cannot reach the OVN-Kubernetes network infrastructure. To enable the traffic directed to the service to reach the OVN-Kubernetes network infrastructure, you must configure routing rules to define the next hops for network traffic. See the   | 
These are the high-level steps to expose a service through a network VRF with a BGP peer:
Define a BGP peer and add a network VRF instance.
Specify an IP address pool for MetalLB.
Configure a BGP route advertisement for MetalLB to advertise a route using the specified IP address pool and the BGP peer associated with the VRF instance.
Deploy a service to test the configuration.
You installed the OpenShift CLI (oc).
You logged in as a user with cluster-admin privileges.
You defined a NodeNetworkConfigurationPolicy to associate a Virtual Routing and Forwarding (VRF) instance with a network interface. For more information about completing this prerequisite, see the Additional resources section.
You installed MetalLB on your cluster.
Create a BGPPeer custom resources (CR):
Create a file, such as frrviavrf.yaml, with content like the following example:
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: frrviavrf
  namespace: metallb-system
spec:
  myASN: 100
  peerASN: 200
  peerAddress: 192.168.130.1
  vrf: ens4vrf (1)
| 1 | Specifies the network VRF instance to associate with the BGP peer. MetalLB can advertise services and make routing decisions based on the routing information in the VRF. | 
| 
 You must configure this network VRF instance in a   | 
Apply the configuration for the BGP peer by running the following command:
$ oc apply -f frrviavrf.yaml
Create an IPAddressPool CR:
Create a file, such as first-pool.yaml, with content like the following example:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.169.10.0/32
Apply the configuration for the IP address pool by running the following command:
$ oc apply -f first-pool.yaml
Create a BGPAdvertisement CR:
Create a file, such as first-adv.yaml, with content like the following example:
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: first-adv
  namespace: metallb-system
spec:
  ipAddressPools:
    - first-pool
  peers:
    - frrviavrf (1)
| 1 | In this example, MetalLB advertises a range of IP addresses from the first-pool IP address pool to the frrviavrf BGP peer. | 
Apply the configuration for the BGP advertisement by running the following command:
$ oc apply -f first-adv.yaml
Create a Namespace, Deployment, and Service CR:
Create a file, such as deploy-service.yaml, with content like the following example:
apiVersion: v1
kind: Namespace
metadata:
  name: test
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: server
  namespace: test
spec:
  selector:
    matchLabels:
      app: server
  template:
    metadata:
      labels:
        app: server
    spec:
      containers:
      - name: server
        image: nginx
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: server1
  namespace: test
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: server
  type: LoadBalancer
Apply the configuration for the namespace, deployment, and service by running the following command:
$ oc apply -f deploy-service.yaml
Identify a MetalLB speaker pod by running the following command:
$ oc get -n metallb-system pods -l component=speaker
NAME            READY   STATUS    RESTARTS   AGE
speaker-c6c5f   6/6     Running   0          69m
Verify that the state of the BGP session is Established in the speaker pod by running the following command, replacing the variables to match your configuration:
$ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> neigh"
BGP neighbor is 192.168.30.1, remote AS 200, local AS 100, external link
  BGP version 4, remote router ID 192.168.30.1, local router ID 192.168.30.71
  BGP state = Established, up for 04:20:09
...
Verify that the service is advertised correctly by running the following command:
$ oc exec -n metallb-system <speaker_pod> -c frr -- vtysh -c "show bgp vrf <vrf_name> ipv4"
You can specify the node selectors field to control which nodes can connect to a BGP peer.
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-nodesel
  namespace: metallb-system
spec:
  peerAddress: 10.0.20.1
  peerASN: 64501
  myASN: 64500
  nodeSelectors:
  - matchExpressions:
    - key: kubernetes.io/hostname
      operator: In
      values: [compute-1.example.com, compute-2.example.com]
You can specify a BFD profile to associate with BGP peers. BFD compliments BGP by providing more rapid detection of communication failures between peers than BGP alone.
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-peer-bfd
  namespace: metallb-system
spec:
  peerAddress: 10.0.20.1
  peerASN: 64501
  myASN: 64500
  holdTime: "10s"
  bfdProfile: doc-example-bfd-profile-full
| 
 Deleting the bidirectional forwarding detection (BFD) profile and removing the   | 
To support dual-stack networking, add one BGP peer custom resource for IPv4 and one BGP peer custom resource for IPv6.
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-dual-stack-ipv4
  namespace: metallb-system
spec:
  peerAddress: 10.0.20.1
  peerASN: 64500
  myASN: 64500
---
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: doc-example-dual-stack-ipv6
  namespace: metallb-system
spec:
  peerAddress: 2620:52:0:88::104
  peerASN: 64500
  myASN: 64500
| 
 The  For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.  | 
To configure unnumbered BGP peering, specify the interface in the spec.interface field by using the following example configuration:
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: peer-unnumber
  namespace: metallb-system
spec:
  myASN: 64512
  ASN: 645000
  interface: net0
| 
 To use the  If you use this field, you cannot specify a value in the   |