F5 EPP Custom Resource Reference¶
The F5EPP Custom Resource (CR) configures and manages an Endpoint Picker (EPP) instance for a target Kubernetes InferencePool.
Minimal Configuration¶
Only two parameters are strictly required to instantiate an F5EPP resource:
spec.poolRef.namespec.engine
All other parameters are optional and override the automatic controller-generated defaults.
Field Specifications¶
metadata¶
Configures standard Kubernetes object metadata for the F5EPP resource.
Parameter |
Type |
Required |
Description |
|---|---|---|---|
|
String |
Yes |
Unique name of the |
|
String |
Yes |
Namespace for the |
spec¶
Configures the operational parameters, backend engine properties, and deployment configuration for the EPP instance.
Parameter |
Type |
Default |
Description |
|---|---|---|---|
|
Object |
Required |
Defines the 1:1 binding to the target |
|
Enum |
Required |
Defines the underlying inference server backend: |
|
Enum |
|
Defines pool deployment topology: |
|
Integer |
|
KV cache block size (in tokens) configured on the backend model servers (e.g., |
|
String (URL) |
|
NATS message bus endpoint for Dynamo cache events (e.g., |
|
Object |
|
Configures explicit tokenizer loading. If unconfigured, the picker auto-discovers the model name from engine metrics. See |
|
Object |
|
Overrides default network listener and pod polling intervals. See |
|
Integer |
|
Number of EPP pods to deploy (Range: |
|
Object |
|
Strategic merge patch applied to the generated EPP deployment pod template (e.g., node affinity, tolerations, resource limits, sidecars). See |
|
Object |
|
Overrides generated EPP picker configuration logic. See |
|
Object |
|
Optional fluent-bit logging sidecar. When enabled, the EPP’s logs are shipped to stdout and/or fluentd. Omitted or disabled, the EPP pod runs with no fluentbit sidecar. See |
spec.poolRef¶
Defines the explicit Kubernetes target resource for the EPP binding.
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
string |
Name of the InferencePool this EPP serves. Must exist in the same namespace as this resource. Required. DNS-1123 subdomain (dots allowed). Max length: |
— |
|
string |
API group of the referenced InferencePool. Only |
|
|
string |
Kind of the referenced resource. Only |
|
poolRef is immutable: every rendered object is named from the pool, and cleanup derives those names from this field. To serve a different pool, delete this resource and create one for that pool.
spec.tokenizer¶
Configures custom tokenizer behavior when automatic metric-based discovery is insufficient (e.g., when model aliases are used or files are stored locally).
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
string |
Model name whose tokenizer to load, usually the HuggingFace repository name. Setting it is what turns this block into a pin. Leaving it out means the picker takes the model name from the engine’s metrics; |
|
|
enum |
Where the tokenizer files come from. |
— |
|
string |
Path to the tokenizer files inside the picker’s container. Required when |
|
|
string |
Name of a PVC you have already created in this namespace, mounted where the picker caches downloaded tokenizer files. Without it that cache is a temporary directory thrown away on every pod restart. The controller only references the claim; it never creates, resizes or deletes storage. Max length: |
|
|
object |
Secret in this namespace holding a HuggingFace access token, passed to the picker as |
|
spec.tokenizer.hfTokenSecret¶
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
string |
Name of the Secret, in the same namespace as this resource. Required per entry. Max length: |
— |
|
string |
Key inside that Secret holding the token. Max length: |
|
Note: Getting the HuggingFace token wrong fails quietly — without a usable token every tokenizer download is refused with
401, so the picker cannot compare prompts at all, while it keeps serving traffic and reporting healthy. Naming a Secret that does not exist yet does not block the pod: it starts without a token instead of failing to start.
spec.server¶
Configures network scrape target configurations and listener parameters.
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
integer |
Port on each model-server pod that the picker scrapes for metrics. Range: |
vllm: |
|
string (Go duration) |
How often the picker re-reads each model server’s metrics, e.g. |
|
|
boolean |
Whether to require TLS on the gRPC listener that BNK calls. Must be |
|
|
boolean |
Whether the picker requires a token on its own |
|
spec.podTemplate¶
Defines custom parameters injected into the generated Deployment specification.
Reserved (Forbidden) Fields¶
The controller explicitly rejects modifications to the following fields to guarantee system stability:
spec.containers[*].argsspec.containers[*].commandspec.containers[*].portsspec.containers[*].readinessProbespec.containers[*].lifecyclespec.serviceAccountNameThe
epp-configvolume and volume mount path.Reserved Environment Variables:
EPP_POOL_NAME,EPP_POOL_NAMESPACE,EPP_CONFIG,EPP_CONFIG_FILE
NOTE: The
livenessProbeconfiguration is not reserved and can be customized to tune container failure thresholds.
spec.eppConfig¶
Provides overrides for internal picker execution profiles. config and configMapRef are mutually exclusive.
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
object |
Settings merged on top of the controller-generated configuration. Plugins merge by name, profiles merge by name and their entries by pluginRef. Setting one parameter, or one weight, leaves everything else generated and still on the upgrade path — send only the keys you are changing. See sub-table below. |
|
|
object |
Names a ConfigMap you supply carrying the picker’s entire configuration in two keys: |
|
spec.eppConfig.config¶
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
list of objects |
Plugin entries merged over the generated ones by name (a plugin’s name defaults to its type). Setting |
|
|
list of objects |
Scoring profiles merged over the generated ones by name. Within a profile, entries merge by |
|
|
list of strings |
Experimental picker features to switch on, by name. Replaces the generated list outright rather than adding to it, so repeat any generated entry you still want. |
|
|
object |
Queue capacity and priority bands, honoured only when the |
|
Note: Direct parameter settings for
eppConfig.config.dataandeppConfig.config.saturationDetectorare invalid and will be rejected.
Configure data extraction settings via
config.plugins.Configure saturation thresholds through the
utilization-detectorplugin parameters (queueDepthThreshold,kvCacheUtilThreshold,metricsStalenessThreshold,headroom).
spec.fluentBit¶
Configures the optional fluent-bit logging sidecar for the EPP pod. When enabled, fluent-bit ships the EPP’s logs to stdout and/or forwards them to a central fluentd. Omitted or disabled, the EPP pod runs with no fluent-bit sidecar.
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
boolean |
Whether to add the fluent-bit sidecar. Required when this block is set. |
— |
|
string |
Overrides the fluent-bit image. Leave empty to use the platform-resolved image. |
|
|
object |
Resource requests and limits for the sidecar container, each a map of quantity strings (e.g. |
|
|
object |
Tunes the fluent-bit engine (log level, flush interval, input). See table below. |
|
|
object |
Selects where fluent-bit ships logs (stdout and/or fluentd). See table below. |
|
spec.fluentBit.fluentbit¶
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
string |
fluent-bit’s own log level: |
|
|
string |
Flush interval, in seconds. |
|
|
object |
Tunes the named-pipe input buffer and poll interval. See table below. |
|
spec.fluentBit.fluentbit.input¶
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
string |
Buffer size for the input plugin, e.g. |
|
|
integer |
Poll interval, in seconds. |
|
|
integer |
Poll interval, in nanoseconds (added to |
|
spec.fluentBit.output¶
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
boolean |
Whether to keep the stdout output, so |
|
|
object |
Forwards logs to a central fluentd. See table below. |
|
spec.fluentBit.output.fluentd¶
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
boolean |
Whether to forward logs to a central fluentd. Required when this block is set. Forwarding requires mTLS; enabling it without a valid |
— |
|
string |
Hostname or address of the central fluentd. |
|
|
integer |
Port of the central fluentd forward input. |
|
|
boolean |
Whether to emit event timestamps as integers, as some fluentd versions require. |
|
|
object |
mTLS configuration for the fluentd forward output. See table below. |
|
spec.fluentBit.output.fluentd.tls¶
Parameter |
Unit |
Description |
Default |
|---|---|---|---|
|
boolean |
Whether to use mTLS on the connection to fluentd. Required when this block is set. |
— |
|
boolean |
Whether fluent-bit verifies the fluentd server certificate. |
|
|
integer |
fluent-bit TLS debug verbosity. Range: |
|
|
string |
Name of a pre-created Secret in this namespace holding the mTLS client certificate. Leave empty to use the platform-provided client certificate. Max length: |
|
Note: EPP fluent-bit to fluentd TLS communication is not supported when f5-cert-manager is being used.
Resource Status¶
The controller populates status with runtime metrics, managed resource references, and state validations.
status.conditions¶
Conditions follow a strict dependency sequence; subsequent conditions require preceding conditions to evaluate to True.
Condition |
Description |
|---|---|
|
Resource specification has passed structural and rule validation. |
|
The referenced |
|
Controller has provisioned all child resources ( |
|
Minimum required EPP pods are running ( |
status.resolved¶
Displays active runtime configurations applied to the operational EPP pod.
Parameter |
Type |
Description |
|---|---|---|
|
String |
Active inference engine ( |
|
String |
Active pool mode ( |
|
String |
Active model identifier. Empty if dynamically discovered. |
|
String |
Origin of model identification ( |
|
String |
Origin of runtime EPP configuration ( |
|
String |
Resolved NATS endpoint URL (Dynamo engine only). |
|
Integer |
Active KV cache block token sizing. |
status.refs¶
Contains generated resource identifiers managed by the controller.
Parameter |
Type |
Description |
|---|---|---|
|
String |
Name of the generated ConfigMap ( |
|
String |
Name of the generated Deployment ( |
|
String |
Name of the generated Service ( |
NOTE: EPP deployment state metrics are exposed via
status.replicasandstatus.readyReplicas.
Validation Rules & Dependencies¶
Engine and Transport Requirements:
spec.engine: dynamorequiresspec.natsURLto be populated. ThenatsURLparameter is rejected for all non-Dynamo engines.Tokenizer Parameter Gates:
spec.tokenizer.sourceandspec.tokenizer.pathrequirespec.tokenizer.nameto be populated.Local Tokenizer Path: When
spec.tokenizer.source: localis specified,spec.tokenizer.pathmust be defined.Binding Cardinality: EPP-to-InferencePool binding is strictly 1:1. Duplicate bindings to an
InferencePoolcause validation failures onResolvedRefs.Configuration Mutex: Configuring both
spec.eppConfig.configandspec.eppConfig.configMapRefsimultaneously will cause a validation rejection.Non-empty Configuration Overrides: If
spec.eppConfig.configis set, it must contain at least one definition block (plugins,schedulingProfiles,featureGates, orflowControl).Failure Modes: EPP consulting failure behaviors are defined at the pool level via
InferencePool.spec.endpointPickerRef.failureMode(Defaults toFailClose).Namespace Scoping: The controller resolves
F5EPPinstances only within namespaces listed inCNEInstance.spec.eppNamespaces.fluent-bit Sidecar:
spec.fluentBit.enabledmust betrueto render the sidecar. If no fluent-bit image can be resolved (neitherspec.fluentBit.imagenor the platform-provided image), the EPP pod is created without the sidecar.fluentd mTLS: Forwarding to a central fluentd requires mTLS; enabling
spec.fluentBit.output.fluentdwithout a validtlsconfiguration results in logs not being delivered. EPP fluent-bit to fluentd TLS communication is not supported when f5-cert-manager is being used.