ServiceGroup#

API Version: purelb.io/v2 Short Names: sg, sgs Scope: Namespaced

ServiceGroupSpec#

Exactly one of local, remote, or netbox must be specified.

FieldTypeRequiredDescription
localServiceGroupLocalSpecNoPool of addresses on the same subnet as nodes
remoteServiceGroupRemoteSpecNoPool of addresses on a different subnet (for BGP routing)
netboxServiceGroupNetboxSpecNoExternal IPAM via Netbox

ServiceGroupLocalSpec#

FieldTypeDefaultDescription
v4poolAddressPoolSingle IPv4 pool (shorthand for v4pools with one entry)
v6poolAddressPoolSingle IPv6 pool (shorthand for v6pools with one entry)
v4pools[]AddressPoolArray of IPv4 pools
v6pools[]AddressPoolArray of IPv6 pools
skipIPv6DADboolfalseDisable IPv6 Duplicate Address Detection
multiPoolboolfalseAllocate one IP per range per family with active nodes
balancePoolsboolfalseAllocate to range with fewest IPs in use (mutually exclusive with multiPool)

ServiceGroupRemoteSpec#

FieldTypeDefaultDescription
v4poolAddressPoolSingle IPv4 pool
v6poolAddressPoolSingle IPv6 pool
v4pools[]AddressPoolArray of IPv4 pools
v6pools[]AddressPoolArray of IPv6 pools
multiPoolboolfalseAllocate one IP per range per family with active nodes
balancePoolsboolfalseAllocate to range with fewest IPs in use (mutually exclusive with multiPool)

ServiceGroupNetboxSpec#

FieldTypeRequiredDescription
urlstringYesBase URL of the Netbox API
tenantstringYesNetbox tenant name
aggregationstringNoOverride address mask ("default" or "8"-"128")

AddressPool#

FieldTypeRequiredDescription
poolstringYesAddress range: CIDR (192.168.1.240/29) or range (192.168.1.240-192.168.1.250)
subnetstringYesCIDR of the containing network (192.168.1.0/24). All pool addresses must be within this subnet.
aggregationstringNoAddress mask override. "default" uses subnet mask. Explicit values like "/32" or "/128" create host routes.

ServiceGroupStatus#

FieldTypeDescription
allocatedCountintNumber of IP addresses currently allocated from this pool

LBNodeAgent#

API Version: purelb.io/v2 Short Names: lbna, lbnas Scope: Namespaced

LBNodeAgentSpec#

FieldTypeDescription
localLBNodeAgentLocalSpecLocal announcer configuration

LBNodeAgentLocalSpec#

FieldTypeDefaultDescription
localInterfacestring"default"Interface for local address announcement. "default" uses the interface with the default route. Regex patterns match interface names.
dummyInterfacestring"kube-lb0"Dummy interface for remote addresses. Created automatically if it doesn’t exist.
interfaces[]stringAdditional interfaces for subnet detection in election
garpConfigGARPConfigGratuitous ARP configuration
addressConfigAddressConfigAddress lifetime and flag configuration

GARPConfig#

FieldTypeDefaultDescription
enabledbooltrueSend GARP packets when addresses are added
initialDelaystring (duration)"100ms"Wait time before first GARP
countint (1-10)3Number of GARP packets to send
intervalstring (duration)"500ms"Time between GARP packets
verifyBeforeSendbooltrueVerify election win before each GARP

AddressConfig#

FieldTypeDescription
localInterfaceInterfaceAddressConfigConfiguration for addresses on the local interface
dummyInterfaceInterfaceAddressConfigConfiguration for addresses on the dummy interface

InterfaceAddressConfig#

FieldTypeDefault (local)Default (dummy)Description
validLifetimeint (seconds)3000 (permanent)Address validity. Non-zero prevents IFA_F_PERMANENT flag. Min when non-zero: 60.
preferredLifetimeint (seconds)Same as validLifetime0Preferred lifetime. Must be <= validLifetime.
noPrefixRoutebooltruefalsePrevent kernel from creating a prefix route for the address.

LBNodeAgentStatus#

FieldTypeDescription
activeLeasesintNumber of active election Leases this node holds

BGPConfiguration#

API Version: bgp.purelb.io/v1 Short Name: bgpconfig Scope: Namespaced

Global#

FieldTypeDefaultDescription
asnint32RequiredLocal Autonomous System Number
routerIDstringAuto-detectBGP router identifier. Empty for auto-detection, explicit IP, or template variable (${NODE_IP})
listenPortint32179BGP listen port
families[]stringRequiredAddress families: "ipv4-unicast", "ipv6-unicast"
listenAddresses[]stringIPs to listen on
gracefulRestartobjectGraceful restart configuration

netlinkImport#

FieldTypeDefaultDescription
enabledboolfalseEnable kernel route import into BGP
interfaceList[]stringInterface glob patterns (e.g., "kube-lb0")

Neighbors#

FieldTypeDescription
config.neighborAddressstringPeer IP address (required)
config.peerAsnint32Peer’s ASN (required)
config.descriptionstringHuman-readable description
config.authPasswordSecretRefobjectReference to Secret with BGP auth password
afiSafis[]objectPer-family configuration (family, enabled)
timers.holdTimeintBGP hold time (seconds)
timers.keepaliveIntervalintKeepalive interval (seconds)
transport.passiveModeboolWait for peer to initiate
nodeSelectorLabelSelectorLimit which nodes peer with this neighbor

BGPNodeStatus#

API Version: bgp.purelb.io/v1 Scope: Namespaced

Read-only status resource written by k8gobgp per node.

FieldTypeDescription
nodeNamestringKubernetes node name
asnint32Local ASN
routerIDstringRouter ID used
healthyboolAll neighbors established and no failures
neighborCountintNumber of configured neighbors
neighbors[]objectPer-neighbor state (address, state, ASN, prefixes sent/received, lastError, sessionUpSince)
lastUpdatedtimestampLast status write
conditions[]ConditionKubernetes-style condition objects