TMM Rolling Update¶
The TMM rolling update feature enables the smooth execution of F5 Ingress deployment updates, to ensure that the TMM pod is readily available to receive network traffic. This is achieved using readinessGates (config and routing gates) which ensures incremental replacement of existing TMM pods with new ones. Kubernetes waits for the new TMM pods before removing the old TMM pods. For more information about readinessGates, see TMM pod readiness.
The number of TMM pods upgrading at a time is dependent
on maxUnavailable and maxSurge parameters defined in Kubernetes and
the number of TMM replicas. Users can customize the default maxUnavailable and maxSurge settings in the values file. Refer to Step 8 below for an example override values file. For more information on maxUnavailable and maxSurge parameters, see Rolling Update Deployment.
Important: Based on the
maxUnavailable,maxSurge, and TMM replicas configuration, ensure that you have:
Enough resources available.
Additional SelfIPs and translationIPs (SNAT and CGNAT).
To upgrade the F5Ingress, follow the instructions below:
Install the CRD Conversion pod.
In this example, the new version of f5-crdconversion helm chart is 0.16.15-0.0.10.
helm install crd-conv tar/f5-crdconversion-0.16.15-0.0.10.tgz -f crd-conv-values.yaml -n spk-ingress
Sample Output:
NAME: f5-crd-conversion LAST DEPLOYED: Sat Apr 5 10:19:26 2025 NAMESPACE: spk-ingress STATUS: deployed REVISION: 1 TEST SUITE: None
Run
cat crd-conv-values.yamlto verify thecrd-conv-values.yamlcontents.Sample Output:
crdconversion: image: repository: repo.f5.com/images rabbitmqNamespace: spk-ingress fluentbit_sidecar: image: repository: repo.f5.com/images
Create a template for common CRDs from the CRD bundle.
helm template tar/f5-spk-crds-common-8.5.2-0.1.4.tgz -f crd-values.yaml > crd_commons-spk-utilities_conversionns.yaml
Run the
oc applycommand to apply the Common CRDs template.oc apply -f crd_commons-spk-utilities_conversionns.yaml
Sample Output:
customresourcedefinition.apiextensions.k8s.io/f5-big-cne-addresslists.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-cne-portlists.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-context-globals.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-context-secures.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-ddos-globals.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-fw-policies.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-fw-rulelists.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-log-hslpubs.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-log-profiles.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-bnkgateways.k8s.f5net.com unchanged customresourcedefinition.apiextensions.k8s.io/l4routes.gateway.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-egresses.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-egressdiameters.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-egresshttp2s.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressdiameters.k8s.f5net.com configured apiVersion: "k8s.f5net.com/v1" customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressegressudps.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressgtps.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingresshttp2s.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressngaps.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingresssips.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingresstcps.ingresstcp.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressudps.ingressudp.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-pools.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-servicetypelbippools.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-statefulsets.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-traffic-distributions.k8s.f5net.com created
Create a template for SPK CRDs from the CRD bundle.
helm template tar/f5-spk-crds-service-proxy-8.5.2-0.1.4.tgz -f crd-values.yaml > crd_service-proxy-spk-utilities.yaml
Run the
oc applycommand to apply the SPK CRDs template.oc apply -f crd_service-proxy-spk-utilities.yaml
Sample Output:
customresourcedefinition.apiextensions.k8s.io/f5-big-cne-addresslists.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-cne-portlists.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-context-globals.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-context-secures.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-ddos-globals.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-fw-policies.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-fw-rulelists.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-log-hslpubs.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-big-log-profiles.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-bnkgateways.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/l4routes.gateway.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-egresses.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-egressdiameters.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-egresshttp2s.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressdiameters.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressegressudps.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressgtps.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingresshttp2s.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressngaps.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingresssips.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingresstcps.ingresstcp.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-ingressudps.ingressudp.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-pools.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-servicetypelbippools.k8s.f5net.com configured customresourcedefinition.apiextensions.k8s.io/f5-spk-statefulsets.k8s.f5net.com created customresourcedefinition.apiextensions.k8s.io/f5-spk-traffic-distributions.k8s.f5net.com created
Navigate to the directory that contains the latest SPK Software, then list the f5ingress Helm chart.
cd cnfinstall; ls -1 tar | grep f5ingress
Sample Output:
f5ingress-9.0.0.tgz
Obtain the Helm release name for the current SPK installation:
In this example, the Helm release is in the spk-ingress namespace.
helm list -n spk-ingress
In this sample output, the Helm release is using CHART version f5ingress-8.0.0.
NAME NAMESPACE REVISION STATUS CHART f5ingress spk-ingress 1 deployed f5ingress-8.0.0
Verify the
overrides_2.0_values.yamlcontents.Note: The following parameters are configured to ensure that, after an upgrade, the TMM pod is immediately available to receive network traffic without any traffic loss:
tmm.bfdToOVN.enabled is set to True
tmm.dynamicRouting.bfd is configured.
cat overrides_2.0_values.yaml
Sample Output:
# This file contains overrides for ocp f5ingress chart in cnab f5-toda-logging: enabled: true fluentd: host: f5-toda-fluentd.spk-utilities.svc.cluster.local. port: 54321 fluentbit: logLevel: debug tls: enabled: true sidecar: image: repository: repo.f5.com/images tmstats: enabled: true config: image: repository: repo.f5.com/images tmm: image: repository: repo.f5.com/images tlsStore: enabled: true logLevel: INFO k8sprobes: enabled: true grpc: enabled: true replicaCount: 2 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 nodeSelector: tmmnode: enabled bfdToOVN: enabled: true sessiondb: useExternalStorage: "true" dynamicRouting: enabled: true tmmRouting: config: bgp: asn: 64522 bgpSecret: bgp-secret gracefulRestartTime: 120 neighbors: - ip : 10.21.1.252 asn: 64521 acceptsIPv4: true fallover: true - ip : fc21:1::253 asn: 64521 acceptsIPv6: true fallover: true bfd: interface: external interval: 100 minrx: 100 multiplier: 3 image: repository: repo.f5.com/images tmrouted: image: repository: repo.f5.com/images cniNetworks: "spk-ingress/spk-ingress-internal-sriov,spk-ingress/spk-ingress-external1-sriov" customEnvVars: - name: SESSIONDB_EXTERNAL_SERVICE value: "f5-dssm-sentinel.spk-utilities" - name: SESSIONDB_DISCOVERY_SENTINEL value: "true" - name: OPENSHIFT_VFIO_RESOURCE_1 value: "sriovEns21f0Mlx6NetdevPolicy" - name: OPENSHIFT_VFIO_RESOURCE_2 value: "sriovEns21f1Mlx6NetdevPolicy" - name: SSL_SERVERSIDE_STORE value: "/tls/tmm/mds/clt" - name: SSL_TRUSTED_CA_STORE value: "/tls/tmm/mds/clt" - name: TMM_DEFAULT_MTU value: "9000" - name: CONFIG_VIEWER_ENABLE value: "TRUE" # vxlan vxlan: enabled: false icni2: enabled: true network: vfio: enabled: false attachment: definitionName: spk-ingress/internal-sriov f5-stats_collector: enabled: true image: repository: repo.f5.com/images stats_collector: image: repository: repo.f5.com/images controller: annotationDelay: 120 cwcNamespace: spk-utilities watchNamespace: "dav21-appns-1,dav21-appns-2" enableCustomResources: false image: repository: repo.f5.com/images vlan_grpc: enabled: true fluentbit_sidecar: enabled: true fluentd: host: f5-toda-fluentd.spk-utilities.svc.cluster.local fluentbit: tls: enabled: true image: repository: repo.f5.com/images f5_lic_helper: enabled: true name: f5-lic-helper rabbitmqNamespace: spk-utilities image: repository: repo.f5.com/images tmm_pod_manager: enabled: true image: repository: repo.f5.com/images debug: image: repository: repo.f5.com/images rabbitmqNamespace: spk-utilities afm: name: f5-afm enabled: false
(Optional) If you want to use the Multiple External Gateway (MEG) with SPK v2.0.0, apply the
AdminPolicyBasedExternalRoute CR. For more information, see AdminPolicyBasedExternalRoute.(Optional) If you have f5-afm pod enabled in
values.yaml, add privileges to the f5-afm service account.oc adm policy add-scc-to-user privileged -n spk-ingress -z f5-afm
Upgrade the F5Ingress using the new f5ingress helm chart version mentioned in the SPK v2.0.0 tarball.
helm upgrade f5ingress tar/f5ingress-<version>.tgz -f <values>.yaml -n namespace
In this example, the Pods will be upgraded using the f5ingress-9.0.0.tgz Helm chart.
helm upgrade f5ingress tar/f5ingress-v0.761.1-0.0.115.tgz -f values.yaml -n spk-ingress
See the installed releases in
spk-ingressnamespace.In this example, the below command shows the installed releases in
spk-ingressnamespace.helm list -n spk-ingress
Sample Output:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION f5ingress spk-ingress 1 2025-02-20 06:55:05.040511141 +0000 UTC deployed f5ingress-10.0.157 v10.0.157
Verify that the Pods have a STATUS of Running.
oc get pods -n spk-ingress -o wide
Sample Output:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES f5-afm-68d5fc75db-zrf4d 2/2 Running 0 13m 10.130.1.153 master-1.ocp21.pd.f5net.com <none> <none> f5-tmm-7f988c98df-kbsg8 7/7 Running 10m 10.130.1.150 master-1.ocp21.pd.f5net.com <none> 2/2 f5-tmm-7f988c98df-pfbkt 7/7 Running 8m 10.129.0.221 master-2.ocp21.pd.f5net.com <none> 2/2 f5ingress-f5ingress-7d8b6cf86-qsn7b 5/5 Running 0 13m 10.128.1.140 master-3.ocp21.pd.f5net.com <none> <none> otel-collector-74c76d445c-7hnbn 1/1 Running 0 13m 10.128.1.139 master-3.ocp21.pd.f5net.com <none> <none>