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. |
|
|
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: registry.redhat.io/ubi9/ubi
ports:
- name: http
containerPort: 30100
command: ["/bin/sh", "-c"]
args: ["sleep INF"]
---
apiVersion: v1
kind: Service
metadata:
name: server1
namespace: test
spec:
ports:
- name: http
port: 30100
protocol: TCP
targetPort: 30100
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