Upgrade CNFs from 2.2.0 to 2.2.1 using F5 Lifecycle Operator

Introduction

The following instructions provides the step-by-step procedure to upgrade CNFs from v2.2.0 to v2.2.1. Follow the steps in sequence to ensure a smooth, successful upgrade. Please review the Release notes to understand new features, fixes, and any potential impacts.

Note

You can upgrade using F5 Lifecycle Operator (FLO) only if the 2.2.0 was installed using FLO.

Prereqisites

Make sure the system is using CNFs 2.2.0 (Release-manifest version: 2.2.0-3.2226.0-0.0.385).

Upgrade to 2.2.1 using FLO

  1. In a terminal window on your computer, make sure you’re in the release-manifest directory.

  2. Upgrade the FLO to the 2.2.1 version.

$ helm upgrade f5-lifecycle-operator tar/<f5LifecycleOperatorVersion> \
     --namespace default \
     --values flo-values.yaml 

example

$ helm upgrade f5-lifecycle-operator tar/f5-lifecycle-operator-v2.9.27-0.3.4.tgz \
     --namespace default \
     --values flo-values.yaml 

output

Helm upgrade successful for f5-lifecycle-operator.
Release "f5-lifecycle-operator" has been upgraded. Happy Helming!
NAME: f5-lifecycle-operator
LAST DEPLOYED: Thu Feb 26 13:08:14 2026
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
  1. Create the CNEInstance CR file (cneinstance-cr.yaml) for the 2.2.1 manifest version. For example,

apiVersion: k8s.f5.com/v1
kind: CNEInstance
metadata:
  labels:
    app.kubernetes.io/name: f5-lifecycle-operator
    app.kubernetes.io/managed-by: kustomize
  name: adi-alpha-cneinstcr
  namespace: adi-alpha
spec:
  wholeCluster: false
  product:
    type: CNF
    gatewayAPI: false
  manifestVersion: "2.2.1-3.2226.0-0.0.511"
  telemetry:
    loggingSubsystem:
      enabled: true
    metricSubsystem:
      enabled: true
  certificate:
    clusterIssuer: oss-issuer
  deploymentSize: "Small"

  registry:
    uri: "repo.f5.com"
    imagePullSecrets:
    - name: farimagesecret
    imagePullPolicy: Always
  networkAttachments:
    - "auto-bond-pool-intel810-numa0"
  storageClassName: robin-rwx
  # Features
  # CSRC Egress
  pseudoCNI:
    enabled: true
  # BGP
  dynamicRouting:
    enabled: true
  # AFM
  firewallACL:
    enabled: true
  # Core dump files
  coreCollection:
    enabled: true
  # CGNAT
  cgnat:
    enabled: true
  # IPSD
  intrusionPrevention:
    enabled: true
  # IP Intelligence
  ipIntelligence:
    enabled: true
  # Intelligent Load Balancer
  intelligentLB:
    enabled: false
  # DPU
  dpu:
    enabled: false
  # TMM Replicas (when not whole cluster or DPU mode)
  tmmReplicas: 2
  # Watch Namespaces
  watchNamespaces:
  - "tcpapp"
  - "udpapp"
  # Advanced Configuration
  advanced:
    maintenanceMode:
      enabled: false
    demoMode:
      enabled: false
    tmm:
      # add_k8s_routes: true
      env: 
      - name: SESSIONDB_EXTERNAL_SERVICE
        value: "f5-dssm-sentinel.adi-alpha.svc.cluster.local"
      - name: SESSIONDB_DISCOVERY_SENTINEL
        value: "true"
      - name: SSL_SERVERSIDE_STORE
        value: "/tls/tmm/mds/clt"
      - name: SSL_TRUSTED_CA_STORE
        value: "/tls/tmm/mds/clt"
      - name: TMM_MAPRES_VERBOSITY
        value: "debug"
      - name: TMM_MAPRES_USE_VETH_NAME  # Set to false to resolve the issue (BZ 1407137)
        value: "FALSE"            
      - name: CONFIG_VIEWER_ENABLE
        value: "TRUE"       
      - name: TMM_MAPRES_ADDL_VETHS_ON_DP
        value: "TRUE"
      - name: TMM_CALICO_ROUTER
        value: "default"  
      - name: TMM_IGNORE_GATEWAYS
        value: "TRUE"
      - name: ROBIN_VFIO_RESOURCE_1
        value: "ENS1F0_VFIOPCI"
      - name: ROBIN_VFIO_RESOURCE_2
        value: "ENS1F1_VFIOPCI"      
      - name: EXPORT_TMROUTED_LOGS
        value: "true"  
      - name: EXPORT_BLOBD_LOGS
        value: "true"  
      - name: ENABLE_K8S_ROUTES
        value: "true"
    cneController:
      env:
      - name: ICNI20_ENABLED
        value: "true"
    envDiscovery:
      enabled: false

Note: While upgrading CNFs from 2.2.0 to 2.2.1 using FLO, the DSSM upgrade hook pod gets stuck in a container-creating state, preventing the DSSM pods from upgrading successfully. To mitigate this issue, before the upgrade:

  • Create a file named dssm-upgrade-cm.yaml containing the configuration for the ConfigMap in the lower version prior to performing the upgrade.

apiVersion: v1
kind: ConfigMap
metadata:
  name: f5-dssm-logs-config
  namespace: f5-alpha
data:
  .minlevel.yaml: |
  • Apply the following dssm-upgrade-cm.yaml cm.yaml in the same namespace where the DSSM pods are deployed.

$ kubectl apply -f dssm-upgrade-cm.yaml -n <dssm pods installed name space>
  1. Apply the CNEInstance CR file (cneinstance-cr.yaml), the custom resource for CNFs.

$ kubectl apply -f <cneInstanceFilename> - n namespace 

example

$ kubectl apply -f <cneinstance-cr.yaml> - n f5-alpha  
  1. Validate the deployment.

$ kubectl get -f <cneInstanceFilename> - n namespace 

example

$ kubectl get -f <cneinstance-cr.yaml> - n f5-alpha  

Note

Verify if all the components are available in the CNE Instance CR status.